2015-10-09 4 views
0

В настоящее время я хочу создать установщик с cmake, но не добавляю все необходимые DLL самостоятельно в CMakeLists.txt. Таким образом, одним из решений должно быть использование fixup_bundle, например here, поэтому мы надеемся, что он скопирует все DLL-файлы, которые он может обнаружить с помощью ходунки зависимостей и находится на пути.Зависимости от установки CMake

Но в настоящее время я понятия не имею, как наилучшим образом использовать его для цели, следующий код не будет работать, потому что он не разрешает TARGET_FILE_DIR, как если вы используете add_custom_command. Чтение местоположения через get_property тоже не будет работать, потому что он больше не знает цель в момент выполнения. Есть идеи?

INSTALL(CODE " 
    include(BundleUtilities) 
    fixup_bundle($<TARGET_FILE_DIR:${PROJECT_NAME}> \"\" \"D:\\Qt\") 
    " COMPONENT Runtime 
) 
+0

Жестко закованный 'D: \\ Qt'? В самом деле? – DevSolar

+0

Это просто тест, если он работает – SunBlack

+0

Документация об [install] (https://cmake.org/cmake/help/v3.0/command/install.html) не говорит о том, что ее аромат 'CODE' поддерживает выражения генератора , 'Чтение местоположения через get_property тоже не будет работать, потому что он больше не знает цель в момент выполнения'. Для кода' install' это, вероятно, так. Но вы можете настроить скрипт со значением get_property() и использовать этот скрипт с 'install (SCRIPT)'. – Tsyvarev

ответ

0

Если вы используете Qt4, а не с помощью BundleUtilities напрямую, вы можете быть лучше использовать DeployQt4 модуль. Она включает в себя следующие три команды, которые могут делать то, что вам нужно:

  • install_qt4_plugin_path
  • install_qt4_plugin
  • install_qt4_executable

Если вы используете Qt5, это становится немного сложнее. Если вас интересуют только Windows и/или Mac, то сам Qt предоставляет соответствующий инструмент для обработки/переноса зависимостей Qt. Соответствующие инструменты называются windeployqt и macdeployqt соответственно. К сожалению, на момент написания статьи пока нет инструмента linuxdeployqt, о котором я знаю.

Если ни один из указанных выше вариантов не открыт для вас или не выполняет то, что вам нужно, то, по крайней мере, модуль DeployQt4 дает некоторые подсказки относительно того, как вы можете использовать команду INSTALL(...), как вы пытались. Модуль DeployQt4 использует следующие определения своей цели (справа ближе к концу файла DeployQt4.cmake):

FIXUP_QT4_EXECUTABLE(\"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${executable}\" \"\" \"${libs}\" \"${dirs}\" \"${plugins_dir}\" \"${request_qt_conf}\")" 
       ${component} 
     ) 

материал перед ${executable}, вероятно, немного вы пропали без вести. В вашем случае, не видя ваш полный файл CMakeLists.txt, я могу только предположить, что у вас есть одна цель и имеет то же имя, что и ваш проект (так как вы использовали $ {PROJECT_NAME} в своем попытке генерации). Вы можете попробовать что-то вроде следующего (не тестировался):

INSTALL(CODE " 
    include(BundleUtilities) 
    fixup_bundle(\"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${MyTarget}\" \"\" \"D:\\Qt\") 
    " COMPONENT Runtime 
) 

где MyTarget это имя исполняемого файла для вашей цели (я думаю, что без каких-либо .exe суффикса, если вы на Windows). Часть DESTDIR необходима при создании пакетов, так как CMake перенаправляет местоположение установки, установив переменную среды DESTDIR (по крайней мере, с некоторыми генераторами CMake). Часть CMAKE_INSTALL_PREFIX - это путь, по которому будет установлено приложение. Существует some history behind this, но приведенное выше отражает правильный способ обращения к установленному исполняемому файлу.

+0

Ну, это еще не общее решение, потому что $ {MyTarget} не содержит CMAKE_ _POSTFIX :( – SunBlack

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