我的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的文件。如何让我的目标可以调用?我知道之前可能已经问过,但我还没找到。
答案 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}")