프로그래밍/cmake

cmake 시작하기

GSW 2020. 11. 30. 16:26
반응형

 cmake를 통해 소스파일을 실행시킬 수 있는 프로그램으로 컴파일 하는 방법은 다음과 같다. 

CMakeLists.txt

PROJECT (Example)

ADD_EXECUTABLE (Example Example.cpp)

 PROJECT 커맨드는 문자 그대로 프로젝트의 이름이다. 결과물의 workspace의 이름을 나타내는 커맨드이다. ADD_EXECUTABLE 커맨드는 빌드 프로세스에 실행시킬 수 있는 타겟을 추가하는 커맨드이다. 이 텍스트 파일과 cmake를 통해 소스파일 Example.cpp로부터 Example이라는 실행시킬 수 있는 파일로 컴파일 할 수 있다. 이 예제가 가장 기본적인 구조라고 생각하면 된다. 

CMakeLists.txt

ADD_EXECUTABLE (Example Example1.cpp Example2.cpp Example3.cpp)

 만약 소스파일이 여러개라면 위와 같은 방식으로 ADD_EXECUTABLE 커맨드를 사용하면 된다.

CMakeLists.txt

CMAKE_MINIMUM_REQURIED (3.1)

PROJECT (Example)


SET (Example_SRCS Example1.cpp Example2.cpp Example3.cpp)


ADD_EXECUTABLE (Example ${Example_SRCS})

#ADD_EXECUTABLE (Example Example1.cpp Example2.cpp Example3.cpp)과 동일

 위 예제에서는 SET 커맨드를 통해서 Example1.cpp, Example2.cpp, Example3.cpp 3개의 파일을 Example_SRCS라는 이름의 변수로 정의했다. 이렇게 정의한 변수를 ${Example_SRCS}와 같이 ${}를 통해서 사용할 수 있다. 위 예제에서 ADD_EXECUTABLE에 ${Example_SRCS}를 사용한 것을 확인할 수 있다. ADD_EXECUTABLE (Example ${Example_SRCS})은 ADD_EXECUTABLE (Example Example1.cpp Example2.cpp Example3.cpp)과 동일한 실행결과를 낳는다. 또한 CMakeLists.txt 파일에서 #을 통해서 주석을 입력할 수 있다는 사실도 위 예제를 통해 확인할 수 있다.

cmake 실행법

 프로젝트를 빌딩하는데 중요한 디렉토리는 소스 디렉토리와 바이너리 디렉토리 두가지가 있다. 소스 디렉토리는 프로젝트에 사용될 소스코드가 위치한 디렉토리이다. 바이너리 디렉토리는 cmake의 결과 오브젝트 파일과 라이브러리 바이너리 파일이 위치할 디렉토리이다. 일반적으로 cmake는 바이너리 디렉토리에만 결과 파일을 만든다. 소스 디렉토리와 바이너리 디렉토리를 같은 디렉토리로 설정할 수도 있다. 만약 소스 디렉토리와 바이너리 디렉토리가 같다면 in-source build라 하고 소스 디렉토리와 바이너리 디렉토리가 다르다면 out-of-source build라고 부른다. cmake는 in-source build와 out-of-source build모두 지원한다. out-of-source build 방법을 쓴다면 하나의 소스 디렉토리로부터 옵션이 다른 여러개의 바이너리 파일을 만들 수 있는 장점이 있다. 

 cmake를 실행시키는 것은 아주 간단하다. out-of-source build 방법을 예로 들면 터미널에서 다음과 같은 작업을 하면 된다.

cmake 실행법

mkdir build

cd build

cmake ..

make

 위의 예제에서 build 디렉토리는 cmake를 이용해서 바이너리 파일들을 생성할 디렉토리이다. 현재 디렉토리에 CMakeLists.txt파일이 있다고 가정하고 build 디렉토리를 만들고 이 디렉토리로 이동 후 cmake .. 커맨드를 통해서 cmake를 실행한다. ..부분에 절대경로를 사용할 수도 있다. cmake .. 커맨드를 통해 configuration이 끝났다면 make 커맨드를 통해서 본격적으로 컴파일한다.

 cmake는 C, C++ 파일에 대해 자동적으로 파일 의존관계를 파악한다. 파일 생성과 관리 모두 cmake를 통해서 자동적으로 할 수 있다. cmake 커맨드를 통해 처음 configuration이 완료되면 그 뒤로는 make 커맨드만 사용해도 cmake가 알아서 나머지 작업을 해준다. cmake는 depend.make, flags.make, build.make, DependInfo.cmake 등과 같은 파일에 의존관계를 저장한다. depend.make 파일에는 오브젝트 파일들의 의존관계를, flags.make 파일에는 컴파일 플래그를, DependInfo.cmake 파일에는 의존관계를 꾸준이 업데이트 하고 어떤 파일이 프로젝트의 어느 부분이고 어떤 언어인지 저장한다. 마지막으로 build.make 파일에 building 의존관계를 저장한다. 만약 의존관계가 바뀌면 cmake는 자동으로 의존관계를 다시 계산하여 파일들을 업데이트한다.  

'프로그래밍 > cmake' 카테고리의 다른 글

cmake란 무엇인가  (0) 2020.11.28