Warning, /pim/trojita/cmake/TrojitaNSIS.cmake is written in an unsupported language. File is not indexed.
0001 # Create NSIS Installer, check for all dependent DLL libraries and include them into Installer 0002 0003 ### Generate list of files for inclusion into installer ### 0004 0005 if(POLICY CMP0026) 0006 # reading the LOCATION property 0007 cmake_policy(SET CMP0026 OLD) 0008 endif() 0009 0010 # Include trojita executable 0011 get_target_property(TROJITA_EXE_PATH trojita LOCATION) 0012 get_filename_component(TROJITA_EXE ${TROJITA_EXE_PATH} NAME) 0013 file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/trojita-files.nsi.in "!define TROJITA_EXE_PATH \"${TROJITA_EXE_PATH}\"\n!define TROJITA_EXE \"${TROJITA_EXE}\"\n") 0014 0015 # Include trojita icon 0016 get_filename_component(TROJITA_ICON_PATH ${CMAKE_CURRENT_SOURCE_DIR}/src/icons/trojita.ico REALPATH) 0017 file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/trojita-files.nsi.in "!define TROJITA_ICON_PATH \"${TROJITA_ICON_PATH}\"\n") 0018 0019 set(TROJITA_INSTALL_FILES "") 0020 0021 set(TROJITA_LIBRARIES "") 0022 set(TROJITA_LIBRARIES_PATHS "") 0023 0024 # Prepare a list of all Qt plugins which are needed. 0025 # We need a hardcoded list of plugin types because I'm too lazy to find out how to work with associative arrays/hashmaps in cmake. 0026 set(TROJITA_QT_PLUGIN_TYPES bearer generic iconengines imageformats sqldrivers platforms) 0027 0028 foreach(plugintype ${TROJITA_QT_PLUGIN_TYPES}) 0029 set(TROJITA_QT_${plugintype}_PLUGINS "") 0030 endforeach() 0031 0032 foreach(plugin ${Qt5Gui_PLUGINS} ${Qt5Network_PLUGINS} Qt5::QSQLiteDriverPlugin Qt5::QSvgIconPlugin) 0033 get_target_property(_loc ${plugin} LOCATION) 0034 0035 set(plugin_recognized FALSE) 0036 0037 foreach(plugintype ${TROJITA_QT_PLUGIN_TYPES}) 0038 if(${_loc} MATCHES "/plugins/${plugintype}/.*\\.dll$") 0039 list(APPEND TROJITA_QT_${plugintype}_PLUGINS ${_loc}) 0040 set(plugin_recognized TRUE) 0041 endif() 0042 endforeach() 0043 0044 if(NOT ${plugin_recognized}) 0045 message(FATAL_ERROR "Unrecognized Qt plugin -- don't know where to put it: ${_loc}") 0046 endif() 0047 0048 endforeach() 0049 0050 # Qt doesn't really link with OpenSSL, but loads it during runtime, which means that our objdump won't find the DLL names. 0051 # Of course, the library names are provided through the .dll.a convention, and I'm too lazy to write code which converts 0052 # them to just DLLs, so we support either passing them explicitly, or we require CMake 4.4 and its OpenSSL imported targets. 0053 # The reason for this is that we only have cmake-3.3 in the CI so far. 0054 if(NOT (EXISTS "${OpenSSL_Crypto_LOC}" AND EXISTS "${OpenSSL_SSL_LOC}")) 0055 find_package(OpenSSL REQUIRED) 0056 get_target_property(OpenSSL_SSL_LOC OpenSSL::SSL LOCATION) 0057 get_target_property(OpenSSL_Crypto_LOC OpenSSL::Crypto LOCATION) 0058 endif() 0059 0060 # We don't have trojita.exe at CMake time yet, so we have to take a look at all the stuff which we know is going to be needed. 0061 # I could probably write some CMake code to handle this, but sorry, that's ETOOCOMPLEX for me. Instead, I chose to write this 0062 # ugly beast and to swear each time in future when the list of libraries which Trojita links against gets extended, and someone 0063 # forgets to update *this* hardcoded list. Patches which improve this are very welcome. 0064 0065 get_target_property(QtCore_LOC Qt5::Core LOCATION) 0066 get_target_property(QtGui_LOC Qt5::Gui LOCATION) 0067 get_target_property(QtNetwork_LOC Qt5::Network LOCATION) 0068 get_target_property(QtSql_LOC Qt5::Sql LOCATION) 0069 get_target_property(QtWebKitWidgets_LOC Qt5::WebKitWidgets LOCATION) 0070 get_target_property(QtWidgets_LOC Qt5::Widgets LOCATION) 0071 set(required_dll_names ${QtCore_LOC} ${QtGui_LOC} ${QtNetwork_LOC} ${QtSql_LOC} ${QtWebKitWidgets_LOC} ${QtWidgets_LOC} ${OpenSSL_SSL_LOC} ${OpenSSL_Crypto_LOC}) 0072 if(WITH_DBUS) 0073 get_target_property(QtDBus_LOC Qt5::DBus LOCATION) 0074 list(APPEND required_dll_names ${QtDBus_LOC}) 0075 endif() 0076 0077 find_package(PythonInterp REQUIRED interpreter) 0078 0079 message(STATUS "Determining the list of required DLL files...") 0080 set(all_plugin_dlls "") 0081 foreach(plugintype ${TROJITA_QT_PLUGIN_TYPES}) 0082 list(APPEND all_plugin_dlls ${TROJITA_QT_${plugintype}_PLUGINS}) 0083 endforeach() 0084 execute_process(COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/packaging/mingw-bundledlls 0085 ${required_dll_names} ${all_plugin_dlls} 0086 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} 0087 OUTPUT_VARIABLE library_dependencies_STR) 0088 # convert from one-file-per-line into a cmake list 0089 string(REPLACE "\n" ";" library_dependencies "${library_dependencies_STR}") 0090 0091 # because mingw-bundledlls filters out the name of the libraries which were passed on the command line 0092 list(APPEND library_dependencies ${required_dll_names}) 0093 0094 # ...and here we go! 0095 foreach(dll_lib ${library_dependencies}) 0096 message(STATUS "Including DLL: ${dll_lib}") 0097 endforeach() 0098 set(TROJITA_INSTALL_FILES "${TROJITA_INSTALL_FILES};${library_dependencies}") 0099 0100 0101 # Include be.contacts executable 0102 get_target_property(FILE_PATH be.contacts LOCATION) 0103 list(APPEND TROJITA_INSTALL_FILES "${FILE_PATH}") 0104 0105 # Include common library for plugins 0106 if(WITH_SHARED_PLUGINS) 0107 get_target_property(FILE_PATH Plugins LOCATION) 0108 list(APPEND TROJITA_INSTALL_FILES "${FILE_PATH}") 0109 endif() 0110 0111 # Include all shared plugins 0112 get_property(SHARED_PLUGINS GLOBAL PROPERTY TROJITA_SHARED_PLUGINS) 0113 foreach(PLUGIN ${SHARED_PLUGINS}) 0114 get_target_property(FILE_PATH ${PLUGIN} LOCATION) 0115 list(APPEND TROJITA_INSTALL_FILES "${FILE_PATH}") 0116 endforeach() 0117 0118 # Include additional files 0119 list(APPEND TROJITA_INSTALL_FILES "${CMAKE_CURRENT_SOURCE_DIR}/README") 0120 list(APPEND TROJITA_INSTALL_FILES "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE") 0121 0122 # Generate list of install files 0123 file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/trojita-files.nsi.in "!macro TROJITA_INSTALL_FILES\n") 0124 foreach(FILE_PATH ${TROJITA_INSTALL_FILES}) 0125 file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/trojita-files.nsi.in "File \"${FILE_PATH}\"\n") 0126 endforeach() 0127 if(Qt5LinguistForTrojita_FOUND) 0128 if(num_languages) 0129 file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/trojita-files.nsi.in "File /r /x *.ts /x x_test locale\n") 0130 endif() 0131 endif() 0132 foreach(plugintype ${TROJITA_QT_PLUGIN_TYPES}) 0133 file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/trojita-files.nsi.in "SetOutPath \"\$INSTDIR\\${plugintype}\"\n") 0134 foreach(plugin ${TROJITA_QT_${plugintype}_PLUGINS}) 0135 file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/trojita-files.nsi.in "File \"${plugin}\"\n") 0136 message(STATUS "Including ${plugintype} plugin: ${plugin}") 0137 endforeach() 0138 endforeach() 0139 0140 file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/trojita-files.nsi.in "!macroend\n") 0141 0142 # Generate list of uninstall files 0143 file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/trojita-files.nsi.in "!macro TROJITA_UNINSTALL_FILES\n") 0144 if(Qt5LinguistForTrojita_FOUND) 0145 if(num_languages) 0146 file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/trojita-files.nsi.in "RMDir /r \"\$INSTDIR\\locale\"\n") 0147 endif() 0148 endif() 0149 0150 foreach(plugintype ${TROJITA_QT_PLUGIN_TYPES}) 0151 foreach(plugin ${TROJITA_QT_${plugintype}_PLUGINS}) 0152 get_filename_component(plugin_basename ${plugin} NAME) 0153 file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/trojita-files.nsi.in "Delete \"\$INSTDIR\\${plugintype}\\${plugin_basename}\"\n") 0154 endforeach() 0155 file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/trojita-files.nsi.in "RMDir \"\$INSTDIR\\${plugintype}\"\n") 0156 endforeach() 0157 0158 foreach(FILE_PATH ${TROJITA_INSTALL_FILES}) 0159 get_filename_component(FILE_NAME ${FILE_PATH} NAME) 0160 file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/trojita-files.nsi.in "Delete \"\$INSTDIR\\${FILE_NAME}\"\n") 0161 endforeach() 0162 file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/trojita-files.nsi.in "!macroend\n") 0163 0164 execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/trojita-files.nsi.in ${CMAKE_CURRENT_BINARY_DIR}/trojita-files.nsi) 0165 0166 ### Generate installer ### 0167 0168 if(CMAKE_SIZEOF_VOID_P STREQUAL 4) 0169 set(MAKENSIS_OUTPUT Trojita-Setup.exe) 0170 else() 0171 set(MAKENSIS_FLAGS -DX86_64 ${MAKENSIS_FLAGS}) 0172 set(MAKENSIS_OUTPUT Trojita-Setup-x86_64.exe) 0173 endif() 0174 0175 if(NOT CMAKE_VERBOSE_MAKEFILE) 0176 set(MAKENSIS_FLAGS -V2 -DQUIET ${MAKENSIS_FLAGS}) 0177 endif() 0178 0179 set(MAKENSIS_FLAGS ${MAKENSIS_FLAGS} -NOCD) 0180 0181 add_custom_command(OUTPUT ${MAKENSIS_OUTPUT} 0182 COMMAND ${MAKENSIS} 0183 ARGS ${MAKENSIS_FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/packaging/trojita.nsi 0184 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/packaging/trojita.nsi ${CMAKE_CURRENT_BINARY_DIR}/trojita-files.nsi ${TROJITA_EXE_PATH} ${TROJITA_ICON_PATH} ${TROJITA_INSTALL_FILES} version) 0185 add_custom_target(installer ALL DEPENDS ${MAKENSIS_OUTPUT})