2017년 7월 31일 월요일

[Build System] cmake를 활용하여 windows와 linux 모두에서 빌드 가능한 프로젝트 만들기

  이번 글에서는 제목과 같이 cmake 툴을 활용해서 Windows와 Linux 모두에서 빌드할 수 있는 프로젝트를 만들어 볼 것이다. 우선 cmake는 소스코드들과 그 결과물인 바이너리, 라이브러리의 구조를 추상화해서 빌드 플랫폼에 의존적인 Makefile(이나 등등)을 생성해내는 도구이다. 자세한건 여기를 참고하자.

  먼저 cmake를 설치한다. https://cmake.org/download/ 이 사이트에서 플랫폼에 맞는 바이너리를 받을 수도 있고 아니면 http://lablk.blogspot.kr/2017/07/ethercat-soem-ethercat.html에서처럼 소스코드를 받아서 직접 빌드할 수도 있다. 다행히 이 소스코드를 빌드할 때에는 cmake를 사용하지 않는다.

# apt-get install cmake

이렇게 해도 된다.

  예제를 기준으로 Windows와 Linux 각각 플랫폼에 대해 다른 빌드 구조나 소스코드를 선택하는 법과, 실제 빌드를 어떻게 수행하는지 알아볼 것이다.

  먼저 cmake의 빌드 구조를 정의한 CMakeLists.txt 파일에서는 현재 빌드 플랫폼이 무엇인지 다음과 같이 확인할 수 있다.

if(WIN32)
    message("win 32 build!")
elseif(UNIX)
    message("linux build!")
endif()

if문과 WIN32, UNIX 키워드를 통해서 확인이 가능하다. Windows 64 타겟으로 빌드할 때에도 WIN32 키워드가 활성화된다. 이 분기문을 통해 각 빌드 플랫폼에 따라 서로 다른 소스코드나 라이브러리를 선택하는 등의 빌드 구조를 정의할 수 있다.

  타겟 플랫폼에 따라 소스코드 파일을 따로 작성할 수도 있지만 그 양이 많지 않다면 한 소스파일 내에서 전처리기 매크로로 구분하는 방법도 좋다.

#if defined(_WIN64)
    printf("_WIN64!!\n");
#elif defined(_WIN32)
    printf("_WIN32!!\n");
#elif defined(__linux__)
    printf("__linux__");
    if(sizeof(long int) == 8)
        printf("64!!\n");
    else
        printf("32!!\n");
#endif

이런 식으로 하면 되는데.. Linux 플랫폼에서 64비트, 32비트로 동작하는지 알아보는 매크로가 없는지 잘 몰라서 일단 sizeof(long int)로 파악해 보도록 했다. 더 좋은 방법 아는 사람은 알려주기 바람..

  마지막으로 각 플랫폼에서의 빌드 방법이다. 먼저 Linux에서는

$ mkdir build
$ cd build
$ cmake ..
$ make

이렇게 하면 된다. build 디렉토리 만든거는 그냥 빌드 결과물이 소스코드와 섞이지 않도록 하기 위한 거다.

  Windows에서는 조금 더 복잡하다. 우선 Visual Studio를 설치해야 한다. cmd.exe나 Visual Studio 명령 프롬프트를 열어서 다음과 같이 명령어를 입력한다. (다른 데서는 Visual Studio 명령 프롬프트만 사용해야 한다고 한 것 같은데 cmd에서도 동작하는 것 같다. 착각이면 알려주기 바람.)

> mkdir build
> cd build
> "C:\Program Files\CMake\bin\cmake.exe" .. -G "Visual Studio 15 2017 Win64"
> "C:\Program Files\CMake\bin\cmake.exe" --build . --config Release

cmake.exe의 경로는 자신의 환경에 맞게 바꾸면 되고, 자신이 설치한 Visual Studio 버전에 따라 3번째 명령어를 다르게 하면 된다. cmake.exe -G 라고만 치면 큰 따옴표 사이에 넣을 수 있는 내용이 쭉 나온다. 여기서 알맞은 것을 선택하자.


엄청 많이 나온다.. Makefile뿐만 아니라 각 IDE의 프로젝트를 그냥 생성해준다.
Visual Studio에 있는 [arch] 부분에는 32비트 타겟으로 빌드할 경우 생략, 64비트 타겟으로 빌드할 경우 "WIN64"라고 입력해주면 된다.

댓글 없음:

댓글 쓰기