add_dependencies传递与add_subdirectory

时间:2016-05-03 12:05:24

标签: makefile cmake

我正在尝试遵循here从CMake中调用现有Makefile(构建静态库)的方法。

我的情况如下

  • 使用目录project/makefile_lib
  • 中的Makefile构建的静态库
  • 使用CMake构建的另一个库(cmake_lib)取决于目录makefile_lib中的project
  • 在目录cmake_lib
  • 中也使用project的可执行文件

CMakeLists.txt中的project内容如下所示。

project(cmake_makefile)
cmake_minimum_required(VERSION 2.8.12)

add_subdirectory(makefile_lib)

add_library(cmake_lib cmake_lib.c)

target_include_directories(cmake_lib
    PRIVATE makefile_lib
)

target_link_libraries(cmake_lib makefile_lib)

add_executable(main main.c)

target_link_libraries(main cmake_lib)

CMakeLists.txt

中的project/makefile_lib
add_custom_target(build_makefile_lib
    ALL
    COMMAND ${CMAKE_MAKE_PROGRAM}
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    COMMENT "makefile_lib makefile"
)

add_library(makefile_lib STATIC IMPORTED)
set_target_properties(makefile_lib
    PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/libmakefile_lib.a
)

add_dependencies(makefile_lib build_makefile_lib)

根据add_dependencies文档:

  

添加到IMPORTED目标的依赖关系会在其位置传递,因为目标本身不会构建。

从我调用的project目录

mkdir build
cd build/
cmake ..
make

但是project/makefile_lib中的Makefile永远不会被调用,并且构建会因cannot find -lmakefile-lib而失败。

有趣的是,如果我将project/makefile_lib的内容移动到project并将顶级add_subdirectory中的CMakeLists.txt命令替换为{{project/makefile_lib/CMakeLists.txt的内容,则此方法有效1}}。

为什么这个案例中的add_dependencies命令似乎没有传递过来?

1 个答案:

答案 0 :(得分:1)

问题在于add_library命令。从文档

  

目标名称在创建它的目录中具有范围   下面,但GLOBAL选项扩展了可见性。

所以解决方案是将GLOBAL选项添加到add_library

中的project/makefile_lib/CMakeLists.txt命令
add_custom_target(build_makefile_lib
    ALL
    COMMAND ${CMAKE_MAKE_PROGRAM}
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    COMMENT "makefile_lib makefile"
)

add_library(makefile_lib STATIC IMPORTED GLOBAL)
set_target_properties(makefile_lib
    PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/libmakefile_lib.a
)

add_dependencies(makefile_lib build_makefile_lib)

编辑:请注意,这不适用于CMake版本< = 2.8.7,其中GLOBAL标志尚不存在。有关可能的解决方法,请参阅here