A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita
audio
rust
zig
deno
mpris
rockbox
mpd
1#
2# __________ __ ___.
3# Open \______ \ ____ ____ | | _\_ |__ _______ ___
4# Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5# Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6# Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7# \/ \/ \/ \/ \/
8#
9# All files in this archive are subject to the GNU General Public License.
10# See the file COPYING in the source tree root for full license agreement.
11#
12# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
13# KIND, either express or implied.
14#
15
16# include this file to
17# - get a new target "deploy"
18# - get a function "deploy_qt()" which will add a deploy target that creates a
19# zip / AppImage / dmg and depends on "deploy".
20
21if(NOT have_deploy)
22 add_custom_target(deploy)
23 set(have_deploy ON)
24endif()
25
26# Linux: Build AppImage
27if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
28 set(LINUXDEPLOY ${CMAKE_BINARY_DIR}/linuxdeploy-x86_64.AppImage)
29 set(LINUXDEPLOYQT ${CMAKE_BINARY_DIR}/linuxdeploy-plugin-qt-x86_64.AppImage)
30 add_custom_command(
31 COMMENT "Downloading linuxdeploy"
32 OUTPUT ${LINUXDEPLOY}
33 ${LINUXDEPLOYQT}
34 COMMAND ${CMAKE_COMMAND}
35 -DOUTDIR=${CMAKE_BINARY_DIR}
36 -DURL=https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage
37 -P ${CMAKE_CURRENT_LIST_DIR}/download.cmake
38 COMMAND ${CMAKE_COMMAND}
39 -DOUTDIR=${CMAKE_BINARY_DIR}
40 -DURL=https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage
41 -P ${CMAKE_CURRENT_LIST_DIR}/download.cmake
42 )
43 # intermediate target needed to be able to get back to the actual file dependency.
44 add_custom_target(linuxdeploy DEPENDS ${LINUXDEPLOY})
45
46 function(deploy_qt)
47 cmake_parse_arguments(deploy ""
48 "TARGET;DESKTOPFILE;ICONFILE;QTBINDIR;DMGBUILDCFG"
49 "EXECUTABLES"
50 ${ARGN})
51 if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
52 message(WARNING "Deploying a Debug build.")
53 endif()
54
55 add_custom_target(deploy_${deploy_TARGET}
56 DEPENDS ${CMAKE_BINARY_DIR}/${deploy_TARGET}.AppImage)
57
58 # need extra rules so we can use generator expressions
59 # (using get_target_property() doesn't know neede values during generation)
60 set(_deploy_deps "")
61 foreach(_deploy_exe_tgt ${deploy_EXECUTABLES})
62 add_custom_command(
63 OUTPUT ${CMAKE_BINARY_DIR}/${_deploy_exe_tgt}.appimage.stamp
64 COMMENT "Copying ${_deploy_exe_tgt} to AppImage"
65 COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/AppImage-${deploy_TARGET}/usr/bin
66 COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:${_deploy_exe_tgt}>
67 ${CMAKE_BINARY_DIR}/AppImage-${deploy_TARGET}/usr/bin
68 COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/${_deploy_exe_tgt}.appimage.stamp
69 DEPENDS ${_deploy_exe_tgt}
70 )
71 add_custom_target(deploy_${deploy_TARGET}_${_deploy_exe_tgt}
72 DEPENDS ${CMAKE_BINARY_DIR}/${_deploy_exe_tgt}.appimage.stamp)
73
74 set(_deploy_deps "${_deploy_deps};deploy_${deploy_TARGET}_${_deploy_exe_tgt}")
75 endforeach()
76
77 add_custom_command(
78 OUTPUT ${CMAKE_BINARY_DIR}/${deploy_TARGET}.AppImage
79 COMMENT "Creating AppImage ${deploy_TARGET}"
80 COMMAND OUTPUT=${CMAKE_BINARY_DIR}/${deploy_TARGET}.AppImage
81 ${LINUXDEPLOY}
82 --plugin qt
83 --icon-file=${deploy_ICONFILE}
84 --desktop-file=${deploy_DESKTOPFILE}
85 --executable=$<TARGET_FILE:${deploy_TARGET}>
86 --appdir=${CMAKE_BINARY_DIR}/AppImage-${deploy_TARGET}
87 --output=appimage
88 --verbosity=2
89 DEPENDS ${deploy_TARGET} ${_deploy_deps} linuxdeploy
90 )
91 add_dependencies(deploy deploy_${deploy_TARGET})
92 endfunction()
93endif()
94
95# MacOS: Build dmg
96if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
97 function(deploy_qt)
98 cmake_parse_arguments(deploy ""
99 "TARGET;DESKTOPFILE;ICONFILE;QTBINDIR;DMGBUILDCFG"
100 "EXECUTABLES"
101 ${ARGN})
102 if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
103 message(WARNING "Deploying a Debug build.")
104 endif()
105 set(DMGBUILD ${CMAKE_BINARY_DIR}/venv/bin/python3 -m dmgbuild)
106 set(DMGBUILD_STAMP ${CMAKE_BINARY_DIR}/dmgbuild.stamp)
107 find_program(MACDEPLOYQT_EXECUTABLE macdeployqt HINTS "${QTBINDIR}")
108
109 # need extra rules so we can use generator expressions
110 # (using get_target_property() doesn't know neede values during generation)
111 set(_deploy_deps "")
112 foreach(_deploy_exe_tgt ${deploy_EXECUTABLES})
113 add_custom_command(
114 OUTPUT ${CMAKE_BINARY_DIR}/${_deploy_exe_tgt}.app.stamp
115 COMMENT "Copying ${_deploy_exe_tgt} to App"
116 COMMAND ${CMAKE_COMMAND} -E make_directory $<TARGET_BUNDLE_CONTENT_DIR:${deploy_TARGET}>/bin
117 COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:${_deploy_exe_tgt}>
118 $<TARGET_BUNDLE_CONTENT_DIR:${deploy_TARGET}>/bin
119 COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/${_deploy_exe_tgt}.app.stamp
120 DEPENDS ${_deploy_exe_tgt}
121 )
122 add_custom_target(deploy_${deploy_TARGET}_${_deploy_exe_tgt}
123 DEPENDS ${CMAKE_BINARY_DIR}/${_deploy_exe_tgt}.app.stamp)
124
125 set(_deploy_deps "${_deploy_deps};deploy_${deploy_TARGET}_${_deploy_exe_tgt}")
126 endforeach()
127
128 add_custom_command(
129 COMMENT "Setting up dmgbuild virtualenv"
130 OUTPUT ${DMGBUILD_STAMP}
131 COMMAND python3 -m venv ${CMAKE_BINARY_DIR}/venv
132 COMMAND ${CMAKE_BINARY_DIR}/venv/bin/python -m pip install -q dmgbuild
133 )
134
135 add_custom_command(
136 # TODO: find a better way to figure the app bundle name.
137 OUTPUT ${CMAKE_BINARY_DIR}/${deploy_TARGET}.dmg
138 COMMENT "Running macdeployqt and creating dmg ${deploy_TARGET}"
139 COMMAND ${MACDEPLOYQT_EXECUTABLE} ${deploy_TARGET}.app
140 COMMAND ${DMGBUILD} -s ${deploy_DMGBUILDCFG}
141 -Dappbundle=${deploy_TARGET}.app
142 ${deploy_TARGET} ${CMAKE_BINARY_DIR}/${deploy_TARGET}.dmg
143 DEPENDS ${deploy_TARGET}
144 ${DMGBUILD_STAMP}
145 ${_deploy_deps}
146 )
147 add_custom_target(deploy_${deploy_TARGET}
148 DEPENDS ${CMAKE_BINARY_DIR}/${deploy_TARGET}.dmg)
149 add_dependencies(deploy deploy_${deploy_TARGET})
150 endfunction()
151endif()
152
153# Windows. Copy to dist folder, run windeployqt on the binary, compress to zip.
154if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
155 function(deploy_qt)
156 cmake_parse_arguments(deploy ""
157 "TARGET;DESKTOPFILE;ICONFILE;QTBINDIR;DMGBUILDCFG"
158 "EXECUTABLES"
159 ${ARGN})
160 if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
161 message(WARNING "Deploying a Debug build.")
162 endif()
163 find_program(WINDEPLOYQT_EXECUTABLE windeployqt HINTS "${QTBINDIR}")
164 set(deploydir ${CMAKE_BINARY_DIR}/deploy-${deploy_TARGET})
165 if(WINDEPLOYQT_EXECUTABLE)
166 add_custom_command(
167 COMMENT "Creating deploy folder and running windeployqt"
168 OUTPUT ${deploydir}/${deploy_TARGET}
169 COMMAND ${CMAKE_COMMAND} -E make_directory ${deploydir}
170 COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:${deploy_TARGET}> ${deploydir}
171 COMMAND ${WINDEPLOYQT_EXECUTABLE}
172 # on MinGW, release is mistaken as debug for Qt less than 5.14.
173 # For later versions the opposite is true: adding --debug or
174 # --release will fail with "platform plugin not found."
175 $<IF:$<VERSION_LESS:${Qt${QT_VERSION_MAJOR}Core_VERSION},5.14.0>,$<IF:$<CONFIG:Debug>,--debug,--release>,>
176 ${deploydir}/$<TARGET_FILE_NAME:${deploy_TARGET}>
177 DEPENDS ${deploy_TARGET}
178 )
179 else()
180 add_custom_command(
181 COMMENT "Creating deploy folder"
182 OUTPUT ${deploydir}/${deploy_TARGET}
183 COMMAND ${CMAKE_COMMAND} -E make_directory ${deploydir}
184 COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:${deploy_TARGET}> ${deploydir}
185 DEPENDS ${deploy_TARGET}
186 )
187 endif()
188 # need extra rules so we can use generator expressions
189 # (using get_target_property() doesn't know neede values during generation)
190 set(_deploy_deps "")
191 foreach(_deploy_exe_tgt ${deploy_EXECUTABLES})
192 add_custom_command(
193 OUTPUT ${CMAKE_BINARY_DIR}/${_deploy_exe_tgt}.app.stamp
194 COMMENT "Copying ${_deploy_exe_tgt} to deploy folder"
195 COMMAND ${CMAKE_COMMAND} -E make_directory ${deploydir}
196 COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:${_deploy_exe_tgt}> ${deploydir}
197 COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/${_deploy_exe_tgt}.app.stamp
198 DEPENDS ${_deploy_exe_tgt}
199 )
200 add_custom_target(deploy_${deploy_TARGET}_${_deploy_exe_tgt}
201 DEPENDS ${CMAKE_BINARY_DIR}/${_deploy_exe_tgt}.app.stamp)
202
203 set(_deploy_deps "${_deploy_deps};deploy_${deploy_TARGET}_${_deploy_exe_tgt}")
204 endforeach()
205 add_custom_command(
206 COMMENT "Compressing to zip"
207 OUTPUT ${CMAKE_BINARY_DIR}/${deploy_TARGET}.zip
208 WORKING_DIRECTORY ${deploydir}
209 COMMAND ${CMAKE_COMMAND} -E tar c ${CMAKE_BINARY_DIR}/${deploy_TARGET}.zip
210 --format=zip .
211 DEPENDS ${deploydir}/${deploy_TARGET} ${_deploy_deps}
212 )
213
214 add_custom_target(deploy_${deploy_TARGET}
215 DEPENDS ${CMAKE_BINARY_DIR}/${deploy_TARGET}.zip)
216 add_dependencies(deploy deploy_${deploy_TARGET})
217 endfunction()
218endif()
219