簡體   English   中英

CMake:生成或提取共享庫所需的頭

[英]CMake: generate or extract header necessary for shared lib

我目前正在開展一個沒有維護的大型項目。

解釋它試圖使用CMake但不是很直觀。 可以在頂級CMakeList中設置一個標志,而不是包含來自每個子模塊的共享庫和標頭,該標志觸發add_subdirectory,潛入頂層CMAKE_BUILD_DIR並安裝到其中。 這些CMakeLists僅使用glob RECUSE來查找所有源,並且大多數操作不是基於目標的,而是全局的。 因此主要目標正確編譯。 這是主CMakeList的一小部分

set(MY_BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
set(MY_SOURCE_BASE_DIR "${MY_BASE_DIR}/myproject")

# includes
include(build/global.cmake)
#include(externalLibs/mz-cmaketools-master/global.cmake)


# configuration options
option(MOD1 "" ON)
option(MOD2 "" ON)
option(MOD3 "" OFF)
option(MOD4 "" OFF)
option(MOD5 "" ON)
option(MOD6 "" OFF)
option(MOD7 "" ON)

message("-- Building myproject unit-tests - ${ENABLE_MYPROJECT_TEST}")
set(CMAKE_ECLIPSE_MAKE_ARGUMENTS "-j4")

if(MOD1)
    message(STATUS "Building viral_core + viral_recon")
    add_subdirectory(${MY_BASE_DIR}/externalLibs/viral/trunk/linux)


include_directories(${MY_BASE_DIR}/externalLibs/viral/trunk/source/)
    else(MOD1)
        if(MOD3)
            message(WARNING "Building viral_core + viral_recon")
            add_subdirectory(${MY_BASE_DIR}/externalLibs/viral/trunk/linux)
            include_directories(${MY_BASE_DIR}/externalLibs/viral/trunk/source/)
        endif(MOD3)
    endif(MOD1)

# external libraries
include(${MY_BASE_DIR}/externalLibs.cmake)


include_directories(
  ${MY_BASE_DIR}
  ${MY_SOURCE_BASE_DIR}
  ${MY_BASE_DIR}/externalLibs/viral/trunk/source/
)


# depending on the supported robots we have different dependencies
if( MOD1 ) 
        set(OPT1 TRUE)
endif()

...

# collect binaries
set(LIBRARY_OUTPUT_PATH ${MY_BASE_DIR} CACHE PATH "Library output path")
set(EXECUTABLE_OUTPUT_PATH ${MY_BASE_DIR} CACHE PATH "Executable output path")
message("-- Setting executable output path: ${EXECUTABLE_OUTPUT_PATH}")
message("-- Setting library output path   : ${LIBRARY_OUTPUT_PATH}")


# collect sources

file(GLOB MY 
    "${MY_SOURCE_BASE_DIR}/*.h"
    "${MY_SOURCE_BASE_DIR}/*.cpp"
)
source_group(base FILES ${MY_BASE})#

file(GLOB MY_UTIL 
    "${MY_SOURCE_BASE_DIR}/util/*.h"
    "${MY_SOURCE_BASE_DIR}/util/*.cpp"
)
source_group(util FILES ${MY_UTIL})

file(GLOB_RECURSE MY_KINEMATICS 
    "${MY_SOURCE_BASE_DIR}/kinematics/*.h"
    "${MY_SOURCE_BASE_DIR}/kinematics/*.cpp"
) 
source_group(kinematics FILES ${MY_KINEMATICS})

file(GLOB MY_COLLISION
    "${MY_SOURCE_BASE_DIR}/collision/pqp/*.cpp"
    "${MY_SOURCE_BASE_DIR}/collision/PQP*.cpp"
)
source_group(collision FILES ${MY_COLLISION})
...
add_library(MY SHARED
    ${MY_COLLISION}
    ${MY_UTIL}
    ${MY_KINEMATICS}
    ...}
)
....

最后,該項目構建了幾個庫,但沒有發布所需的頭文件來使用它們。 這些庫被放入構建目錄的頂層。 (沒有安裝步驟)

是否有可能使CMake導出lib(目標)的包含頭。 更准確地說,這些標題應該只位於源文件夾及其下方; 來自/ usr / ...的標題不應該被考慮。 此外,如果標題合並為一個標題,則可以接受。 但是從~1700標題只有~40是相關的,所以一個簡單的發現RECURSE對我來說似乎不夠。

我確實看過GENERATE_EXPORT_HEADER,但不認為這就是我想要的。 我沒有權限更改項目,因此我想對SVN存儲庫進行修補,並且不想制作存儲庫的另一個副本,因為有大約10個不同的使用。

我將不勝感激任何有關解決方案或戰略的提示

這是我關於stackoverflow的第一個問題,所以請憐憫:)

我希望我能正確理解你的問題。

我通常使用CMakePackageConfigHelpers為lib生成cmake配置文件,如果正確完成,那么好的事情是CMake設置傳遞依賴關系並在使用包配置鏈接庫時自動包含目錄。

然后,可以使用install命令將目標,目錄,包含文件復制到CMAKE_INSTALL_PREFIX目錄,或通過CPack復制到存檔。

在宣布我的目標后,我通常會有以下內容:

install(TARGETS MyLibrary
    LIBRARY DESTINATION lib
)

include(CMakePackageConfigHelpers)

write_basic_package_version_file(
    "${GENERATED_DIR}/MyLibraryConfigVersion.cmake" COMPATIBILITY SameMajorVersion
)

configure_package_config_file(
    "cmake/Config.cmake.in" 
    "${GENERATED_DIR}/MyLibraryConfig.cmake"
    INSTALL_DESTINATION "cmake"
)

install(FILES 
    inc/someHeader.h
    inc/someHeaderB.h
    DESTINATION include/MyLibrary
)

install(FILES 
    "${GENERATED_DIR}/MyLibraryConfig.cmake" 
    "${GENERATED_DIR}/MyLibraryConfigVersion.cmake" 
    DESTINATION "cmake"
)

然后,您可以將CMAKE_INSTALL_PREFIX設置為您選擇的目錄並運行make install ,創建以下結構:

InstallationDir
├── cmake
│   ├── MyLibraryConfig.cmake
│   └── MyLibraryConfigVersion.cmake
├── include
│   └── MyLibrary
│       ├── someHeaderB.h
│       └── someHeader.h
└── lib
    └── MyLibrary.so

然后,您可以在CONFIG模式下使用find_package在鏈接MyLibrary.so時自動設置包含目錄,編譯選項等。

只是一個提示: target_include_directories函數比include_directoriesinclude_directories 如果您不使用它,我不確定配置文件生成的效果如何。 也看看下面的功能在你的目標更先進的控制: set_target_propertiestarget_link_librariestarget_compile_definitions

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM