2008년 9월 17일 수요일

cmake 로 빌드할때 다른툴(예를들어 lex 등)이 생성해낸 소스로 타겟을 만드는 방법..을 보여주는 간단하고 별 의미없는 예제

GENERATED 속성과 add_custom_target 을 이런식으로 써먹을수
있다..라는 글이지 lex 를 이렇게 쓰라는건 아니다. 만약 lex 를 써야
한다면 cmake 의 lex 지원 툴들을 먼저 찾아보고 없다면 macro 등으로
적절히 포장후 사용하자.


# 쪼까 드럽네.
# 나중에도 한번에 못만들어낼게 뻔하니 적어둔다.
# 샘플삼아 만들어본거라 이게 정석적인 방법이 맞는지는 모르겠고..
# 실무에 쓸상황이 오면 검색좀 해보고 쓰자.
#
#
# foo.yy.c 를 이용해서 foo 라는 실행파일을 생성
add_executable(foo foo.yy.c)
#
# 그런데 foo.yy.c 는 실제 소스가 아니고 cmake 시스템이 생성해내는
# 놈이므로 cmake 시스템에 그런 속성을 알려줘야 한다.
#
# 이건 사족이지만 짱나는게 있는데.. cmake 구버전 문서들은 cmake
# command 에 대문자를 주로 쓰지만 요즘엔 소문자도 쓰길래 나도 소문자로
# 써봤는데 커맨드이름이야 소문자가 잘 먹지만 인자중에 나오는 OUTPUT
# 이니 PROPERTIES 니 하는 것들은 대문자로 써줘야 돌아가는듯 하다.
set_source_files_properties(foo.yy.c PROPERTIES GENERATED true)
#
# add_custom_command 로 foo.l 로부터 foo.yy.c 를 생성하도록 해줬다.
# 몇가지 드러운점은.. 난 주로 소스디렉토리와 빌드디렉토리를 달리 하는데
# 그럴경우 디렉토리를 맟춰주는 삽질을 좀 해줘야 한다는것.
#
# 아래 코드를 보자면 빌드시에는 ${CMAKE_CURRENT_BINARY_DIR} 에서 작업이
# 진행되니 foo.yy.c 는 그자리( 이걸 소스디렉토리에 남길 이유는 없지 )
# 에 두고 flex 에 넘길 원본인 foo.l 을 지칭할때는 매번
# ${CMAKE_CURRENT_SOURCE_DIR} 를 지정해줬다.
add_custom_command(
OUTPUT foo.yy.c
COMMAND flex -o foo.yy.c ${CMAKE_CURRENT_SOURCE_DIR}/foo.l
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/foo.l)


보기 좋지 않군. 주석 제거한놈도 적어둬야지.

add_executable
(foo foo.yy.c)
set_source_files_properties(foo.yy.c PROPERTIES GENERATED true)
add_custom_command(
OUTPUT foo.yy.c
COMMAND flex -o foo.yy.c ${CMAKE_CURRENT_SOURCE_DIR}/foo.l
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/foo.l)






댓글 없음: