CMake:如何创建包含生成的包含文件的路径

时间:2014-11-29 04:42:59

标签: cmake

我有一个包含大约600个目录的项目,其中包含大约十二个库和几十个程序的源代码。某些程序依赖于从文本文件生成的C ++头文件。

如何干净地告诉CMake如何将生成的头文件的路径包含到需要它的源文件的include路径中?

或者,在CMake尝试编译这些程序之前,如何强制将生成的文件安装到已知位置? (这个想法基于当前的Makefile系统,该系统生成标头并将其安装到/ include目录中,所有源文件都可以在其中找到它。)

还是有其他选择吗?

- 编辑:添加了“玩具”示例 -

此示例不起作用。我需要一种方法来告诉prog1和prog2在哪里找到home.h。

我的树:

.
|-- prog1/
|   |-- CMakeLists.txt
|   `-- prog1.cpp
|-- prog2/
|   |-- CMakeLists.txt
|   `-- prog2.cpp
`-- share/
    `-- dict/
        |-- CMakeLists.txt
        `-- gen.sh*

在share / dict中:

cmake_minimum_required(VERSION 2.8.4)
project(dict)

set(SRC foo.c)
set(HEADERS foo.h home.h)

add_custom_target(home
  ALL
  DEPENDS ${CMAKE_INSTALL_PREFIX}/include/home.h
)

add_custom_command(
  OUTPUT ${CMAKE_INSTALL_PREFIX}/include/home.h
  COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/gen.sh gen.sh
  COMMAND gen.sh ${CMAKE_INSTALL_PREFIX}
)

add_library(dict ${SRC})

install(TARGETS dict DESTINATION lib)
install(FILES ${HEADERS} DESTINATION include)

在prog1中(类似于prog2):

cmake_minimum_required(VERSION 2.8.4)
project(prog1)
add_executable(prog1 prog1.cpp)
target_link_libraries(prog1 dict)
install(TARGETS prog1 DESTINATION bin)

2 个答案:

答案 0 :(得分:5)

之后

add_library(dict ${SRC})

添加

target_include_directories(dict 
    # The location of the headers before installation 
    $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
    # The location of the headers after installation
    $<INSTALL_INTERFACE:include>
)

并阅读我在评论中提供的链接。

答案 1 :(得分:2)

将生成的文件输出到源外构建目录中是一种预期的方法。

使用CMAKE_BINARY_DIRCMAKE_CURRENT_BINARY_DIR作为输出前缀和include_directories()参数。