我正在尝试使用ExternalProject_Add
框架在CMake中自动下载、编译和链接一个静态库。您可以找到库这里,但是这个问题可以应用于任何外部CMake项目。
以下是我问题的边界条件:
我能够通过硬编码来让它工作,但是我非常肯定我的解决方案不是优雅的,也不是可移植的。
这是我的项目结构
root
|---> CMakeList.txt
|
|---> external ---> CMakeList.txt
| |--> CMakeList.txt.inih.in
|
|---> src ---> CMakeList.txt
root/CMakeList.txt
add_subdirectory(external)
set(INIH_LIB_DIR ${CMAKE_CURRENT_BINARY_DIR}/external/inih-install/lib)
set(INIH_INC_DIR ${CMAKE_CURRENT_BINARY_DIR}/external/inih-install/include/inih)
set(INIH_LIBRARIES inih inihcpp)
message(STATUS "inih includes directory : ${INIH_LIB_DIR}")
message(STATUS "inih libraries directory : ${INIH_INC_DIR}")
add_subdirectory(src)
root/external/CMakeList.txt
configure_file(${PROJECT_SOURCE_DIR}/external/CMakeLists.txt.inih.in inih-download/CMakeLists.txt)
execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
RESULT_VARIABLE result
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/inih-download)
if (result)
message(FATAL_ERROR "CMake step for inih failed: ${result}")
endif ()
execute_process(COMMAND ${CMAKE_COMMAND} --build .
RESULT_VARIABLE result
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/inih-download)
if (result)
message(FATAL_ERROR "Build step for inih failed: ${result}")
endif ()
root/external/CMakeList.txt.inih.in
include(ExternalProject)
ExternalProject_Add(inih
GIT_REPOSITORY https://github.com/OSSystems/inih.git
GIT_TAG master
SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/inih-src"
BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/inih-build"
INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/inih-install"
CONFIGURE_COMMAND cmake -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/inih-install ${CMAKE_CURRENT_BINARY_DIR}/inih-src
BUILD_COMMAND ${MAKE}
INSTALL_COMMAND make install
TEST_COMMAND ""
)
root/src/CMakeList.txt
add_executable(test test.cpp)
target_include_directories(test PRIVATE ${INIH_INC_DIR})
target_link_directories(test PRIVATE ${INIH_LIB_DIR})
target_link_libraries(WagasciRecon ${INIH_LIBRARIES})
我的问题是:是否有一种更优雅、更便携的方法来实现这一点?
发布于 2020-11-29 07:53:49
感谢Tsyvarev的评论,我能够用一个更干净、更健壮的代码来实现同样的目标:
root/CMakeList.txt
set(INIH_PROJECT inih_project)
set(INIH_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/external/inih-install)
set(INIH_LIB_DIR ${INIH_INSTALL_DIR}/lib)
set(INIH_INC_DIR ${INIH_INSTALL_DIR}/include/inih)
add_library (inih STATIC IMPORTED)
set_target_properties (inih PROPERTIES IMPORTED_LOCATION ${INIH_LIB_DIR}/libinih.a)
target_include_directories(inih INTERFACE ${INIH_INC_DIR})
add_library (inihcpp STATIC IMPORTED)
set_target_properties(inihcpp PROPERTIES IMPORTED_LOCATION ${INIH_LIB_DIR}/libinihcpp.a)
target_include_directories(inihcpp INTERFACE ${INIH_INC_DIR})
set(INIH_LIBRARIES inih inihcpp)
message(STATUS "inih includes directory : ${INIH_INC_DIR}")
message(STATUS "inih libraries directory : ${INIH_LIB_DIR}")
...
add_subdirectory(external)
add_subdirectory(src)
root/external/CMakeList.txt
include(CMakeLists.txt.inih.in)
root/external/CMakeList.txt.inih.in
include(ExternalProject)
ExternalProject_Add(${INIH_PROJECT}
GIT_REPOSITORY https://github.com/OSSystems/inih.git
GIT_TAG master
PREFIX "${CMAKE_CURRENT_BINARY_DIR}/inih-prefix"
INSTALL_DIR "${INIH_INSTALL_DIR}"
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
BUILD_COMMAND ${MAKE}
INSTALL_COMMAND make install
TEST_COMMAND ""
)
root/src/CMakeList.txt
add_executable(test test.cpp)
target_link_libraries(test ${INIH_LIBRARIES})
更新
如果将上面的解决方案应用到一个新的构建目录中,就会遇到像Imported target "inih" includes non-existent path
这样的错误,这个错误可以像这里那样处理。
https://stackoverflow.com/questions/64999518
复制相似问题