최신목록

2017년 6월 28일 수요일

[perl] VS2015로 perl 빌드하기

perl 5.24.0을 사용하다가 기존 프로젝트 빌드 환경을 VS2015로 변경하면서 perl을 VS2015에서 빌드를 시도하였다.

perl 5.24.0은 VS2015 고려가 안되있어서 Makefile에 일일이
CCTYPE이 MSVC140일때 vcruntimed.lib와 ucrt.lib를 넣어주어야 한다.
귀찮다...perl 5.26.0은 처리가 다 되서 배포된다. ㅎ

일단 perl 5.26.0을 다운받고 압축을 풀면
아래와 같이 win32/Makefile에서 MSVC140을 활성화해준다.

CCTYPE = MSVC60       -> #CCTYPE = MSVC60
#CCTYPE = MSVC140    -> CCTYPE = MSVC140

그럼 일단 가이드하는 상의 셋팅은 끝이다.
그런데 빌드를 해보니 빌드가 되지 않는다.



perl-5.26.0/win32/perlhost.h에서 나는 에러다.

_iobuf 멤버를 correct_wstdio.h에서 참조하고 있다.

#ifndef _FILE_DEFINED
    #define _FILE_DEFINED
    typedef struct _iobuf
    {
        void* _Placeholder;
    } FILE;
#endif

_base, _cnt는 보이지 않는다.

perlhost.h에서 가리키는 코드는

#ifdef FILE_base
    FILE *f = pf;
    return FILE_base(f);
#else
    return NULL;
#endif

FILE_base를 define 한곳을 막아야한다.

perl-5.26.0/win32/config.h에 보면


#define USE_STDIO_PTR  /**/
#ifdef USE_STDIO_PTR
#define FILE_ptr(fp) ((fp)->_ptr)
#define STDIO_PTR_LVALUE   /**/
#define FILE_cnt(fp) ((fp)->_cnt)
#define STDIO_CNT_LVALUE   /**/
/*#define STDIO_PTR_LVAL_SETS_CNT / **/
#define STDIO_PTR_LVAL_NOCHANGE_CNT /**/
#endif

#define USE_STDIO_BASE  /**/
#ifdef USE_STDIO_BASE
#define FILE_base(fp) ((fp)->_base)
#define FILE_bufsiz(fp) ((fp)->_cnt + (fp)->_ptr - (fp)->_base)
#endif

두 군데가 활성화 되있다. USE_STDIO_PTR과 USE_STDIO_BASE의 정의되있어서 활성화되었던 코드이다. 이걸 막으면  일단 컴파일은 된다.

그런데 나는 압축 푸는과정에 cmake를 이용해서 자동으로 Makefile과 config.h의 코드를 수정해서 빌드를 하려고 하는데 압축 풀면 config.h가 없다. 빌드되는 과정에서 생성이 된다. 빌드 과정에 config.h가 없으면 config.vc에서 카피한다고 떠서 그런줄 알고 config.vc도 수정해서 해봐도 config.h에는 적용되지 않았다. 한참 헤매다 아래 두 파일을 이용해서 생성이 됨을 알 수 있었다.

- perl-5.26.0/config_h.SH
- perl-5.26.0/win32/config.vc

config.vc의 d_stdstdio, d_stdiobase 의 값을 'undef'로 변경해주면 된다.

댓글 없음:

댓글 쓰기