如何在执行另一个目标的二进制产品时限制一个目标的构建?

时间:2019-07-15 11:59:20

标签: cmake

我有一个用于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”仅适用于目标。 添加包括我的二进制文件的自定义目标可以解决此问题吗?

1 个答案:

答案 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和我的自定义目标之间添加依赖项,可以确保为每个版本都调用生成二进制文件的命令。