同一个cmake文件,在VS上是可以实现PRE_BUILD功能的,在linux上编译则没有执行到,不起作用。修改CMakeLists.txt后,下面的实现,可以在linux编译时也能执行到。
if (WIN32)
add_custom_command(TARGET ${target}
PRE_BUILD
COMMAND "yyy/xxx.exe" "${in_file}" "${out_file}"
COMMENT "================ Do xxx.exe"
DEPENDS "${in_file}"
VERBATIM
)
else()
string(REPLACE / _ in_file_1 ${in_file})
string(REPLACE . _ in_file_2 ${in_file_1})
set(temp_target "$in_file_2")
add_custom_target(${temp_target}
COMMAND "yyy/xxx" "${in_file}" "${out_file}"
COMMENT "================ Do xxx"
DEPENDS "${in_file}"
VERBATIM
)
add_dependencies(${target} ${temp_target})
endif()
原理就是通过两次string替换,把文件名里的分隔符替换成下划线,用文件名做custom target,然后添加dependencies,这个temp_target就会执行到了。
之所以用文件名做custom target,是因为这段在一个function里,会多次调用,不能用固定的target名字。
还有一个方法,直接执行这个命令,在调用这个function时,直接执行相关处理:
function(MyFunction in_file out_file)
execute_process(COMMAND "yyy/xxx" "${in_file}" "${out_file}")
endfunction()