2013-08-31 77 views
1

我的CMakeLists.txt:不能产生的CMake命令

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的文件。我怎样才能让我的目标被调用?我知道这可能以前曾问过,但我还没有找到它。

回答

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}") 
+0

谢谢,这似乎工作。仅仅为了兴趣:如果我想让RunMain只在二进制文件生成后执行一次,我需要做什么? (假设编译后二进制总是产生相同的输出) – Johannes

+0

我不知道我在追随。 RunMain只有在你想构建它时才能被执行(即构建)。它不是'ALL'目标的一部分,所以它不会自动生成。如果你想让事情自动化,你可以使用'add_custom_command'的原始方法将该命令作为后期构建事件。这样你就没有单独的目标;你不能“制造”它 - 你只需构建MyExe并在构建完成时运行该命令。这个命令就像'add_custom_command(TARGET MyExe POST_BUILD COMMAND $ > $ {MainOut} COMMENT“...”)'。 – Fraser

+0

同意,我们在这种情况下不需要单独的目标。但是如果我真的想要一个单独的,那可能吗? – Johannes