Использование как CMAKE_INSTALL_PATH, так и генератора CPack WiX

Я пытаюсь сгенерировать msi-пакет с помощью CPack WiX Generator.

В моем CMakeLists.txt CMAKE_INSTALL_PREFIX установлено на "C:/Program Files/My Project". Мне нужен полный путь, потому что от него зависит значительная часть исходного кода проекта. Также я разбил проект на несколько компонентов, один из которых называется core.

Я успешно создаю решение Visual Studio с помощью cmake-gui. Но когда я пытаюсь собрать проект PACKAGE, я получаю следующую ошибку:

53>EXEC : CPack error : Problem creating temporary directory: D:/Projects/build-Project-MSVC2015/_CPack_Packages/win64/WIX/project-2.3.0-20.AMD64/coreC:/Program Files/My Project

Та же ошибка возникает, когда я оставляю CMAKE_INSTALL_PREFIX пустым. В этом случае эта переменная по умолчанию инициализируется значением "C:/Program Files/Project_Name", а ошибка будет:

53>EXEC : CPack error : Problem creating temporary directory: D:/Projects/build-Project-MSVC2015/_CPack_Packages/win64/WIX/project-2.3.0-20.AMD64/coreC:/Program Files/Project_Name

Только когда я установил CMAKE_INSTALL_PREFIX на My Project (без добавления C:/ или /) все работает хорошо. Каталог создается как D:/Projects/build-Project-MSVC2015/_CPack_Packages/win64/WIX/project-2.3.0-20.AMD64/coreMy Project и создается msi-пакет.

Кажется, что CPack пытается make DESTDIR="D:/Projects/build-Project-MSVC2015/_CPack_Packages/win64/WIX/project-2.3.0-20.AMD64/core" установить в качестве промежуточного шага, но, как указано в документация по cmake:

ВНИМАНИЕ: DESTDIR нельзя использовать в Windows, поскольку префикс установки обычно содержит букву диска, как в «C: / Program Files», к которой нельзя добавить какой-либо другой префикс.

Могу ли я неправильно понять использование CMAKE_INSTALL_PREFIX с генератором CPack WiX? Или это специфично для Visual Studio? Или есть обходной путь для этой проблемы, например, заставить DESTDIR быть пустым (да, я знаю, что это опасно)?


person Igor Gorbunov    schedule 02.06.2017    source источник


Ответы (1)


Я действительно несколько неправильно понял использование CPack. Прочитав некоторую информацию о CPack, мне удалось создать msi-пакет следующим образом.

Для установки пакетов на базе Windows я отключил использование DESTDIR, установив CPACK_SET_DESTDIR на ЛОЖЬ.

Как указано в документации cmake на CPACK_SET_DESTDIR:

Наиболее заметное отличие состоит в том, что без CPACK_SET_DESTDIR CPack использует CPACK_PACKAGING_INSTALL_PREFIX в качестве префикса, тогда как с установленным CPACK_SET_DESTDIR CPack будет использовать CMAKE_INSTALL_PREFIX в качестве префикса.

То есть я должен установить для переменной CPACK_PACKAGING_INSTALL_PREFIX соответствующее значение.

Если я установлю CPACK_PACKAGING_INSTALL_PREFIX в непустое значение, например. г. до /My Project (обратите внимание на начальный /), CPack добавит это к C:/Program files/${CPACK_PACKAGE_INSTALL_DIRECTORY}. CPACK_PACKAGE_INSTALL_DIRECTORY, в свою очередь, по умолчанию "${CPACK_PACKAGE_NAME} ${CPACK_PACKAGE_VERSION}". Полный путь установки будет C:/Program Files/my-project 1.0.0/My Project, если я установлю CPACK_PACKAGE_NAME на "my-project" и CPACK_PACKAGE_VERSION на 1.0.0.

Итак, чтобы создать msi-пакет, который установит программу на C:\Program files\My Project, я использую следующие строки в CMakeLists.txt:

SET(CMAKE_INSTALL_PREFIX "C:/Program Files/My Project" CACHE PATH "Install path" FORCE)
...
SET(CPACK_SET_DESTDIR FALSE)
SET(CPACK_PACKAGE_INSTALL_DIRECTORY "My Project")
SET(CPACK_PACKAGING_INSTALL_PREFIX "")

Генератор WiX CPACK_PACKAGE_INSTALL_DIRECTORY может не содержать полный путь, поэтому SET(CPACK_PACKAGE_INSTALL_DIRECTORY ${CMAKE_INSTALL_PREFIX}) работать не будет.

CPACK_PACKAGING_INSTALL_PREFIX по умолчанию кажется пустым, поэтому последняя строка является избыточной.

person Igor Gorbunov    schedule 05.06.2017