2014-10-14 3 views
1

Я хочу создать внешний проект CMake с помощью MSBuild. Но я также хочу построить подмножество решения для внешних проектов. Так что в основном это выглядитCMake ExternalProject_Add: Как создать несколько целей msbuild?

ExternalProject_Add(MyExternalProject 
    PREFIX ${CMAKE_BINARY_DIR}/External/myproject 
    GIT_REPOSITORY ... 
    CONFIGURE_COMMAND ... 
    BUILD_COMMAND msbuild /p:Configuration=Release /target:TargetA;TargetB /m Project.sln 
) 

К сожалению CMake всегда заменяет ; с пространством и, следовательно, MSBuild жалуется, что было дано более одного файла проекта (* .sln).

Я пробовал все: цитируя аргументы, ставя целую команду сборки в переменную, избегая точки с запятой ... ничего не работало.

Первоначально я также попытался построить с CMake --build -параметром без успеха.

+0

https://www.mail-archive.com/[email protected]/msg16813.html намекает, что вам нужно как цитаты и побег. – IdeaHat

+0

Я не нашел способ передать несколько целей в CMake build '--target'-parameter. –

+0

@IdeaHat, я прочитал сообщение, но я до сих пор не уверен, что мне следует избегать - ';' или '' '. –

ответ

0

Если вы разделяете цели запятыми вместо запятой это работает:

BUILD_COMMAND msbuild /p:Configuration=Release /target:TargetA,TargetB /m Project.sln 
2

Вы можете добавить еще одну инструкцию сборки для BUILD_COMMAND вариант:

ExternalProject_Add(
    MyExternalProject 
    ... 
    BUILD_COMMAND "${CMAKE_COMMAND}" --build . --target TargetA 
    COMMAND "${CMAKE_COMMAND}" --build . --target TargetB 
) 
+0

Это работает. Но я получаю лучший параллелизм сборки проекта при указании целей в один вызов msbuild. –

0

Вы можете заменить «;» в строке с другим разделителем списков, на который не влияет CMake, например.

ExternalProject_Add(MyExternalProject 
    PREFIX ${CMAKE_BINARY_DIR}/External/myproject 
    GIT_REPOSITORY ... 
    CONFIGURE_COMMAND ... 
    LIST_SEPARATOR ^^ 
    BUILD_COMMAND msbuild /p:Configuration=Release /target:TargetA^^TargetB /m Project.sln 
) 

«^^» затем заменяется точкой с запятой для выполнения.

Я нашел этот ответ здесь: https://cmake.org/pipermail/cmake/2012-February/049148.html

Смежные вопросы