[CMake] 04. 개념 이해 (Property, Target, Source File, Directory)

앞서서 우리는 다양한 개념들이 CMake에서 어떤 형태로 존재하고 그 개념들간에 어떤 관계가 있는지 공부했다. 이번 글에서는 각각에 대해서 조금 더 자세하게 설명한다.

1. Property

우리가 작성한 CMakeLists.txt는 cmMakefile 클래스에서 읽혀지고 저장된다는 것을 알았다. 그리고 그 외에 taget, source file, directory등과 같은 개념들이 클래스로 구현되어져 있다고 공부했다. 이와 같은 클래스들의 정보들이 모두 채워지면 프로젝트 파일(Makefile 또는 솔루션 파일)이 생성될 준비가 완료 된 것이다. 이와 같은 정보들은 CMake에서는 Property라고 부른다. CMake는 property를 저장하고 읽기 위해서 get_property() (doc) 그리고 set_property() (doc) 함수를 제공한다.


2. Library

우리가 CMake를 통해서 얻고자하는 것은 어떤 플랫폼에서든 우리가 작성한 프로그램이 빌드 될 수 있게 프로젝트 파일을 만들어 주는 것이다. 프로그램이 빌드가 되어 나오는 결과물은 크게 두가지로 나눌 수 있다. 실행 파일에 필요한 함수, 클래스 등을 저장하고 있는 library와 실행이 가능 한 파일 executable이 있다. CMake에서 target이라고 말하면 library이거나 executable을 말한다. 지금부터는 어떻게 target을 정의하고 속성은 어떻게 설정하는지 알아본다. (CMake에서 target은 library와 executable뿐만 아니라 다른 utility들도 존재한다.)

Library

Library target을 만드는 함수는 add_library() (doc)이다. 다음 코드는 foo라는 정적 라이브러리(static library)를 foo1.cpp와 foo2.cpp를 이용해서 만들어준다.

add_library(foo STATIC foo1.cpp foo2.cpp)

첫 번째 인자는 library의 이름을, 두 번째 인자는 library의 형태를 결정한다. 정적 라이브러리를 뜻하는 STATIC 말고도 공유 라이브러리를 뜻하는 SHARED, 마지막으로 동적 라이브러리를 지칭하는 MODULE이 있다.

Executable

Executable target을 만드는 함수는 add_executable() (doc)이다. 아래 코드는 foobar.cpp를 이용해서 실행 파일 foobar를 만든다.

add_executable(foobar foobar.cpp)

 

Target은 다른 클래스들과 마찬가지로 property를 갖으며 get_property()를 이용해서 설정된 property를 읽어 올 수 있으며 set_property()를 이용해서 property를 설정할 수도 있다. 특별히 get_target_property() (doc)와 set_target_properties() (doc)을 이용해도 된다. 생성된(정의된) library target을 이용해서 다른 target에 link시킬 수 있다. (Linking이라는 말을 처음 듣는 분은 위키를 읽고오자.)

add_library(foo STATIC foo1.cpp foo2.cpp)
target_link_libraries(foo bar)

add_executable(foobar foobar.cpp)
target_link_libraries(foobar foo)

위 예제는 (1번째 줄) foo라는 library를 만들고 (2번째 줄) bar라는 library target를 link한 것이다. 다른 말로 foo library에 bar 라이브러리 의존성을 부여하였다. (4번째 줄) foobar.cpp를 이용해서 foobar라는 executable library를 생성하고 (5번째 줄) foobar에 foo library를 link하였다. CMake는 참 똑똑하게도 명시적으로 foobar에 foo만 link해도 저절로 foobar는 bar까지 link한다. Linking은 빌드 시스템에서 굉장히 중요하므로 자세한건 공부하도록 한다.


3. Source File

Source file의 property는 파일 이름, 경로, 확장자 등이 있다. 다른 개념들과 마찬가지로 property를 읽을 수도, 쓸 수도 있으며 특별히 get_source_file_property() (doc)와 set_source_files_properties (doc)를 이용한다. Source file의 property 중에서 많이 쓰는 것들은 다음과 같다.

COMPILE_FLAGS source file의 컴파일에 필요한 flag들을 설정 할 수 있다.

GENERATED cmake를 돌리기 시작하는 그 순간에 존재하는 파일이 아니라 cmake가 수행되는 도중에 생기는 파일이라는 것을 알려준다. (CMake는 외부 프로그램을 부를수 있게 execute_process() (doc)이라는 명령어를 제공한다. 외부 프로그램에 의해 source file이 생기는 경우에는 GENERATED를 설정해야 한다.)


4. Directory

Directory는 소스트리에 있는 디텍토리를 말한다. Directory도 다른 개념들과 같이 property가 존재하며 get_property()와 set_property()를 이용해서 읽고 쓸 수 있다. 유용한 directory property는 다음과 같다.

ADDITIONAL_MAKE_CLEAN_FILES make clean이라는 명령어에 지워질 파일 리스트를 설정한다.

EXCLUDE_FROM_ALL directory와 하위 directory를 빌드에서 제외시킬때 사용한다.

글쓴이 keunjun,