diff --git a/cmake/linux/CMakeLists.txt b/cmake/linux/CMakeLists.txt index 78a7c541ab5..11ad2711733 100644 --- a/cmake/linux/CMakeLists.txt +++ b/cmake/linux/CMakeLists.txt @@ -2,3 +2,24 @@ INSTALL(FILES lmms.png DESTINATION "${DATA_DIR}/pixmaps") INSTALL(FILES lmms DESTINATION "${DATA_DIR}/menu") INSTALL(FILES lmms.desktop DESTINATION "${DATA_DIR}/applications") INSTALL(FILES lmms.xml DESTINATION "${DATA_DIR}/mime/packages") + +CONFIGURE_FILE("build-installer.in" "${CMAKE_BINARY_DIR}/build-installer" @ONLY) + +IF(LMMS_HOST_X86) + SET(HOST_ARCH i386-linux-gnu) +ELSEIF(LMMS_HOST_X86_64) + SET(HOST_ARCH x86_64-linux-gnu) +ELSE() + SET(HOST_ARCH unknown-linux-gnu) +ENDIF() +SET(RUN_FILE "${CMAKE_PROJECT_NAME}-${VERSION}-${HOST_ARCH}.run") +ADD_CUSTOM_TARGET(makeself + COMMAND "${CMAKE_BINARY_DIR}/build-installer" "\"${CMAKE_BINARY_DIR}\"" + "\"${RUN_FILE}\"" + COMMENT "Generating installer") + +SET(BUNDLE_FILE "${CMAKE_PROJECT_NAME}-${VERSION}-bundled-source-linux.tar.gz") +ADD_CUSTOM_TARGET(bundled-source + COMMAND "${CMAKE_SOURCE_DIR}/cmake/linux/fetch-sources" + "\"${CMAKE_BINARY_DIR}\"" "\"${BUNDLE_FILE}\"" + COMMENT "Fetching source for bundled libraries") diff --git a/cmake/linux/build-installer.in b/cmake/linux/build-installer.in new file mode 100755 index 00000000000..6c58529ff56 --- /dev/null +++ b/cmake/linux/build-installer.in @@ -0,0 +1,98 @@ +#!/bin/bash +set -e +BINDIR="$1" +RUNFILE="$2" +[ "$BINDIR" -a "$RUNFILE" ] + +VERSION=@VERSION@ + +cd "$BINDIR" +[ -e CMakeCache.txt ] + +rm -fr lmms.root +mkdir lmms.root +make install DESTDIR=lmms.root + +cd lmms.root +mv usr/local/* usr +rm -r usr/include usr/local + +strip usr/bin/lmms usr/lib/lmms/RemoteZynAddSubFx usr/lib/lmms/*.so \ + usr/lib/lmms/ladspa/* + +rm -f ../download.log + +# Find required libraries and download the deb files that contain them; +# RemoteVstPlugin.exe.so is not considered +ldd usr/bin/lmms usr/lib/lmms/RemoteZynAddSubFx usr/lib/lmms/lib*.so \ + usr/lib/lmms/ladspa/* | +grep = | +cut -d " " -f 3 | +grep -v usr/lib/lmms | +sort -u | +xargs dpkg -S | +cut -d : -f 1 | +sort -u | +xargs aptitude download | +tee -a ../download.log + +unpack_downloaded_deb() +{ + ls *.deb | + while read DEB + do + dpkg-deb -x $DEB . + done + rm *.deb +} + +unpack_downloaded_deb + +# Fetch missing copyright files +find -L usr/share/doc -maxdepth 1 -type l -printf "%l\n" | +sort -u | +xargs aptitude download | +tee -a ../download.log + +unpack_downloaded_deb + +mv usr/share/applications/lmms.desktop lmms-$VERSION.desktop +sed -e " +/^Name=/ s/LMMS/LMMS $VERSION/ +/^Icon=/ s/lmms/lmms-$VERSION/ +" -i lmms-$VERSION.desktop + +mv usr/share/pixmaps/lmms.png lmms-$VERSION.png +rmdir --ignore-fail-on-non-empty usr/share/pixmaps + +mv usr/share/mime/packages/lmms.xml . + +rm -fr lib64 usr/share/applications usr/share/doc-base usr/share/lintian \ + usr/share/man usr/share/menu usr/share/mime + +find usr/share/doc -type f ! -name copyright -delete +find usr/share/doc -type d -empty -delete + +# libc6 is included, so its loader should be used instead of the system one; +# move the loader to usr/bin because of Qt applicationDirPath() usage +MULTIARCH=$(dpkg-architecture -qDEB_HOST_MULTIARCH) +mv lib/$MULTIARCH/ld-*.so usr/bin/ld.so + +# FHS requires /opt programs to be in /opt//bin +mkdir -p bin + +cat > bin/lmms-launcher << EOF +#!/bin/sh +DIR=\$(dirname \$(readlink -f "\$0")) +DIR=\${DIR%/bin} +export LD_LIBRARY_PATH="\$DIR"/lib/$MULTIARCH:"\$DIR"/usr/lib/$MULTIARCH\ +:"\$DIR"/usr/lib/$MULTIARCH/pulseaudio +"\$DIR"/usr/bin/ld.so "\$DIR"/usr/bin/lmms "\$@" +EOF + +chmod a+x bin/lmms-launcher + +cp -a ../../cmake/linux/installer . + +cd .. +makeself --xz --complevel 6 lmms.root "$RUNFILE" LMMS ./installer $VERSION diff --git a/cmake/linux/fetch-sources b/cmake/linux/fetch-sources new file mode 100755 index 00000000000..46e9af3e094 --- /dev/null +++ b/cmake/linux/fetch-sources @@ -0,0 +1,19 @@ +#!/bin/sh +set -e +BINDIR="$1" +BUNDLE_FILE="$2" +[ "$BINDIR" -a "$BUNDLE_FILE" ] + +cd "$BINDIR" +[ -e download.log ] + +rm -fr bundled-source +mkdir bundled-source +cd bundled-source + +grep "^Get:" ../download.log | +sed -re "s/.* ([^ ]+) [^ ]+ ([^ ]+) \[.*/\1=\2/" | +xargs apt-get -d source + +cd .. +tar zcf "$BUNDLE_FILE" bundled-source diff --git a/cmake/linux/installer b/cmake/linux/installer new file mode 100755 index 00000000000..1f2dab1da39 --- /dev/null +++ b/cmake/linux/installer @@ -0,0 +1,47 @@ +#!/bin/sh +set -e +[ "$1" ] + +VERSION="$1" + +if [ $(id -u) -eq 0 ] +then + DIR=/opt/lmms-$VERSION + PREFIX=/usr + umask 022 + chmod -R +rX * +else + DIR="$HOME"/.lmms-$VERSION + PREFIX="$HOME"/.local +fi +echo Installing to $DIR +mkdir -p "$DIR" + +rm -fr "$DIR"/bin "$DIR"/etc "$DIR"/lib "$DIR"/usr +mv bin etc lib usr "$DIR" + +sed -e "/^Exec=/ s#lmms#\"$DIR\"/bin/lmms-launcher#" -i lmms-$VERSION.desktop + +ICONDIR="$PREFIX"/share/icons +mkdir -p "$ICONDIR" +mv lmms-$VERSION.png "$ICONDIR" + +MENUDIR="$PREFIX"/share/applications +mkdir -p "$MENUDIR" +mv lmms-$VERSION.desktop "$MENUDIR" +if [ "$(which update-desktop-database)" ] +then + update-desktop-database "$MENUDIR" +fi + +MIMEDIR="$PREFIX"/share/mime/packages +if [ ! \( -e "$MIMEDIR"/lmms.xml -o -e /usr/share/mime/packages/lmms.xml -o \ + -e /usr/local/share/mime/packages/lmms.xml \) ] +then + mkdir -p "$MIMEDIR" + mv lmms.xml "$MIMEDIR" + if [ "$(which update-mime-database)" ] + then + update-mime-database "$PREFIX"/share/mime + fi +fi