본문 바로가기

도구의발견

[cmake] 자동으로 컴파일 대상 파일 리스트 만들기

NOTE[도구의발견] - CMake에서 CMake의 기본 사용법을 익혀 보세요.

 

cmake를 이용해 실행 바이너리를 만들기 위해서는 add_executable 명령을 사용하면 됩니다.

 

add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL]
    [source1] [source2 ...]
)

 

여기서 문제는 저 [source1] [source2 ...] 입니다. 컴파일 해야 할 파일이 몇개가 될지도 모르는데 파일이 추가 될 때 마다 소스 파일 리스트에 손으로 일일이 쓰는 것은 너무나도 귀찮고, 빈번한 실수를 유발 할 수 있는 방법입니다.

 

비주얼 스튜디오나 이클립스 IDE 처럼 자동으로 추가해주는 방법은 없을까요?

당연히 있으니 지금 이 글을 쓰고 있겠죠.

 

cmake의 file명령어와 GLOB인자를 사용하면 모든 디렉토리 내에 있는 모든 파일 목록의 리스트를 자동으로 만들 수 있습니다. 만일 하위 디렉토리까지 검색해야 할 필요가 있다면 GLOB_RECURSE 인자를 대신 사용하면 디렉토리를 재귀적으로 순회하며 파일 리스트를 만들어 줍니다.

 

file(GLOB_RECURSE SRC "*.cpp" "*.c")
message("${SRC}")

 

위 명령어는 전체 디렉토리들을 재귀적으로 검색해서 .cpp나 .c 확장자를 가진 모든 파일들의 경로를 SRC변수에 리스트 형태로 저장하라는 뜻입니다.

(message 명령어는 그냥 결과 한번 보시라고 추가 했습니다ˋ( ° ▽、° ) )

 

그런데 여기서 다시 문제가 생깁니다. 하위 디렉토리까지 모두 검색하다 보니 CMakeFiles에서 내가 만들지 않은, 예를 들어 CMakeCCompilerId.c나 CMakeCXXCompilerId.cpp 같이 cmake가 자동 생성한 파일들까지 컴파일 대상에 포함되게 됩니다.

 

그럼 이제는 빌드에서 제외 시킬 디렉토리를 지정하는 방법을 보겠습니다.

 

 

 

set(EXCLUDE_PATHS
    "CMakeFiles"
    [directory1]
    [directory2 ...]
)

 

EXCLUDE_PATHS 변수에 GLOB_RECURES에서 제외 시킬 디렉토리 목록을 적어 줍니다. 그리고 $SRC 리스트를 순회 하며 EXCLUDE_PATHS에 지정되어 있는 경로에 있는 파일들을 리스트에서 제외 합니다.

 

file(GLOB_RECURSE SRC "*.cpp" "*.c")
foreach(TMP_PATH ${SRC})
    foreach(EXCLUDE_PATH ${EXCLUDE_PATHS})
        string(FIND ${TMP_PATH} ${EXCLUDE_PATH} RESULT)
        if(NOT ${RESULT} EQUAL -1)
            list(REMOVE_ITEM SRC ${TMP_PATH})
        endif()
    endforeach(EXCLUDE_PATH)
endforeach(TMP_PATH)

 

이렇게 하면 딱 내가 원하는 파일 리스트가 나옵니다. 이제 이걸 add_executable이나 add_library 명령어의 인자로 넘겨 주면 끝입니다.

 

add_executable( <binary name> ${SRC} )
add_library(<lib name> STATIC ${SRC})

 

참 쉽죠?

http://img.segye.com/content/image/2019/08/09/20190809509551.jpg

부록 1. 참고

cmake - file

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!