我有一个用于c项目的测试代码,该代码是cmake项目的一部分。 为了正常运行,SW需要输入二进制文件。 使用指定的.json文件(位于测试目录中)使用单独的可执行文件创建二进制文件,该文件也是同一cmake项目的一部分。 在测试运行之前(即在构建测试时),我需要构建bin-build可执行文件(足够容易并具有目标依赖性),但我还需要生成的可执行文件以我的.json作为输入来运行。 哪些cmake函数可以实现此目的?
我尝试用二进制文件作为输出来构建自定义命令,但是测试目标不知道它需要二进制文件才能运行,不能接受二进制文件作为源,因此产生了一个简单的“ add_dependancy”错误。
function(create_binary input_json dst_bin)
if (IS_WINDOWS)
set(exe_path ${OUTPUT_BIN_DIR}/BinaryGenerator.exe)
elseif(IS_LINUX)
set(exe_path ${OUTPUT_BIN_DIR}/BinaryGenerator)
endif()
add_custom_command(OUTPUT ${dst_bin}
COMMAND ${exe_path} ${input_json} ${dst_bin}
DEPENDS ${exe_path} ${dst_bin}
COMMENT STATUS "Creating bin file ${dst_bin} from ${input_json}"
)
endfunction(create_binary)
create_binary(InputParams.json ${OUTPUT_BIN_DIR}/InputParams.bin)
add_executable(MySwTest TestFile.cpp TestFile.h)
add_dependencies(${OUTPUT_BIN_DIR}/InputParams.bin)
我希望cmake在测试目标和bin创建者目标之间以及测试的bin文件的存在之间放置目标依赖项,从而运行custom命令以创建它。 cmake的实际输出是“依赖关系目标InputParams.bin不存在”。我认为这是因为“ add_dependency”仅适用于目标。 添加包括我的二进制文件的自定义目标可以解决此问题吗?
答案 0 :(得分:0)
通过定义依赖于结果二进制文件的自定义目标,确实可以解决此问题。
添加自定义命令时,仅在另一个目标需要命令的OUTPUT文件时才调用实际命令-因此,如果它是源文件,则将调用它。
我的命令的输出是生成的二进制文件,因此不是目标的源文件。
但是,使用add_custom_target()
可以创建一个依赖于上述bin文件的目标,并在最终目标和我的自定义目标之间创建依赖关系。
上面的工作代码如下:
set(PARAMS_NAME InputParams)
set(INPUT_JSON ${PARAMS_NAME}.json)
set(DST_BIN ${PARAMS_NAME}.bin)
if (IS_WINDOWS)
set(EXE_PATH ${OUTPUT_BIN_DIR}/BinaryGenerator.exe)
elseif(IS_LINUX)
set(EXE_PATH ${OUTPUT_BIN_DIR}/BinaryGenerator)
endif()
add_custom_command(OUTPUT ${DST_BIN}
COMMAND ${EXE_PATH} ${INPUT_JSON} ${DST_BIN}
DEPENDS BinaryGenerator ${INPUT_JSON}
COMMENT STATUS "Creating bin file ${DST_BIN} from ${INPUT_JSON}"
)
add_custom_target(${PARAMS_NAME}BinGenerated DEPENDS ${DST_BIN})
add_executable(MySwTest TestFile.cpp TestFile.h)
add_dependencies(MySwTest ${PARAMS_NAME}BinGenerated)
通过在MySwTest和我的自定义目标之间添加依赖项,可以确保为每个版本都调用生成二进制文件的命令。