2015-09-29 4 views
0

Я хотел бы построить xerces-c как статическую библиотеку на окнах, используя внешний вид cmake ExternalProject. Однако для этого мне нужно добавить в проект определение препроцессора XERCES_STATIC_LIBRARY. В linux мне кажется, что я могу сделать это достаточно легко с файлом патча, но я не уверен, как это сделать в Windows.Добавить препроцессор определить для внешнего проекта cmake

Вот мой текущий 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) 
+0

'ExternalProject_Add' не предоставляет функциональность над командной строкой. Поскольку у вас есть решение VS, оно уже * настроено *, поэтому определения компилятора могут быть добавлены только путем исправления. – Tsyvarev

ответ

1

переход от Devenv к msbuild командной строки секретный соус. Он намного более мощный, и вы можете определить константы, используя /property:DefineConstants=XERCES_STATIC_LIBRARY. ОСТОРОЖНО: он сдует другие константы, определяемые в файлах проекта ... но вы не были бы глупыми, чтобы определить константы в файле .vcxproj в сборке cmake, не так ли?

Так или иначе, вот полное решение для построения xerces-c на окнах. Обратите внимание, что для статической сборки они используют (покинутые Богом) пространства в своем имени конфигурации. Самое простое решение - заменить их символами подчеркивания и продолжительностью жизни. Я использовал the find and replace text (FART) tool.

Кроме того, я делал сборку библиотеки времени выполнения 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) 
Смежные вопросы