CMake:如何设置从可执行文件到自定义目标的依赖关系

时间:2013-01-20 20:11:55

标签: dependencies cmake

我在使用cmake 2.8.1的Linux环境中使用CMake。我也尝试了cmake 2.8.7,结果相同。

我需要对存档(静态库)进行一些特殊的调节。这是作为cmake custom_command完成的。结果是应该在可执行文件的链接中使用的新存档。条件的输入存档也是一个cmake目标。

我需要的是存档的条件版本和可执行文件之间的依赖关系。使用add_dependencies不起作用,我不明白为什么。

我创建了一个显示cmake行为的示例。该示例包含2个C文件,一个用于存档,另一个包含main()。作为简单的存档条件,我只需复制以前生成的存档。

以下是2个源文件:

main.c中:

int myPrint(void);

int main(void)
{
  myPrint();
}

mylib.c:

#include <stdio.h>

int myPrint(void)
{
  printf("Hello World\n");
}

这是我创建的CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)

project(cmake_dependency_test)

add_library(mylib STATIC mylib.c)

add_custom_command(OUTPUT libmylib_conditioned.a
                   COMMAND cp libmylib.a libmylib_conditioned.a
                   DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/libmylib.a
                   COMMENT "Conditioning library")
add_custom_target(conditioning DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/libmylib_conditioned.a)
add_dependencies(conditioning mylib)

add_executable(cmake_dependency_test main.c)
add_dependencies(cmake_dependency_test conditioning)
target_link_libraries(cmake_dependency_test -L. mylib_conditioned)

首先,我创建了存档mylib。使用add_custom_command我进行条件化,add_custom_target为条件存档提供顶级目标。由于我需要在构建条件存档之前更新输入存档,因此我在输入存档顶级目标和条件存档顶级目标之间添加了依赖关系。这很完美!当我触摸mylib.c并运行make conditioning时,将构建输入存档,然后构建条件存档。

确定。现在我使用条件存档进行链接。为了从可执行文件到条件存档具有依赖性,我再次使用add_dependencies。但是触摸库源mylib.c然后运行make将不会按预期更新可执行文件。

CMakeLists.txt中的错误在哪里?

1 个答案:

答案 0 :(得分:2)

您可以尝试为目标 cmake_dependency_test 设置目标属性LINK_DEPENDS

...
add_executable(cmake_dependency_test main.c )  
set_property(TARGET cmake_dependency_test PROPERTY LINK_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/libmylib_conditioned.a)  
add_dependencies(cmake_dependency_test conditioning mylib)
target_link_libraries(cmake_dependency_test -L. mylib_conditioned)