由于項(xiàng)目需要用到thrift昼汗,而每次修改.thrift文件后献宫,需要重新進(jìn)到別的目錄生成thrift的.cpp及.h文件愿待,于是想在cmake中能否自動生成观谦,本來想用add_custom_command就可以了拉盾,但是發(fā)現(xiàn)即使在cmake文件中添加了add_custom_command,仍然無法自動生成豁状。 于是詳細(xì)研究了下add_custom_command及add_custom_target:
add_custom_command
The first signature is for adding a custom command to produce an output:
add_custom_command(OUTPUT output1 [output2 ...]
COMMAND command1 [ARGS] [args1...]
[COMMAND command2 [ARGS] [args2...] ...]
[MAIN_DEPENDENCY depend]
[DEPENDS [depends...]]
[BYPRODUCTS [files...]]
[IMPLICIT_DEPENDS <lang1> depend1
[<lang2> depend2] ...]
[WORKING_DIRECTORY dir]
[COMMENT comment]
[DEPFILE depfile]
[VERBATIM] [APPEND] [USES_TERMINAL]
[COMMAND_EXPAND_LISTS])
這是一個用來定義生成輸出文件的命令捉偏,在本目錄的CMakeLists.txt中的任何一個目標(biāo)倒得,如果這個目標(biāo)使用的源文件是在add_custom_command的輸出文件中的,那么add_custom_command將被執(zhí)行夭禽。在最終生成的Makefile中霞掺,add_custom_command將生成如下命令: OUTPUT:MAIN_DEPENDENCY DEPENDS COMMAND
所以,還需要將命令生成的文件添加到目標(biāo)的源文件中讹躯;
所以命令應(yīng)該如下形式:
設(shè)置thrift最終生成的文件列表
set(THRIFT_SRCS
${PROJECT_SOURCE_DIR}/thrift/xxx.h
${PROJECT_SOURCE_DIR}/thrift/xxx.cpp
...)
#定義生成命令菩彬,注意將skeleton.cpp文件要刪除的
add_custom_command(
OUTPUT ${THRIFT_SRCS}
COMMAND thrift --gen cpp ${PROJECT_SOURCE_DIR}/thrift/my_server.thrift -out ${PROJECT_SOURCE_DIR}/thrift
COMMAND rm -f {PRJJECT_SOURCE_DIR}/thrift/xxx.skeleton.cpp
DEPENDS ${PROJECT_SOURCE_DIR}/thrift/my_server.thrift
COMMENT "Now Generating thrift files..."
)
注意,這里都不要加雙引號潮梯,否則會出現(xiàn)不生成的情況挤巡。
定義目標(biāo)可執(zhí)行文件
add_executable(my_exe main.cpp ${THRIFT_SRCS} ...)
因?yàn)閍dd_custom_command中DEPENDS寫了my_server.thrift,相當(dāng)于在Makeflie的DEPENDS上多了這項(xiàng)酷麦,所以my_server.thrift更新后矿卑,將自動編譯出源文件; 謹(jǐn)記要把a(bǔ)dd_custom_command的輸出文件添加到目標(biāo)源文件中
推廣到gprc等其他自動生成代碼的流程一樣沃饶,
另外還需要注意一點(diǎn):
如果add_custom_command和add_executable在不同的CMakeLists.txt母廷,那么add_executable那個CMakeLists.txt無法引用到add_custom_command,也就是說糊肤,最好add_custom_command和add_executable在同一個CMakeLists.txt中