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})