티스토리 뷰

cmake

[CMake, KOR] get_filename_component

4whomtbts 2019. 12. 23. 19:38

참고 : https://cmake.org/cmake/help/v3.14/command/get_filename_component.html

소스트리에서 파일의 이름을 추출하고, extension을 떼었다 붙이고, 폴더만 추출하고 하는 작업들은 정말 귀찮고 짜증납니다.

특히 언어나 OS마다 separator 나 encoding 등등이 달라서 쉽게 구현하는것도 여의치 않아서 여기저기 언어별로 API랑

stackoverflow 를 뒤져가면서 찾아봐야되는데.. CMake는 태생자체가 그런 일을 하려고 만들어졌기 때문인지.. 

get_filename_component 라는 기특한 함수가 있습니다.

우선 기본적인 모양은 위와 같습니다. 

아래의 예제에서 보시겠지만,  <var>는 결과를 담을 변수, <FileName> 은 path를 포함한 파일이름

<mode>는 바로 설명할 기능들입니다.

1. DIRECTORY : 파일이름 빼고 디렉터리 이름만 골라서 반환.

아래에서 예를 보겠지만.. proto/foo.a.b.c 라는 소스root의 relative path로 파일 이름을 넘겨주면 

proto 라는 디렉토리 이름만 골라서 반환해줍니다.

2. NAME : 이번에는 디렉터리 이름을 빼고 파일 이름만 바환해줍니다.

3. EXT : 최장확장자 이름만 반환해줍니다. foo.a.b.c 라는 파일이 있으면, 결과로 얻는 값은 .a.b.c입니다.

4. NAME_WE : 디렉터리 이름이나, 최장확장자 다 없에버리고 파일 이름만 반환해줍니다.

5. LAST_EXT : 제일 뒤의 확장자만 반환해줍니다. foo.a.b.c 라면, .c만 반환

6. NAME_WLE : 디렉터리 이름이나 마지막 확장자 빼고 반환해줍니다.

 

그리고, mode 대신에 

위에서 ABSOLUTE를 넣으면 proto/Student.proto를 /home/user/Desktop/proto/Student.proto 로 바꾼값을

반환해줍니다.

CACHE 를 명시하면, 말 그대로 CACHE가 됩니다.

예제

get_filename_component(TEST_VAR_0 Student.proto NAME)
get_filename_component(TEST_VAR_1 proto/foo.a.b.c NAME)
get_filename_component(TEST_VAR_2 Student.proto EXT)
get_filename_component(TEST_VAR_3 proto/foo.a.b.c EXT)
get_filename_component(TEST_VAR_4 Student.proto NAME_WE)
get_filename_component(TEST_VAR_5 proto/foo.a.b.c NAME_WE)
get_filename_component(TEST_VAR_6 Student.proto NAME_WLE)
get_filename_component(TEST_VAR_7 proto/foo.a.b.c NAME_WLE)
get_filename_component(TEST_VAR_8 proto/inner_folder/Student.proto DIRECTORY)
get_filename_component(TEST_VAR_9 proto/foo.a.b.c DIRECTORY)
get_filename_component(TEST_VAR_10 proto/foo.a.b.c ABSOLUTE)
get_filename_component(TEST_VAR_10 proto/foo.a.b.c REALPATH)

foreach(SUFFIX_NUM RANGE 0 11)
    LIST(APPEND TEST_VAR_LIST "TEST_VAR_${SUFFIX_NUM}")
    message("TEST_VAL_LIST${SUFFIX_NUM} = ${TEST_VAR_${SUFFIX_NUM}}")
endforeach(SUFFIX_NUM)

'cmake' 카테고리의 다른 글

[CMake, ENG] Let's use "FUNCTION" in CMake  (0) 2019.12.27
[CMake, KOR/ENG] How to generate gRPC c++ code with CMake  (0) 2019.12.24
[CMake,ENG/KOR] compile protobuf with CMake  (0) 2019.12.24
[CMake, KOR] foreach - 1  (0) 2019.12.23
[CMake,KOR] LIST  (0) 2019.12.23
댓글