添加预处理器定义到cmake外部项目
add preprocessor define to cmake external project
我想使用cmake ExternalProject在windows上构建xerces-c作为静态库。然而,要做到这一点,我需要将XERCES_STATIC_LIBRARY预处理器定义添加到项目中。在linux上,我似乎可以很容易地用一个补丁文件,但我不确定如何在windows上做到这一点。
这是我当前的CMakeLists.txt:
cmake_minimum_required(VERSION 3.0.0 FATAL_ERROR)
PROJECT(xercesc)
SET(TARGET_NAME xercesc)
IF(WIN32)
# find the msvc version
if(${MSVC_VERSION} EQUAL 1400)
SET(VC_PROJ_DIR VC8)
elseif(${MSVC_VERSION} EQUAL 1500)
SET(VC_PROJ_DIR VC9)
elseif(${MSVC_VERSION} EQUAL 1600)
SET(VC_PROJ_DIR VC10)
elseif(${MSVC_VERSION} EQUAL 1700)
SET(VC_PROJ_DIR VC11)
elseif(${MSVC_VERSION} EQUAL 1800)
SET(VC_PROJ_DIR VC12)
endif(${MSVC_VERSION} EQUAL 1400)
include(ExternalProject)
ExternalProject_Add(
${TARGET_NAME}
URL ${CMAKE_CURRENT_SOURCE_DIR}/xerces-c-${XERCESC_VERSION}.tar.gz
DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/xercesc
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/xercesc
CONFIGURE_COMMAND ""
BUILD_COMMAND Devenv "${CMAKE_CURRENT_SOURCE_DIR}/xercesc/projects/Win32/${VC_PROJ_DIR}/xerces-all/xerces-all.sln" /build Release
INSTALL_COMMAND ""
BUILD_IN_SOURCE 1
)
ENDIF(WIN32)
从Devenv
切换到msbuild
命令行是秘笈。它更强大,你可以使用/property:DefineConstants=XERCES_STATIC_LIBRARY
定义常量。注意:它会忽略项目文件中定义的其他常量…但你不会傻到在cmake构建的.vcxproj文件中定义常量,你会吗?
无论如何,这里是在windows上构建exercise -c的完整解决方案。注意,对于静态构建,它们在配置名中使用(上帝抛弃的)空格。最简单的解决办法就是用下划线代替它们,继续生活。我使用了查找和替换文本(FART)工具。
此外,我正在做一个DLL运行时库构建,所以我替换了所有的/MT选项。
cmake_minimum_required(VERSION 3.0.0 FATAL_ERROR)
PROJECT(xercesc)
SET(TARGET_NAME xercesc)
IF(WIN32)
# find the msvc version
if(${MSVC_VERSION} EQUAL 1400)
SET(VC_PROJ_DIR VC8)
elseif(${MSVC_VERSION} EQUAL 1500)
SET(VC_PROJ_DIR VC9)
elseif(${MSVC_VERSION} EQUAL 1600)
SET(VC_PROJ_DIR VC10)
elseif(${MSVC_VERSION} EQUAL 1700)
SET(VC_PROJ_DIR VC11)
elseif(${MSVC_VERSION} EQUAL 1800)
SET(VC_PROJ_DIR VC12)
endif(${MSVC_VERSION} EQUAL 1400)
# Use FART to replace spaces in the project files, ugh. FART requires windows style slashes.
SET(XERCES_SOLUTION_DIR ${CMAKE_CURRENT_SOURCE_DIR}/xercesc/projects/Win32/${VC_PROJ_DIR}/xerces-all)
SET(XERCES_SOLUTION "${XERCES_SOLUTION_DIR}/xerces-all.sln")
SET(XERCES_SOLUTIONS "${XERCES_SOLUTION_DIR}/*.sln")
SET(XERCES_PROJECTS "${XERCES_SOLUTION_DIR}/*.vcxproj")
SET(XERCES_LIB_PROJECT "${XERCES_SOLUTION_DIR}/XercesLib/XercesLib.vcxproj")
STRING(REGEX REPLACE "/" "\\" XERCES_SOLUTIONS_WIN ${XERCES_SOLUTIONS})
STRING(REGEX REPLACE "/" "\\" XERCES_PROJECTS_WIN ${XERCES_PROJECTS})
include(ExternalProject)
ExternalProject_Add(
${TARGET_NAME}
DEPENDS fart
URL ${CMAKE_CURRENT_SOURCE_DIR}/xerces-c-${XERCESC_VERSION}.tar.gz
DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/xercesc
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/xercesc
PATCH_COMMAND ${FART_DIR}/bin/$<CONFIGURATION>/fart.exe -v -r --svn -- ${XERCES_SOLUTIONS_WIN},${XERCES_PROJECTS_WIN} "Static " Static_
COMMAND ${FART_DIR}/bin/$<CONFIGURATION>/fart.exe -v -r --svn -- ${XERCES_SOLUTIONS_WIN},${XERCES_PROJECTS_WIN} <RuntimeLibrary>MultiThreaded</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
COMMAND ${FART_DIR}/bin/$<CONFIGURATION>/fart.exe -v -r --svn -- ${XERCES_SOLUTIONS_WIN},${XERCES_PROJECTS_WIN} <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
CONFIGURE_COMMAND ""
BUILD_COMMAND msbuild ${XERCES_LIB_PROJECT} /m /property:Configuration=Static_Release,Platform=x64 /property:DefineConstants=XERCES_STATIC_LIBRARY
COMMAND msbuild ${XERCES_LIB_PROJECT} /m /property:Configuration=Static_Debug,Platform=x64 /property:DefineConstants=XERCES_STATIC_LIBRARY /property:DefineDebug=true
INSTALL_COMMAND ""
BUILD_IN_SOURCE 1
)
SET(LIBRARIES debug ${CMAKE_CURRENT_SOURCE_DIR}/xercesc/Build/Win64/${VC_PROJ_DIR}/Static_Debug/xerces-c_static_3D.lib)
SET(LIBRARIES ${LIBRARIES} optimized ${CMAKE_CURRENT_SOURCE_DIR}/xercesc/Build/Win64/${VC_PROJ_DIR}/Static_Release/xerces-c_static_3.lib)
SET(INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/xercesc/src/)
ELSE(WIN32)
相关文章:
- 使外部项目可用于find_package CMake
- CMake 无法链接外部库
- 如何将外部依赖引入跨平台CMake项目?
- 使用带有 CMake 和 Conan 的外部库的未定义引用
- 使用 cmake 获取外部依赖关系
- CMake 外部和内部静态库的循环依赖关系
- CMake用于C++/Qt项目中的外部库
- 'cmake'不被识别为内部或外部命令 - 北极星
- 将外部C++库与 CMake 一起使用时出错
- 在 CMake 中链接外部 HDFql 库
- cmake 无法查找外部库(提升)目录
- 在 Android Studio 中使用 NDK、Gradle 和 CMake 链接外部库
- 通过 CMake 将外部库包含在 CLion 项目中
- cmake 添加外部已构建的库
- 链接导入的库与CMAKE外部项目
- 使用 CMake 外部项目为跨平台库依赖项的目标名称
- 如何为 CMAKE 外部项目指定编译器
- CMAKE:外部项目更新和离线工作
- 添加预处理器定义到cmake外部项目
- 取决于CMake外部项目的INSTALL目标