添加的最佳方法是将根项目的目录添加到CMake中的子目录中

时间:2016-05-20 08:23:07

标签: cmake

我在根目录中有一个CMakeLists.txt的项目,其中包含test/子目录中使用add_subdirectory并带有标记EXCLUDE_FROM_ALL的项目。测试需要父项目的所有include目录。最优雅的方法是什么?

的CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 3.1)
SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules")

PROJECT(autoffi CXX)

SET(CMAKE_CXX_STANDARD 11)

SET(AutoFFI_VERSION_MAJOR 0)
SET(AutoFFI_VERSION_MINOR 1)

SET(Boost_USE_STATIC_LIBS OFF)
FIND_PACKAGE(BOOST 1.50 COMPONENTS system filesystem REQUIRED) 

FIND_PACKAGE(LLVM 3.9 REQUIRED CONFIG)
ADD_DEFINITIONS(${LLVM_DEFINITIONS})

FIND_PACKAGE(Clang REQUIRED)

CONFIGURE_FILE(
  "${PROJECT_SOURCE_DIR}/include/env.h.in"
  #"${PROJECT_BINARY_DIR}/include/env.h"
  "${PROJECT_SOURCE_DIR}/include/env.h" # added to VCS
)

INCLUDE_DIRECTORIES(
  #"${PROJECT_BINARY_DIR}"
  "${PROJECT_SOURCE_DIR}/include"
  "${CLANG_INCLUDE_DIRS}"
  "${Boost_INCLUDE_DIRS}"
)

# The C++ interface
ADD_LIBRARY(autoffiCore src/Type.cpp)
# FIXME: boost package finder seems to be broken
TARGET_LINK_LIBRARIES(autoffiCore boost_filesystem boost_system)
ADD_LIBRARY(autoffiBin src/BinFormat.cpp)
TARGET_LINK_LIBRARIES(autoffiBin autoffiCore)
ADD_LIBRARY(autoffiClang src/ClangEngine.cpp)
llvm_map_components_to_libnames(llvm_libs all)
TARGET_LINK_LIBRARIES(autoffiClang autoffiCore ${llvm_libs} ${CLANG_LIBS})

# The C interface
ADD_LIBRARY(autoffi src/PrettyPrinter.cpp src/libautoffi.cpp)
TARGET_LINK_LIBRARIES(autoffi autoffiBin autoffiClang)

set_target_properties(autoffiCore autoffiBin autoffiClang autoffi PROPERTIES DEFINE_SYMBOL BUILDING_SHARED)

# CLI Tools

ADD_EXECUTABLE(afdump src/dump.cpp src/PrettyPrinter.cpp)
TARGET_LINK_LIBRARIES(afdump autoffiBin)

ADD_EXECUTABLE(afconvert src/convert.cpp)
TARGET_LINK_LIBRARIES(afconvert autoffiBin)

ADD_EXECUTABLE(afcompile src/tooling.cpp src/PrettyPrinter.cpp)
TARGET_LINK_LIBRARIES(afcompile autoffiClang ${CLANG_LIBS} autoffiBin)

# Testing

ENABLE_TESTING()
ADD_TEST(headerASTDump afcompile test/assets/basic.h)

测试/的CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

project("AutoFFI Tests")

SET(CMAKE_CXX_STANDARD 11)

SET(GTEST_ROOT "${CMAKE_CURRENT_LIST_DIR}/gtest")
find_package(GTest REQUIRED)
INCLUDE_DIRECTORIES(${AUTOFFI_INCLUDE_DIRS} ${GTEST_INCLUDE_DIRS})

ADD_EXECUTABLE(autoffiTest libautoffi.cpp core.cpp formats.cpp clang.cpp)
TARGET_LINK_LIBRARIES(autoffiTest ${GTEST_BOTH_LIBRARIES})
SET_TARGET_PROPERTIES(autoffiTest PROPERTIES OUTPUT_NAME runtests)

2 个答案:

答案 0 :(得分:1)

如果您正在使用include_directories()添加目录,则这些目标应向下传播到test subdir中的目标。请注意,相对路径是相对于当前源dir:

  

include_directories:向构建添加包含目录。    include_directories([AFTER | BEFORE] [SYSTEM] dir1 dir2 ...)   将给定目录添加到编译器用于搜索包含文件的目录。相对路径被解释为相对于当前源目录。

cmake docs

答案 1 :(得分:1)

您将主目录和子目录测试保存在完全独立的项目中。我想你是通过单独调用cmake并再次进行构建测试。毫不奇怪,您的主项目include_directories对测试项目没有影响。

你提到命令add_subdirectory,(应该用来包括你的主目录中的test)但你实际上并没有使用它......