summaryrefslogtreecommitdiffstats
path: root/utils/cmake/deploy.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'utils/cmake/deploy.cmake')
-rw-r--r--utils/cmake/deploy.cmake219
1 files changed, 219 insertions, 0 deletions
diff --git a/utils/cmake/deploy.cmake b/utils/cmake/deploy.cmake
new file mode 100644
index 0000000000..252aba0636
--- /dev/null
+++ b/utils/cmake/deploy.cmake
@@ -0,0 +1,219 @@
+#
+# __________ __ ___.
+# Open \______ \ ____ ____ | | _\_ |__ _______ ___
+# Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+# Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+# Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+# \/ \/ \/ \/ \/
+#
+# All files in this archive are subject to the GNU General Public License.
+# See the file COPYING in the source tree root for full license agreement.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+
+# include this file to
+# - get a new target "deploy"
+# - get a function "deploy_qt()" which will add a deploy target that creates a
+# zip / AppImage / dmg and depends on "deploy".
+
+if(NOT have_deploy)
+ add_custom_target(deploy)
+ set(have_deploy ON)
+endif()
+
+# Linux: Build AppImage
+if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
+ set(LINUXDEPLOY ${CMAKE_BINARY_DIR}/linuxdeploy-x86_64.AppImage)
+ set(LINUXDEPLOYQT ${CMAKE_BINARY_DIR}/linuxdeploy-plugin-qt-x86_64.AppImage)
+ add_custom_command(
+ COMMENT "Downloading linuxdeploy"
+ OUTPUT ${LINUXDEPLOY}
+ ${LINUXDEPLOYQT}
+ COMMAND ${CMAKE_COMMAND}
+ -DOUTDIR=${CMAKE_BINARY_DIR}
+ -DURL=https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage
+ -P ${CMAKE_CURRENT_LIST_DIR}/download.cmake
+ COMMAND ${CMAKE_COMMAND}
+ -DOUTDIR=${CMAKE_BINARY_DIR}
+ -DURL=https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage
+ -P ${CMAKE_CURRENT_LIST_DIR}/download.cmake
+ )
+ # intermediate target needed to be able to get back to the actual file dependency.
+ add_custom_target(linuxdeploy DEPENDS ${LINUXDEPLOY})
+
+ function(deploy_qt)
+ cmake_parse_arguments(deploy ""
+ "TARGET;DESKTOPFILE;ICONFILE;QTBINDIR;DMGBUILDCFG"
+ "EXECUTABLES"
+ ${ARGN})
+ if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
+ message(WARNING "Deploying a Debug build.")
+ endif()
+
+ add_custom_target(deploy_${deploy_TARGET}
+ DEPENDS ${CMAKE_BINARY_DIR}/${deploy_TARGET}.AppImage)
+
+ # need extra rules so we can use generator expressions
+ # (using get_target_property() doesn't know neede values during generation)
+ set(_deploy_deps "")
+ foreach(_deploy_exe_tgt ${deploy_EXECUTABLES})
+ add_custom_command(
+ OUTPUT ${CMAKE_BINARY_DIR}/${_deploy_exe_tgt}.appimage.stamp
+ COMMENT "Copying ${_deploy_exe_tgt} to AppImage"
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/AppImage-${deploy_TARGET}/usr/bin
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:${_deploy_exe_tgt}>
+ ${CMAKE_BINARY_DIR}/AppImage-${deploy_TARGET}/usr/bin
+ COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/${_deploy_exe_tgt}.appimage.stamp
+ DEPENDS ${_deploy_exe_tgt}
+ )
+ add_custom_target(deploy_${deploy_TARGET}_${_deploy_exe_tgt}
+ DEPENDS ${CMAKE_BINARY_DIR}/${_deploy_exe_tgt}.appimage.stamp)
+
+ set(_deploy_deps "${_deploy_deps};deploy_${deploy_TARGET}_${_deploy_exe_tgt}")
+ endforeach()
+
+ add_custom_command(
+ OUTPUT ${CMAKE_BINARY_DIR}/${deploy_TARGET}.AppImage
+ COMMENT "Creating AppImage ${deploy_TARGET}"
+ COMMAND OUTPUT=${CMAKE_BINARY_DIR}/${deploy_TARGET}.AppImage
+ ${LINUXDEPLOY}
+ --plugin qt
+ --icon-file=${deploy_ICONFILE}
+ --desktop-file=${deploy_DESKTOPFILE}
+ --executable=$<TARGET_FILE:${deploy_TARGET}>
+ --appdir=${CMAKE_BINARY_DIR}/AppImage-${deploy_TARGET}
+ --output=appimage
+ --verbosity=2
+ DEPENDS ${deploy_TARGET} ${_deploy_deps} linuxdeploy
+ )
+ add_dependencies(deploy deploy_${deploy_TARGET})
+ endfunction()
+endif()
+
+# MacOS: Build dmg
+if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
+ function(deploy_qt)
+ cmake_parse_arguments(deploy ""
+ "TARGET;DESKTOPFILE;ICONFILE;QTBINDIR;DMGBUILDCFG"
+ "EXECUTABLES"
+ ${ARGN})
+ if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
+ message(WARNING "Deploying a Debug build.")
+ endif()
+ set(DMGBUILD ${CMAKE_BINARY_DIR}/venv/bin/python3 -m dmgbuild)
+ set(DMGBUILD_STAMP ${CMAKE_BINARY_DIR}/dmgbuild.stamp)
+ find_program(MACDEPLOYQT_EXECUTABLE macdeployqt HINTS "${QTBINDIR}")
+
+ # need extra rules so we can use generator expressions
+ # (using get_target_property() doesn't know neede values during generation)
+ set(_deploy_deps "")
+ foreach(_deploy_exe_tgt ${deploy_EXECUTABLES})
+ add_custom_command(
+ OUTPUT ${CMAKE_BINARY_DIR}/${_deploy_exe_tgt}.app.stamp
+ COMMENT "Copying ${_deploy_exe_tgt} to App"
+ COMMAND ${CMAKE_COMMAND} -E make_directory $<TARGET_BUNDLE_CONTENT_DIR:${deploy_TARGET}>/bin
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:${_deploy_exe_tgt}>
+ $<TARGET_BUNDLE_CONTENT_DIR:${deploy_TARGET}>/bin
+ COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/${_deploy_exe_tgt}.app.stamp
+ DEPENDS ${_deploy_exe_tgt}
+ )
+ add_custom_target(deploy_${deploy_TARGET}_${_deploy_exe_tgt}
+ DEPENDS ${CMAKE_BINARY_DIR}/${_deploy_exe_tgt}.app.stamp)
+
+ set(_deploy_deps "${_deploy_deps};deploy_${deploy_TARGET}_${_deploy_exe_tgt}")
+ endforeach()
+
+ add_custom_command(
+ COMMENT "Setting up dmgbuild virtualenv"
+ OUTPUT ${DMGBUILD_STAMP}
+ COMMAND python3 -m venv ${CMAKE_BINARY_DIR}/venv
+ COMMAND ${CMAKE_BINARY_DIR}/venv/bin/python -m pip install -q dmgbuild
+ )
+
+ add_custom_command(
+ # TODO: find a better way to figure the app bundle name.
+ OUTPUT ${CMAKE_BINARY_DIR}/${deploy_TARGET}.dmg
+ COMMENT "Running macdeployqt and creating dmg ${deploy_TARGET}"
+ COMMAND ${MACDEPLOYQT_EXECUTABLE} ${deploy_TARGET}.app
+ COMMAND ${DMGBUILD} -s ${deploy_DMGBUILDCFG}
+ -Dappbundle=${deploy_TARGET}.app
+ ${deploy_TARGET} ${CMAKE_BINARY_DIR}/${deploy_TARGET}.dmg
+ DEPENDS ${deploy_TARGET}
+ ${DMGBUILD_STAMP}
+ ${_deploy_deps}
+ )
+ add_custom_target(deploy_${deploy_TARGET}
+ DEPENDS ${CMAKE_BINARY_DIR}/${deploy_TARGET}.dmg)
+ add_dependencies(deploy deploy_${deploy_TARGET})
+ endfunction()
+endif()
+
+# Windows. Copy to dist folder, run windeployqt on the binary, compress to zip.
+if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
+ function(deploy_qt)
+ cmake_parse_arguments(deploy ""
+ "TARGET;DESKTOPFILE;ICONFILE;QTBINDIR;DMGBUILDCFG"
+ "EXECUTABLES"
+ ${ARGN})
+ if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
+ message(WARNING "Deploying a Debug build.")
+ endif()
+ find_program(WINDEPLOYQT_EXECUTABLE windeployqt HINTS "${QTBINDIR}")
+ set(deploydir ${CMAKE_BINARY_DIR}/deploy-${deploy_TARGET})
+ if(WINDEPLOYQT_EXECUTABLE)
+ add_custom_command(
+ COMMENT "Creating deploy folder and running windeployqt"
+ OUTPUT ${deploydir}/${deploy_TARGET}
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${deploydir}
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:${deploy_TARGET}> ${deploydir}
+ COMMAND ${WINDEPLOYQT_EXECUTABLE}
+ # on MinGW, release is mistaken as debug for Qt less than 5.14.
+ # For later versions the opposite is true: adding --debug or
+ # --release will fail with "platform plugin not found."
+ $<IF:$<VERSION_LESS:${Qt${QT_VERSION_MAJOR}Core_VERSION},5.14.0>,$<IF:$<CONFIG:Debug>,--debug,--release>,>
+ ${deploydir}/$<TARGET_FILE_NAME:${deploy_TARGET}>
+ DEPENDS ${deploy_TARGET}
+ )
+ else()
+ add_custom_command(
+ COMMENT "Creating deploy folder"
+ OUTPUT ${deploydir}/${deploy_TARGET}
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${deploydir}
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:${deploy_TARGET}> ${deploydir}
+ DEPENDS ${deploy_TARGET}
+ )
+ endif()
+ # need extra rules so we can use generator expressions
+ # (using get_target_property() doesn't know neede values during generation)
+ set(_deploy_deps "")
+ foreach(_deploy_exe_tgt ${deploy_EXECUTABLES})
+ add_custom_command(
+ OUTPUT ${CMAKE_BINARY_DIR}/${_deploy_exe_tgt}.app.stamp
+ COMMENT "Copying ${_deploy_exe_tgt} to deploy folder"
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${deploydir}
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:${_deploy_exe_tgt}> ${deploydir}
+ COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/${_deploy_exe_tgt}.app.stamp
+ DEPENDS ${_deploy_exe_tgt}
+ )
+ add_custom_target(deploy_${deploy_TARGET}_${_deploy_exe_tgt}
+ DEPENDS ${CMAKE_BINARY_DIR}/${_deploy_exe_tgt}.app.stamp)
+
+ set(_deploy_deps "${_deploy_deps};deploy_${deploy_TARGET}_${_deploy_exe_tgt}")
+ endforeach()
+ add_custom_command(
+ COMMENT "Compressing to zip"
+ OUTPUT ${CMAKE_BINARY_DIR}/${deploy_TARGET}.zip
+ WORKING_DIRECTORY ${deploydir}
+ COMMAND ${CMAKE_COMMAND} -E tar c ${CMAKE_BINARY_DIR}/${deploy_TARGET}.zip
+ --format=zip .
+ DEPENDS ${deploydir}/${deploy_TARGET} ${_deploy_deps}
+ )
+
+ add_custom_target(deploy_${deploy_TARGET}
+ DEPENDS ${CMAKE_BINARY_DIR}/${deploy_TARGET}.zip)
+ add_dependencies(deploy deploy_${deploy_TARGET})
+ endfunction()
+endif()
+