gpt4 book ai didi

cmake - 如何以跨平台的方式使用 CMake ExternalProject_Add 或替代品?

转载 作者:行者123 更新时间:2023-12-03 08:49:28 35 4
gpt4 key购买 nike

我想构建一个第三方项目,该项目已经将 CMake 作为我项目的 CMake strip 的一部分。 ExternalProject_Add 就是为了这个目的,但我发现它只能与特定的生成器一起工作,我希望它可以轻松地在许多平台上工作。

例如,这是我的外部项目,为 zlib 添加了一个脚本,它有自己的 CMakeLists.txt:

set(USE_PROJECT_CMAKE_MODULE_PATH "-DCMAKE_MODULE_PATH=${MAKE_MODULE_PATH}")
ExternalProject_Add(ZLIB
SOURCE_DIR ${CMAKE_SOURCE_DIR}/external/zlib
DOWNLOAD_COMMAND ""
UPDATE_COMMAND ""
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
${USE_PROJECT_CMAKE_MODULE_PATH}
INSTALL_COMMAND "")

ExternalProject_Add_Step(ZLIB installInternally
COMMAND cd <BINARY_DIR> && make install
DEPENDEES install
ALWAYS 1)
ExternalProject_Get_Property(ZLIB install_dir)

if(UNIX)
set(ZLIB_NAME libz)
else(UNIX)
set(ZLIB_NAME zlib)
endif(UNIX)

add_library(zlib UNKNOWN IMPORTED)
set_property(TARGET zlib PROPERTY IMPORTED_LOCATION ${install_dir}/lib/${ZLIB_NAME}.a)
set(ZLIB_LIBRARIES zlib)
set(ZLIB_LIBRARIES_OPTIONAL ${ZLIB_LIBRARIES})
set(ZLIB_DIR ${install_dir} CACHE INTERNAL "zlib ROOT dir")
set(ZLIB_INCLUDE_DIRS ${install_dir}/include CACHE INTERNAL "zlib include dirs")
set(ZLIB_DEFINES "-msse2 -mfpmath=sse" CACHE INTERNAL "zlib defines")

问题在于它适用于 make,但不适用于 Xcode 或 Visual Studio。也许有某种方法可以将传递给我的项目的 CMake 构建命令转发给 ExternalProject_Add。

如何以最小的代码复杂性以跨平台的方式编写 ExternalProject_Add 调用,或者有更好的选择吗?

最佳答案

问题

-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}

这对于单配置项目来说已经足够了。但是对于Xcode和Visual Studio,需要设置 CMAKE_CONFIGURATION_TYPES加电 build . --config在构建阶段。见 my answer .
COMMAND cd <BINARY_DIR> && make install

当然,这仅适用于 Makefile 生成器。要跨平台,您可以使用:
--build . --target install --configINSTALL_COMMANDExternalProject_Add .

看看 this template file ,特别是 the following lines :
ExternalProject_Add(
"${current_project}"
URL
@HUNTER_PACKAGE_URL@
URL_HASH
SHA1=@HUNTER_PACKAGE_SHA1@
DOWNLOAD_DIR
"@HUNTER_PACKAGE_DOWNLOAD_DIR@"
SOURCE_DIR
"@HUNTER_PACKAGE_SOURCE_DIR@"
INSTALL_DIR
"@HUNTER_PACKAGE_INSTALL_PREFIX@"
# Not used, just avoid creating Install/<name> empty directory
BUILD_COMMAND ""
# This command is empty because all necessary targets will
# be built on install stage
CMAKE_ARGS
"-G@CMAKE_GENERATOR@"
"-C@HUNTER_CACHE_FILE@"
"-C@HUNTER_ARGS_FILE@"
"-D${postfix_name}=${${postfix_name}}"
"-DCMAKE_BUILD_TYPE=${configuration}"
"-DCMAKE_CONFIGURATION_TYPES=${configuration}"
"-DCMAKE_INSTALL_PREFIX=@HUNTER_PACKAGE_INSTALL_PREFIX@"
"-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}"
INSTALL_COMMAND
"@CMAKE_COMMAND@"
--build .
--target install
--config ${configuration}
--
${jobs_option}
)

选择

or is there a better alternative?



你看到了吗 Hunter ?

您可以像 this 一样添加 zlib :
hunter_add_package(ZLIB)
find_package(ZLIB CONFIG REQUIRED)
target_link_libraries(... ZLIB::zlib)

此代码适用于任何地方。第三方依赖将在配置步骤中自动下载。使用不同生成器/工具链构建的示例( build.py 只是设置 CMAKE_TOOLCHAIN_FILE-G/ -B 的 CMake 包装器):
build.py --toolchain mingw --config Release # MinGW Makefiles
build.py --toolchain vs-12-2013 --config Debug # Visual Studio 12 2013
build.py --toolchain xcode --config Release # Xcode
build.py --toolchain libcxx --config Release # Makefile with -stdlib=libc++ toolchain
build.py --toolchain ios-8-2 --config Release # Xcode with iOS SDK 8.2 toolchain

您可以完全控制什么 options , build typesnumber of jobs您希望在构建第三方包时拥有。例如,您可以通过以下方式为 zlib 构建四种类型:Debug、Release、MinSizeRel 和 RelWithDebInfo,并将 MinSizeRel 链接到当前项目:
> build.py --toolchain xcode --verbose --config MinSizeRel --fwd "HUNTER_CONFIGURATION_TYPES=Release;Debug;MinSizeRel;RelWithDebInfo"
/.../clang /.../lib/libz-MinSizeRel.a ... -o /.../_builds/xcode/MinSizeRel/foo

> ls -la /.../.hunter/_Base/d1232c0/326318e/37e4682/Install/lib/libz*
99056 /.../.hunter/_Base/d1232c0/326318e/37e4682/Install/lib/libz-MinSizeRel.a
307872 /.../.hunter/_Base/d1232c0/326318e/37e4682/Install/lib/libz-RelWithDebInfo.a
109536 /.../.hunter/_Base/d1232c0/326318e/37e4682/Install/lib/libz.a
258904 /.../.hunter/_Base/d1232c0/326318e/37e4682/Install/lib/libzd.a

关于cmake - 如何以跨平台的方式使用 CMake ExternalProject_Add 或替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16842218/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com