如果您希望能够输入“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}")
谢谢,这似乎工作。仅仅为了兴趣:如果我想让RunMain只在二进制文件生成后执行一次,我需要做什么? (假设编译后二进制总是产生相同的输出) – Johannes
我不知道我在追随。 RunMain只有在你想构建它时才能被执行(即构建)。它不是'ALL'目标的一部分,所以它不会自动生成。如果你想让事情自动化,你可以使用'add_custom_command'的原始方法将该命令作为后期构建事件。这样你就没有单独的目标;你不能“制造”它 - 你只需构建MyExe并在构建完成时运行该命令。这个命令就像'add_custom_command(TARGET MyExe POST_BUILD COMMAND $> $ {MainOut} COMMENT“...”)'。 –
Fraser
同意,我们在这种情况下不需要单独的目标。但是如果我真的想要一个单独的,那可能吗? – Johannes