无法生成CMake命令

时间:2013-08-31 12:52:47

标签: cmake

我的CMakeLists.txt:

cmake_minimum_required(VERSION 2.6)
project(main)

SET(MAIN main)
SET(MAIN_OUT "${CMAKE_CURRENT_BINARY_DIR}/out.txt")
add_executable(${MAIN} main.cpp)

# command is unknown
add_custom_command(OUTPUT ${MAIN_OUT}
    POST_BUILD
    COMMAND ./${MAIN} > ${MAIN_OUT}
    DEPENDS ${MAIN}
)

编译后,我只想输入

make out.txt

然而,cmake似乎并未意识到这个目标("没有规则")。在构建目录中,调用

grep out.txt -r *

找不到包含out.txt的文件。如何让我的目标可以调用?我知道之前可能已经问过,但我还没找到。

1 个答案:

答案 0 :(得分:2)

如果您希望能够输入“make out.txt”,则可能需要add_custom_target而不是add_custom_command。这将创建一个可以构建的目标,并在构建中执行指定的命令。

而不是将此目标称为“out.txt”,这会误导性地使其看起来像文本文件而不是目标,我建议更像“RunMain”或“GetOutputOfMain”。

如果您可以将最近版本的CMake指定为最小版本,则可以在add_custom_target调用的命令部分中使用“生成器表达式”。 add_custom_target没有记录这一点,但您可以在add_custom_command的文档中阅读有关生成器表达式的信息。我不确定应该设置最小版本的CMake以使生成器表达式可用。

因此,您的CMakeLists.txt可以更改为:

cmake_minimum_required(VERSION 2.8.10)
project(Test)

add_executable(MyExe main.cpp)

set(MainOut "${CMAKE_CURRENT_BINARY_DIR}/out.txt")
add_custom_target(RunMain $<TARGET_FILE:MyExe> > ${MainOut}
                  COMMENT "Running MyExe with output redirected to ${MainOut}")

# Ensure MyExe is built before trying to build the custom target
add_dependencies(RunMain MyExe)

然后只需make RunMain生成out.txt。

如果您不想指定如此高的最低版本,则可以使用过时的LOCATION目标属性:

get_target_property(MyExeLocation MyExe LOCATION)
add_custom_target(
    RunMain ${MyExeLocation} > ${MainOut}
    COMMENT "Running ${MyExeLocation} with output redirected to ${MainOut}")