Compare commits
26 Commits
fuckass-bu
...
groove
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
013aef5513 | ||
|
|
cbcde94d61 | ||
|
|
dfc7eabcb9 | ||
|
|
9b3fe5e2ad | ||
|
|
94221651d4 | ||
|
|
193c30f888 | ||
|
|
1dbf6aabf7 | ||
|
|
fe9c8b6bf6 | ||
|
|
b2057aee0f | ||
|
|
170c8b9a34 | ||
|
|
14f894c3ee | ||
|
|
6122d0f3f2 | ||
|
|
df329e6f5e | ||
|
|
1b9f28254a | ||
|
|
7117d90c00 | ||
|
|
3760e4642f | ||
|
|
9e23b2a03b | ||
|
|
8fa33a8970 | ||
|
|
81e0fe23b0 | ||
|
|
217c31af8c | ||
|
|
ad9ea6f362 | ||
|
|
d6529ae1e8 | ||
|
|
46a2f78733 | ||
|
|
3866cef8b3 | ||
|
|
46fa1803d3 | ||
|
|
957ec6b611 |
@@ -1,7 +1,7 @@
|
||||
---
|
||||
# Language
|
||||
Language: Cpp
|
||||
Standard: c++20
|
||||
Standard: Cpp11 # Cpp14 and Cpp17 are not supported by clang 11
|
||||
|
||||
# Indentation
|
||||
TabWidth: 4
|
||||
|
||||
@@ -20,6 +20,7 @@ Checks: >
|
||||
readability-simplify-boolean-expr
|
||||
WarningsAsErrors: ''
|
||||
HeaderFilterRegex: '' # don't show errors from headers
|
||||
AnalyzeTemporaryDtors: false
|
||||
FormatStyle: none
|
||||
User: user
|
||||
CheckOptions:
|
||||
|
||||
1
.github/FUNDING.yml
vendored
@@ -1,2 +1 @@
|
||||
---
|
||||
custom: https://lmms.io/get-involved/#donate
|
||||
|
||||
3
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@@ -78,8 +78,7 @@ body:
|
||||
label: Screenshots / Minimum Reproducible Project
|
||||
description: |
|
||||
- Upload any screenshots showing the bug in action.
|
||||
- If possible, also include a .mmp/.mmpz project containing the simplest possible
|
||||
setup needed to reproduce the bug.
|
||||
- If possible, also include a .mmp/.mmpz project containing the simplest possible setup needed to reproduce the bug.
|
||||
|
||||
***Note:** To upload a project file to GitHub, it will need to be placed in a .zip archive.*
|
||||
- type: checkboxes
|
||||
|
||||
7
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1,5 +1,4 @@
|
||||
---
|
||||
contact_links:
|
||||
- name: Get help on Discord
|
||||
url: https://lmms.io/chat/
|
||||
about: Need help? Have a question? Reach out to other LMMS users on our Discord server!
|
||||
- name: Get help on Discord
|
||||
url: https://lmms.io/chat/
|
||||
about: Need help? Have a question? Reach out to other LMMS users on our Discord server!
|
||||
|
||||
3
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
@@ -10,8 +10,7 @@ body:
|
||||
label: Enhancement Summary
|
||||
description: |
|
||||
- Briefly describe the enhancement.
|
||||
- Explain why you believe the proposed enhancement to be a good idea, and (if applicable) how it helps
|
||||
overcome a limitation of LMMS you are currently facing.
|
||||
- Explain why you believe the proposed enhancement to be a good idea, and (if applicable) how it helps overcome a limitation of LMMS you are currently facing.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
|
||||
1
.github/no-response.yml
vendored
@@ -1,3 +1,2 @@
|
||||
---
|
||||
# Label requiring a response
|
||||
responseRequiredLabel: "response required"
|
||||
|
||||
342
.github/workflows/build.yml
vendored
@@ -5,49 +5,30 @@ concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
jobs:
|
||||
linux-x86_64:
|
||||
name: linux-x86_64
|
||||
runs-on: ubuntu-22.04
|
||||
linux:
|
||||
name: linux
|
||||
runs-on: ubuntu-latest
|
||||
container: lmmsci/linux.gcc:18.04
|
||||
env:
|
||||
CMAKE_OPTS: >-
|
||||
-DUSE_WERROR=ON
|
||||
-DCMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
-DUSE_COMPILE_CACHE=ON
|
||||
-DWANT_DEBUG_CPACK=ON
|
||||
CCACHE_MAXSIZE: 0
|
||||
CCACHE_NOCOMPRESS: 1
|
||||
MAKEFLAGS: -j2
|
||||
steps:
|
||||
- name: Configure git
|
||||
run: git config --global --add safe.directory "$GITHUB_WORKSPACE"
|
||||
- name: Update and configure Git
|
||||
run: |
|
||||
add-apt-repository ppa:git-core/ppa
|
||||
apt-get update
|
||||
apt-get --yes install git
|
||||
git config --global --add safe.directory "$GITHUB_WORKSPACE"
|
||||
- name: Check out
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: recursive
|
||||
- name: Clone fltk
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: fltk/fltk
|
||||
path: fltk
|
||||
ref: 27d991f046bdebb12bfd58f7c05a19f135979c29
|
||||
fetch-depth: 1
|
||||
- name: Configure winehq
|
||||
run: |
|
||||
sudo dpkg --add-architecture i386
|
||||
sudo mkdir -pm755 /etc/apt/keyrings
|
||||
wget -O - https://dl.winehq.org/wine-builds/winehq.key | \
|
||||
sudo gpg --dearmor -o /etc/apt/keyrings/winehq-archive.key -
|
||||
sudo wget -NP /etc/apt/sources.list.d/ \
|
||||
https://dl.winehq.org/wine-builds/ubuntu/dists/$(lsb_release -cs)/winehq-$(lsb_release -cs).sources
|
||||
- name: Install packages
|
||||
run: |
|
||||
sudo apt-get update -y
|
||||
sudo apt-get install -y --no-install-recommends \
|
||||
$(xargs < .github/workflows/deps-ubuntu-24.04-gcc.txt)
|
||||
sudo apt-get install -y --install-recommends g++-multilib gcc-multilib winehq-devel wine-devel-dev
|
||||
sudo apt-get install -y --install-recommends \
|
||||
$(xargs < .github/workflows/deps-ubuntu-24.04-fltk.txt)
|
||||
- name: Cache ccache data
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
@@ -56,21 +37,12 @@ jobs:
|
||||
ccache-${{ github.job }}-${{ github.ref }}-
|
||||
ccache-${{ github.job }}-
|
||||
path: ~/.ccache
|
||||
- name: Configure fltk
|
||||
run: |
|
||||
cmake -S fltk -B fltk/build -DFLTK_BUILD_SHARED_LIBS=ON -DFLTK_BACKEND_WAYLAND=ON \
|
||||
-DFLTK_USE_LIBDECOR_GTK=OFF -DFLTK_BUILD_TEST=OFF -DFLTK_BUILD_GL=OFF
|
||||
- name: Install fltk
|
||||
run: |
|
||||
cmake --build fltk/build
|
||||
sudo cmake --install fltk/build --prefix /usr
|
||||
- name: Configure
|
||||
run: |
|
||||
ccache --zero-stats
|
||||
source /opt/qt5*/bin/qt5*-env.sh || true
|
||||
cmake -S . \
|
||||
-B build \
|
||||
$CMAKE_OPTS
|
||||
mkdir build && cd build
|
||||
cmake .. $CMAKE_OPTS -DCMAKE_INSTALL_PREFIX=./install
|
||||
- name: Build
|
||||
run: cmake --build build
|
||||
- name: Run tests
|
||||
@@ -79,9 +51,10 @@ jobs:
|
||||
ctest --output-on-failure -j2
|
||||
- name: Package
|
||||
run: |
|
||||
cmake --build build --target package
|
||||
cmake --build build --target install
|
||||
cmake --build build --target appimage
|
||||
- name: Upload artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: linux
|
||||
path: build/lmms-*.AppImage
|
||||
@@ -89,115 +62,23 @@ jobs:
|
||||
run: |
|
||||
ccache --cleanup
|
||||
echo "[ccache config]"
|
||||
ccache --show-config
|
||||
echo "[ccache stats]"
|
||||
ccache --show-stats
|
||||
env:
|
||||
CCACHE_MAXSIZE: 500M
|
||||
linux-arm64:
|
||||
name: linux-arm64
|
||||
runs-on: ubuntu-24.04-arm
|
||||
env:
|
||||
CMAKE_OPTS: >-
|
||||
-DUSE_WERROR=ON
|
||||
-DCMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
-DUSE_COMPILE_CACHE=ON
|
||||
-DWANT_DEBUG_CPACK=ON
|
||||
CCACHE_MAXSIZE: 0
|
||||
CCACHE_NOCOMPRESS: 1
|
||||
MAKEFLAGS: -j2
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
steps:
|
||||
- name: Configure git
|
||||
run: git config --global --add safe.directory "$GITHUB_WORKSPACE"
|
||||
- name: Check out
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: recursive
|
||||
- name: Clone fltk
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: fltk/fltk
|
||||
path: fltk
|
||||
ref: 27d991f046bdebb12bfd58f7c05a19f135979c29
|
||||
fetch-depth: 1
|
||||
- name: Install system packages
|
||||
run: |
|
||||
sudo apt-get update -y
|
||||
sudo apt-get install -y --no-install-recommends \
|
||||
$(xargs < .github/workflows/deps-ubuntu-24.04-gcc.txt)
|
||||
sudo apt-get install -y --install-recommends \
|
||||
$(xargs < .github/workflows/deps-ubuntu-24.04-fltk.txt)
|
||||
- name: Cache ccache data
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
key: ccache-${{ github.job }}-${{ github.ref }}-${{ github.run_id }}
|
||||
restore-keys: |
|
||||
ccache-${{ github.job }}-${{ github.ref }}-
|
||||
ccache-${{ github.job }}-
|
||||
path: ~/.ccache
|
||||
- name: Configure fltk
|
||||
run: |
|
||||
cmake -S fltk -B fltk/build -DFLTK_BUILD_SHARED_LIBS=ON -DFLTK_BACKEND_WAYLAND=ON \
|
||||
-DFLTK_USE_LIBDECOR_GTK=OFF -DFLTK_BUILD_TEST=OFF -DFLTK_BUILD_GL=OFF
|
||||
- name: Install fltk
|
||||
run: |
|
||||
cmake --build fltk/build
|
||||
sudo cmake --install fltk/build --prefix /usr
|
||||
- name: Configure
|
||||
run: |
|
||||
ccache --zero-stats
|
||||
cmake -S . \
|
||||
-B build \
|
||||
$CMAKE_OPTS
|
||||
- name: Build
|
||||
run: cmake --build build
|
||||
- name: Run tests
|
||||
run: |
|
||||
cd build/tests
|
||||
ctest --output-on-failure -j2
|
||||
- name: Package
|
||||
run: |
|
||||
cmake --build build --target package
|
||||
- name: Upload artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: linux-arm64
|
||||
path: build/lmms-*.AppImage
|
||||
- name: Trim ccache and print statistics
|
||||
run: |
|
||||
ccache --cleanup
|
||||
echo "[ccache config]"
|
||||
ccache --show-config
|
||||
ccache --print-config
|
||||
echo "[ccache stats]"
|
||||
ccache --show-stats
|
||||
env:
|
||||
CCACHE_MAXSIZE: 500M
|
||||
macos:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
arch: [ x86_64, arm64 ]
|
||||
include:
|
||||
- arch: x86_64
|
||||
os: macos-15-intel
|
||||
xcode: "16.4"
|
||||
- arch: arm64
|
||||
os: macos-15
|
||||
xcode: "16.4"
|
||||
name: macos-${{ matrix.arch }}
|
||||
runs-on: ${{ matrix.os }}
|
||||
name: macos
|
||||
runs-on: macos-12
|
||||
env:
|
||||
CMAKE_OPTS: >-
|
||||
-Werror=dev
|
||||
-DUSE_WERROR=ON
|
||||
-DCMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
-DUSE_COMPILE_CACHE=ON
|
||||
CCACHE_MAXSIZE: 0
|
||||
CCACHE_NOCOMPRESS: 1
|
||||
MAKEFLAGS: -j3
|
||||
DEVELOPER_DIR: /Applications/Xcode_${{ matrix.xcode }}.app/Contents/Developer
|
||||
DEVELOPER_DIR: /Applications/Xcode_13.1.app/Contents/Developer
|
||||
steps:
|
||||
- name: Check out
|
||||
uses: actions/checkout@v3
|
||||
@@ -207,21 +88,19 @@ jobs:
|
||||
- name: Clean up Homebrew download cache
|
||||
run: rm -rf ~/Library/Caches/Homebrew/downloads
|
||||
- name: Restore Homebrew download cache
|
||||
id: cache-homebrew
|
||||
uses: actions/cache/restore@v3
|
||||
with:
|
||||
key: n/a - only restore from restore-keys
|
||||
restore-keys: |
|
||||
homebrew-${{ matrix.arch }}-
|
||||
homebrew-
|
||||
path: ~/Library/Caches/Homebrew/downloads
|
||||
- name: Cache ccache data
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
key: "ccache-${{ github.job }}-${{ matrix.arch }}-${{ github.ref }}\
|
||||
-${{ github.run_id }}"
|
||||
key: ccache-${{ github.job }}-${{ github.ref }}-${{ github.run_id }}
|
||||
restore-keys: |
|
||||
ccache-${{ github.job }}-${{ matrix.arch }}-${{ github.ref }}-
|
||||
ccache-${{ github.job }}-${{ matrix.arch }}-
|
||||
ccache-${{ github.job }}-${{ github.ref }}-
|
||||
ccache-${{ github.job }}-
|
||||
path: ~/Library/Caches/ccache
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
@@ -235,11 +114,11 @@ jobs:
|
||||
- name: Configure
|
||||
run: |
|
||||
ccache --zero-stats
|
||||
source .github/workflows/macos-env.sh
|
||||
mkdir build
|
||||
cmake -S . \
|
||||
-B build \
|
||||
-DCMAKE_OSX_ARCHITECTURES=${{ matrix.arch }} \
|
||||
-DCMAKE_INSTALL_PREFIX="../target" \
|
||||
-DCMAKE_PREFIX_PATH="$(brew --prefix qt5)" \
|
||||
$CMAKE_OPTS \
|
||||
-DUSE_WERROR=OFF
|
||||
- name: Build
|
||||
@@ -250,11 +129,12 @@ jobs:
|
||||
ctest --output-on-failure -j3
|
||||
- name: Package
|
||||
run: |
|
||||
cmake --build build --target package
|
||||
cmake --build build --target install
|
||||
cmake --build build --target dmg
|
||||
- name: Upload artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: macos-${{ matrix.arch }}
|
||||
name: macos
|
||||
path: build/lmms-*.dmg
|
||||
- name: Trim ccache and print statistics
|
||||
run: |
|
||||
@@ -266,20 +146,20 @@ jobs:
|
||||
env:
|
||||
CCACHE_MAXSIZE: 500MB
|
||||
- name: Save Homebrew download cache
|
||||
if: ${{ steps.cache-homebrew.outputs.cache-matched-key != env.key }}
|
||||
uses: actions/cache/save@v3
|
||||
with:
|
||||
key: ${{ env.key }}
|
||||
key: homebrew-${{ hashFiles('Brewfile.lock.json') }}
|
||||
path: ~/Library/Caches/Homebrew/downloads
|
||||
env:
|
||||
key: "homebrew-${{ matrix.arch }}\
|
||||
-${{ hashFiles('Brewfile.lock.json') }}"
|
||||
mingw:
|
||||
name: mingw64
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
arch: ['32', '64']
|
||||
name: mingw${{ matrix.arch }}
|
||||
runs-on: ubuntu-latest
|
||||
container: lmmsci/linux.mingw${{ matrix.arch }}:18.04
|
||||
env:
|
||||
CMAKE_OPTS: >-
|
||||
-Werror=dev
|
||||
-DUSE_WERROR=ON
|
||||
-DCMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
-DUSE_COMPILE_CACHE=ON
|
||||
@@ -287,14 +167,12 @@ jobs:
|
||||
CCACHE_NOCOMPRESS: 1
|
||||
MAKEFLAGS: -j2
|
||||
steps:
|
||||
- name: Configure apt
|
||||
- name: Update and configure Git
|
||||
run: |
|
||||
sudo sh -c 'echo "deb http://ppa.launchpad.net/tobydox/mingw-w64/ubuntu focal main" > \
|
||||
/etc/apt/sources.list.d/tobydox-mingw-w64.list'
|
||||
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 72931B477E22FEFD47F8DECE02FE5F12ADDE29B2
|
||||
sudo apt-get update -y
|
||||
- name: Configure git
|
||||
run: git config --global --add safe.directory "$GITHUB_WORKSPACE"
|
||||
add-apt-repository ppa:git-core/ppa
|
||||
apt-get update
|
||||
apt-get --yes install git
|
||||
git config --global --add safe.directory "$GITHUB_WORKSPACE"
|
||||
- name: Check out
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
@@ -303,45 +181,44 @@ jobs:
|
||||
- name: Cache ccache data
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
key: "ccache-${{ github.job }}-64-${{ github.ref }}\
|
||||
key: "ccache-${{ github.job }}-${{ matrix.arch }}-${{ github.ref }}\
|
||||
-${{ github.run_id }}"
|
||||
restore-keys: |
|
||||
ccache-${{ github.job }}-64-${{ github.ref }}-
|
||||
ccache-${{ github.job }}-64-
|
||||
ccache-${{ github.job }}-${{ matrix.arch }}-${{ github.ref }}-
|
||||
ccache-${{ github.job }}-${{ matrix.arch }}-
|
||||
path: ~/.ccache
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get install -y --no-install-recommends \
|
||||
$(xargs < .github/workflows/deps-ubuntu-24.04-mingw.txt)
|
||||
- name: Configure
|
||||
run: |
|
||||
ccache --zero-stats
|
||||
cmake -S . \
|
||||
-B build \
|
||||
-DCMAKE_TOOLCHAIN_FILE="./cmake/toolchains/MinGW-W64-64.cmake" \
|
||||
$CMAKE_OPTS
|
||||
mkdir build && cd build
|
||||
../cmake/build_win${{ matrix.arch }}.sh
|
||||
- name: Build
|
||||
run: cmake --build build
|
||||
- name: Package
|
||||
run: cmake --build build --target package
|
||||
- name: Upload artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: mingw64
|
||||
name: mingw${{ matrix.arch }}
|
||||
path: build/lmms-*.exe
|
||||
- name: Trim ccache and print statistics
|
||||
run: |
|
||||
ccache --cleanup
|
||||
echo "[ccache config]"
|
||||
ccache --show-config
|
||||
ccache --print-config
|
||||
echo "[ccache stats]"
|
||||
ccache --show-stats
|
||||
env:
|
||||
CCACHE_MAXSIZE: 500M
|
||||
msvc:
|
||||
name: msvc-x64
|
||||
runs-on: windows-2022
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
arch: ['x86', 'x64']
|
||||
name: msvc-${{ matrix.arch }}
|
||||
runs-on: windows-2019
|
||||
env:
|
||||
qt-version: '5.15.2'
|
||||
CCACHE_MAXSIZE: 0
|
||||
CCACHE_NOCOMPRESS: 1
|
||||
steps:
|
||||
@@ -354,34 +231,41 @@ jobs:
|
||||
id: cache-deps
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
key: vcpkg-msvc-x86_64-${{ hashFiles('vcpkg.json') }}
|
||||
key: vcpkg-${{ matrix.arch }}-${{ hashFiles('vcpkg.json') }}
|
||||
restore-keys: |
|
||||
vcpkg-msvc-x86_64-
|
||||
vcpkg-${{ matrix.arch }}-
|
||||
path: build\vcpkg_installed
|
||||
- name: Cache ccache data
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
# yamllint disable rule:line-length
|
||||
key: "ccache-${{ github.job }}-x64-${{ github.ref }}\
|
||||
key: "ccache-${{ github.job }}-${{ matrix.arch }}-${{ github.ref }}\
|
||||
-${{ github.run_id }}"
|
||||
restore-keys: |
|
||||
ccache-${{ github.job }}-x64-${{ github.ref }}-
|
||||
ccache-${{ github.job }}-x64-
|
||||
ccache-${{ github.job }}-${{ matrix.arch }}-${{ github.ref }}-
|
||||
ccache-${{ github.job }}-${{ matrix.arch }}-
|
||||
path: ~\AppData\Local\ccache
|
||||
# yamllint enable rule:line-length
|
||||
- name: Install tools
|
||||
run: choco install ccache
|
||||
- name: Install Qt
|
||||
uses: jurplel/install-qt-action@d325aaf2a8baeeda41ad0b5d39f84a6af9bcf005
|
||||
- name: Install 64-bit Qt
|
||||
if: matrix.arch == 'x64'
|
||||
uses: jurplel/install-qt-action@b3ea5275e37b734d027040e2c7fe7a10ea2ef946
|
||||
with:
|
||||
version: '6.8.*'
|
||||
arch: "win64_msvc2022_64"
|
||||
version: ${{ env.qt-version }}
|
||||
arch: win64_msvc2019_64
|
||||
archives: qtbase qtsvg qttools
|
||||
cache: true
|
||||
- name: Install 32-bit Qt
|
||||
uses: jurplel/install-qt-action@b3ea5275e37b734d027040e2c7fe7a10ea2ef946
|
||||
with:
|
||||
version: ${{ env.qt-version }}
|
||||
arch: win32_msvc2019
|
||||
archives: qtbase qtsvg qttools
|
||||
cache: true
|
||||
set-env: ${{ matrix.arch == 'x86' }}
|
||||
- name: Set up build environment
|
||||
uses: ilammy/msvc-dev-cmd@cec98b9d092141f74527d0afa6feb2af698cfe89
|
||||
with:
|
||||
arch: x64
|
||||
arch: ${{ matrix.arch }}
|
||||
- name: Configure
|
||||
run: |
|
||||
ccache --zero-stats
|
||||
@@ -390,13 +274,10 @@ jobs:
|
||||
-B build `
|
||||
-G Ninja `
|
||||
--toolchain C:/vcpkg/scripts/buildsystems/vcpkg.cmake `
|
||||
-Werror=dev `
|
||||
-DCMAKE_BUILD_TYPE=RelWithDebInfo `
|
||||
-DWANT_QT6=ON `
|
||||
-DUSE_COMPILE_CACHE=ON `
|
||||
-DUSE_WERROR=ON `
|
||||
-DVCPKG_TARGET_TRIPLET="x64-windows" `
|
||||
-DVCPKG_HOST_TRIPLET="x64-windows" `
|
||||
-DVCPKG_TARGET_TRIPLET="${{ matrix.arch }}-windows" `
|
||||
-DVCPKG_HOST_TRIPLET="${{ matrix.arch }}-windows" `
|
||||
-DVCPKG_MANIFEST_INSTALL="${{ env.should_install_manifest }}"
|
||||
env:
|
||||
should_install_manifest:
|
||||
@@ -410,9 +291,9 @@ jobs:
|
||||
- name: Package
|
||||
run: cmake --build build --target package
|
||||
- name: Upload artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: msvc-x64
|
||||
name: msvc-${{ matrix.arch }}
|
||||
path: build\lmms-*.exe
|
||||
- name: Trim ccache and print statistics
|
||||
run: |
|
||||
@@ -423,68 +304,3 @@ jobs:
|
||||
ccache --show-stats --verbose
|
||||
env:
|
||||
CCACHE_MAXSIZE: 500MB
|
||||
msys2:
|
||||
name: windows-arm64
|
||||
runs-on: windows-11-arm
|
||||
defaults:
|
||||
run:
|
||||
shell: msys2 {0}
|
||||
env:
|
||||
CMAKE_OPTS: >-
|
||||
-DCMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
-DUSE_COMPILE_CACHE=ON
|
||||
-DCPACK_NSIS_EXECUTABLE=/clang64/bin/makensis.exe
|
||||
CCACHE_MAXSIZE: 0
|
||||
CCACHE_NOCOMPRESS: 1
|
||||
MAKEFLAGS: -j2
|
||||
steps:
|
||||
- name: Check out
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: recursive
|
||||
- name: Cache msys2 dependencies
|
||||
id: cache-deps
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
key: windows-arm64-${{ hashFiles('.github/workflows/deps-msys2-clangarm64.txt') }}
|
||||
restore-keys: |
|
||||
windows-arm64-
|
||||
path: \msys64\var\cache\pacman\pkg
|
||||
- name: Install msys2
|
||||
uses: msys2/setup-msys2@v2
|
||||
with:
|
||||
msystem: CLANGARM64
|
||||
update: true
|
||||
- name: Install dependencies
|
||||
run: pacman --needed --noconfirm -S - < .github/workflows/deps-msys2-clangarm64.txt
|
||||
- name: Cache ccache data
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
key: ccache-${{ github.job }}-${{ github.ref }}-${{ github.run_id }}
|
||||
restore-keys: |
|
||||
ccache-${{ github.job }}-${{ github.ref }}-
|
||||
ccache-${{ github.job }}-
|
||||
path: ~\AppData\Local\ccache
|
||||
- name: Configure
|
||||
run: |
|
||||
/clang64/bin/ccache.exe --zero-stats
|
||||
cmake -B build $CMAKE_OPTS
|
||||
- name: Build
|
||||
run: cmake --build build
|
||||
- name: Package
|
||||
run: cmake --build build --target package
|
||||
- name: Upload artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: windows-arm64
|
||||
path: build\lmms-*.exe
|
||||
- name: Trim ccache and print statistics
|
||||
run: |
|
||||
/clang64/bin/ccache.exe --cleanup
|
||||
echo "[ccache config]"
|
||||
/clang64/bin/ccache.exe --show-config
|
||||
echo "[ccache stats]"
|
||||
/clang64/bin/ccache.exe --show-stats --verbose
|
||||
env:
|
||||
CCACHE_MAXSIZE: 500MB
|
||||
|
||||
7
.github/workflows/checks.yml
vendored
@@ -31,10 +31,3 @@ jobs:
|
||||
$(find "./cmake/" -type f -name '*.sh' -o -name "*.sh.in") \
|
||||
doc/bash-completion/lmms \
|
||||
buildtools/update_locales
|
||||
yamllint:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Check out
|
||||
uses: actions/checkout@v3
|
||||
- name: Run yamllint
|
||||
run: for i in $(git ls-files '*.yml'); do yamllint $i; done
|
||||
|
||||
25
.github/workflows/deps-msys2-clangarm64.txt
vendored
@@ -1,25 +0,0 @@
|
||||
base
|
||||
base-devel
|
||||
filesystem
|
||||
git
|
||||
mingw-w64-clang-aarch64-SDL2
|
||||
mingw-w64-clang-aarch64-ccache
|
||||
mingw-w64-clang-aarch64-clang
|
||||
mingw-w64-clang-aarch64-cmake
|
||||
mingw-w64-clang-aarch64-fftw
|
||||
mingw-w64-clang-aarch64-fltk
|
||||
mingw-w64-clang-aarch64-fluidsynth
|
||||
mingw-w64-clang-aarch64-libgig
|
||||
mingw-w64-clang-aarch64-libsamplerate
|
||||
mingw-w64-clang-aarch64-libsndfile
|
||||
mingw-w64-clang-aarch64-lilv
|
||||
mingw-w64-clang-aarch64-lv2
|
||||
mingw-w64-clang-aarch64-qt5-base
|
||||
mingw-w64-clang-aarch64-qt5-svg
|
||||
mingw-w64-clang-aarch64-suil
|
||||
mingw-w64-clang-aarch64-stk
|
||||
mingw-w64-clang-x86_64-nsis
|
||||
mingw-w64-clang-x86_64-ccache
|
||||
msys2-runtime
|
||||
perl-List-MoreUtils
|
||||
perl-XML-Parser
|
||||
3
.github/workflows/deps-ubuntu-24.04-fltk.txt
vendored
@@ -1,3 +0,0 @@
|
||||
libcairo2-dev
|
||||
libpango1.0-dev
|
||||
wayland-protocols
|
||||
52
.github/workflows/deps-ubuntu-24.04-gcc.txt
vendored
@@ -1,52 +0,0 @@
|
||||
binutils
|
||||
ca-certificates
|
||||
ccache
|
||||
cmake
|
||||
file
|
||||
fluid
|
||||
gcc
|
||||
git
|
||||
gpg
|
||||
g++
|
||||
libasound2-dev
|
||||
libc6-dev
|
||||
libfftw3-dev
|
||||
libfluidsynth-dev
|
||||
libgig-dev
|
||||
libgtk2.0-0
|
||||
libjack-jackd2-dev
|
||||
liblilv-dev
|
||||
liblist-moreutils-perl
|
||||
libmp3lame-dev
|
||||
libogg-dev
|
||||
libqt5svg5-dev
|
||||
libqt5x11extras5-dev
|
||||
libsamplerate0-dev
|
||||
libsdl2-dev
|
||||
libsndfile1-dev
|
||||
libsoundio-dev
|
||||
libstk-dev
|
||||
libsuil-dev
|
||||
libvorbis-dev
|
||||
libx11-xcb-dev
|
||||
libxcb-keysyms1-dev
|
||||
libxcb-util0-dev
|
||||
libxft-dev
|
||||
libxinerama-dev
|
||||
libxml2-utils
|
||||
libxml-perl
|
||||
lsb-release
|
||||
lv2-dev
|
||||
make
|
||||
perl
|
||||
portaudio19-dev
|
||||
qt5-qmake
|
||||
qtbase5-dev
|
||||
qtbase5-dev-tools
|
||||
qtbase5-private-dev
|
||||
qttools5-dev-tools
|
||||
qtwayland5
|
||||
software-properties-common
|
||||
ssh-client
|
||||
stk
|
||||
wget
|
||||
32
.github/workflows/deps-ubuntu-24.04-mingw.txt
vendored
@@ -1,32 +0,0 @@
|
||||
binutils-mingw-w64
|
||||
ccache
|
||||
cmake
|
||||
fftw-mingw-w64
|
||||
file
|
||||
flac-mingw-w64
|
||||
fltk-mingw-w64
|
||||
fluidsynth-mingw-w64
|
||||
g++-mingw-w64-i686
|
||||
g++-mingw-w64-x86-64
|
||||
gcc-mingw-w64
|
||||
gcc-mingw-w64-i686
|
||||
gcc-mingw-w64-x86-64
|
||||
git
|
||||
glib2-mingw-w64
|
||||
lame-mingw-w64
|
||||
libgig-mingw-w64
|
||||
liblist-moreutils-perl
|
||||
libsamplerate-mingw-w64
|
||||
libsndfile-mingw-w64
|
||||
libsoundio-mingw-w64
|
||||
libvorbis-mingw-w64
|
||||
libxml-parser-perl
|
||||
libz-mingw-w64-dev
|
||||
mingw-w64-tools
|
||||
nsis
|
||||
portaudio-mingw-w64
|
||||
qt5base-mingw-w64
|
||||
qt5svg-mingw-w64
|
||||
qttools5-dev-tools
|
||||
sdl2-mingw-w64
|
||||
stk-mingw-w64
|
||||
121
.github/workflows/macos-env.sh
vendored
@@ -1,121 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# Calculate macOS-specific environment variables
|
||||
# 1. Sets the value of MACOSX_DEPLOYMENT_TARGET by matching another binary on the system.
|
||||
#
|
||||
# Usage:
|
||||
# source macos-env.sh [package_manager] [package_name] [package_version]
|
||||
#
|
||||
# Example:
|
||||
# source macos-env.sh brew qt 5
|
||||
# source macos-env.sh port wget
|
||||
|
||||
set -e
|
||||
|
||||
unset package_manager package_name package_version
|
||||
|
||||
# Obtain the package manager
|
||||
if [ -n "$1" ]; then
|
||||
# Set package manager to first parameter
|
||||
package_manager="$1"
|
||||
case "$package_manager" in
|
||||
"homebrew")
|
||||
package_manager="brew"
|
||||
;;
|
||||
"macports")
|
||||
package_manager="port"
|
||||
;;
|
||||
esac
|
||||
# Test the command
|
||||
if ! command -v "$package_manager" &> /dev/null; then
|
||||
echo "ERROR: Command '$package_manager' was not found, aborting." 1>&2
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
# Try to guess the package manager
|
||||
if command -v brew &> /dev/null; then
|
||||
package_manager="brew"
|
||||
elif command -v port &> /dev/null; then
|
||||
package_manager="port"
|
||||
else
|
||||
echo "WARNING: A compatible package manager wasn't found, we'll search for '$package_name' on \$PATH instead" 1>&2
|
||||
fi
|
||||
fi
|
||||
|
||||
# Obtain the package name
|
||||
if [ -n "$2" ]; then
|
||||
package_name="$2"
|
||||
else
|
||||
package_name="qt"
|
||||
fi
|
||||
|
||||
# Special fallback handling for when package_name != binary_name, adjust as needed
|
||||
if [ "$package_name" = "qt" ]; then
|
||||
binary_name="qmake"
|
||||
elif [ "$package_name" = "fltk" ]; then
|
||||
binary_name="fluid"
|
||||
else
|
||||
# Assume the binary_name is the package_name
|
||||
binary_name="$package_name"
|
||||
fi
|
||||
|
||||
# Obtain the package version
|
||||
if [ -n "$3" ]; then
|
||||
package_version="$3"
|
||||
else
|
||||
if [ "$package_name" = "qt" ]; then
|
||||
# Sane fallback for qt, adjust as needed
|
||||
package_version="5"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Format $package_name to include $package_version
|
||||
if [ -n "$package_version" ]; then
|
||||
# Specify qt version in package name
|
||||
case "$package_manager" in
|
||||
"port")
|
||||
case "$package_name" in
|
||||
"qt")
|
||||
# Special handling for "qt5-qtbase"
|
||||
package_name="$package_name${package_version}-${package_name}base"
|
||||
;;
|
||||
*)
|
||||
package_name="$package_name$package_version"
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
"brew" | *)
|
||||
package_name="$package_name@$package_version"
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Determine MACOSX_DEPLOYMENT_TARGET
|
||||
if [ -n "$package_manager" ]; then
|
||||
# Specify qt version in package name
|
||||
case "$package_manager" in
|
||||
"port")
|
||||
binary_path="$(port contents "$package_name" |grep "bin/${binary_name}\$" |head -1 |sed -e 's/^[[:space:]]*//')"
|
||||
;;
|
||||
"brew" | *)
|
||||
binary_path="$("$package_manager" --prefix "$package_name")/bin/$binary_name"
|
||||
;;
|
||||
esac
|
||||
otool_out="$(otool -l "$binary_path")"
|
||||
|
||||
else
|
||||
otool_out="$(otool -l "$(which "$binary_name")")"
|
||||
fi
|
||||
|
||||
echo "Using '$binary_name' (from $package_manager) to calculate the macOS deployment target..."
|
||||
|
||||
min_ver="$(echo "$otool_out" |grep "minos" || echo "$otool_out" |grep -A 2 "LC_VERSION_MIN_MACOS"|grep "version")"
|
||||
MACOSX_DEPLOYMENT_TARGET="$(echo "$min_ver"|awk '{print $2}')"
|
||||
|
||||
# Echo the lowest target macOS version supported by this SDK
|
||||
sdk_settings="$(xcrun --sdk macosx --show-sdk-path)/SDKSettings.plist"
|
||||
sdk_min="$(plutil -extract SupportedTargets.macosx.MinimumDeploymentTarget raw "$sdk_settings")"
|
||||
echo "- Lowest SDK supported by this environment is '$sdk_min' based on $sdk_settings"
|
||||
|
||||
# Echo the sane target macOS version based on another build dependency
|
||||
export MACOSX_DEPLOYMENT_TARGET
|
||||
echo "- Exporting 'MACOSX_DEPLOYMENT_TARGET=$MACOSX_DEPLOYMENT_TARGET' based on $binary_name"
|
||||
2
.gitignore
vendored
@@ -10,5 +10,3 @@
|
||||
/plugins/ZynAddSubFx/zynaddsubfx/doc/gen/Makefile
|
||||
/data/locale/*.qm
|
||||
Brewfile.lock.json
|
||||
/.cache/
|
||||
compile_commands.json
|
||||
|
||||
7
.gitmodules
vendored
@@ -16,7 +16,6 @@
|
||||
[submodule "plugins/Xpressive/exprtk"]
|
||||
path = plugins/Xpressive/exprtk
|
||||
url = https://github.com/ArashPartow/exprtk
|
||||
branch = release
|
||||
[submodule "plugins/LadspaEffect/swh/ladspa"]
|
||||
path = plugins/LadspaEffect/swh/ladspa
|
||||
url = https://github.com/swh/ladspa
|
||||
@@ -26,6 +25,9 @@
|
||||
[submodule "src/3rdparty/weakjack/weakjack"]
|
||||
path = src/3rdparty/weakjack/weakjack
|
||||
url = https://github.com/x42/weakjack.git
|
||||
[submodule "src/3rdparty/mingw-std-threads"]
|
||||
path = src/3rdparty/mingw-std-threads
|
||||
url = https://github.com/meganz/mingw-std-threads.git
|
||||
[submodule "doc/wiki"]
|
||||
path = doc/wiki
|
||||
url = https://github.com/lmms/lmms.wiki.git
|
||||
@@ -47,6 +49,3 @@
|
||||
[submodule "src/3rdparty/hiir/hiir"]
|
||||
path = src/3rdparty/hiir/hiir
|
||||
url = https://github.com/LostRobotMusic/hiir
|
||||
[submodule "plugins/MidiImport/portsmf"]
|
||||
path = plugins/MidiImport/portsmf
|
||||
url = https://github.com/portsmf/portsmf
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
[main]
|
||||
host = https://app.transifex.com
|
||||
host = https://www.transifex.com
|
||||
minimum_perc = 51
|
||||
#Need to finish at least 51% before merging back
|
||||
|
||||
[o:lmms:p:lmms:r:lmms]
|
||||
[lmms.lmms]
|
||||
file_filter = data/locale/<lang>.ts
|
||||
source_file = data/locale/en.ts
|
||||
source_lang = en
|
||||
type = QT
|
||||
type = QT
|
||||
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
rules:
|
||||
line-length:
|
||||
max: 120 # be conforming to LMMS coding rules
|
||||
2
Brewfile
@@ -13,7 +13,7 @@ brew "libsoundio"
|
||||
brew "libvorbis"
|
||||
brew "lilv"
|
||||
brew "lv2"
|
||||
brew "pkgconf"
|
||||
brew "pkg-config"
|
||||
brew "portaudio"
|
||||
brew "qt@5"
|
||||
brew "sdl2"
|
||||
|
||||
234
CMakeLists.txt
@@ -1,5 +1,4 @@
|
||||
CMAKE_MINIMUM_REQUIRED(VERSION 3.13)
|
||||
SET(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||
CMAKE_MINIMUM_REQUIRED(VERSION 3.9)
|
||||
|
||||
# Set the given policy to NEW. If it does not exist, it will not be set. If it
|
||||
# is already set to NEW (most likely due to predating the minimum required CMake
|
||||
@@ -16,7 +15,8 @@ function(enable_policy_if_exists id)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
enable_policy_if_exists(CMP0092) # MSVC warning flags are not in CMAKE_<LANG>_FLAGS by default.
|
||||
# Needed for the SWH Ladspa plugins. See below.
|
||||
enable_policy_if_exists(CMP0074) # find_package() uses <PackageName>_ROOT variables.
|
||||
# Needed for ccache support with MSVC
|
||||
enable_policy_if_exists(CMP0141) # MSVC debug information format flags are selected by an abstraction.
|
||||
|
||||
@@ -43,11 +43,10 @@ INCLUDE(AddFileDependencies)
|
||||
INCLUDE(CheckIncludeFiles)
|
||||
INCLUDE(FindPkgConfig)
|
||||
INCLUDE(GenerateExportHeader)
|
||||
include(StaticDependencies)
|
||||
|
||||
STRING(TOUPPER "${CMAKE_PROJECT_NAME}" PROJECT_NAME_UCASE)
|
||||
|
||||
SET(PROJECT_YEAR 2026)
|
||||
SET(PROJECT_YEAR 2024)
|
||||
|
||||
SET(PROJECT_AUTHOR "LMMS Developers")
|
||||
SET(PROJECT_URL "https://lmms.io")
|
||||
@@ -103,11 +102,7 @@ option(WANT_DEBUG_ASAN "Enable AddressSanitizer" OFF)
|
||||
option(WANT_DEBUG_TSAN "Enable ThreadSanitizer" OFF)
|
||||
option(WANT_DEBUG_MSAN "Enable MemorySanitizer" OFF)
|
||||
option(WANT_DEBUG_UBSAN "Enable UndefinedBehaviorSanitizer" OFF)
|
||||
option(WANT_DEBUG_GPROF "Enable gprof profiler" OFF)
|
||||
OPTION(BUNDLE_QT_TRANSLATIONS "Install Qt translation files for LMMS" OFF)
|
||||
option(WANT_DEBUG_CPACK "Show detailed logs for packaging commands" OFF)
|
||||
option(WANT_CPACK_TARBALL "Request CPack to create a tarball instead of an installer" OFF)
|
||||
option(WANT_QT6 "Build with experimental Qt6 support" OFF)
|
||||
|
||||
|
||||
IF(LMMS_BUILD_APPLE)
|
||||
@@ -150,6 +145,16 @@ ELSE(LMMS_BUILD_WIN32)
|
||||
SET(STATUS_WINMM "<not supported on this platform>")
|
||||
ENDIF(LMMS_BUILD_WIN32)
|
||||
|
||||
|
||||
# TODO: Fix linking issues with msys debug builds
|
||||
IF(LMMS_BUILD_MSYS AND CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
SET(WANT_GIG OFF)
|
||||
SET(WANT_STK OFF)
|
||||
SET(WANT_SWH OFF)
|
||||
SET(STATUS_GIG "not built as requested")
|
||||
SET(STATUS_STK "not built as requested")
|
||||
ENDIF()
|
||||
|
||||
SET(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
CHECK_INCLUDE_FILES(pthread.h LMMS_HAVE_PTHREAD_H)
|
||||
@@ -159,7 +164,6 @@ CHECK_INCLUDE_FILES(sys/types.h LMMS_HAVE_SYS_TYPES_H)
|
||||
CHECK_INCLUDE_FILES(sys/ipc.h LMMS_HAVE_SYS_IPC_H)
|
||||
CHECK_INCLUDE_FILES(sys/time.h LMMS_HAVE_SYS_TIME_H)
|
||||
CHECK_INCLUDE_FILES(sys/times.h LMMS_HAVE_SYS_TIMES_H)
|
||||
CHECK_INCLUDE_FILES(sys/prctl.h LMMS_HAVE_SYS_PRCTL_H)
|
||||
CHECK_INCLUDE_FILES(sched.h LMMS_HAVE_SCHED_H)
|
||||
CHECK_INCLUDE_FILES(sys/soundcard.h LMMS_HAVE_SYS_SOUNDCARD_H)
|
||||
CHECK_INCLUDE_FILES(soundcard.h LMMS_HAVE_SOUNDCARD_H)
|
||||
@@ -175,45 +179,30 @@ check_library_exists(rt shm_open "" LMMS_HAVE_LIBRT)
|
||||
|
||||
LIST(APPEND CMAKE_PREFIX_PATH "${CMAKE_INSTALL_PREFIX}")
|
||||
|
||||
if(WANT_QT6)
|
||||
set(QT_VERSION_MAJOR 6)
|
||||
if(MSVC)
|
||||
set(LMMS_QT_MIN_VERSION 6.8.0)
|
||||
else()
|
||||
set(LMMS_QT_MIN_VERSION 6.0.0)
|
||||
endif()
|
||||
set(STATUS_QT6 "Enabled")
|
||||
else()
|
||||
set(QT_VERSION_MAJOR 5)
|
||||
set(LMMS_QT_MIN_VERSION 5.15.0)
|
||||
set(STATUS_QT6 "Disabled")
|
||||
endif()
|
||||
FIND_PACKAGE(Qt5 5.6.0 COMPONENTS Core Gui Widgets Xml REQUIRED)
|
||||
FIND_PACKAGE(Qt5 COMPONENTS LinguistTools QUIET)
|
||||
|
||||
find_package(Qt${QT_VERSION_MAJOR} ${LMMS_QT_MIN_VERSION} COMPONENTS Core Gui Widgets Xml Svg REQUIRED)
|
||||
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS LinguistTools QUIET)
|
||||
|
||||
include_directories(SYSTEM
|
||||
${Qt${QT_VERSION_MAJOR}Core_INCLUDE_DIRS}
|
||||
${Qt${QT_VERSION_MAJOR}Gui_INCLUDE_DIRS}
|
||||
${Qt${QT_VERSION_MAJOR}Widgets_INCLUDE_DIRS}
|
||||
${Qt${QT_VERSION_MAJOR}Xml_INCLUDE_DIRS}
|
||||
INCLUDE_DIRECTORIES(
|
||||
${Qt5Core_INCLUDE_DIRS}
|
||||
${Qt5Gui_INCLUDE_DIRS}
|
||||
${Qt5Widgets_INCLUDE_DIRS}
|
||||
${Qt5Xml_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
set(QT_LIBRARIES
|
||||
Qt${QT_VERSION_MAJOR}::Core
|
||||
Qt${QT_VERSION_MAJOR}::Gui
|
||||
Qt${QT_VERSION_MAJOR}::Widgets
|
||||
Qt${QT_VERSION_MAJOR}::Xml
|
||||
Qt${QT_VERSION_MAJOR}::Svg
|
||||
SET(QT_LIBRARIES
|
||||
Qt5::Core
|
||||
Qt5::Gui
|
||||
Qt5::Widgets
|
||||
Qt5::Xml
|
||||
)
|
||||
|
||||
IF(LMMS_BUILD_LINUX AND WANT_VST AND NOT WANT_QT6)
|
||||
IF(LMMS_BUILD_LINUX AND WANT_VST)
|
||||
FIND_PACKAGE(Qt5 COMPONENTS X11Extras REQUIRED)
|
||||
LIST(APPEND QT_LIBRARIES Qt5::X11Extras)
|
||||
ENDIF()
|
||||
|
||||
# Resolve qmake to full path for use in packaging scripts
|
||||
get_target_property(QT_QMAKE_EXECUTABLE Qt${QT_VERSION_MAJOR}::qmake IMPORTED_LOCATION)
|
||||
# Resolve Qt5::qmake to full path for use in packaging scripts
|
||||
GET_TARGET_PROPERTY(QT_QMAKE_EXECUTABLE "${Qt5Core_QMAKE_EXECUTABLE}" IMPORTED_LOCATION)
|
||||
|
||||
# Find the location of Qt translation files
|
||||
execute_process(COMMAND ${QT_QMAKE_EXECUTABLE} -query QT_INSTALL_TRANSLATIONS
|
||||
@@ -226,8 +215,8 @@ IF(EXISTS "${QT_TRANSLATIONS_DIR}")
|
||||
ADD_DEFINITIONS("-DQT_TRANSLATIONS_DIR=\"${QT_TRANSLATIONS_DIR}\"")
|
||||
ENDIF()
|
||||
|
||||
FIND_PACKAGE(Qt${QT_VERSION_MAJOR}Test)
|
||||
SET(QT_QTTEST_LIBRARY Qt${QT_VERSION_MAJOR}::Test)
|
||||
FIND_PACKAGE(Qt5Test)
|
||||
SET(QT_QTTEST_LIBRARY Qt5::Test)
|
||||
|
||||
# check for libsndfile
|
||||
FIND_PACKAGE(SndFile REQUIRED)
|
||||
@@ -256,28 +245,29 @@ if(LMMS_BUILD_APPLE)
|
||||
endif()
|
||||
find_package(Perl)
|
||||
|
||||
if(WANT_LV2)
|
||||
if(PKG_CONFIG_FOUND)
|
||||
pkg_check_modules(LV2 lv2)
|
||||
endif()
|
||||
|
||||
find_package(Lilv)
|
||||
if(Lilv_FOUND)
|
||||
set(LILV_LIBRARIES Lilv::lilv)
|
||||
endif()
|
||||
|
||||
# Ensure both dependencies are found
|
||||
if(NOT LV2_FOUND)
|
||||
set(STATUS_LV2 "not found, install lv2 or set PKG_CONFIG_PATH appropriately")
|
||||
elseif(NOT Lilv_FOUND)
|
||||
set(STATUS_LV2 "not found, install lilv or set PKG_CONFIG_PATH appropriately")
|
||||
else()
|
||||
set(LMMS_HAVE_LV2 TRUE)
|
||||
set(STATUS_LV2 "OK")
|
||||
endif()
|
||||
else()
|
||||
set(STATUS_LV2 "not built as requested")
|
||||
endif()
|
||||
IF(WANT_LV2)
|
||||
IF(PKG_CONFIG_FOUND)
|
||||
PKG_CHECK_MODULES(LV2 lv2)
|
||||
PKG_CHECK_MODULES(LILV lilv-0)
|
||||
ENDIF()
|
||||
IF(NOT LV2_FOUND AND NOT LILV_FOUND)
|
||||
UNSET(LV2_FOUND CACHE)
|
||||
UNSET(LILV_FOUND CACHE)
|
||||
FIND_PACKAGE(LV2 CONFIG)
|
||||
FIND_PACKAGE(LILV CONFIG)
|
||||
IF(LILV_FOUND)
|
||||
SET(LILV_LIBRARIES "lilv::lilv")
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
IF(LV2_FOUND AND LILV_FOUND)
|
||||
SET(LMMS_HAVE_LV2 TRUE)
|
||||
SET(STATUS_LV2 "OK")
|
||||
ELSE()
|
||||
SET(STATUS_LV2 "not found, install it or set PKG_CONFIG_PATH appropriately")
|
||||
ENDIF()
|
||||
ELSE(WANT_LV2)
|
||||
SET(STATUS_LV2 "not built as requested")
|
||||
ENDIF(WANT_LV2)
|
||||
|
||||
IF(WANT_SUIL)
|
||||
IF(PKG_CONFIG_FOUND)
|
||||
@@ -285,7 +275,6 @@ IF(WANT_SUIL)
|
||||
IF(SUIL_FOUND)
|
||||
SET(LMMS_HAVE_SUIL TRUE)
|
||||
SET(STATUS_SUIL "OK")
|
||||
find_package(SuilModules)
|
||||
ELSE()
|
||||
SET(STATUS_SUIL "not found, install it or set PKG_CONFIG_PATH appropriately")
|
||||
ENDIF()
|
||||
@@ -358,14 +347,37 @@ IF(WANT_SDL)
|
||||
FIND_PACKAGE(SDL2)
|
||||
IF(SDL2_FOUND)
|
||||
SET(LMMS_HAVE_SDL TRUE)
|
||||
SET(STATUS_SDL "OK")
|
||||
SET(LMMS_HAVE_SDL2 TRUE)
|
||||
SET(STATUS_SDL "OK, using SDL2")
|
||||
SET(SDL2_LIBRARY "SDL2::SDL2")
|
||||
SET(SDL_INCLUDE_DIR "")
|
||||
SET(SDL_LIBRARY "")
|
||||
ELSE()
|
||||
SET(STATUS_SDL "not found, please install libsdl2-dev (or similar) if you require SDL support")
|
||||
SET(SDL2_LIBRARY "")
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
# fallback to SDL1
|
||||
IF(WANT_SDL AND NOT LMMS_HAVE_SDL2)
|
||||
# Fallback to SDL1.2
|
||||
SET(SDL_BUILDING_LIBRARY TRUE)
|
||||
FIND_PACKAGE(SDL)
|
||||
IF(SDL_FOUND)
|
||||
SET(LMMS_HAVE_SDL TRUE)
|
||||
SET(STATUS_SDL "OK, using SDL1.2")
|
||||
# fix mingw since 53abd65
|
||||
IF(NOT SDL_INCLUDE_DIR)
|
||||
SET(SDL_INCLUDE_DIR "${CMAKE_FIND_ROOT_PATH}/include")
|
||||
ENDIF()
|
||||
|
||||
ELSE()
|
||||
SET(STATUS_SDL "not found, please install libsdl2-dev (or similar) "
|
||||
"if you require SDL support")
|
||||
SET(SDL_INCLUDE_DIR "")
|
||||
SET(SDL_LIBRARY "")
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
# check for Sid
|
||||
if(WANT_SID)
|
||||
if(PERL_FOUND)
|
||||
@@ -408,7 +420,7 @@ IF(WANT_SOUNDIO)
|
||||
IF(SOUNDIO_FOUND)
|
||||
SET(LMMS_HAVE_SOUNDIO TRUE)
|
||||
SET(STATUS_SOUNDIO "OK")
|
||||
include_directories(SYSTEM "${SOUNDIO_INCLUDE_DIR}")
|
||||
INCLUDE_DIRECTORIES("${SOUNDIO_INCLUDE_DIR}")
|
||||
ELSE(SOUNDIO_FOUND)
|
||||
SET(SOUNDIO_INCLUDE_DIR "")
|
||||
SET(STATUS_SOUNDIO "not found, please install libsoundio if you require libsoundio support")
|
||||
@@ -489,9 +501,11 @@ ENDIF(NOT LMMS_HAVE_ALSA)
|
||||
IF(WANT_JACK)
|
||||
IF(WANT_WEAKJACK)
|
||||
SET(LMMS_HAVE_WEAKJACK TRUE)
|
||||
SET(WEAKJACK_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/src/3rdparty/weakjack/weakjack)
|
||||
SET(JACK_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/src/3rdparty/jack2/common)
|
||||
SET(STATUS_JACK "OK (weak linking enabled)")
|
||||
set(JACK_INCLUDE_DIRS "")
|
||||
set(JACK_LIBRARIES weakjack)
|
||||
# use dlsym instead
|
||||
SET(JACK_LIBRARIES ${CMAKE_DL_LIBS})
|
||||
SET(LMMS_HAVE_JACK TRUE)
|
||||
SET(LMMS_HAVE_JACK_PRENAME TRUE)
|
||||
SET(JACK_FOUND TRUE)
|
||||
@@ -611,9 +625,6 @@ if(WANT_VST)
|
||||
else()
|
||||
set(STATUS_VST "No hosts selected and available")
|
||||
endif()
|
||||
if(WINE_ASLR_ENABLED)
|
||||
set(STATUS_VST_64 "${STATUS_VST_64}\n\tWARNING: You are using wine ${WINE_VERSION} which cannot disable ASLR, please consider upgrading to wine 10.14 or higher. ASLR may cause crashes with older VSTs.")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
IF(WANT_DEBUG_FPE)
|
||||
@@ -627,20 +638,31 @@ ELSE()
|
||||
SET (STATUS_DEBUG_FPE "Disabled")
|
||||
ENDIF(WANT_DEBUG_FPE)
|
||||
|
||||
if(WANT_DEBUG_CPACK)
|
||||
if((LMMS_BUILD_WIN32 AND CMAKE_VERSION VERSION_LESS "3.19") OR WANT_CPACK_TARBALL)
|
||||
set(STATUS_DEBUG_CPACK "Wanted but disabled due to unsupported configuration")
|
||||
else()
|
||||
set(CPACK_DEBUG TRUE)
|
||||
set(STATUS_DEBUG_CPACK "Enabled")
|
||||
endif()
|
||||
else()
|
||||
set(STATUS_DEBUG_CPACK "Disabled")
|
||||
endif()
|
||||
|
||||
# check for libsamplerate
|
||||
FIND_PACKAGE(Samplerate 0.1.8 MODULE REQUIRED)
|
||||
|
||||
# set compiler flags
|
||||
IF(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
|
||||
SET(WERROR_FLAGS "-Wall -Werror=unused-function -Wno-sign-compare -Wno-strict-overflow")
|
||||
OPTION(USE_WERROR "Add -werror to the build flags. Stops the build on warnings" OFF)
|
||||
IF(${USE_WERROR})
|
||||
SET(WERROR_FLAGS "${WERROR_FLAGS} -Werror")
|
||||
ENDIF()
|
||||
|
||||
# Due to a regression in gcc-4.8.X, we need to disable array-bounds check
|
||||
IF (CMAKE_COMPILER_IS_GNUCXX AND ((CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL "4.8.0") OR (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "4.8.0") OR LMMS_BUILD_WIN32))
|
||||
SET(WERROR_FLAGS "${WERROR_FLAGS} -Wno-array-bounds -Wno-attributes")
|
||||
ENDIF()
|
||||
ELSEIF(MSVC)
|
||||
# Remove any existing /W flags
|
||||
STRING(REGEX REPLACE "/W[0-4]" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
|
||||
SET(WERROR_FLAGS "/W2")
|
||||
IF(${USE_WERROR})
|
||||
SET(WERROR_FLAGS "${WERROR_FLAGS} /WX")
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
|
||||
IF(NOT CMAKE_BUILD_TYPE)
|
||||
message(STATUS "Setting build type to 'Release' as none was specified.")
|
||||
set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE)
|
||||
@@ -649,23 +671,16 @@ IF(NOT CMAKE_BUILD_TYPE)
|
||||
"MinSizeRel" "RelWithDebInfo")
|
||||
ENDIF()
|
||||
|
||||
SET(CMAKE_C_FLAGS "${WERROR_FLAGS} ${CMAKE_C_FLAGS}")
|
||||
SET(CMAKE_CXX_FLAGS "${WERROR_FLAGS} ${CMAKE_CXX_FLAGS}")
|
||||
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DLMMS_DEBUG")
|
||||
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DLMMS_DEBUG")
|
||||
|
||||
if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
add_compile_definitions(NDEBUG)
|
||||
SET(STATUS_ASSERTIONS "Disabled")
|
||||
else()
|
||||
remove_definitions(-DNDEBUG)
|
||||
SET(STATUS_ASSERTIONS "Enabled")
|
||||
endif()
|
||||
|
||||
if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.16")
|
||||
set(NOOP_COMMAND "${CMAKE_COMMAND}" "-E" "true")
|
||||
else()
|
||||
set(NOOP_COMMAND "${CMAKE_COMMAND}" "-E" "echo")
|
||||
endif()
|
||||
|
||||
if(STRIP)
|
||||
# TODO CMake 3.19: Now that CONFIG generator expressions support testing for
|
||||
# multiple configurations, combine the OR into a single CONFIG expression.
|
||||
@@ -699,30 +714,17 @@ ENDIF()
|
||||
# we somehow have to make LMMS-binary depend on MOC-files
|
||||
ADD_FILE_DEPENDENCIES("${CMAKE_BINARY_DIR}/lmmsconfig.h")
|
||||
|
||||
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang" AND NOT WIN32)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC -DPIC")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -DPIC")
|
||||
IF(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
|
||||
IF(WIN32)
|
||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-attributes")
|
||||
ELSE(WIN32)
|
||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -DPIC")
|
||||
ENDIF(WIN32)
|
||||
elseif(MSVC)
|
||||
# Use UTF-8 as the source and execution character set
|
||||
add_compile_options("/utf-8")
|
||||
ENDIF()
|
||||
|
||||
# gcc builds support gprof for profiling
|
||||
# clang too seems to support gprof, but i couldn't get it working.
|
||||
# if needed, change the if condition to "GNU|CLANG"
|
||||
if(NOT CMAKE_CXX_COMPILER_ID MATCHES "GNU")
|
||||
set(STATUS_GPROF ", NOT SUPPORTED BY THIS COMPILER")
|
||||
set(WANT_DEBUG_GPROF OFF)
|
||||
endif()
|
||||
|
||||
if(WANT_DEBUG_GPROF)
|
||||
add_compile_options(-pg)
|
||||
add_link_options(-pg)
|
||||
set(STATUS_GPROF "OK")
|
||||
else()
|
||||
set(STATUS_GPROF "Disabled ${STATUS_GPROF}")
|
||||
endif()
|
||||
|
||||
# add enabled sanitizers
|
||||
function(add_sanitizer sanitizer supported_compilers want_flag status_flag)
|
||||
if(${want_flag})
|
||||
@@ -747,8 +749,6 @@ add_sanitizer(memory "Clang" WANT_DEBUG_MSAN STATUS_DEBUG_MSAN -fno-omit-frame-p
|
||||
# not being found by PeakController
|
||||
add_sanitizer(undefined "GNU|Clang" WANT_DEBUG_UBSAN STATUS_DEBUG_UBSAN -fno-sanitize=vptr)
|
||||
|
||||
# Add warning and error flags
|
||||
include(ErrorFlags)
|
||||
|
||||
# use ccache
|
||||
include(CompileCache)
|
||||
@@ -786,7 +786,7 @@ IF(LMMS_BUILD_LINUX)
|
||||
"${CMAKE_BINARY_DIR}/lmmsconfig.h"
|
||||
"${CMAKE_BINARY_DIR}/lmmsversion.h"
|
||||
"${CMAKE_SOURCE_DIR}/src/gui/embed.cpp"
|
||||
DESTINATION "include/lmms/")
|
||||
DESTINATION "${CMAKE_INSTALL_PREFIX}/include/lmms/")
|
||||
ENDIF(LMMS_BUILD_LINUX)
|
||||
|
||||
#
|
||||
@@ -890,10 +890,6 @@ MESSAGE(
|
||||
"* Debug using ThreadSanitizer : ${STATUS_DEBUG_TSAN}\n"
|
||||
"* Debug using MemorySanitizer : ${STATUS_DEBUG_MSAN}\n"
|
||||
"* Debug using UBSanitizer : ${STATUS_DEBUG_UBSAN}\n"
|
||||
"* Debug packaging commands : ${STATUS_DEBUG_CPACK}\n"
|
||||
"* Profile using GNU profiler : ${STATUS_GPROF}\n"
|
||||
"* Debug assertions : ${STATUS_ASSERTIONS}\n"
|
||||
"* Experimental Qt6 support : ${STATUS_QT6}\n"
|
||||
)
|
||||
|
||||
MESSAGE(
|
||||
|
||||
67
README.md
@@ -1,57 +1,58 @@
|
||||
<div align="center">
|
||||
<h1>
|
||||
<img src="https://raw.githubusercontent.com/LMMS/artwork/master/Icon%20%26%20Mimetypes/lmms-64x64.svg" alt="LMMS Logo"><br>LMMS
|
||||
</h1>
|
||||
<p>Cross-platform music production software</p>
|
||||
<p>
|
||||
<a href="https://lmms.io/">Website</a>
|
||||
⦁︎
|
||||
<a href="https://github.com/LMMS/lmms/releases">Releases</a>
|
||||
⦁︎
|
||||
<a href="https://github.com/LMMS/lmms/wiki">Developer wiki</a>
|
||||
⦁︎
|
||||
<a href="https://lmms.io/documentation">User manual</a>
|
||||
⦁︎
|
||||
<a href="https://lmms.io/showcase/">Showcase</a>
|
||||
⦁︎
|
||||
<a href="https://lmms.io/lsp/">Sharing platform</a>
|
||||
</p>
|
||||
<p>
|
||||
<a href="https://github.com/LMMS/lmms/actions/workflows/build.yml"><img src="https://github.com/LMMS/lmms/actions/workflows/build.yml/badge.svg" alt="Build status"></a>
|
||||
<a href="https://lmms.io/download"><img src="https://img.shields.io/github/release/LMMS/lmms.svg?maxAge=3600" alt="Latest stable release"></a>
|
||||
<a href="https://github.com/LMMS/lmms/releases"><img src="https://img.shields.io/github/downloads/LMMS/lmms/total.svg?maxAge=3600" alt="Overall downloads on Github"></a>
|
||||
<a href="https://discord.gg/3sc5su7"><img src="https://img.shields.io/badge/chat-on%20discord-7289DA.svg" alt="Join the chat at Discord"></a>
|
||||
<a href="https://www.transifex.com/lmms/lmms/"><img src="https://img.shields.io/badge/localise-on_transifex-green.svg"></a>
|
||||
</p>
|
||||
</div>
|
||||
#  LMMS
|
||||
|
||||
[](https://github.com/LMMS/lmms/actions/workflows/build.yml)
|
||||
[](https://lmms.io/download)
|
||||
[](https://github.com/LMMS/lmms/releases)
|
||||
[](https://discord.gg/3sc5su7)
|
||||
[](https://www.transifex.com/lmms/lmms/)
|
||||
|
||||
What is LMMS?
|
||||
--------------
|
||||
|
||||
LMMS is an open-source cross-platform digital audio workstation designed for music production. It includes an advanced Piano Roll, Beat Sequencer, Song Editor, and Mixer for composing, arranging, and mixing music. It comes with 15+ synthesizer plugins by default, along with VST2 and SoundFont2 support.
|
||||
LMMS is a free cross-platform alternative to commercial programs like
|
||||
FL Studio®, which allow you to produce music with your computer. This includes
|
||||
the creation of melodies and beats, the synthesis and mixing of sounds, and
|
||||
arranging of samples. You can have fun with your MIDI-keyboard and much more;
|
||||
all in a user-friendly and modern interface.
|
||||
|
||||
[Homepage](https://lmms.io)<br>
|
||||
[Downloads/Releases](https://github.com/LMMS/lmms/releases)<br>
|
||||
[Developer Wiki](https://github.com/LMMS/lmms/wiki)<br>
|
||||
[Artist & User Wiki/Documentation](https://lmms.io/documentation)<br>
|
||||
[Sound Demos](https://lmms.io/showcase/)<br>
|
||||
[LMMS Sharing Platform](https://lmms.io/lsp/) Share your songs!
|
||||
|
||||
Features
|
||||
---------
|
||||
|
||||
* Song-Editor for arranging melodies, samples, patterns, and automation
|
||||
* Song-Editor for composing songs
|
||||
* Pattern-Editor for creating beats and patterns
|
||||
* An easy-to-use Piano-Roll for editing patterns and melodies
|
||||
* A Mixer with unlimited mixer channels and arbitrary number of effects
|
||||
* Many powerful instrument and effect-plugins out of the box
|
||||
* Full user-defined track-based automation and computer-controlled automation sources
|
||||
* Compatible with many standards such as SoundFont2, VST2 (instruments and effects), LADSPA, LV2, GUS Patches, and full MIDI support
|
||||
* Compatible with many standards such as SoundFont2, VST(i), LADSPA, GUS Patches, and full MIDI support
|
||||
* MIDI file importing and exporting
|
||||
|
||||
Building
|
||||
---------
|
||||
|
||||
See [Compiling LMMS](https://github.com/LMMS/lmms/wiki/Compiling)
|
||||
See [Compiling LMMS](https://github.com/LMMS/lmms/wiki/Compiling) on our
|
||||
wiki for information on how to build LMMS.
|
||||
|
||||
|
||||
Join LMMS-development
|
||||
----------------------
|
||||
|
||||
If you are interested in LMMS, its programming, artwork, testing, writing demo songs, (and improving this README...) or something like that, you're welcome to participate in the development of LMMS!
|
||||
If you are interested in LMMS, its programming, artwork, testing, writing demo
|
||||
songs, (and improving this README...) or something like that, you're welcome
|
||||
to participate in the development of LMMS!
|
||||
|
||||
Information about what you can do and how can be found in the [wiki](https://github.com/LMMS/lmms/wiki).
|
||||
Information about what you can do and how can be found in the
|
||||
[wiki](https://github.com/LMMS/lmms/wiki).
|
||||
|
||||
Before coding a new big feature, please _always_ [file an issue](https://github.com/LMMS/lmms/issues/new) for your idea and suggestions about your feature and about the intended implementation on GitHub, or ask in one of the tech channels on Discord and wait for replies! Maybe there are different ideas, improvements, or hints, or maybe your feature is not welcome/needed at the moment.
|
||||
Before coding a new big feature, please _always_
|
||||
[file an issue](https://github.com/LMMS/lmms/issues/new) for your idea and
|
||||
suggestions about your feature and about the intended implementation on GitHub,
|
||||
or ask in one of the tech channels on Discord and wait for replies! Maybe there are different ideas, improvements, or hints, or
|
||||
maybe your feature is not welcome/needed at the moment.
|
||||
|
||||
@@ -14,14 +14,10 @@ ENDIF()
|
||||
SET(CPACK_PACKAGE_INSTALL_DIRECTORY "${PROJECT_NAME_UCASE}")
|
||||
SET(CPACK_SOURCE_GENERATOR "TBZ2")
|
||||
SET(CPACK_SOURCE_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${VERSION}")
|
||||
SET(CPACK_PACKAGE_EXECUTABLES "${CMAKE_PROJECT_NAME}" "${PROJECT_NAME_UCASE} binary")
|
||||
|
||||
# Disable strip for Debug|RelWithDebInfo
|
||||
if(CMAKE_BUILD_TYPE MATCHES "Deb")
|
||||
unset(CPACK_STRIP_FILES)
|
||||
else()
|
||||
set(CPACK_STRIP_FILES TRUE)
|
||||
endif()
|
||||
IF(NOT DEFINED WIN32)
|
||||
SET(CPACK_STRIP_FILES "bin/${CMAKE_PROJECT_NAME};${PLUGIN_DIR}/*.so")
|
||||
SET(CPACK_PACKAGE_EXECUTABLES "${CMAKE_PROJECT_NAME}" "${PROJECT_NAME_UCASE} binary")
|
||||
ENDIF()
|
||||
|
||||
IF(LMMS_BUILD_WIN32)
|
||||
ADD_SUBDIRECTORY(nsis)
|
||||
|
||||
@@ -1,38 +1,35 @@
|
||||
IF(CMAKE_OSX_ARCHITECTURES)
|
||||
SET(DMG_ARCH "${CMAKE_OSX_ARCHITECTURES}")
|
||||
ELSEIF(IS_ARM64)
|
||||
# Target arch is host arch
|
||||
SET(DMG_ARCH "arm64")
|
||||
ELSE()
|
||||
# Fallback to Intel
|
||||
SET(DMG_ARCH "x86_64")
|
||||
ENDIF()
|
||||
SET(MACOSX_BUNDLE_ICON_FILE "icon.icns")
|
||||
SET(MACOSX_BUNDLE_GUI_IDENTIFIER "${PROJECT_NAME_UCASE}")
|
||||
SET(MACOSX_BUNDLE_LONG_VERSION_STRING "${VERSION}")
|
||||
SET(MACOSX_BUNDLE_BUNDLE_NAME "${PROJECT_NAME_UCASE}")
|
||||
SET(MACOSX_BUNDLE_SHORT_VERSION_STRING "${VERSION}")
|
||||
SET(MACOSX_BUNDLE_BUNDLE_VERSION "${VERSION}")
|
||||
SET(MACOSX_BUNDLE_COPYRIGHT "${PROJECT_COPYRIGHT}")
|
||||
SET(MACOSX_BUNDLE_MIMETYPE "application/x-lmms-project")
|
||||
SET(MACOSX_BUNDLE_MIMETYPE_ICON "project.icns")
|
||||
SET(MACOSX_BUNDLE_MIMETYPE_ID "io.lmms")
|
||||
SET(MACOSX_BUNDLE_PROJECT_URL "${PROJECT_URL}")
|
||||
SET(MACOSX_BUNDLE_DMG_TITLE "${MACOSX_BUNDLE_BUNDLE_NAME} ${MACOSX_BUNDLE_LONG_VERSION_STRING}")
|
||||
|
||||
# Standard CPack options
|
||||
set(CPACK_GENERATOR "External" PARENT_SCOPE)
|
||||
set(CPACK_EXTERNAL_ENABLE_STAGING TRUE PARENT_SCOPE)
|
||||
set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${VERSION}-mac${APPLE_OS_VER}-${DMG_ARCH}")
|
||||
set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_FILE_NAME}" PARENT_SCOPE)
|
||||
set(CPACK_PRE_BUILD_SCRIPTS "${CMAKE_CURRENT_SOURCE_DIR}/MacDeployQt.cmake" PARENT_SCOPE)
|
||||
# disable cpack's strip: causes missing symbols on macOS
|
||||
set(CPACK_STRIP_FILES_ORIG "${CPACK_STRIP_FILES}" PARENT_SCOPE)
|
||||
set(CPACK_STRIP_FILES FALSE PARENT_SCOPE)
|
||||
# FIXME: appdmg won't allow volume names > 27 char
|
||||
# See also https://github.com/LinusU/node-appdmg/issues/48
|
||||
STRING(SUBSTRING "${MACOSX_BUNDLE_DMG_TITLE}" 0 27 MACOSX_BUNDLE_DMG_TITLE)
|
||||
|
||||
# Custom vars to expose to Cpack
|
||||
# must be prefixed with "CPACK_" per https://stackoverflow.com/a/46526757/3196753)
|
||||
set(CPACK_CURRENT_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}" PARENT_SCOPE)
|
||||
set(CPACK_CURRENT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}" PARENT_SCOPE)
|
||||
set(CPACK_BINARY_DIR "${CMAKE_BINARY_DIR}" PARENT_SCOPE)
|
||||
set(CPACK_SOURCE_DIR "${CMAKE_SOURCE_DIR}" PARENT_SCOPE)
|
||||
set(CPACK_QMAKE_EXECUTABLE "${QT_QMAKE_EXECUTABLE}" PARENT_SCOPE)
|
||||
set(CPACK_CARLA_LIBRARIES "${CARLA_LIBRARIES}" PARENT_SCOPE)
|
||||
set(CPACK_PROJECT_NAME "${PROJECT_NAME}" PARENT_SCOPE)
|
||||
set(CPACK_PROJECT_VERSION "${VERSION}" PARENT_SCOPE)
|
||||
set(CPACK_PROJECT_NAME_UCASE "${PROJECT_NAME_UCASE}" PARENT_SCOPE)
|
||||
set(CPACK_PROJECT_URL "${PROJECT_URL}" PARENT_SCOPE)
|
||||
set(CPACK_SUIL_MODULES "${Suil_MODULES}" PARENT_SCOPE)
|
||||
set(CPACK_SUIL_MODULES_PREFIX "${Suil_MODULES_PREFIX}" PARENT_SCOPE)
|
||||
CONFIGURE_FILE("lmms.plist.in" "${CMAKE_BINARY_DIR}/Info.plist")
|
||||
CONFIGURE_FILE("install_apple.sh.in" "${CMAKE_BINARY_DIR}/install_apple.sh" @ONLY)
|
||||
CONFIGURE_FILE("package_apple.json.in" "${CMAKE_BINARY_DIR}/package_apple.json" @ONLY)
|
||||
|
||||
# DMG creation target
|
||||
SET(DMG_FILE "${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}-${VERSION}-mac${APPLE_OS_VER}.dmg")
|
||||
FILE(REMOVE "${DMG_FILE}")
|
||||
ADD_CUSTOM_TARGET(removedmg
|
||||
COMMAND touch "\"${DMG_FILE}\"" && rm "\"${DMG_FILE}\""
|
||||
COMMENT "Removing old DMG")
|
||||
ADD_CUSTOM_TARGET(dmg
|
||||
COMMAND appdmg "\"${CMAKE_BINARY_DIR}/package_apple.json\"" "\"${DMG_FILE}\""
|
||||
DEPENDS "${CMAKE_BINARY_DIR}/package_apple.json"
|
||||
COMMENT "Generating DMG")
|
||||
ADD_DEPENDENCIES(dmg removedmg)
|
||||
|
||||
# see also ../postinstall/CMakeLists.txt
|
||||
|
||||
if(CMAKE_VERSION VERSION_LESS "3.19")
|
||||
message(WARNING "DMG creation requires at least CMake 3.19")
|
||||
endif()
|
||||
|
||||
@@ -1,175 +0,0 @@
|
||||
# Create a macOS .dmg desktop installer using macdeployqt
|
||||
#
|
||||
# Copyright (c) 2025, Tres Finocchiaro, <tres.finocchiaro@gmail.com>
|
||||
#
|
||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||
|
||||
# Variables must be prefixed with "CPACK_" to be visible here
|
||||
set(lmms "${CPACK_PROJECT_NAME}")
|
||||
set(APP "${CPACK_TEMPORARY_INSTALL_DIRECTORY}/${CPACK_PROJECT_NAME_UCASE}.app")
|
||||
|
||||
# Toggle command echoing & verbosity
|
||||
# 0 = no output, 1 = error/warning, 2 = normal, 3 = debug
|
||||
if(DEFINED ENV{CPACK_DEBUG})
|
||||
set(CPACK_DEBUG "$ENV{CPACK_DEBUG}")
|
||||
endif()
|
||||
if(NOT CPACK_DEBUG)
|
||||
set(VERBOSITY 1)
|
||||
set(COMMAND_ECHO NONE)
|
||||
else()
|
||||
set(VERBOSITY 2)
|
||||
set(COMMAND_ECHO STDOUT)
|
||||
endif()
|
||||
|
||||
# Detect release|debug build
|
||||
if(NOT CPACK_STRIP_FILES_ORIG)
|
||||
# -use-debug-libs implies -no-strip
|
||||
if(CPACK_QMAKE_EXECUTABLE MATCHES "/homebrew/|/usr/local")
|
||||
message(STATUS "Homebrew does not provide debug qt libraries, replacing \"-use-debug-libs\" with \"-no-strip\" instead")
|
||||
set(USE_DEBUG_LIBS -no-strip)
|
||||
else()
|
||||
set(USE_DEBUG_LIBS -use-debug-libs)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Cleanup CPack "External" json, txt files, old DMG files
|
||||
file(GLOB cleanup "${CPACK_BINARY_DIR}/${lmms}-*.json"
|
||||
"${CPACK_BINARY_DIR}/${lmms}-*.dmg"
|
||||
"${CPACK_BINARY_DIR}/install_manifest.txt")
|
||||
list(SORT cleanup)
|
||||
file(REMOVE ${cleanup})
|
||||
|
||||
# Create bundle structure
|
||||
file(MAKE_DIRECTORY "${APP}/Contents/MacOS")
|
||||
file(MAKE_DIRECTORY "${APP}/Contents/Frameworks")
|
||||
file(MAKE_DIRECTORY "${APP}/Contents/Resources")
|
||||
|
||||
# Fix layout
|
||||
file(RENAME "${CPACK_TEMPORARY_INSTALL_DIRECTORY}/lib" "${APP}/Contents/lib")
|
||||
file(RENAME "${CPACK_TEMPORARY_INSTALL_DIRECTORY}/share" "${APP}/Contents/share")
|
||||
file(RENAME "${CPACK_TEMPORARY_INSTALL_DIRECTORY}/bin" "${APP}/Contents/bin")
|
||||
|
||||
# Move binaries into Contents/MacOS
|
||||
file(RENAME "${APP}/Contents/bin/${lmms}" "${APP}/Contents/MacOS/${lmms}")
|
||||
file(RENAME "${APP}/Contents/lib/${lmms}/RemoteZynAddSubFx" "${APP}/Contents/MacOS/RemoteZynAddSubFx")
|
||||
file(REMOVE_RECURSE "${APP}/Contents/bin")
|
||||
file(REMOVE_RECURSE "${APP}/Contents/share/man1")
|
||||
file(REMOVE_RECURSE "${APP}/Contents/include")
|
||||
|
||||
# Copy missing files
|
||||
# Convert https://lmms.io to io.lmms
|
||||
string(REPLACE "." ";" mime_parts "${CPACK_PROJECT_URL}")
|
||||
string(REPLACE ":" ";" mime_parts "${mime_parts}")
|
||||
string(REPLACE "/" "" mime_parts "${mime_parts}")
|
||||
list(REMOVE_AT mime_parts 0)
|
||||
list(REVERSE mime_parts)
|
||||
list(JOIN mime_parts "." MACOS_MIMETYPE_ID)
|
||||
configure_file("${CPACK_CURRENT_SOURCE_DIR}/lmms.plist.in" "${APP}/Contents/Info.plist" @ONLY)
|
||||
file(COPY "${CPACK_CURRENT_SOURCE_DIR}/project.icns" DESTINATION "${APP}/Contents/Resources")
|
||||
file(COPY "${CPACK_CURRENT_SOURCE_DIR}/icon.icns" DESTINATION "${APP}/Contents/Resources")
|
||||
file(RENAME "${APP}/Contents/Resources/icon.icns" "${APP}/Contents/Resources/${lmms}.icns")
|
||||
|
||||
# Copy Suil modules
|
||||
if(CPACK_SUIL_MODULES)
|
||||
set(SUIL_MODULES_TARGET "${APP}/Contents/Frameworks/${CPACK_SUIL_MODULES_PREFIX}")
|
||||
file(MAKE_DIRECTORY "${SUIL_MODULES_TARGET}")
|
||||
file(COPY ${CPACK_SUIL_MODULES} DESTINATION "${SUIL_MODULES_TARGET}")
|
||||
endif()
|
||||
|
||||
# Make all libraries writable for macdeployqt
|
||||
file(CHMOD_RECURSE "${APP}/Contents" PERMISSIONS
|
||||
OWNER_EXECUTE OWNER_WRITE OWNER_READ
|
||||
GROUP_EXECUTE GROUP_WRITE GROUP_READ
|
||||
WORLD_READ)
|
||||
|
||||
# Qt6: Fix @rpath bug https://github.com/orgs/Homebrew/discussions/2823
|
||||
include(CreateSymlink)
|
||||
get_filename_component(QTBIN "${CPACK_QMAKE_EXECUTABLE}" DIRECTORY)
|
||||
get_filename_component(QTDIR "${QTBIN}" DIRECTORY)
|
||||
create_symlink("${QTDIR}/lib" "${CPACK_TEMPORARY_INSTALL_DIRECTORY}/lib")
|
||||
|
||||
# Replace @rpath with @loader_path for Carla
|
||||
execute_process(COMMAND install_name_tool -change
|
||||
"@rpath/libcarlabase.dylib"
|
||||
"@loader_path/libcarlabase.dylib"
|
||||
"${APP}/Contents/lib/${lmms}/libcarlapatchbay.so"
|
||||
COMMAND_ECHO ${COMMAND_ECHO}
|
||||
COMMAND_ERROR_IS_FATAL ANY)
|
||||
execute_process(COMMAND install_name_tool -change
|
||||
"@rpath/libcarlabase.dylib"
|
||||
"@loader_path/libcarlabase.dylib"
|
||||
"${APP}/Contents/lib/${lmms}/libcarlarack.so"
|
||||
COMMAND_ECHO ${COMMAND_ECHO}
|
||||
COMMAND_ERROR_IS_FATAL ANY)
|
||||
|
||||
# Build list of executables to inform macdeployqt about
|
||||
# e.g. -executable=foo.dylib -executable=bar.dylib
|
||||
file(GLOB LIBS "${APP}/Contents/lib/${lmms}/*.so")
|
||||
|
||||
# Inform macdeployqt about LADSPA plugins; may depend on bundled fftw3f, etc.
|
||||
file(GLOB LADSPA "${APP}/Contents/lib/${lmms}/ladspa/*.so")
|
||||
|
||||
# Inform macdeployqt about remote plugins
|
||||
file(GLOB REMOTE_PLUGINS "${APP}/Contents/MacOS/*Remote*")
|
||||
|
||||
# Collect, sort and dedupe all libraries
|
||||
list(APPEND LIBS ${LADSPA})
|
||||
list(APPEND LIBS ${REMOTE_PLUGINS})
|
||||
list(APPEND LIBS ${CPACK_SUIL_MODULES})
|
||||
list(REMOVE_DUPLICATES LIBS)
|
||||
list(SORT LIBS)
|
||||
|
||||
# Construct macdeployqt parameters
|
||||
foreach(_lib IN LISTS LIBS)
|
||||
if(EXISTS "${_lib}")
|
||||
list(APPEND EXECUTABLES "-executable=${_lib}")
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
# Call macdeployqt
|
||||
get_filename_component(QTBIN "${CPACK_QMAKE_EXECUTABLE}" DIRECTORY)
|
||||
message(STATUS "Calling ${QTBIN}/macdeployqt ${APP} [... executables]")
|
||||
execute_process(COMMAND "${QTBIN}/macdeployqt" "${APP}" ${EXECUTABLES}
|
||||
-verbose=${VERBOSITY}
|
||||
${USE_DEBUG_LIBS}
|
||||
COMMAND_ECHO ${COMMAND_ECHO}
|
||||
COMMAND_ERROR_IS_FATAL ANY)
|
||||
|
||||
# Cleanup symlink
|
||||
file(REMOVE "${CPACK_TEMPORARY_INSTALL_DIRECTORY}/lib")
|
||||
|
||||
# Remove dummy carla libs, relink to a sane location (e.g. /Applications/Carla.app/...)
|
||||
# (must be done after calling macdeployqt)
|
||||
file(GLOB CARLALIBS "${APP}/Contents/lib/${lmms}/libcarla*")
|
||||
foreach(_carlalib IN LISTS CARLALIBS)
|
||||
foreach(_lib "${CPACK_CARLA_LIBRARIES}")
|
||||
set(_oldpath "../../Frameworks/lib${_lib}.dylib")
|
||||
set(_newpath "Carla.app/Contents/MacOS/lib${_lib}.dylib")
|
||||
execute_process(COMMAND install_name_tool -change
|
||||
"@loader_path/${_oldpath}"
|
||||
"@executable_path/../../../${_newpath}"
|
||||
"${_carlalib}"
|
||||
COMMAND_ECHO ${COMMAND_ECHO}
|
||||
COMMAND_ERROR_IS_FATAL ANY)
|
||||
file(REMOVE "${APP}/Contents/Frameworks/lib${_lib}.dylib")
|
||||
endforeach()
|
||||
endforeach()
|
||||
|
||||
# Call ad-hoc codesign manually (CMake offers this as well)
|
||||
execute_process(COMMAND codesign --force --deep --sign - "${APP}"
|
||||
COMMAND_ECHO ${COMMAND_ECHO}
|
||||
COMMAND_ERROR_IS_FATAL ANY)
|
||||
|
||||
# Create DMG
|
||||
# appdmg won't allow volume names > 27 char https://github.com/LinusU/node-alias/issues/7
|
||||
find_program(APPDMG_BIN appdmg REQUIRED)
|
||||
string(SUBSTRING "${CPACK_PROJECT_NAME_UCASE} ${CPACK_PROJECT_VERSION}" 0 27 APPDMG_VOLUME_NAME)
|
||||
# We'll configure this file twice (again in MacDeployQt.cmake once we know CPACK_TEMPORARY_INSTALL_DIRECTORY)
|
||||
configure_file("${CPACK_CURRENT_SOURCE_DIR}/appdmg.json.in" "${CPACK_CURRENT_BINARY_DIR}/appdmg.json" @ONLY)
|
||||
|
||||
execute_process(COMMAND "${APPDMG_BIN}"
|
||||
"${CPACK_CURRENT_BINARY_DIR}/appdmg.json"
|
||||
"${CPACK_BINARY_DIR}/${CPACK_PACKAGE_FILE_NAME}.dmg"
|
||||
COMMAND_ECHO ${COMMAND_ECHO}
|
||||
COMMAND_ERROR_IS_FATAL ANY)
|
||||
@@ -1,9 +0,0 @@
|
||||
{
|
||||
"title": "@APPDMG_VOLUME_NAME@",
|
||||
"background": "@CPACK_SOURCE_DIR@/cmake/apple/background.png",
|
||||
"icon-size": 128,
|
||||
"contents": [
|
||||
{ "x": 139, "y": 200, "type": "file", "path": "@CPACK_TEMPORARY_INSTALL_DIRECTORY@/@CPACK_PROJECT_NAME_UCASE@.app" },
|
||||
{ "x": 568, "y": 200, "type": "link", "path": "/Applications" }
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 114 KiB |
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 50 KiB |
BIN
cmake/apple/dmg_branding@2x.png
Normal file
|
After Width: | Height: | Size: 113 KiB |
104
cmake/apple/install_apple.sh.in
Normal file
@@ -0,0 +1,104 @@
|
||||
#!/bin/bash
|
||||
# Creates Apple ".app" bundle for @PROJECT_NAME_UCASE@
|
||||
# Note:
|
||||
# Examine linkings using `otool -L somelib.so`
|
||||
# Debug the loading of dynamic libraries using `export DYLD_PRINT_LIBRARIES=1`
|
||||
|
||||
set -e
|
||||
|
||||
# Place to create ".app" bundle
|
||||
APP="@CMAKE_BINARY_DIR@/@PROJECT_NAME_UCASE@.app"
|
||||
|
||||
MSG_COLOR='\x1B[1;36m'
|
||||
COLOR_RESET='\x1B[0m'
|
||||
echo -e "$MSG_COLOR\n\nCreating App Bundle \"$APP\"...$COLOR_RESET"
|
||||
|
||||
qtpath="$(dirname "@QT_QMAKE_EXECUTABLE@")"
|
||||
export PATH="$PATH:$qtpath"
|
||||
|
||||
# Remove any old .app bundles
|
||||
rm -Rf "$APP"
|
||||
|
||||
# Copy/overwrite Info.plist
|
||||
command cp "@CMAKE_BINARY_DIR@/Info.plist" "@CMAKE_INSTALL_PREFIX@/"
|
||||
|
||||
# Create .app bundle containing contents from CMAKE_INSTALL_PREFIX
|
||||
mkdir -p "$APP/Contents/MacOS"
|
||||
mkdir -p "$APP/Contents/Frameworks"
|
||||
mkdir -p "$APP/Contents/Resources"
|
||||
cd "@CMAKE_INSTALL_PREFIX@"
|
||||
cp -R ./* "$APP/Contents"
|
||||
cp "@CMAKE_SOURCE_DIR@/cmake/apple/"*.icns "$APP/Contents/Resources/"
|
||||
|
||||
# Make all libraries writable for macdeployqt
|
||||
cd "$APP"
|
||||
find . -type f -print0 | xargs -0 chmod u+w
|
||||
|
||||
lmmsbin="MacOS/@CMAKE_PROJECT_NAME@"
|
||||
zynbin="MacOS/RemoteZynAddSubFx"
|
||||
|
||||
# Move lmms binary
|
||||
mv "$APP/Contents/bin/@CMAKE_PROJECT_NAME@" "$APP/Contents/$lmmsbin"
|
||||
|
||||
# Fix zyn linking
|
||||
mv "$APP/Contents/lib/lmms/RemoteZynAddSubFx" "$APP/Contents/$zynbin"
|
||||
|
||||
# Replace @rpath with @loader_path for Carla
|
||||
# See also plugins/CarlaBase/CMakeLists.txt
|
||||
# This MUST be done BEFORE calling macdeployqt
|
||||
install_name_tool -change @rpath/libcarlabase.dylib \
|
||||
@loader_path/libcarlabase.dylib \
|
||||
"$APP/Contents/lib/lmms/libcarlapatchbay.so"
|
||||
|
||||
install_name_tool -change @rpath/libcarlabase.dylib \
|
||||
@loader_path/libcarlabase.dylib \
|
||||
"$APP/Contents/lib/lmms/libcarlarack.so"
|
||||
|
||||
# Link lmms binary
|
||||
_executables="${_executables} -executable=$APP/Contents/$zynbin"
|
||||
|
||||
# Build a list of shared objects in target/lib/lmms
|
||||
for file in "$APP/Contents/lib/lmms/"*.so; do
|
||||
_thisfile="$APP/Contents/lib/lmms/${file##*/}"
|
||||
_executables="${_executables} -executable=$_thisfile"
|
||||
done
|
||||
|
||||
# Build a list of shared objects in target/lib/lmms/ladspa
|
||||
for file in "$APP/Contents/lib/lmms/ladspa/"*.so; do
|
||||
_thisfile="$APP/Contents/lib/lmms/ladspa/${file##*/}"
|
||||
_executables="${_executables} -executable=$_thisfile"
|
||||
done
|
||||
|
||||
# Finalize .app
|
||||
# shellcheck disable=SC2086
|
||||
macdeployqt "$APP" $_executables
|
||||
|
||||
# Carla is a standalone plugin. Remove library, look for it side-by-side LMMS.app
|
||||
# This MUST be done AFTER calling macdeployqt
|
||||
#
|
||||
# For example:
|
||||
# /Applications/LMMS.app
|
||||
# /Applications/Carla.app
|
||||
carlalibs=$(echo "@CARLA_LIBRARIES@"|tr ";" "\n")
|
||||
|
||||
# Loop over all libcarlas, fix linking
|
||||
for file in "$APP/Contents/lib/lmms/"libcarla*; do
|
||||
_thisfile="$APP/Contents/lib/lmms/${file##*/}"
|
||||
for lib in $carlalibs; do
|
||||
_oldpath="../../Frameworks/lib${lib}.dylib"
|
||||
_newpath="Carla.app/Contents/MacOS/lib${lib}.dylib"
|
||||
# shellcheck disable=SC2086
|
||||
install_name_tool -change @loader_path/$_oldpath \
|
||||
@executable_path/../../../$_newpath \
|
||||
"$_thisfile"
|
||||
rm -f "$APP/Contents/Frameworks/lib${lib}.dylib"
|
||||
done
|
||||
done
|
||||
|
||||
# Cleanup
|
||||
rm -rf "$APP/Contents/bin"
|
||||
|
||||
# Codesign
|
||||
codesign --force --deep --sign - "$APP"
|
||||
|
||||
echo -e "\nFinished.\n\n"
|
||||
@@ -7,13 +7,13 @@
|
||||
<string>English</string>
|
||||
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>@CPACK_PROJECT_NAME@</string>
|
||||
<string>@MACOSX_BUNDLE_ICON_FILE@</string>
|
||||
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
|
||||
<key>CFBundleGetInfoString</key>
|
||||
<string>@CPACK_PROJECT_NAME_UCASE@ @CPACK_PROJECT_VERSION@</string>
|
||||
<string>@MACOSX_BUNDLE_GUI_IDENTIFIER@ @MACOSX_BUNDLE_LONG_VERSION_STRING@</string>
|
||||
|
||||
<!--
|
||||
#############################################################
|
||||
@@ -29,38 +29,38 @@
|
||||
#############################################################
|
||||
-->
|
||||
<key>CFBundleSignature</key>
|
||||
<string>@CPACK_PROJECT_NAME_UCASE@</string>
|
||||
<string>@MACOSX_BUNDLE_GUI_IDENTIFIER@</string>
|
||||
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>@CPACK_PROJECT_NAME@</string>
|
||||
<string>@MACOSX_BUNDLE_GUI_IDENTIFIER@</string>
|
||||
|
||||
<key>CFBundleVersion</key>
|
||||
<string>@CPACK_PROJECT_VERSION@</string>
|
||||
<string>@MACOSX_BUNDLE_LONG_VERSION_STRING@</string>
|
||||
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>@VERSIONCPACK_PROJECT_VERSION@</string>
|
||||
<string>@MACOSX_BUNDLE_LONG_VERSION_STRING@</string>
|
||||
|
||||
<key>CFBundleName</key>
|
||||
<string>@CPACK_PROJECT_NAME_UCASE@</string>
|
||||
<string>@MACOSX_BUNDLE_BUNDLE_NAME@</string>
|
||||
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>@MACOS_MIMETYPE_ID@</string>
|
||||
<string>@MACOSX_BUNDLE_MIMETYPE_ID@</string>
|
||||
|
||||
<key>CFBundleDocumentTypes</key>
|
||||
<array>
|
||||
|
||||
|
||||
<dict>
|
||||
<key>CFBundleTypeExtensions</key>
|
||||
<array>
|
||||
<string>mmpz</string>
|
||||
</array>
|
||||
<key>CFBundleTypeIconFile</key>
|
||||
<string>project</string>
|
||||
<string>@MACOSX_BUNDLE_MIMETYPE_ICON@</string>
|
||||
<key>CFBundleTypeName</key>
|
||||
<string>@CPACK_PROJECT_NAME_UCASE@ Project</string>
|
||||
<string>@MACOSX_BUNDLE_GUI_IDENTIFIER@ Project</string>
|
||||
<key>CFBundleTypeOSTypes</key>
|
||||
<array>
|
||||
<string>mmpz</string>
|
||||
@@ -69,19 +69,19 @@
|
||||
<string>Editor</string>
|
||||
<key>CFBundleTypeMIMETypes</key>
|
||||
<array>
|
||||
<string>application/x-@CPACK_PROJECT_NAME@-project</string>
|
||||
<string>@MACOSX_BUNDLE_MIMETYPE@</string>
|
||||
</array>
|
||||
</dict>
|
||||
|
||||
|
||||
<dict>
|
||||
<key>CFBundleTypeExtensions</key>
|
||||
<array>
|
||||
<string>mmp</string>
|
||||
</array>
|
||||
<key>CFBundleTypeIconFile</key>
|
||||
<string>project</string>
|
||||
<string>@MACOSX_BUNDLE_MIMETYPE_ICON@</string>
|
||||
<key>CFBundleTypeName</key>
|
||||
<string>@CPACK_PROJECT_NAME_UCASE@ Project (uncompressed)</string>
|
||||
<string>@MACOSX_BUNDLE_GUI_IDENTIFIER@ Project (uncompressed)</string>
|
||||
<key>CFBundleTypeOSTypes</key>
|
||||
<array>
|
||||
<string>mmp</string>
|
||||
@@ -90,23 +90,23 @@
|
||||
<string>Editor</string>
|
||||
<key>CFBundleTypeMIMETypes</key>
|
||||
<array>
|
||||
<string>application/x-@CPACK_PROJECT_NAME@-project</string>
|
||||
<string>@MACOSX_BUNDLE_MIMETYPE@</string>
|
||||
</array>
|
||||
</dict>
|
||||
|
||||
|
||||
</array>
|
||||
|
||||
<key>UTExportedTypeDeclarations</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>UTTypeIdentifier</key>
|
||||
<string>@MACOS_MIMETYPE_ID@.mmpz</string>
|
||||
<string>@MACOSX_BUNDLE_MIMETYPE_ID@.mmpz</string>
|
||||
<key>UTTypeReferenceURL</key>
|
||||
<string>@CPACK_PROJECT_URL@</string>
|
||||
<string>@MACOSX_BUNDLE_PROJECT_URL@</string>
|
||||
<key>UTTypeDescription</key>
|
||||
<string>@CPACK_PROJECT_VERSIONPROJECT_NAME_UCASE@ Project</string>
|
||||
<string>@MACOSX_BUNDLE_GUI_IDENTIFIER@ Project</string>
|
||||
<key>UTTypeIconFile</key>
|
||||
<string>project</string>
|
||||
<string>@MACOSX_BUNDLE_MIMETYPE_ICON@</string>
|
||||
<key>UTTypeConformsTo</key>
|
||||
<array>
|
||||
<string>public.data</string>
|
||||
@@ -122,13 +122,13 @@
|
||||
|
||||
<dict>
|
||||
<key>UTTypeIdentifier</key>
|
||||
<string>@MACOS_MIMETYPE_ID@.mmp</string>
|
||||
<string>@MACOSX_BUNDLE_MIMETYPE_ID@.mmp</string>
|
||||
<key>UTTypeReferenceURL</key>
|
||||
<string>@CPACK_PROJECT_URL@</string>
|
||||
<string>@MACOSX_BUNDLE_PROJECT_URL@</string>
|
||||
<key>UTTypeDescription</key>
|
||||
<string>@CPACK_PROJECT_NAME_UCASE@ Project (uncompressed)</string>
|
||||
<string>@MACOSX_BUNDLE_GUI_IDENTIFIER@ Project (uncompressed)</string>
|
||||
<key>UTTypeIconFile</key>
|
||||
<string>project</string>
|
||||
<string>@MACOSX_BUNDLE_MIMETYPE_ICON@</string>
|
||||
<key>UTTypeConformsTo</key>
|
||||
<array>
|
||||
<string>public.xml</string>
|
||||
|
||||
9
cmake/apple/package_apple.json.in
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"title": "@MACOSX_BUNDLE_DMG_TITLE@",
|
||||
"background": "@CMAKE_SOURCE_DIR@/cmake/apple/dmg_branding.png",
|
||||
"icon-size": 128,
|
||||
"contents": [
|
||||
{ "x": 139, "y": 200, "type": "file", "path": "@CMAKE_BINARY_DIR@/@MACOSX_BUNDLE_BUNDLE_NAME@.app" },
|
||||
{ "x": 568, "y": 200, "type": "link", "path": "/Applications" }
|
||||
]
|
||||
}
|
||||
40
cmake/build_win32.sh
Executable file
@@ -0,0 +1,40 @@
|
||||
#!/usr/bin/env bash
|
||||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
# Accomodate both linux windows mingw locations
|
||||
if [ -z "$ARCH" ]; then
|
||||
ARCH=32
|
||||
fi
|
||||
|
||||
MINGW=/mingw$ARCH
|
||||
|
||||
if [ -z "$MSYSCON" ]; then
|
||||
MINGW=/opt$MINGW
|
||||
|
||||
DISTRO=$(lsb_release -si)
|
||||
DISTRO_VERSION=$(lsb_release -sr)
|
||||
|
||||
if [ "$DISTRO" != "Ubuntu" ]; then
|
||||
echo "This script only supports Ubuntu"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "$DISTRO_VERSION" == "14.04" ]; then
|
||||
TOOLCHAIN="$DIR/toolchains/Ubuntu-MinGW-X-Trusty-$ARCH.cmake"
|
||||
else
|
||||
TOOLCHAIN="$DIR/toolchains/Ubuntu-MinGW-W64-$ARCH.cmake"
|
||||
fi
|
||||
else
|
||||
TOOLCHAIN="$DIR/toolchains/MSYS-$ARCH.cmake"
|
||||
fi
|
||||
|
||||
export PATH=$MINGW/bin:$PATH
|
||||
export CXXFLAGS="$CFLAGS"
|
||||
if [ "$ARCH" == "32" ]; then
|
||||
export CFLAGS="-march=pentium3 -mtune=generic -mpreferred-stack-boundary=5 -mfpmath=sse"
|
||||
fi
|
||||
|
||||
CMAKE_OPTS="-DCMAKE_PREFIX_PATH=$MINGW $CMAKE_OPTS"
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
cmake "$DIR/.." -DCMAKE_TOOLCHAIN_FILE="$TOOLCHAIN" $CMAKE_OPTS
|
||||
3
cmake/build_win64.sh
Executable file
@@ -0,0 +1,3 @@
|
||||
#!/usr/bin/env bash
|
||||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
ARCH=64 "$DIR/build_win32.sh"
|
||||
@@ -1,9 +1,6 @@
|
||||
SET(PLUGIN_FILES "")
|
||||
IF(LMMS_BUILD_WIN32)
|
||||
INSTALL(FILES $<TARGET_FILE:Qt${QT_VERSION_MAJOR}::QWindowsIntegrationPlugin> DESTINATION platforms)
|
||||
INSTALL(FILES $<TARGET_FILE:Qt${QT_VERSION_MAJOR}::QSvgIconPlugin> DESTINATION iconengines)
|
||||
INSTALL(FILES $<TARGET_FILE:Qt${QT_VERSION_MAJOR}::QSvgPlugin> DESTINATION imageformats)
|
||||
INSTALL(FILES $<TARGET_FILE:Qt${QT_VERSION_MAJOR}::Svg> DESTINATION .)
|
||||
INSTALL(FILES $<TARGET_FILE:Qt5::QWindowsIntegrationPlugin> DESTINATION platforms)
|
||||
ENDIF()
|
||||
|
||||
IF(LMMS_BUILD_WIN32 OR LMMS_INSTALL_DEPENDENCIES)
|
||||
@@ -43,10 +40,17 @@ ENDIF()
|
||||
if(LMMS_HAVE_STK AND (LMMS_BUILD_WIN32 OR LMMS_BUILD_APPLE))
|
||||
if(STK_RAWWAVE_ROOT)
|
||||
file(GLOB RAWWAVES "${STK_RAWWAVE_ROOT}/*.raw")
|
||||
list(SORT RAWWAVES)
|
||||
install(FILES ${RAWWAVES} DESTINATION "${DATA_DIR}/stk/rawwaves")
|
||||
else()
|
||||
message(WARNING "Can't find STK rawwave root!")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
IF(LMMS_BUILD_APPLE)
|
||||
INSTALL(CODE "EXECUTE_PROCESS(COMMAND chmod u+x ${CMAKE_BINARY_DIR}/install_apple.sh)")
|
||||
INSTALL(CODE "EXECUTE_PROCESS(COMMAND ${CMAKE_BINARY_DIR}/install_apple.sh RESULT_VARIABLE EXIT_CODE)
|
||||
IF(NOT EXIT_CODE EQUAL 0)
|
||||
MESSAGE(FATAL_ERROR \"Execution of install_apple.sh failed\")
|
||||
ENDIF()
|
||||
")
|
||||
ENDIF()
|
||||
|
||||
@@ -3,21 +3,17 @@
|
||||
ADVAPI32.dll
|
||||
COMCTL32.dll
|
||||
comdlg32.dll
|
||||
d3d11.dll
|
||||
dwmapi.dll
|
||||
dxgi.dll
|
||||
GDI32.dll
|
||||
IMM32.dll
|
||||
KERNEL32.dll
|
||||
MPR.DLL
|
||||
msvcrt.dll
|
||||
netapi32.dll
|
||||
ole32.dll
|
||||
OLEAUT32.dll
|
||||
OPENGL32.DLL
|
||||
SHELL32.dll
|
||||
USER32.dll
|
||||
userenv.dll
|
||||
UxTheme.dll
|
||||
VERSION.dll
|
||||
WINMM.DLL
|
||||
|
||||
@@ -1,51 +1,19 @@
|
||||
install(DIRECTORY icons/ DESTINATION "${DATA_DIR}/icons/hicolor")
|
||||
install(FILES lmms.desktop DESTINATION "${DATA_DIR}/applications")
|
||||
install(FILES lmms.xml DESTINATION "${DATA_DIR}/mime/packages")
|
||||
INSTALL(DIRECTORY icons/ DESTINATION "${DATA_DIR}/icons/hicolor")
|
||||
INSTALL(FILES lmms.desktop DESTINATION "${DATA_DIR}/applications")
|
||||
INSTALL(FILES lmms.xml DESTINATION "${DATA_DIR}/mime/packages")
|
||||
|
||||
# Preserve old CPack behavior
|
||||
if(WANT_CPACK_TARBALL)
|
||||
message(STATUS "Skipping AppImage creation")
|
||||
return()
|
||||
endif()
|
||||
# AppImage creation target
|
||||
SET(APPIMAGE_FILE "${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}-${VERSION}-linux-${CMAKE_SYSTEM_PROCESSOR}.AppImage")
|
||||
|
||||
# Standard CPack options
|
||||
set(CPACK_GENERATOR "External" PARENT_SCOPE)
|
||||
set(CPACK_EXTERNAL_ENABLE_STAGING true PARENT_SCOPE)
|
||||
set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${VERSION}-linux-${CMAKE_SYSTEM_PROCESSOR}")
|
||||
set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_FILE_NAME}" PARENT_SCOPE)
|
||||
set(CPACK_PRE_BUILD_SCRIPTS "${CMAKE_CURRENT_SOURCE_DIR}/LinuxDeploy.cmake" PARENT_SCOPE)
|
||||
CONFIGURE_FILE("package_linux.sh.in" "${CMAKE_BINARY_DIR}/package_linux.sh" @ONLY)
|
||||
|
||||
# Custom vars to expose to Cpack
|
||||
# must be prefixed with "CPACK_" per https://stackoverflow.com/a/46526757/3196753)
|
||||
set(CPACK_CURRENT_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}" PARENT_SCOPE)
|
||||
set(CPACK_CURRENT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}" PARENT_SCOPE)
|
||||
set(CPACK_BINARY_DIR "${CMAKE_BINARY_DIR}" PARENT_SCOPE)
|
||||
set(CPACK_SOURCE_DIR "${CMAKE_SOURCE_DIR}" PARENT_SCOPE)
|
||||
set(CPACK_QMAKE_EXECUTABLE "${QT_QMAKE_EXECUTABLE}" PARENT_SCOPE)
|
||||
set(CPACK_CARLA_LIBRARIES "${CARLA_LIBRARIES}" PARENT_SCOPE)
|
||||
set(CPACK_WINE_32_LIBRARY_DIRS "${WINE_32_LIBRARY_DIRS}" PARENT_SCOPE)
|
||||
set(CPACK_WINE_64_LIBRARY_DIRS "${WINE_64_LIBRARY_DIRS}" PARENT_SCOPE)
|
||||
set(CPACK_PROJECT_NAME "${PROJECT_NAME}" PARENT_SCOPE)
|
||||
set(CPACK_PROJECT_NAME_UCASE "${PROJECT_NAME_UCASE}" PARENT_SCOPE)
|
||||
set(CPACK_PROJECT_VERSION "${VERSION}" PARENT_SCOPE)
|
||||
set(CPACK_CMAKE_COMMAND "${CMAKE_COMMAND}" PARENT_SCOPE)
|
||||
set(CPACK_SUIL_MODULES "${Suil_MODULES}" PARENT_SCOPE)
|
||||
set(CPACK_SUIL_MODULES_PREFIX "${Suil_MODULES_PREFIX}" PARENT_SCOPE)
|
||||
set(CPACK_STK_RAWWAVE_ROOT "${STK_RAWWAVE_ROOT}" PARENT_SCOPE)
|
||||
|
||||
# TODO: Canidate for DetectMachine.cmake
|
||||
if(IS_X86_64)
|
||||
set(CPACK_TARGET_ARCH x86_64 PARENT_SCOPE)
|
||||
elseif(IS_X86)
|
||||
set(CPACK_TARGET_ARCH i386 PARENT_SCOPE)
|
||||
elseif(IS_ARM64)
|
||||
set(CPACK_TARGET_ARCH aarch64 PARENT_SCOPE)
|
||||
elseif(IS_ARM32)
|
||||
set(CPACK_TARGET_ARCH armhf PARENT_SCOPE)
|
||||
else()
|
||||
set(CPACK_TARGET_ARCH unknown PARENT_SCOPE)
|
||||
endif()
|
||||
|
||||
if(CMAKE_VERSION VERSION_LESS "3.19")
|
||||
message(WARNING "AppImage creation requires at least CMake 3.19")
|
||||
endif()
|
||||
FILE(REMOVE "${APPIMAGE_FILE}")
|
||||
ADD_CUSTOM_TARGET(removeappimage
|
||||
COMMAND rm -f "${APPIMAGE_FILE}"
|
||||
COMMENT "Removing old AppImage")
|
||||
ADD_CUSTOM_TARGET(appimage
|
||||
COMMAND chmod +x "${CMAKE_BINARY_DIR}/package_linux.sh"
|
||||
COMMAND "${CMAKE_BINARY_DIR}/package_linux.sh"
|
||||
COMMENT "Generating AppImage"
|
||||
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}")
|
||||
ADD_DEPENDENCIES(appimage removeappimage)
|
||||
|
||||
@@ -1,244 +0,0 @@
|
||||
# Create a Linux desktop installer using linuxdeploy
|
||||
# * Creates a relocatable LMMS.AppDir installation in build/_CPack_Packages using linuxdeploy
|
||||
# * If CPACK_TOOL=appimagetool or is not set, bundles AppDir into redistributable ".AppImage" file
|
||||
# * If CPACK_TOOL=makeself is provided, bundles into a redistributable ".run" file
|
||||
#
|
||||
# Copyright (c) 2025, Tres Finocchiaro, <tres.finocchiaro@gmail.com>
|
||||
#
|
||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||
|
||||
# Variables must be prefixed with "CPACK_" to be visible here
|
||||
set(lmms "${CPACK_PROJECT_NAME}")
|
||||
set(LMMS "${CPACK_PROJECT_NAME_UCASE}")
|
||||
set(ARCH "${CPACK_TARGET_ARCH}")
|
||||
set(APP "${CPACK_TEMPORARY_INSTALL_DIRECTORY}/${LMMS}.AppDir")
|
||||
|
||||
# Target AppImage file
|
||||
set(APPIMAGE_FILE "${CPACK_BINARY_DIR}/${CPACK_PACKAGE_FILE_NAME}.AppImage")
|
||||
set(APPIMAGE_BEFORE_RENAME "${CPACK_BINARY_DIR}/${LMMS}-${ARCH}.AppImage")
|
||||
|
||||
set(DESKTOP_FILE "${APP}/usr/share/applications/${lmms}.desktop")
|
||||
|
||||
# Determine which packaging tool to use
|
||||
if(NOT CPACK_TOOL)
|
||||
# Pick up environmental variable
|
||||
if(DEFINED ENV{CPACK_TOOL})
|
||||
set(CPACK_TOOL "$ENV{CPACK_TOOL}")
|
||||
else()
|
||||
set(CPACK_TOOL "appimagetool")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Toggle command echoing & verbosity
|
||||
# 0 = no output, 1 = error/warning, 2 = normal, 3 = debug
|
||||
if(DEFINED ENV{CPACK_DEBUG})
|
||||
set(CPACK_DEBUG "$ENV{CPACK_DEBUG}")
|
||||
endif()
|
||||
if(NOT CPACK_DEBUG)
|
||||
set(VERBOSITY 1)
|
||||
set(APPIMAGETOOL_VERBOSITY "")
|
||||
set(COMMAND_ECHO NONE)
|
||||
set(OUTPUT_QUIET OUTPUT_QUIET)
|
||||
else()
|
||||
set(VERBOSITY 2)
|
||||
set(APPIMAGETOOL_VERBOSITY "--verbose")
|
||||
set(COMMAND_ECHO STDOUT)
|
||||
unset(OUTPUT_QUIET)
|
||||
endif()
|
||||
|
||||
include(DownloadBinary)
|
||||
include(CreateSymlink)
|
||||
include(CopyDependency)
|
||||
|
||||
# Cleanup CPack "External" json, txt files, old AppImage files
|
||||
file(GLOB cleanup "${CPACK_BINARY_DIR}/${lmms}-*.json"
|
||||
"${CPACK_BINARY_DIR}/${lmms}-*.AppImage"
|
||||
"${CPACK_BINARY_DIR}/install_manifest.txt")
|
||||
list(SORT cleanup)
|
||||
file(REMOVE ${cleanup})
|
||||
|
||||
# Download and extract linuxdeploy
|
||||
download_binary(LINUXDEPLOY_BIN
|
||||
"https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-${ARCH}.AppImage"
|
||||
linuxdeploy-${ARCH}.AppImage
|
||||
FALSE)
|
||||
|
||||
# Guess the path to appimagetool
|
||||
set(APPIMAGETOOL_BIN "${CPACK_CURRENT_BINARY_DIR}/.linuxdeploy-${ARCH}.AppImage/squashfs-root/plugins/linuxdeploy-plugin-appimage/appimagetool-prefix/AppRun")
|
||||
|
||||
# Download linuxdeploy-plugin-qt
|
||||
download_binary(LINUXDEPLOY_PLUGIN_BIN
|
||||
"https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-${ARCH}.AppImage"
|
||||
linuxdeploy-plugin-qt-${ARCH}.AppImage
|
||||
FALSE)
|
||||
|
||||
message(STATUS "Creating AppDir ${APP}...")
|
||||
|
||||
file(REMOVE_RECURSE "${CPACK_TEMPORARY_INSTALL_DIRECTORY}/include")
|
||||
file(MAKE_DIRECTORY "${APP}/usr")
|
||||
|
||||
# Setup AppDir structure (/usr/bin, /usr/lib, /usr/share... etc)
|
||||
file(GLOB files "${CPACK_TEMPORARY_INSTALL_DIRECTORY}/*")
|
||||
list(SORT files)
|
||||
foreach(_file ${files})
|
||||
get_filename_component(_filename "${_file}" NAME)
|
||||
if(NOT _filename MATCHES ".AppDir")
|
||||
file(RENAME "${_file}" "${APP}/usr/${_filename}")
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
# Gather deps
|
||||
list(APPEND DEPLOY_DEPS
|
||||
--deploy-deps-only "${APP}/usr/lib/${lmms}/"
|
||||
--deploy-deps-only "${APP}/usr/lib/${lmms}/ladspa/"
|
||||
)
|
||||
|
||||
# If usr/bin/lmms is hard-linked to libjack, copy it to a new location
|
||||
# See https://github.com/LMMS/lmms/issues/7689
|
||||
copy_dependency("${APP}/usr/bin/lmms" "libjack.so" "${APP}/usr/lib/jack" JACK_LIB_RELOC)
|
||||
if(JACK_LIB_RELOC)
|
||||
list(APPEND DEPLOY_DEPS --deploy-deps-only "${JACK_LIB_RELOC}")
|
||||
endif()
|
||||
|
||||
if(CPACK_HAVE_VST_32)
|
||||
list(APPEND DEPLOY_DEPS --deploy-deps-only "${APP}/usr/lib/${lmms}/32/")
|
||||
endif()
|
||||
|
||||
# Copy Suil modules
|
||||
if(CPACK_SUIL_MODULES)
|
||||
set(SUIL_MODULES_TARGET "${APP}/usr/lib/suil-0/")
|
||||
file(MAKE_DIRECTORY "${SUIL_MODULES_TARGET}")
|
||||
file(COPY ${CPACK_SUIL_MODULES} DESTINATION "${SUIL_MODULES_TARGET}")
|
||||
list(APPEND DEPLOY_DEPS --deploy-deps-only "${APP}/usr/lib/suil-0/")
|
||||
endif()
|
||||
|
||||
# Copy stk/rawwaves
|
||||
if(CPACK_STK_RAWWAVE_ROOT)
|
||||
set(STK_RAWWAVE_TARGET "${APP}/usr/share/stk/rawwaves/")
|
||||
file(MAKE_DIRECTORY "${STK_RAWWAVE_TARGET}")
|
||||
file(GLOB RAWWAVES "${CPACK_STK_RAWWAVE_ROOT}/*.raw")
|
||||
file(COPY ${RAWWAVES} DESTINATION "${STK_RAWWAVE_TARGET}")
|
||||
endif()
|
||||
|
||||
# Ensure project's "qmake" executable is first on the PATH
|
||||
get_filename_component(QTBIN "${CPACK_QMAKE_EXECUTABLE}" DIRECTORY)
|
||||
set(ENV{PATH} "${QTBIN}:$ENV{PATH}")
|
||||
|
||||
# Promote finding our own libraries first
|
||||
set(ENV{LD_LIBRARY_PATH} "${APP}/usr/lib/${lmms}/:${APP}/usr/lib/${lmms}/optional:$ENV{LD_LIBRARY_PATH}")
|
||||
|
||||
# Workaround for finding libs from online installer
|
||||
# https://github.com/linuxdeploy/linuxdeploy-plugin-qt/issues/193
|
||||
set(ENV{LD_LIBRARY_PATH} "${QTBIN}/../lib:$ENV{LD_LIBRARY_PATH}")
|
||||
|
||||
# Skip slow searching of copyright files https://github.com/linuxdeploy/linuxdeploy/issues/278
|
||||
set(ENV{DISABLE_COPYRIGHT_FILES_DEPLOYMENT} 1)
|
||||
|
||||
# Patch desktop file
|
||||
file(APPEND "${DESKTOP_FILE}" "X-AppImage-Version=${CPACK_PROJECT_VERSION}\n")
|
||||
|
||||
# Custom scripts to run immediately before lmms is executed
|
||||
file(COPY "${CPACK_SOURCE_DIR}/cmake/linux/apprun-hooks" DESTINATION "${APP}")
|
||||
file(REMOVE "${APP}/apprun-hooks/README.md")
|
||||
|
||||
# Prefer a hard-copy of .DirIcon over appimagetool's symlinking
|
||||
# 256x256 default for Cinnamon Desktop https://forums.linuxmint.com/viewtopic.php?p=2585952
|
||||
file(COPY "${APP}/usr/share/icons/hicolor/256x256/apps/${lmms}.png" DESTINATION "${APP}")
|
||||
file(RENAME "${APP}/${lmms}.png" "${APP}/.DirIcon")
|
||||
file(COPY "${APP}/usr/share/icons/hicolor/256x256/apps/${lmms}.png" DESTINATION "${APP}")
|
||||
|
||||
# Inform linuxdeploy-plugin-qt about wayland plugin
|
||||
set(ENV{EXTRA_PLATFORM_PLUGINS} "libqwayland-generic.so")
|
||||
set(ENV{EXTRA_QT_MODULES} "waylandcompositor")
|
||||
|
||||
# Call linuxdeploy
|
||||
message(STATUS "Calling ${LINUXDEPLOY_BIN} --appdir \"${APP}\" ... [... libraries].")
|
||||
execute_process(COMMAND "${LINUXDEPLOY_BIN}"
|
||||
--appdir "${APP}"
|
||||
--desktop-file "${DESKTOP_FILE}"
|
||||
--plugin qt
|
||||
${DEPLOY_DEPS}
|
||||
--exclude-library "*libgallium*"
|
||||
--verbosity ${VERBOSITY}
|
||||
WORKING_DIRECTORY "${CPACK_CURRENT_BINARY_DIR}"
|
||||
${OUTPUT_QUIET}
|
||||
COMMAND_ECHO ${COMMAND_ECHO}
|
||||
COMMAND_ERROR_IS_FATAL ANY)
|
||||
|
||||
# Remove svg ambitiously placed by linuxdeploy
|
||||
file(REMOVE "${APP}/${lmms}.svg")
|
||||
|
||||
# Remove libraries that are normally system-provided
|
||||
file(GLOB EXCLUDE_LIBS
|
||||
"${APP}/usr/lib/libwine*"
|
||||
"${APP}/usr/lib/libcarla_native*"
|
||||
"${APP}/usr/lib/${lmms}/optional/libcarla*"
|
||||
"${APP}/usr/lib/libjack*")
|
||||
|
||||
list(SORT EXCLUDE_LIBS)
|
||||
foreach(_lib IN LISTS EXCLUDE_LIBS)
|
||||
if(EXISTS "${_lib}")
|
||||
file(REMOVE "${_lib}")
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
# cleanup empty directories
|
||||
file(REMOVE_RECURSE "${APP}/usr/lib/${lmms}/optional/")
|
||||
|
||||
if(CPACK_TOOL STREQUAL "appimagetool")
|
||||
# Create ".AppImage" file using appimagetool (default)
|
||||
|
||||
# appimage plugin needs ARCH set when running in extracted form from squashfs-root / CI
|
||||
set(ENV{ARCH} "${ARCH}")
|
||||
message(STATUS "Finishing the AppImage...")
|
||||
execute_process(COMMAND "${APPIMAGETOOL_BIN}" "${APP}" "${APPIMAGE_FILE}"
|
||||
${APPIMAGETOOL_VERBOSITY}
|
||||
${OUTPUT_QUIET}
|
||||
COMMAND_ECHO ${COMMAND_ECHO}
|
||||
COMMAND_ERROR_IS_FATAL ANY)
|
||||
|
||||
message(STATUS "AppImage created: ${APPIMAGE_FILE}")
|
||||
elseif(CPACK_TOOL STREQUAL "makeself")
|
||||
# Create self-extracting ".run" script using makeself
|
||||
find_program(MAKESELF_BIN makeself REQUIRED)
|
||||
|
||||
message(STATUS "Finishing the .run file using ${MAKESELF_BIN}...")
|
||||
string(REPLACE ".AppImage" ".run" RUN_FILE "${APPIMAGE_FILE}")
|
||||
configure_file(
|
||||
"${CPACK_SOURCE_DIR}/cmake/linux/makeself_setup.sh.in" "${APP}/setup.sh" @ONLY
|
||||
FILE_PERMISSIONS
|
||||
OWNER_EXECUTE OWNER_WRITE OWNER_READ
|
||||
GROUP_EXECUTE GROUP_WRITE GROUP_READ
|
||||
WORLD_READ)
|
||||
|
||||
if(OUTPUT_QUIET)
|
||||
set(MAKESELF_QUIET "--quiet")
|
||||
set(ERROR_QUIET ERROR_QUIET)
|
||||
endif()
|
||||
|
||||
# makeself.sh [args] archive_dir file_name label startup_script [script_args]
|
||||
file(REMOVE "${RUN_FILE}")
|
||||
execute_process(COMMAND "${MAKESELF_BIN}"
|
||||
--keep-umask
|
||||
--nox11
|
||||
${MAKESELF_QUIET}
|
||||
"${APP}"
|
||||
"${RUN_FILE}"
|
||||
"${LMMS} Installer"
|
||||
"./setup.sh"
|
||||
${OUTPUT_QUIET}
|
||||
COMMAND_ECHO ${COMMAND_ECHO}
|
||||
COMMAND_ERROR_IS_FATAL ANY)
|
||||
|
||||
# ensure the installer can be executed as a script file
|
||||
execute_process(COMMAND "${RUN_FILE}" --help
|
||||
${OUTPUT_QUIET}
|
||||
${ERROR_QUIET}
|
||||
COMMAND_ECHO ${COMMAND_ECHO}
|
||||
COMMAND_ERROR_IS_FATAL ANY)
|
||||
|
||||
message(STATUS "Installer created: ${RUN_FILE}")
|
||||
else()
|
||||
message(FATAL_ERROR "Packaging tool CPACK_TOOL=\"${CPACK_TOOL}\" is not yet supported")
|
||||
endif()
|
||||
@@ -1,11 +0,0 @@
|
||||
# AppRun Hooks
|
||||
|
||||
Scripts placed in this directory will automatically be bundled into linuxdeploy AppImages
|
||||
(e.g. `LMMS.AppDir/apprun-hooks`) and executed immediately before lmms.
|
||||
|
||||
Quoting:
|
||||
|
||||
> "Sometimes it's important to perform actions before running the actual app. Some plugins might have to set e.g.,
|
||||
> environment variables to work properly."
|
||||
|
||||
See also: https://github.com/linuxdeploy/linuxdeploy/wiki/Plugin-system#apprun-hooks
|
||||
@@ -1,43 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Workaround nuances with carla being an optional-yet-hard-linked plugin
|
||||
CARLA_LIB_NAME="libcarla_native-plugin.so"
|
||||
KNOWN_LOCATIONS="lib lib64"
|
||||
unset CARLA_LIB_FILE
|
||||
|
||||
# Check for carla at "known" locations
|
||||
if command -v carla > /dev/null 2>&1; then
|
||||
CARLA_PATH="$(command -v carla)"
|
||||
CARLA_PREFIX="${CARLA_PATH%/bin*}"
|
||||
|
||||
# Look for libcarla_native-plugin.so in adjacent lib directory
|
||||
for lib in $KNOWN_LOCATIONS; do
|
||||
if [ -e "$CARLA_PREFIX/$lib/carla/$CARLA_LIB_NAME" ]; then
|
||||
# Add directory to LD_LIBRARY_PATH so libcarlabase.so can find it
|
||||
CARLA_LIB_FILE="$CARLA_PREFIX/$lib/carla/$CARLA_LIB_NAME"
|
||||
export LD_LIBRARY_PATH="$CARLA_PREFIX/$lib/carla/:$LD_LIBRARY_PATH"
|
||||
echo "[${0##*/}] Carla appears to be installed on this system at $CARLA_PREFIX/$lib/carla so we'll use it." >&2
|
||||
break
|
||||
fi
|
||||
done
|
||||
else
|
||||
echo "[${0##*/}] Carla does not appear to be installed, we'll remove it from the plugin listing." >&2
|
||||
export "LMMS_EXCLUDE_PLUGINS=libcarla,${LMMS_EXCLUDE_PLUGINS}"
|
||||
fi
|
||||
|
||||
# Additional workarounds for library conflicts
|
||||
# libgobject has been versioned "2.0" for over 20 years, but the ABI is constantly changing
|
||||
KNOWN_CONFLICTS="libgobject-2.0.so.0"
|
||||
if [ -n "$CARLA_LIB_FILE" ]; then
|
||||
for conflict in $KNOWN_CONFLICTS; do
|
||||
# Only prepend LD_PRELOAD if we bundle the same version
|
||||
if [ -e "$APPDIR/usr/lib/$conflict" ]; then
|
||||
conflict_sys="$(ldd "$CARLA_LIB_FILE" | grep "$conflict" | awk '{print $3}')"
|
||||
if [ -e "$conflict_sys" ]; then
|
||||
# Add library to LD_PRELOAD so lmms can find it over its bundled version
|
||||
echo "[${0##*/}] Preferring the system's \"$conflict\" over the version bundled." >&2
|
||||
export LD_PRELOAD="$conflict_sys:$LD_PRELOAD"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
@@ -1,9 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Workaround crash when jack is missing by providing a dummy version
|
||||
if LC_ALL=C ldd "$APPDIR/usr/bin/lmms" |grep "libjack.so" |grep "not found" > /dev/null 2>&1; then
|
||||
echo "[${0##*/}] Jack does not appear to be installed. That's OK, we'll use a dummy version instead." >&2
|
||||
export LD_LIBRARY_PATH="$APPDIR/usr/lib/jack:$LD_LIBRARY_PATH"
|
||||
else
|
||||
echo "[${0##*/}] Jack appears to be installed on this system, so we'll use it." >&2
|
||||
fi
|
||||
@@ -1,8 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Workaround Unity desktop menubar integration
|
||||
# - Unity's menubar relocation breaks Qt's MDI window handling in Linux
|
||||
# - Unity was default in Ubuntu 11.04 - 18.04
|
||||
if [ "$XDG_CURRENT_DESKTOP" = "Unity" ]; then
|
||||
export QT_X11_NO_NATIVE_MENUBAR=1
|
||||
fi
|
||||
@@ -1,4 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Paths for plugin systems to pick-up
|
||||
export SUIL_MODULE_DIR="$APPDIR/usr/lib/suil-0/" # See also ${SUIL_MODULES_TARGET}
|
||||
@@ -1,7 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Workaround crash in VirtualBox when hardware rendering is enabled
|
||||
if lsmod |grep vboxguest > /dev/null 2>&1; then
|
||||
echo "[${0##*/}] VirtualBox detected. Forcing libgl software rendering." >&2
|
||||
export LIBGL_ALWAYS_SOFTWARE=1;
|
||||
fi
|
||||
@@ -1,10 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Configure QPlatform Abstraction (qpa) to prefer X-Protocol C-Bindings (xcb) over Wayland
|
||||
if [ -n "$QT_QPA_PLATFORM" ]; then
|
||||
echo "[${0##*/}] QT_QPA_PLATFORM=\"$QT_QPA_PLATFORM\" was provided, using." >&2
|
||||
else
|
||||
export QT_QPA_PLATFORM="xcb"
|
||||
echo "[${0##*/}] Defaulting to QT_QPA_PLATFORM=\"$QT_QPA_PLATFORM\" for compatibility purposes." >&2
|
||||
echo "[${0##*/}] To force wayland, set QT_QPA_PLATFORM=\"wayland\" or call using \"-platform wayland\"." >&2
|
||||
fi
|
||||
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 7.5 KiB |
24
cmake/linux/launch_lmms.sh
Normal file
@@ -0,0 +1,24 @@
|
||||
#!/usr/bin/env bash
|
||||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
export PATH="$PATH:/sbin"
|
||||
if command -v carla > /dev/null 2>&1; then
|
||||
CARLAPATH="$(command -v carla)"
|
||||
CARLAPREFIX="${CARLAPATH%/bin*}"
|
||||
echo "Carla appears to be installed on this system at $CARLAPREFIX/lib[64]/carla so we'll use it." >&2
|
||||
export LD_LIBRARY_PATH=$CARLAPREFIX/lib/carla:$CARLAPREFIX/lib64/carla:$LD_LIBRARY_PATH
|
||||
else
|
||||
echo "Carla does not appear to be installed. That's OK, please ignore any related library errors." >&2
|
||||
fi
|
||||
export LD_LIBRARY_PATH=$DIR/usr/lib/:$DIR/usr/lib/lmms:$LD_LIBRARY_PATH
|
||||
# Prevent segfault on VirualBox
|
||||
if lsmod |grep vboxguest > /dev/null 2>&1; then
|
||||
echo "VirtualBox detected. Forcing libgl software rendering." >&2
|
||||
export LIBGL_ALWAYS_SOFTWARE=1;
|
||||
fi
|
||||
if ldconfig -p | grep libjack.so.0 > /dev/null 2>&1; then
|
||||
echo "Jack appears to be installed on this system, so we'll use it." >&2
|
||||
else
|
||||
echo "Jack does not appear to be installed. That's OK, we'll use a dummy version instead." >&2
|
||||
export LD_LIBRARY_PATH=$DIR/usr/lib/lmms/optional:$LD_LIBRARY_PATH
|
||||
fi
|
||||
QT_X11_NO_NATIVE_MENUBAR=1 "$DIR"/usr/bin/lmms.real "$@"
|
||||
@@ -1,35 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Halt on first error
|
||||
set -e
|
||||
|
||||
DESTDIR="/opt/@CPACK_PROJECT_NAME@"
|
||||
BASHCOMPLETIONS="/usr/share/bash-completion/completions"
|
||||
if [ "$(id -u)" != "0" ]; then
|
||||
# Prepend "$HOME" so we can install to a writable location
|
||||
DESTDIR="${HOME}${DESTDIR}"
|
||||
BASHCOMPLETIONS="${HOME}/.local/share/bash-completion/completions"
|
||||
echo "Installing as a regular user to ${DESTDIR}/..."
|
||||
else
|
||||
echo "Installing as elevated user to ${DESTDIR}/..."
|
||||
fi
|
||||
|
||||
# Deploy @CPACK_PROJECT_NAME_UCASE@
|
||||
mkdir -p "${DESTDIR}"
|
||||
unalias cp &> /dev/null || true
|
||||
cp -rf ./* "${DESTDIR}"
|
||||
rm -f "${DESTDIR}/setup.sh"
|
||||
mv "${DESTDIR}/AppRun" "${DESTDIR}/@CPACK_PROJECT_NAME@"
|
||||
|
||||
# Install bash completions
|
||||
mkdir -p "${BASHCOMPLETIONS}"
|
||||
ln -sf "${DESTDIR}/usr/share/@CPACK_PROJECT_NAME@/bash-completion/completions/@CPACK_PROJECT_NAME@" "${BASHCOMPLETIONS}/@CPACK_PROJECT_NAME@"
|
||||
|
||||
# Test @CPACK_PROJECT_NAME_UCASE@
|
||||
echo "Installation complete... Testing \"@CPACK_PROJECT_NAME@\"..."
|
||||
"${DESTDIR}/@CPACK_PROJECT_NAME@" --allowroot --version &> /dev/null
|
||||
|
||||
# TODO: Register file associations, desktop icon, etc
|
||||
|
||||
echo "@CPACK_PROJECT_NAME_UCASE@ was installed successfully to ${DESTDIR}. To run:"
|
||||
echo " ${DESTDIR}/@CPACK_PROJECT_NAME@"
|
||||
213
cmake/linux/package_linux.sh.in
Normal file
@@ -0,0 +1,213 @@
|
||||
#!/usr/bin/env bash
|
||||
# Creates Linux ".AppImage" for @PROJECT_NAME_UCASE@
|
||||
#
|
||||
# Depends: linuxdeployqt
|
||||
#
|
||||
# Notes: Will attempt to fetch linuxdeployqt automatically (x86_64 only)
|
||||
# See Also: https://github.com/probonopd/linuxdeployqt/blob/master/BUILDING.md
|
||||
|
||||
VERBOSITY=2 # 3=debug
|
||||
LOGFILE="@CMAKE_BINARY_DIR@/appimage.log"
|
||||
APPDIR="@CMAKE_BINARY_DIR@/@PROJECT_NAME_UCASE@.AppDir/"
|
||||
DESKTOPFILE="${APPDIR}usr/share/applications/lmms.desktop"
|
||||
STRIP=""
|
||||
|
||||
# Don't strip for Debug|RelWithDebInfo builds
|
||||
# shellcheck disable=SC2193
|
||||
if [[ "@CMAKE_BUILD_TYPE@" == *"Deb"* ]]; then
|
||||
STRIP="-no-strip"
|
||||
fi
|
||||
|
||||
# Console colors
|
||||
RED="\\x1B[1;31m"
|
||||
GREEN="\\x1B[1;32m"
|
||||
YELLOW="\\x1B[1;33m"
|
||||
PLAIN="\\x1B[0m"
|
||||
|
||||
function error {
|
||||
echo -e " ${PLAIN}[${RED}error${PLAIN}] ${1}"
|
||||
return 1
|
||||
}
|
||||
|
||||
function success {
|
||||
echo -e " ${PLAIN}[${GREEN}success${PLAIN}] ${1}"
|
||||
}
|
||||
|
||||
function skipped {
|
||||
echo -e " ${PLAIN}[${YELLOW}skipped${PLAIN}] ${1}"
|
||||
}
|
||||
|
||||
# Exit with error message if any command fails
|
||||
trap "error 'Failed to generate AppImage'; exit 1" ERR
|
||||
|
||||
# Run a command silently, but print output if it fails
|
||||
function run_and_log {
|
||||
echo -e "\n\n>>>>> $1" >> "$LOGFILE"
|
||||
output="$("$@" 2>&1)"
|
||||
status=$?
|
||||
echo "$output" >> "$LOGFILE"
|
||||
[[ $status != 0 ]] && echo "$output"
|
||||
return $status
|
||||
}
|
||||
|
||||
# Blindly assume system arch is appimage arch
|
||||
ARCH=$(uname -m)
|
||||
export ARCH
|
||||
|
||||
# Check for problematic install locations
|
||||
INSTALL=$(echo "@CMAKE_INSTALL_PREFIX@" | sed 's/\/*$//g')
|
||||
if [ "$INSTALL" == "/usr/local" ] || [ "$INSTALL" == "/usr" ] ; then
|
||||
error "Incompatible CMAKE_INSTALL_PREFIX for creating AppImage: @CMAKE_INSTALL_PREFIX@"
|
||||
fi
|
||||
|
||||
# Ensure linuxdeployqt uses the same qmake version as cmake
|
||||
PATH="$(dirname "@QT_QMAKE_EXECUTABLE@"):$PATH"
|
||||
export PATH
|
||||
|
||||
# Use linuxdeployqt from env or in PATH
|
||||
[[ $LINUXDEPLOYQT ]] || LINUXDEPLOYQT="$(which linuxdeployqt 2>/dev/null)" || true
|
||||
[[ $APPIMAGETOOL ]] || APPIMAGETOOL="$(which appimagetool 2>/dev/null)" || true
|
||||
|
||||
# Fetch portable linuxdeployqt if not in PATH
|
||||
if [[ -z $LINUXDEPLOYQT || -z $APPIMAGETOOL ]]; then
|
||||
filename="linuxdeployqt-continuous-$ARCH.AppImage"
|
||||
url="https://github.com/probonopd/linuxdeployqt/releases/download/continuous/$filename"
|
||||
echo " [.......] Downloading: ${url}"
|
||||
wget -N -q "$url" && err=0 || err=$?
|
||||
case "$err" in
|
||||
0) success "Downloaded $PWD/$filename" ;;
|
||||
# 8 == server issued 4xx error
|
||||
8) error "Download failed (perhaps no package available for $ARCH)" ;;
|
||||
*) error "Download failed" ;;
|
||||
esac
|
||||
|
||||
# Extract AppImage and replace LINUXDEPLOYQT variable with extracted binary
|
||||
# to support systems without fuse
|
||||
# Also, we need to set LD_LIBRARY_PATH, but linuxdepoyqt's AppRun unsets it
|
||||
# See https://github.com/probonopd/linuxdeployqt/pull/370/
|
||||
chmod +x "$filename"
|
||||
./"$filename" --appimage-extract >/dev/null
|
||||
success "Extracted $filename"
|
||||
|
||||
# Use the extracted linuxdeployqt and appimagetool
|
||||
PATH="$(pwd -P)/squashfs-root/usr/bin:$PATH"
|
||||
[[ $LINUXDEPLOYQT ]] || LINUXDEPLOYQT="$(which linuxdeployqt)"
|
||||
[[ $APPIMAGETOOL ]] || APPIMAGETOOL="$(which appimagetool)"
|
||||
fi
|
||||
|
||||
# Make skeleton AppDir
|
||||
echo -e "\nCreating ${APPDIR}..."
|
||||
rm -rf "${APPDIR}"
|
||||
mkdir -p "${APPDIR}usr"
|
||||
success "Created ${APPDIR}"
|
||||
|
||||
# Clone install to AppDir
|
||||
echo -e "\nCopying @CMAKE_INSTALL_PREFIX@ to ${APPDIR}..."
|
||||
cp -R "@CMAKE_INSTALL_PREFIX@/." "${APPDIR}usr"
|
||||
rm -rf "${APPDIR}usr/include"
|
||||
success "${APPDIR}"
|
||||
|
||||
# Copy rawwaves directory for stk/mallets
|
||||
mkdir -p "${APPDIR}usr/share/stk/"
|
||||
cp -R /usr/share/stk/rawwaves/ "${APPDIR}usr/share/stk/"
|
||||
|
||||
# Create a wrapper script which calls the lmms executable
|
||||
mv "${APPDIR}usr/bin/lmms" "${APPDIR}usr/bin/lmms.real"
|
||||
|
||||
cp "@CMAKE_CURRENT_SOURCE_DIR@/launch_lmms.sh" "${APPDIR}usr/bin/lmms"
|
||||
|
||||
chmod +x "${APPDIR}usr/bin/lmms"
|
||||
|
||||
# Per https://github.com/probonopd/linuxdeployqt/issues/129
|
||||
unset LD_LIBRARY_PATH
|
||||
|
||||
# Ensure linuxdeployqt can find shared objects
|
||||
export LD_LIBRARY_PATH="${APPDIR}"usr/lib/lmms/:"${APPDIR}"usr/lib/lmms/optional:"$LD_LIBRARY_PATH"
|
||||
|
||||
# Move executables so linuxdeployqt can find them
|
||||
ZYNLIB="${APPDIR}usr/lib/lmms/RemoteZynAddSubFx"
|
||||
VSTLIB32="${APPDIR}usr/lib/lmms/32/RemoteVstPlugin32.exe.so"
|
||||
VSTLIB64="${APPDIR}usr/lib/lmms/RemoteVstPlugin64.exe.so"
|
||||
|
||||
ZYNBIN="${APPDIR}usr/bin/RemoteZynAddSubFx"
|
||||
VSTBIN32="${APPDIR}usr/bin/RemoteVstPlugin32.exe.so"
|
||||
VSTBIN64="${APPDIR}usr/bin/RemoteVstPlugin64.exe.so"
|
||||
|
||||
mv "$ZYNLIB" "$ZYNBIN"
|
||||
mv "$VSTLIB32" "$VSTBIN32" || true
|
||||
mv "$VSTLIB64" "$VSTBIN64" || true
|
||||
|
||||
# Handle wine linking
|
||||
if [ -d "@WINE_32_LIBRARY_DIR@" ] && \
|
||||
ldd "$VSTBIN32" | grep "libwine\.so" | grep "not found"; then
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"@WINE_32_LIBRARY_DIRS@"
|
||||
fi
|
||||
if [ -d "@WINE_64_LIBRARY_DIR@" ] && \
|
||||
ldd "$VSTBIN64" | grep "libwine\.so" | grep "not found"; then
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"@WINE_64_LIBRARY_DIRS@"
|
||||
fi
|
||||
|
||||
# Patch the desktop file
|
||||
sed -i 's/.*Exec=.*/Exec=lmms.real/' "$DESKTOPFILE"
|
||||
echo "X-AppImage-Version=@VERSION@" >> "$DESKTOPFILE"
|
||||
|
||||
# Fix linking for soft-linked plugins
|
||||
for file in "${APPDIR}usr/lib/lmms/"*.so; do
|
||||
thisfile="${APPDIR}usr/lib/lmms/${file##*/}"
|
||||
executables="${executables} -executable=$thisfile"
|
||||
done
|
||||
executables="${executables} -executable=${ZYNBIN}"
|
||||
executables="${executables} -executable=${VSTBIN32}"
|
||||
executables="${executables} -executable=${VSTBIN64}"
|
||||
executables="${executables} -executable=${APPDIR}usr/lib/lmms/ladspa/imp_1199.so"
|
||||
executables="${executables} -executable=${APPDIR}usr/lib/lmms/ladspa/imbeq_1197.so"
|
||||
executables="${executables} -executable=${APPDIR}usr/lib/lmms/ladspa/pitch_scale_1193.so"
|
||||
executables="${executables} -executable=${APPDIR}usr/lib/lmms/ladspa/pitch_scale_1194.so"
|
||||
|
||||
echo -e "\nWriting verbose output to \"${LOGFILE}\""
|
||||
echo -n > "$LOGFILE"
|
||||
|
||||
# Bundle both qt and non-qt dependencies into appimage format
|
||||
echo -e "\nBundling and relinking system dependencies..."
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
run_and_log "$LINUXDEPLOYQT" "$DESKTOPFILE" $executables -bundle-non-qt-libs -verbose=$VERBOSITY $STRIP
|
||||
success "Bundled and relinked dependencies"
|
||||
|
||||
# Link to original location so lmms can find them
|
||||
ln -sr "$ZYNBIN" "$ZYNLIB"
|
||||
ln -sr "$VSTBIN32" "$VSTLIB32" || true
|
||||
ln -sr "$VSTBIN64" "$VSTLIB64" || true
|
||||
|
||||
# Remove wine library conflict
|
||||
rm -f "${APPDIR}/usr/lib/libwine.so.1"
|
||||
|
||||
# Use system-provided carla
|
||||
rm -f "${APPDIR}usr/lib/"libcarla*.so
|
||||
rm -f "${APPDIR}usr/lib/lmms/optional/"libcarla*.so
|
||||
|
||||
# Remove bundled jack in LD_LIBRARY_PATH if exists
|
||||
if [ -e "${APPDIR}/usr/lib/libjack.so.0" ]; then
|
||||
rm "${APPDIR}/usr/lib/libjack.so.0"
|
||||
fi
|
||||
|
||||
# Bundle jack out of LD_LIBRARY_PATH
|
||||
JACK_LIB=$(ldd "${APPDIR}/usr/bin/lmms.real" | sed -n 's/\tlibjack\.so\.0 => \(.\+\) (0x[0-9a-f]\+)/\1/p')
|
||||
if [ -e "$JACK_LIB" ]; then
|
||||
mkdir -p "${APPDIR}usr/lib/lmms/optional/"
|
||||
cp "$JACK_LIB" "${APPDIR}usr/lib/lmms/optional/"
|
||||
fi
|
||||
|
||||
# Point the AppRun to the shim launcher
|
||||
rm -f "${APPDIR}/AppRun"
|
||||
ln -sr "${APPDIR}/usr/bin/lmms" "${APPDIR}/AppRun"
|
||||
|
||||
# Add icon
|
||||
ln -srf "${APPDIR}/lmms.png" "${APPDIR}/.DirIcon"
|
||||
|
||||
# Create AppImage
|
||||
echo -e "\nFinishing the AppImage..."
|
||||
run_and_log "$APPIMAGETOOL" "${APPDIR}" "@APPIMAGE_FILE@"
|
||||
success "Created @APPIMAGE_FILE@"
|
||||
|
||||
echo -e "\nFinished"
|
||||
@@ -1,78 +1,93 @@
|
||||
# Copyright (c) 2024, Tres Finocchiaro, <tres.finocchiaro@gmail.com>
|
||||
# A wrapper around pkg-config-provided and cmake-provided bash completion that
|
||||
# will have dynamic behavior at INSTALL() time to allow both root-level
|
||||
# INSTALL() as well as user-level INSTALL().
|
||||
#
|
||||
# See also https://github.com/scop/bash-completion
|
||||
#
|
||||
# Copyright (c) 2018, Tres Finocchiaro, <tres.finocchiaro@gmail.com>
|
||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||
#
|
||||
# Description:
|
||||
# Fail-safe bash-completion installation support
|
||||
# - Installs to ${CMAKE_INSTALL_PREFIX}/share/bash-completion/completions
|
||||
# - Attempts to calculate and install to system-wide location
|
||||
# - See also https://github.com/scop/bash-completion
|
||||
#
|
||||
# Usage:
|
||||
# INCLUDE(BashCompletion)
|
||||
# BASHCOMP_INSTALL(foo)
|
||||
# ... where "foo" is a shell script adjacent to the CMakeLists.txt
|
||||
#
|
||||
# How it determines BASHCOMP_PKG_PATH, in order:
|
||||
# 1. Uses BASHCOMP_PKG_PATH if already set (e.g. -DBASHCOMP_PKG_PATH=...)
|
||||
# a. If not, uses pkg-config's PKG_CHECK_MODULES to determine path
|
||||
# b. Fallback to cmake's FIND_PACKAGE(bash-completion) path
|
||||
# c. Fallback to hard-coded /usr/share/bash-completion/completions
|
||||
# 2. Final fallback to ${CMAKE_INSTALL_PREFIX}/share/bash-completion/completions if
|
||||
# detected path is unwritable.
|
||||
|
||||
# Honor manual override if provided
|
||||
if(NOT BASHCOMP_PKG_PATH)
|
||||
# First, use pkg-config, which is the most reliable
|
||||
find_package(PkgConfig QUIET)
|
||||
if(PKGCONFIG_FOUND)
|
||||
PKG_CHECK_MODULES(BASH_COMPLETION bash-completion)
|
||||
PKG_GET_VARIABLE(BASHCOMP_PKG_PATH bash-completion completionsdir)
|
||||
else()
|
||||
# Second, use cmake (preferred but less common)
|
||||
find_package(bash-completion QUIET)
|
||||
if(BASH_COMPLETION_FOUND)
|
||||
set(BASHCOMP_PKG_PATH "${BASH_COMPLETION_COMPLETIONSDIR}")
|
||||
endif()
|
||||
endif()
|
||||
# - Windows does not support bash completion
|
||||
# - macOS support should eventually be added for Homebrew (TODO)
|
||||
IF(WIN32)
|
||||
MESSAGE(STATUS "Bash completion is not supported on this platform.")
|
||||
ELSEIF(APPLE)
|
||||
MESSAGE(STATUS "Bash completion is not yet implemented for this platform.")
|
||||
ELSE()
|
||||
INCLUDE(FindUnixCommands)
|
||||
# Honor manual override if provided
|
||||
IF(NOT BASHCOMP_PKG_PATH)
|
||||
# First, use pkg-config, which is the most reliable
|
||||
FIND_PACKAGE(PkgConfig QUIET)
|
||||
IF(PKGCONFIG_FOUND)
|
||||
PKG_CHECK_MODULES(BASH_COMPLETION bash-completion)
|
||||
PKG_GET_VARIABLE(BASHCOMP_PKG_PATH bash-completion completionsdir)
|
||||
ELSE()
|
||||
# Second, use cmake (preferred but less common)
|
||||
FIND_PACKAGE(bash-completion QUIET)
|
||||
IF(BASH_COMPLETION_FOUND)
|
||||
SET(BASHCOMP_PKG_PATH "${BASH_COMPLETION_COMPLETIONSDIR}")
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
# Third, use a hard-coded fallback value
|
||||
if("${BASHCOMP_PKG_PATH}" STREQUAL "")
|
||||
set(BASHCOMP_PKG_PATH "/usr/share/bash-completion/completions")
|
||||
endif()
|
||||
endif()
|
||||
# Third, use a hard-coded fallback value
|
||||
IF("${BASHCOMP_PKG_PATH}" STREQUAL "")
|
||||
SET(BASHCOMP_PKG_PATH "/usr/share/bash-completion/completions")
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
# Always provide a fallback for non-root INSTALL()
|
||||
# * "lmms" subfolder ensures we don't pollute /usr/local/share/ on default "make install"
|
||||
set(BASHCOMP_USER_PATH "share/${PROJECT_NAME}/bash-completion/completions")
|
||||
# Always provide a fallback for non-root INSTALL()
|
||||
SET(BASHCOMP_USER_PATH "${CMAKE_INSTALL_PREFIX}/share/bash-completion/completions")
|
||||
|
||||
macro(BASHCOMP_INSTALL SCRIPT_NAME)
|
||||
# Note: When running from CPack, message(...) will be suppressed unless WARNING
|
||||
if(WIN32)
|
||||
message(STATUS "Bash completion is not supported on this platform.")
|
||||
else()
|
||||
# Install a copy of bash completion to the default install prefix
|
||||
# See also: https://github.com/LMMS/lmms/pull/7252/files#r1815749125
|
||||
install(FILES "${SCRIPT_NAME}" DESTINATION "${BASHCOMP_USER_PATH}")
|
||||
|
||||
# Next, blindly attempt a system-wide install, ignoring failure
|
||||
# See also: https://stackoverflow.com/q/58448332
|
||||
# * CPack doesn't use CMAKE_INSTALL_PREFIX, so the original will be missing when packaging
|
||||
# and this step will be skipped
|
||||
# * For non-root installs (e.g. ../target), this will silently fail
|
||||
set(BASHCOMP_ORIG "${CMAKE_INSTALL_PREFIX}/${BASHCOMP_USER_PATH}/${CMAKE_PROJECT_NAME}")
|
||||
set(BASHCOMP_LINK "${BASHCOMP_PKG_PATH}/${CMAKE_PROJECT_NAME}")
|
||||
|
||||
if(BASHCOMP_PKG_PATH)
|
||||
# TODO: CMake 3.21 Use "file(COPY_FILE ...)"
|
||||
install(CODE "
|
||||
if(EXISTS \"${BASHCOMP_ORIG}\")
|
||||
file(REMOVE \"${BASHCOMP_LINK}\")
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
|
||||
\"${BASHCOMP_ORIG}\"
|
||||
\"${BASHCOMP_LINK}\"
|
||||
ERROR_QUIET
|
||||
RESULT_VARIABLE result)
|
||||
if(result EQUAL 0)
|
||||
message(STATUS \"Bash completion-support has been installed to ${BASHCOMP_LINK}\")
|
||||
endif()
|
||||
endif()
|
||||
")
|
||||
endif()
|
||||
endif()
|
||||
endmacro()
|
||||
# Cmake doesn't allow easy use of conditional logic at INSTALL() time
|
||||
# this is a problem because ${BASHCOMP_PKG_PATH} may not be writable and we
|
||||
# need sane fallback behavior for bundled INSTALL() (e.g. .AppImage, etc).
|
||||
#
|
||||
# The reason this can't be detected by cmake is that it's fairly common to
|
||||
# run "cmake" as a one user (i.e. non-root) and "make install" as another user
|
||||
# (i.e. root).
|
||||
#
|
||||
# - Creates a script called "install_${SCRIPT_NAME}_completion.sh" into the
|
||||
# working binary directory and invokes this script at install.
|
||||
# - Script handles INSTALL()-time conditional logic for sane ballback behavior
|
||||
# when ${BASHCOMP_PKG_PATH} is unwritable (i.e. non-root); Something cmake
|
||||
# can't handle on its own at INSTALL() time)
|
||||
MACRO(BASHCOMP_INSTALL SCRIPT_NAME)
|
||||
# A shell script for wrapping conditionl logic
|
||||
SET(BASHCOMP_SCRIPT "${CMAKE_CURRENT_BINARY_DIR}/install_${SCRIPT_NAME}_completion.sh")
|
||||
|
||||
FILE(WRITE ${BASHCOMP_SCRIPT} "\
|
||||
#!${BASH}\n\
|
||||
set -e\n\
|
||||
if [ -w \"${BASHCOMP_PKG_PATH}\" ]; then\n\
|
||||
BASHCOMP_PKG_PATH=\"${BASHCOMP_PKG_PATH}\"\n\
|
||||
else \n\
|
||||
BASHCOMP_PKG_PATH=\"\$DESTDIR${BASHCOMP_USER_PATH}\"\n\
|
||||
fi\n\
|
||||
echo -e \"\\nInstalling bash completion...\\n\"\n\
|
||||
mkdir -p \"\$BASHCOMP_PKG_PATH\"\n\
|
||||
cp \"${CMAKE_CURRENT_SOURCE_DIR}/${SCRIPT_NAME}\" \"\$BASHCOMP_PKG_PATH\"\n\
|
||||
chmod a+r \"\$BASHCOMP_PKG_PATH/${SCRIPT_NAME}\"\n\
|
||||
echo -e \"Bash completion for ${SCRIPT_NAME} has been installed to \$BASHCOMP_PKG_PATH/${SCRIPT_NAME}\"\n\
|
||||
")
|
||||
INSTALL(CODE "EXECUTE_PROCESS(COMMAND chmod u+x \"install_${SCRIPT_NAME}_completion.sh\" WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} )")
|
||||
INSTALL(CODE "EXECUTE_PROCESS(COMMAND \"./install_${SCRIPT_NAME}_completion.sh\" WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} )")
|
||||
|
||||
MESSAGE(STATUS "Bash completion script for ${SCRIPT_NAME} will be installed to ${BASHCOMP_PKG_PATH} or fallback to ${BASHCOMP_USER_PATH} if unwritable.")
|
||||
ENDMACRO()
|
||||
ENDIF()
|
||||
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# BuildPlugin.cmake - Copyright (c) 2008 Tobias Doerffel
|
||||
#
|
||||
# description: build LMMS-plugin
|
||||
# usage: BUILD_PLUGIN(<PLUGIN_NAME> <PLUGIN_SOURCES> MOCFILES <HEADERS_FOR_MOC> EMBEDDED_RESOURCES <LIST_OF_FILES_TO_EMBED> LINK <SHARED|MODULE>)
|
||||
# usage: BUILD_PLUGIN(<PLUGIN_NAME> <PLUGIN_SOURCES> MOCFILES <HEADERS_FOR_MOC> EMBEDDED_RESOURCES <LIST_OF_FILES_TO_EMBED> UICFILES <UI_FILES_TO_COMPILE> LINK <SHARED|MODULE>)
|
||||
|
||||
INCLUDE(GenQrc)
|
||||
|
||||
MACRO(BUILD_PLUGIN PLUGIN_NAME)
|
||||
CMAKE_PARSE_ARGUMENTS(PLUGIN "" "LINK;EXPORT_BASE_NAME" "MOCFILES;EMBEDDED_RESOURCES" ${ARGN})
|
||||
CMAKE_PARSE_ARGUMENTS(PLUGIN "" "LINK;EXPORT_BASE_NAME" "MOCFILES;EMBEDDED_RESOURCES;UICFILES" ${ARGN})
|
||||
SET(PLUGIN_SOURCES ${PLUGIN_UNPARSED_ARGUMENTS})
|
||||
|
||||
INCLUDE_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_BINARY_DIR}" "${CMAKE_SOURCE_DIR}/include")
|
||||
@@ -30,10 +30,11 @@ MACRO(BUILD_PLUGIN PLUGIN_NAME)
|
||||
ADD_GEN_QRC(RCC_OUT "${PLUGIN_NAME}.qrc" PREFIX artwork/${PLUGIN_NAME} ${PLUGIN_EMBEDDED_RESOURCES})
|
||||
ENDIF(ER_LEN)
|
||||
|
||||
cmake_language(CALL QT${QT_VERSION_MAJOR}_WRAP_CPP plugin_MOC_out ${PLUGIN_MOCFILES})
|
||||
QT5_WRAP_CPP(plugin_MOC_out ${PLUGIN_MOCFILES})
|
||||
QT5_WRAP_UI(plugin_UIC_out ${PLUGIN_UICFILES})
|
||||
|
||||
FOREACH(f ${PLUGIN_SOURCES})
|
||||
ADD_FILE_DEPENDENCIES(${f} ${RCC_OUT})
|
||||
ADD_FILE_DEPENDENCIES(${f} ${RCC_OUT} ${plugin_UIC_out})
|
||||
ENDFOREACH(f)
|
||||
|
||||
IF(LMMS_BUILD_APPLE)
|
||||
@@ -44,6 +45,10 @@ MACRO(BUILD_PLUGIN PLUGIN_NAME)
|
||||
LINK_DIRECTORIES("${CMAKE_BINARY_DIR}" "${CMAKE_SOURCE_DIR}")
|
||||
LINK_LIBRARIES(${QT_LIBRARIES})
|
||||
ENDIF(LMMS_BUILD_WIN32)
|
||||
IF(LMMS_BUILD_MSYS AND CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
# Override Qt debug libraries with release versions
|
||||
SET(QT_LIBRARIES "${QT_OVERRIDE_LIBRARIES}")
|
||||
ENDIF()
|
||||
|
||||
IF (NOT PLUGIN_LINK)
|
||||
SET(PLUGIN_LINK "MODULE")
|
||||
@@ -51,7 +56,7 @@ MACRO(BUILD_PLUGIN PLUGIN_NAME)
|
||||
|
||||
ADD_LIBRARY(${PLUGIN_NAME} ${PLUGIN_LINK} ${PLUGIN_SOURCES} ${plugin_MOC_out} ${RCC_OUT})
|
||||
|
||||
target_link_libraries("${PLUGIN_NAME}" lmms Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Xml)
|
||||
target_link_libraries("${PLUGIN_NAME}" lmms Qt5::Widgets Qt5::Xml)
|
||||
|
||||
INSTALL(TARGETS ${PLUGIN_NAME}
|
||||
LIBRARY DESTINATION "${PLUGIN_DIR}"
|
||||
@@ -60,7 +65,7 @@ MACRO(BUILD_PLUGIN PLUGIN_NAME)
|
||||
|
||||
IF(LMMS_BUILD_APPLE)
|
||||
IF ("${PLUGIN_LINK}" STREQUAL "SHARED")
|
||||
TARGET_LINK_OPTIONS(${PLUGIN_NAME} PRIVATE -undefined dynamic_lookup)
|
||||
SET_TARGET_PROPERTIES(${PLUGIN_NAME} PROPERTIES LINK_FLAGS "-undefined dynamic_lookup")
|
||||
ENDIF()
|
||||
ENDIF(LMMS_BUILD_APPLE)
|
||||
IF(LMMS_BUILD_WIN32)
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
# INCLUDE(CheckSubmodules)
|
||||
#
|
||||
# Options:
|
||||
# SET(PLUGIN_LIST "ZynAddSubFx;...") # skips submodules for plugins not explicitly listed
|
||||
# SET(PLUGIN_LIST "ZynAddSubFx;...") # skips submodules for plugins not explicitely listed
|
||||
#
|
||||
# Or via command line:
|
||||
# cmake -PLUGIN_LIST=foo;bar
|
||||
@@ -43,7 +43,7 @@ SET(LANG_BACKUP "$ENV{LANG}")
|
||||
SET(ENV{LC_ALL} "C")
|
||||
SET(ENV{LANG} "en_US")
|
||||
|
||||
# Submodule list pairs, unparsed (WARNING: Assumes alphanumeric paths)
|
||||
# Submodule list pairs, unparsed (WARNING: Assumes alpha-numeric paths)
|
||||
STRING(REGEX MATCHALL "path = [-0-9A-Za-z/]+" SUBMODULE_LIST_RAW ${SUBMODULE_DATA})
|
||||
STRING(REGEX MATCHALL "url = [.:%-0-9A-Za-z/]+" SUBMODULE_URL_RAW ${SUBMODULE_DATA})
|
||||
|
||||
|
||||
@@ -9,19 +9,7 @@ FUNCTION(CheckWineGcc BITNESS WINEGCC_EXECUTABLE RESULT)
|
||||
return 0;
|
||||
}
|
||||
")
|
||||
|
||||
# Handle non-Intel platforms
|
||||
IF(LMMS_HOST_X86_64 OR LMMS_HOST_X86)
|
||||
SET(MPLATFORM "-m${BITNESS}")
|
||||
ELSEIF(BITNESS EQUAL 64)
|
||||
SET(MPLATFORM "")
|
||||
ELSE()
|
||||
# Skip 32-bit for non-Intel
|
||||
SET(${RESULT} False PARENT_SCOPE)
|
||||
RETURN()
|
||||
ENDIF()
|
||||
|
||||
EXECUTE_PROCESS(COMMAND ${WINEGCC_EXECUTABLE} "${MPLATFORM}"
|
||||
EXECUTE_PROCESS(COMMAND ${WINEGCC_EXECUTABLE} "-m${BITNESS}"
|
||||
"${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/winegcc_test.cxx"
|
||||
"-o" "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/winegcc_test"
|
||||
OUTPUT_QUIET ERROR_QUIET
|
||||
|
||||
@@ -1,76 +0,0 @@
|
||||
# Copy source_lib's dependency matching 'name_match' into specified location
|
||||
# Sets variable named in relocated_lib to the destination
|
||||
macro(copy_dependency source_lib name_match destination relocated_lib)
|
||||
if(NOT COMMAND_ECHO OR "${COMMAND_ECHO}" STREQUAL "NONE")
|
||||
set(_command_echo NONE)
|
||||
else()
|
||||
set(_command_echo "${COMMAND_ECHO}")
|
||||
endif()
|
||||
|
||||
execute_process(COMMAND file -b --mime-type "${source_lib}" OUTPUT_VARIABLE file_type)
|
||||
|
||||
set(_is_linux_lib false)
|
||||
set(_is_mac_lib false)
|
||||
|
||||
if("${file_type}" MATCHES "application/x-pie-executable")
|
||||
# Linux ELF binary
|
||||
set(_is_linux_lib true)
|
||||
list(APPEND _lib_command ldd)
|
||||
elseif("${file_type}" MATCHES "application/x-mach-binary")
|
||||
# macOS Mach-O binary
|
||||
set(_is_mac_lib true)
|
||||
list(APPEND _lib_command otool -L)
|
||||
else()
|
||||
message(FATAL_ERROR "Copying dependencies for ${file_type} are not yet supported")
|
||||
endif()
|
||||
|
||||
execute_process(COMMAND ${_lib_command}
|
||||
"${source_lib}"
|
||||
OUTPUT_VARIABLE raw_output
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
COMMAND_ECHO ${_command_echo}
|
||||
COMMAND_ERROR_IS_FATAL ANY)
|
||||
|
||||
# escape periods to avoid double-escaping
|
||||
string(REPLACE "." "\\." name_match "${name_match}")
|
||||
|
||||
# cli output --> list
|
||||
string(REPLACE "\n" ";" raw_list "${raw_output}")
|
||||
|
||||
foreach(line ${raw_list})
|
||||
if(line MATCHES "${name_match}")
|
||||
if(_is_linux_lib)
|
||||
# Assumes format "libname.so.0 => /lib/location/libname.so.0 (0x00007f48d0b0e000)"
|
||||
string(REGEX MATCH "=> ([^\\(]+)" dummy_var "${line}")
|
||||
# Trim leading/trailing whitespace and add to our list
|
||||
string(STRIP "${CMAKE_MATCH_1}" lib)
|
||||
elseif(_is_mac_lib)
|
||||
# Assumes format "@loader_path/../Frameworks/libname-0.0.dylib (compatibility version 0.0.0, current version 0.24.26)"
|
||||
string(REGEX MATCH "^[ \t]+(.*) \\(" dummy_var "${line}")
|
||||
string(STRIP "${CMAKE_MATCH_1}" lib)
|
||||
get_filename_component(loader_path ${source_lib} DIRECTORY)
|
||||
string(REPLACE "@loader_path" "${loader_path}" resolved_lib "${lib}")
|
||||
string(REPLACE "@rpath" "${loader_path}" resolved_lib "${lib}")
|
||||
# Special handling for '@executable_path'
|
||||
if(line MATCHES "@executable_path")
|
||||
# Find the position of '/Contents/'
|
||||
string(FIND "${APP_PATH}" "/Contents/" APP_CONTENTS_POS)
|
||||
# Extract the base path up to '/Contents/'
|
||||
string(SUBSTRING "${loader_path}" 0 "${APP_CONTENTS_POS}" app_base_path)
|
||||
string(REPLACE "@executable_path" "${app_base_path}/Contents/MacOS" resolved_lib "${lib}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Resolve any possible symlinks
|
||||
file(REAL_PATH "${lib}" libreal)
|
||||
get_filename_component(symname "${lib}" NAME)
|
||||
get_filename_component(realname "${libreal}" NAME)
|
||||
file(MAKE_DIRECTORY "${destination}")
|
||||
# Copy, but with original symlink name
|
||||
file(COPY "${libreal}" DESTINATION "${destination}")
|
||||
file(RENAME "${destination}/${realname}" "${destination}/${symname}")
|
||||
set("${relocated_lib}" "${destination}/${symname}")
|
||||
break()
|
||||
endif()
|
||||
endforeach()
|
||||
endmacro()
|
||||
@@ -1,34 +0,0 @@
|
||||
# Offer relative symlink support via "cmake -E create_symlink"
|
||||
# For verbose, set COMMAND_ECHO to STDOUT in calling script
|
||||
macro(create_symlink filepath sympath)
|
||||
if(CMAKE_COMMAND)
|
||||
set(_cmake_command "${CMAKE_COMMAND}")
|
||||
elseif(CPACK_CMAKE_COMMAND)
|
||||
set(_cmake_command "${CPACK_CMAKE_COMMAND}")
|
||||
else()
|
||||
message(FATAL_ERROR "Sorry, can't resolve variable CMAKE_COMMAND")
|
||||
endif()
|
||||
|
||||
if(NOT IS_ABSOLUTE "${sympath}")
|
||||
message(FATAL_ERROR "Sorry, this command only works with absolute paths")
|
||||
endif()
|
||||
|
||||
if(NOT DEFINED COMMAND_ECHO)
|
||||
set(_command_echo NONE)
|
||||
else()
|
||||
set(_command_echo "${COMMAND_ECHO}")
|
||||
endif()
|
||||
|
||||
# Calculate the relative path
|
||||
file(RELATIVE_PATH reldir "${sympath}/../" "${filepath}")
|
||||
get_filename_component(symname "${sympath}" NAME)
|
||||
|
||||
# Calculate the working directory
|
||||
get_filename_component(sympath_parent "${sympath}" DIRECTORY)
|
||||
|
||||
# Create the symbolic link
|
||||
execute_process(COMMAND "${_cmake_command}" -E create_symlink "${reldir}" "${symname}"
|
||||
WORKING_DIRECTORY "${sympath_parent}"
|
||||
COMMAND_ECHO ${_command_echo}
|
||||
COMMAND_ERROR_IS_FATAL ANY)
|
||||
endmacro()
|
||||
@@ -12,6 +12,11 @@ ELSE()
|
||||
SET(LMMS_BUILD_LINUX 1)
|
||||
ENDIF(WIN32)
|
||||
|
||||
# LMMS_BUILD_MSYS also set in build_winXX.sh
|
||||
IF(LMMS_BUILD_WIN32 AND CMAKE_COMPILER_IS_GNUCXX AND DEFINED ENV{MSYSCON})
|
||||
SET(LMMS_BUILD_MSYS TRUE)
|
||||
ENDIF()
|
||||
|
||||
MESSAGE("PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}")
|
||||
SET(LMMS_HOST_X86 FALSE)
|
||||
SET(LMMS_HOST_X86_64 FALSE)
|
||||
@@ -77,15 +82,13 @@ IF(WIN32)
|
||||
unset(MSVC_VER)
|
||||
else()
|
||||
# Cross-compiled
|
||||
if($ENV{MSYSTEM_CARCH} MATCHES "aarch64")
|
||||
set(IS_ARM64 TRUE)
|
||||
set(LMMS_BUILD_WIN64 TRUE)
|
||||
elseif(WIN64)
|
||||
set(IS_X86_64 TRUE)
|
||||
set(LMMS_BUILD_WIN64 TRUE)
|
||||
else()
|
||||
set(IS_X86 TRUE)
|
||||
endif()
|
||||
# TODO: Handle Windows ARM64 targets
|
||||
IF(WIN64)
|
||||
SET(IS_X86_64 TRUE)
|
||||
SET(LMMS_BUILD_WIN64 TRUE)
|
||||
ELSE(WIN64)
|
||||
SET(IS_X86 TRUE)
|
||||
ENDIF(WIN64)
|
||||
endif()
|
||||
ELSE()
|
||||
# Detect target architecture based on compiler target triple e.g. "x86_64-pc-linux"
|
||||
@@ -165,26 +168,15 @@ IF(LMMS_BUILD_APPLE)
|
||||
# Detect Homebrew versus Macports environment
|
||||
EXECUTE_PROCESS(COMMAND brew --prefix RESULT_VARIABLE DETECT_HOMEBREW OUTPUT_VARIABLE HOMEBREW_PREFIX ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
EXECUTE_PROCESS(COMMAND which port RESULT_VARIABLE DETECT_MACPORTS OUTPUT_VARIABLE MACPORTS_PREFIX ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
IF(DETECT_HOMEBREW EQUAL 0)
|
||||
SET(HOMEBREW 1)
|
||||
SET(APPLE_PREFIX "${HOMEBREW_PREFIX}")
|
||||
# Configure Qt
|
||||
SET(Qt5_DIR "${HOMEBREW_PREFIX}/opt/qt@5/lib/cmake/Qt5")
|
||||
SET(Qt5Test_DIR "${HOMEBREW_PREFIX}/opt/qt@5/lib/cmake/Qt5Test")
|
||||
SET(Qt6_DIR "${HOMEBREW_PREFIX}/opt/qt@6/lib/cmake/Qt6")
|
||||
SET(Qt6Test_DIR "${HOMEBREW_PREFIX}/opt/qt@6/lib/cmake/Qt6Test")
|
||||
ELSEIF(DETECT_MACPORTS EQUAL 0)
|
||||
SET(MACPORTS 1)
|
||||
# move up two directories
|
||||
GET_FILENAME_COMPONENT(MACPORTS_PREFIX "${MACPORTS_PREFIX}" DIRECTORY)
|
||||
GET_FILENAME_COMPONENT(MACPORTS_PREFIX "${MACPORTS_PREFIX}" DIRECTORY)
|
||||
SET(APPLE_PREFIX "${MACPORTS_PREFIX}")
|
||||
# Configure Qt
|
||||
SET(Qt5_DIR "${MACPORTS_PREFIX}/lib/cmake/Qt5")
|
||||
SET(Qt5Test_DIR "${MACPORTS_PREFIX}/lib/cmake/Qt5Test")
|
||||
SET(Qt6_DIR "${MACPORTS_PREFIX}/lib/cmake/Qt6")
|
||||
SET(Qt6Test_DIR "${MACPORTS_PREFIX}/lib/cmake/Qt6Test")
|
||||
LINK_DIRECTORIES(${LINK_DIRECTORIES} ${APPLE_PREFIX}/lib)
|
||||
IF(${DETECT_HOMEBREW} EQUAL 0)
|
||||
SET(HOMEBREW 1)
|
||||
SET(APPLE_PREFIX "${HOMEBREW_PREFIX}")
|
||||
ELSEIF(${DETECT_MACPORTS} EQUAL 0)
|
||||
SET(MACPORTS 1)
|
||||
GET_FILENAME_COMPONENT(MACPORTS_PREFIX ${MACPORTS_PREFIX} DIRECTORY)
|
||||
GET_FILENAME_COMPONENT(MACPORTS_PREFIX ${MACPORTS_PREFIX} DIRECTORY)
|
||||
SET(APPLE_PREFIX "${MACPORTS_PREFIX}")
|
||||
LINK_DIRECTORIES(${LINK_DIRECTORIES} ${APPLE_PREFIX}/lib)
|
||||
ENDIF()
|
||||
|
||||
# Detect OS Version
|
||||
|
||||
@@ -1,143 +0,0 @@
|
||||
# Downloads an executable from the provided URL for use in a build system
|
||||
# and optionally prepends it to the PATH
|
||||
#
|
||||
# Assumes:
|
||||
# - CMAKE_CURRENT_BINARY_DIR/[${_name}]
|
||||
# - CPACK_CURRENT_BINARY_DIR/[${_name}]
|
||||
# - Fallback to $ENV{TMPDIR}/[RANDOM]/[${_name}]
|
||||
# - For verbose, set COMMAND_ECHO to STDOUT in calling script
|
||||
#
|
||||
macro(download_binary RESULT_VARIABLE _url _name _prepend_to_path)
|
||||
if(NOT COMMAND_ECHO OR "${COMMAND_ECHO}" STREQUAL "NONE")
|
||||
set(_command_echo NONE)
|
||||
set(_output_quiet OUTPUT_QUIET)
|
||||
set(_error_quiet ERROR_QUIET)
|
||||
else()
|
||||
set(_command_echo "${COMMAND_ECHO}")
|
||||
set(_output_quiet "")
|
||||
set(_error_quiet "")
|
||||
endif()
|
||||
|
||||
# Check if fuse is needed
|
||||
if("${RESULT_VARIABLE}" MATCHES "\\.AppImage$" OR "${_name}" MATCHES "\\.AppImage$")
|
||||
message(STATUS "AppImage detected, we'll extract the AppImage before using")
|
||||
set(_${RESULT_VARIABLE}_IS_APPIMAGE TRUE)
|
||||
endif()
|
||||
|
||||
# Determine a suitable working directory
|
||||
if(CMAKE_CURRENT_BINARY_DIR)
|
||||
# Assume we're called from configure step
|
||||
set(_working_dir "${CMAKE_CURRENT_BINARY_DIR}")
|
||||
elseif(CPACK_CURRENT_BINARY_DIR)
|
||||
# Assume cpack (non-standard variable name, but used throughout)
|
||||
set(_working_dir "${CPACK_CURRENT_BINARY_DIR}")
|
||||
else()
|
||||
# Fallback to somewhere temporary, writable
|
||||
if($ENV{_tmpdir})
|
||||
# POSIX
|
||||
set(_tmpdir "$ENV{_tmpdir}")
|
||||
elseif($ENV{TEMP})
|
||||
# Windows
|
||||
set(_tmpdir "$ENV{TEMP}")
|
||||
else()
|
||||
# Linux, shame on you!
|
||||
find_program(MKTEMP mktemp)
|
||||
if(MKTEMP)
|
||||
execute_process(COMMAND mktemp
|
||||
OUTPUT_VARIABLE _working_dir
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
${_output_quiet}
|
||||
COMMAND_ECHO ${_command_echo})
|
||||
# mktemp formats it how we want it
|
||||
else()
|
||||
# Ummm... Linux you can do better!
|
||||
set(_tmpdir "/tmp")
|
||||
endif()
|
||||
endif()
|
||||
if(NOT DEFINED _working_dir)
|
||||
string(RANDOM subdir)
|
||||
set(_working_dir "${_tmpdir}/tmp.${subdir}")
|
||||
endif()
|
||||
if(NOT EXISTS "${_working_dir}")
|
||||
file(MAKE_DIRECTORY "${_working_dir}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(_prepend_to_path)
|
||||
# Ensure the PATH is configured
|
||||
string(FIND "$ENV{PATH}" "${_working_dir}" _pathloc)
|
||||
if(NOT $_pathloc EQUAL 0)
|
||||
set(ENV{PATH} "${_working_dir}:$ENV{PATH}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# First ensure the binary doesn't already exist
|
||||
find_program(_${RESULT_VARIABLE} "${_name}" HINTS "${_working_dir}")
|
||||
|
||||
set(_binary_path "${_working_dir}/${_name}")
|
||||
if(NOT _${RESULT_VARIABLE})
|
||||
message(STATUS "Downloading ${_name} from ${_url}...")
|
||||
file(DOWNLOAD
|
||||
"${_url}"
|
||||
"${_binary_path}"
|
||||
STATUS DOWNLOAD_STATUS)
|
||||
# Check if download was successful.
|
||||
list(GET DOWNLOAD_STATUS 0 STATUS_CODE)
|
||||
list(GET DOWNLOAD_STATUS 1 ERROR_MESSAGE)
|
||||
if(NOT ${STATUS_CODE} EQUAL 0)
|
||||
file(REMOVE "${_binary_path}")
|
||||
message(FATAL_ERROR "Error downloading ${_url} ${ERROR_MESSAGE}")
|
||||
endif()
|
||||
|
||||
# Ensure the file is executable
|
||||
file(CHMOD "${_binary_path}" PERMISSIONS
|
||||
OWNER_EXECUTE OWNER_WRITE OWNER_READ
|
||||
GROUP_EXECUTE GROUP_WRITE GROUP_READ)
|
||||
|
||||
# Ensure it's found
|
||||
find_program(_${RESULT_VARIABLE} "${_name}" HINTS "${_working_dir}" REQUIRED)
|
||||
endif()
|
||||
|
||||
# We need to create a subdirectory for this binary and symlink it's AppRun to where it's expected
|
||||
if(_${RESULT_VARIABLE}_IS_APPIMAGE AND NOT IS_SYMLINK "${_${RESULT_VARIABLE}}")
|
||||
if(NOT COMMAND create_symlink)
|
||||
include(CreateSymlink)
|
||||
endif()
|
||||
|
||||
message(STATUS "Extracting ${_${RESULT_VARIABLE}} to ${_working_dir}/.${_name}/")
|
||||
|
||||
# extract appimage
|
||||
execute_process(COMMAND "${_${RESULT_VARIABLE}}" --appimage-extract
|
||||
WORKING_DIRECTORY "${_working_dir}"
|
||||
COMMAND_ECHO ${_command_echo}
|
||||
${_output_quiet}
|
||||
${_error_quiet}
|
||||
COMMAND_ERROR_IS_FATAL ANY)
|
||||
|
||||
# move extracted files to dedicated location (e.g. ".linuxdeploy-x86_64.AppImage/squashfs-root/")
|
||||
file(MAKE_DIRECTORY "${_working_dir}/.${_name}/")
|
||||
file(RENAME "${_working_dir}/squashfs-root/" "${_working_dir}/.${_name}/squashfs-root/")
|
||||
|
||||
# remove the unusable binary
|
||||
file(REMOVE "${_${RESULT_VARIABLE}}")
|
||||
|
||||
# symlink the expected binary name to the AppRun file
|
||||
message(STATUS "Creating a symbolic link ${_${RESULT_VARIABLE}} which points to ${_working_dir}/.${_name}/squashfs-root/AppRun")
|
||||
create_symlink("${_working_dir}/.${_name}/squashfs-root/AppRun" "${_${RESULT_VARIABLE}}")
|
||||
endif()
|
||||
|
||||
# Test the binary
|
||||
# - TODO: Add support for bad binaries that set "$?" to an error code for no good reason
|
||||
# - TODO: Add support for Windows binaries expecting "/?" instead of "--help"
|
||||
message(STATUS "Testing that ${_name} works on this system...")
|
||||
set(_test_param "--help")
|
||||
|
||||
execute_process(COMMAND "${_${RESULT_VARIABLE}}" ${_test_param}
|
||||
COMMAND_ECHO ${_command_echo}
|
||||
${_output_quiet}
|
||||
${_error_quiet}
|
||||
COMMAND_ERROR_IS_FATAL ANY)
|
||||
|
||||
message(STATUS "The binary \"${_${RESULT_VARIABLE}}\" is now available")
|
||||
set(${RESULT_VARIABLE} "${_${RESULT_VARIABLE}}")
|
||||
endmacro()
|
||||
@@ -1,76 +0,0 @@
|
||||
# Shim the SYSTEM property for older CMake versions - we rely on this property
|
||||
# to determine which set of error flags to use.
|
||||
if(CMAKE_VERSION VERSION_LESS "3.25")
|
||||
define_property(TARGET
|
||||
PROPERTY SYSTEM
|
||||
INHERITED
|
||||
BRIEF_DOCS "Shim of built-in SYSTEM property for CMake versions less than 3.25"
|
||||
FULL_DOCS "Non-functional, but allows the property to be inherited properly."
|
||||
"See the CMake documentation at https://cmake.org/cmake/help/latest/prop_tgt/SYSTEM.html."
|
||||
)
|
||||
endif()
|
||||
|
||||
# Allow the user to control whether to treat warnings as errors
|
||||
option(USE_WERROR "Treat compiler warnings as errors" OFF)
|
||||
|
||||
# Compute the appropriate flags for the current compiler and options
|
||||
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
|
||||
set(COMPILE_ERROR_FLAGS
|
||||
"-Wall" # Enable most warnings by default
|
||||
)
|
||||
set(THIRD_PARTY_COMPILE_ERROR_FLAGS
|
||||
"-w" # Disable all warnings
|
||||
)
|
||||
|
||||
if(CMAKE_COMPILER_IS_GNUCXX)
|
||||
list(APPEND COMPILE_ERROR_FLAGS
|
||||
# The following warning generates false positives that are difficult
|
||||
# to work around, in particular when inlining calls to standard
|
||||
# algorithms performed on single-element arrays. See, for example,
|
||||
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111273.
|
||||
"-Wno-array-bounds" # Permit out-of-bounds array subscripts
|
||||
)
|
||||
|
||||
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "11")
|
||||
list(APPEND COMPILE_ERROR_FLAGS
|
||||
# This has the same problems described above for "array-bounds".
|
||||
"-Wno-stringop-overread" # Permit string functions overreading the source
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(USE_WERROR)
|
||||
list(APPEND COMPILE_ERROR_FLAGS
|
||||
"-Werror" # Treat warnings as errors
|
||||
)
|
||||
endif()
|
||||
elseif(MSVC)
|
||||
set(COMPILE_ERROR_FLAGS
|
||||
"/W2" # Enable some warnings by default
|
||||
"/external:W0" # Don't emit warnings for third-party code
|
||||
"/external:anglebrackets" # Consider headers included with angle brackets to be third-party
|
||||
"/external:templates-" # Still emit warnings from first-party instantiations of third-party templates
|
||||
# Silence "class X needs to have DLL-interface to be used by clients of
|
||||
# class Y" warnings. These aren't trivial to address, and don't pose a
|
||||
# problem for us since we build all modules with the same compiler and
|
||||
# options, and dynamically link the CRT.
|
||||
"/wd4251"
|
||||
)
|
||||
set(THIRD_PARTY_COMPILE_ERROR_FLAGS
|
||||
"/W0" # Disable all warnings
|
||||
)
|
||||
|
||||
if(USE_WERROR)
|
||||
list(APPEND COMPILE_ERROR_FLAGS
|
||||
"/WX" # Treat warnings as errors
|
||||
)
|
||||
endif()
|
||||
|
||||
# Silence deprecation warnings for the std::atomic_...<std::shared_ptr> family of functions.
|
||||
# TODO: Remove once C++20's std::atomic<std::shared_ptr> is fully supported.
|
||||
add_compile_definitions("_SILENCE_CXX20_OLD_SHARED_PTR_ATOMIC_SUPPORT_DEPRECATION_WARNING")
|
||||
endif()
|
||||
|
||||
# Add the flags to the whole directory tree. We use the third-party flags for
|
||||
# targets whose SYSTEM property is true, and the normal flags otherwise.
|
||||
add_compile_options("$<IF:$<BOOL:$<TARGET_PROPERTY:SYSTEM>>,${THIRD_PARTY_COMPILE_ERROR_FLAGS},${COMPILE_ERROR_FLAGS}>")
|
||||
@@ -22,7 +22,7 @@ find_path(FluidSynth_INCLUDE_DIR
|
||||
)
|
||||
|
||||
find_library(FluidSynth_LIBRARY
|
||||
NAMES "fluidsynth" "fluidsynth-3" "fluidsynth-2" "fluidsynth-1"
|
||||
NAMES "fluidsynth"
|
||||
HINTS ${FLUIDSYNTH_PKG_LIBRARY_DIRS}
|
||||
)
|
||||
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
# Copyright (c) 2025 Dalton Messmer <messmer.dalton/at/gmail.com>
|
||||
#
|
||||
# Redistribution and use is allowed according to the terms of the New BSD license.
|
||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||
|
||||
include(ImportedTargetHelpers)
|
||||
|
||||
find_package_config_mode_with_fallback(Lilv Lilv::lilv
|
||||
LIBRARY_NAMES "lilv" "lilv-0"
|
||||
INCLUDE_NAMES "lilv/lilv.h"
|
||||
PKG_CONFIG "lilv-0"
|
||||
)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
|
||||
find_package_handle_standard_args(Lilv
|
||||
REQUIRED_VARS Lilv_LIBRARY Lilv_INCLUDE_DIRS
|
||||
VERSION_VAR Lilv_VERSION
|
||||
)
|
||||
@@ -18,15 +18,13 @@ ENDIF (PULSEAUDIO_INCLUDE_DIR AND PULSEAUDIO_LIBRARIES)
|
||||
IF (NOT WIN32)
|
||||
# use pkg-config to get the directories and then use these values
|
||||
# in the FIND_PATH() and FIND_LIBRARY() calls
|
||||
find_package(PkgConfig QUIET)
|
||||
if(PKG_CONFIG_FOUND)
|
||||
pkg_check_modules(PA libpulse)
|
||||
set(_PASIncDir ${PA_INCLUDE_DIRS})
|
||||
set(_PASLinkDir ${PA_LIBRARY_DIRS})
|
||||
set(_PASLinkFlags ${PA_LDFLAGS})
|
||||
set(_PASCflags ${PA_CFLAGS})
|
||||
set(PULSEAUDIO_DEFINITIONS ${_PASCflags})
|
||||
endif()
|
||||
INCLUDE(FindPkgConfig)
|
||||
pkg_check_modules(PA libpulse)
|
||||
set(_PASIncDir ${PA_INCLUDE_DIRS})
|
||||
set(_PASLinkDir ${PA_LIBRARY_DIRS})
|
||||
set(_PASLinkFlags ${PA_LDFLAGS})
|
||||
set(_PASCflags ${PA_CFLAGS})
|
||||
SET(PULSEAUDIO_DEFINITIONS ${_PASCflags})
|
||||
ENDIF (NOT WIN32)
|
||||
|
||||
FIND_PATH(PULSEAUDIO_INCLUDE_DIR pulse/pulseaudio.h
|
||||
|
||||
@@ -33,18 +33,6 @@
|
||||
find_package(SDL2 CONFIG QUIET)
|
||||
|
||||
if(TARGET SDL2::SDL2)
|
||||
# SDL2::SDL2 under MinGW is an interface target for reasons, so we can't get
|
||||
# the library location from it. Print minimal information and return early.
|
||||
get_target_property(sdl2_target_type SDL2::SDL2 TYPE)
|
||||
if(sdl2_target_type STREQUAL "INTERFACE_LIBRARY")
|
||||
unset(sdl2_target_type)
|
||||
if(NOT SDL2_FIND_QUIETLY)
|
||||
message(STATUS "Found SDL2 (found version \"${SDL2_VERSION}\")")
|
||||
endif()
|
||||
return()
|
||||
endif()
|
||||
unset(sdl2_target_type)
|
||||
|
||||
# Extract details for find_package_handle_standard_args
|
||||
get_target_property(SDL2_LIBRARY SDL2::SDL2 LOCATION)
|
||||
get_target_property(SDL2_INCLUDE_DIR SDL2::SDL2 INTERFACE_INCLUDE_DIRECTORIES)
|
||||
|
||||
@@ -14,7 +14,7 @@ if(STK_INCLUDE_DIRS)
|
||||
list(GET STK_INCLUDE_DIRS 0 STK_INCLUDE_DIR)
|
||||
find_path(STK_RAWWAVE_ROOT
|
||||
NAMES silence.raw sinewave.raw
|
||||
HINTS "${STK_INCLUDE_DIR}/.." "${STK_INCLUDE_DIR}/../.."
|
||||
HINTS "${STK_INCLUDE_DIR}/.."
|
||||
PATH_SUFFIXES share/stk/rawwaves share/libstk/rawwaves
|
||||
)
|
||||
endif()
|
||||
@@ -22,6 +22,6 @@ endif()
|
||||
include(FindPackageHandleStandardArgs)
|
||||
|
||||
find_package_handle_standard_args(STK
|
||||
REQUIRED_VARS STK_LIBRARY STK_INCLUDE_DIR STK_RAWWAVE_ROOT
|
||||
REQUIRED_VARS STK_LIBRARY STK_INCLUDE_DIR
|
||||
# STK doesn't appear to expose its version, so we can't pass it here
|
||||
)
|
||||
|
||||
@@ -24,7 +24,7 @@ check_library_exists(sndio sio_open "${SNDIO_LIBRARY_DIR}" HAVE_SIO_OPEN)
|
||||
find_path(SNDIO_INCLUDE_DIR sndio.h)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(Sndio DEFAULT_MSG SNDIO_LIBRARY SNDIO_INCLUDE_DIR HAVE_SIO_OPEN)
|
||||
find_package_handle_standard_args(SNDIO DEFAULT_MSG SNDIO_LIBRARY SNDIO_INCLUDE_DIR HAVE_SIO_OPEN)
|
||||
|
||||
if(SNDIO_FOUND)
|
||||
set(SNDIO_INCLUDE_DIRS "${SNDIO_INCLUDE_DIR}")
|
||||
|
||||
@@ -11,6 +11,6 @@ find_path(SOUNDIO_INCLUDE_DIR NAMES soundio/soundio.h)
|
||||
find_library(SOUNDIO_LIBRARY NAMES soundio)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(SoundIo DEFAULT_MSG SOUNDIO_LIBRARY SOUNDIO_INCLUDE_DIR)
|
||||
find_package_handle_standard_args(SOUNDIO DEFAULT_MSG SOUNDIO_LIBRARY SOUNDIO_INCLUDE_DIR)
|
||||
|
||||
mark_as_advanced(SOUNDIO_INCLUDE_DIR SOUNDIO_LIBRARY)
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
# Copyright (c) 2024 Tres Finocchiaro
|
||||
#
|
||||
# Redistribution and use is allowed according to the terms of the New BSD license.
|
||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||
|
||||
# This module defines
|
||||
# Suil_MODULES: List of full paths to Suil modules (e.g. "/usr/lib/suil-0/libsuil_x11.so;...")
|
||||
# Suil_MODULES_PREFIX: Only the directory name of the Suil_MODULES path (e.g. "suil-0")
|
||||
|
||||
pkg_check_modules(Suil QUIET suil-0)
|
||||
|
||||
if(Suil_FOUND)
|
||||
if(APPLE)
|
||||
set(_lib_ext "dylib")
|
||||
elseif(WIN32)
|
||||
set(_lib_ext "dll")
|
||||
else()
|
||||
set(_lib_ext "so")
|
||||
endif()
|
||||
|
||||
# Isolate -- if needed -- the first suil library path (e.g. "/usr/lib/libsuil-0.so")
|
||||
list(GET Suil_LINK_LIBRARIES 0 _lib)
|
||||
if(EXISTS "${_lib}")
|
||||
# Isolate -- if needed -- the first suil library name (e.g. "suil-0")
|
||||
list(GET Suil_LIBRARIES 0 _modules_prefix)
|
||||
get_filename_component(_lib_dir "${_lib}" DIRECTORY)
|
||||
# Construct modules path (e.g. "/usr/lib/suil-0")
|
||||
set(_modules_dir "${_lib_dir}/${_modules_prefix}")
|
||||
if(IS_DIRECTORY "${_modules_dir}")
|
||||
set(Suil_MODULES_PREFIX "${_modules_prefix}")
|
||||
file(GLOB Suil_MODULES "${_modules_dir}/*.${_lib_ext}")
|
||||
list(SORT Suil_MODULES)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(SuilModules
|
||||
REQUIRED_VARS Suil_MODULES Suil_MODULES_PREFIX
|
||||
)
|
||||
@@ -2,17 +2,8 @@
|
||||
# Once done this will define
|
||||
#
|
||||
# WINE_FOUND - System has wine
|
||||
#
|
||||
# WINE_INCLUDE_DIR - Wine include directory
|
||||
# WINE_BUILD - Path to winebuild
|
||||
# WINE_CXX - Path to wineg++
|
||||
# WINE_GCC - Path to winegcc
|
||||
# WINE_32_LIBRARY_DIRS - Path(s) to 32-bit wine libs
|
||||
# WINE_32_FLAGS - 32-bit linker flags
|
||||
# WINE_64_LIBRARY_DIRS - Path(s) to 64-bit wine libs
|
||||
# WINE_64_FLAGS - 64-bit linker flags
|
||||
# WINE_VERSION - Wine version
|
||||
# WINE_ASLR_ENABLED - If binaries will use dynamicbase/ASLR; influenced by wine version and WINE_WANT_ASLR
|
||||
# WINE_INCLUDE_DIRS - The wine include directories
|
||||
# WINE_DEFINITIONS - Compiler switches required for using wine
|
||||
#
|
||||
|
||||
MACRO(_findwine_find_flags output expression result)
|
||||
@@ -32,82 +23,17 @@ MACRO(_regex_replace_foreach EXPRESSION REPLACEMENT RESULT INPUT)
|
||||
ENDFOREACH()
|
||||
ENDMACRO()
|
||||
|
||||
# Prefer newest wine first
|
||||
list(APPEND WINE_LOCATIONS
|
||||
/opt/wine-staging
|
||||
/opt/wine-devel
|
||||
/opt/wine-stable
|
||||
# Gentoo Systems
|
||||
/etc/eselect/wine
|
||||
/usr/lib/wine)
|
||||
LIST(APPEND CMAKE_PREFIX_PATH /opt/wine-stable /opt/wine-devel /opt/wine-staging /usr/lib/wine/)
|
||||
|
||||
# Prepare bin search
|
||||
foreach(_loc ${WINE_LOCATIONS})
|
||||
if(_loc STREQUAL /usr/lib/wine)
|
||||
# /usr/lib/wine doesn't have a "bin"
|
||||
list(APPEND WINE_CXX_LOCATIONS "${_loc}")
|
||||
else()
|
||||
# expect "bin"
|
||||
list(APPEND WINE_CXX_LOCATIONS "${_loc}/bin")
|
||||
endif()
|
||||
endforeach()
|
||||
# Fallback
|
||||
list(APPEND WINE_CXX_LOCATIONS "/usr/bin")
|
||||
|
||||
# Prefer most-common to least common
|
||||
FIND_PROGRAM(WINE_CXX NAMES
|
||||
wineg++
|
||||
wineg++-stable
|
||||
PATHS
|
||||
${WINE_CXX_LOCATIONS}
|
||||
NO_DEFAULT_PATH
|
||||
FIND_PROGRAM(WINE_CXX
|
||||
NAMES wineg++ winegcc winegcc64 winegcc32 winegcc-stable
|
||||
PATHS /usr/lib/wine
|
||||
)
|
||||
|
||||
FIND_PROGRAM(WINE_GCC NAMES
|
||||
winegcc
|
||||
winegcc-stable
|
||||
PATHS
|
||||
${WINE_CXX_LOCATIONS}
|
||||
NO_DEFAULT_PATH
|
||||
)
|
||||
|
||||
FIND_PROGRAM(WINE NAMES wine PATHS ${WINE_CXX_LOCATIONS} NO_DEFAULT_PATH)
|
||||
FIND_PROGRAM(WINE_BUILD NAMES winebuild PATHS ${WINE_CXX_LOCATIONS} NO_DEFAULT_PATH)
|
||||
|
||||
# Detect wine version
|
||||
if(WINE)
|
||||
# Wine version can be formatted:
|
||||
# wine-1.4
|
||||
# wine-6.0.3 (Ubuntu 6.0.3~repack-1)
|
||||
# wine-9.8 (Staging)
|
||||
# wine-9.22
|
||||
execute_process(COMMAND "${WINE}" --version OUTPUT_VARIABLE WINE_VERSION_OUTPUT ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
string(REGEX REPLACE "^wine-([^\ \t]+).*$" "\\1" WINE_VERSION "${WINE_VERSION_OUTPUT}")
|
||||
if(WINE_VERSION VERSION_LESS 8.17)
|
||||
# Wine versions prior to 8.17 did not use ASLR by default. Assume off.
|
||||
set(WINE_ASLR_ENABLED false)
|
||||
elseif(WINE_VERSION VERSION_GREATER_EQUAL 10.14 AND NOT WINE_WANT_ASLR)
|
||||
# Wine 10.14 introduced the ability to disable ASLR, preventing crashes with older VSTs (See issue #7987)
|
||||
# Explicitly set '/DYNAMICBASE:NO' per #7987 (effectively setting '/HIGHENTROPYVA:NO' as well for 64-bit)
|
||||
set(WINE_32_FLAGS "-Wb,--disable-dynamicbase")
|
||||
set(WINE_64_FLAGS "-Wb,--disable-dynamicbase")
|
||||
set(WINE_ASLR_ENABLED false)
|
||||
else()
|
||||
# Wine versions 8.17 - 10.13 use ASLR by default, but provide no option to disable. Assume on.
|
||||
set(WINE_ASLR_ENABLED true)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
FIND_PROGRAM(WINE_BUILD NAMES winebuild)
|
||||
# Detect wine paths and handle linking problems
|
||||
IF(WINE_CXX)
|
||||
# call wineg++ to obtain implied includes and libs
|
||||
if(LMMS_HOST_X86_64 OR LMMS_HOST_X86)
|
||||
execute_process(COMMAND ${WINE_CXX} -m32 -v /dev/zero OUTPUT_VARIABLE WINEBUILD_OUTPUT_32 ERROR_QUIET)
|
||||
execute_process(COMMAND ${WINE_CXX} -m64 -v /dev/zero OUTPUT_VARIABLE WINEBUILD_OUTPUT_64 ERROR_QUIET)
|
||||
else()
|
||||
execute_process(COMMAND ${WINE_CXX} -v /dev/zero OUTPUT_VARIABLE WINEBUILD_OUTPUT_64 ERROR_QUIET)
|
||||
endif()
|
||||
|
||||
execute_process(COMMAND ${WINE_CXX} -m32 -v /dev/zero OUTPUT_VARIABLE WINEBUILD_OUTPUT_32)
|
||||
execute_process(COMMAND ${WINE_CXX} -m64 -v /dev/zero OUTPUT_VARIABLE WINEBUILD_OUTPUT_64)
|
||||
_findwine_find_flags("${WINEBUILD_OUTPUT_32}" "^-isystem/usr/include$" BUGGED_WINEGCC)
|
||||
_findwine_find_flags("${WINEBUILD_OUTPUT_32}" "^-isystem" WINEGCC_INCLUDE_DIR)
|
||||
_findwine_find_flags("${WINEBUILD_OUTPUT_32}" "libwinecrt0\\.a.*" WINECRT_32)
|
||||
@@ -116,9 +42,6 @@ IF(WINE_CXX)
|
||||
_regex_replace_foreach("/wine/windows$" "" WINE_INCLUDE_HINT "${WINE_INCLUDE_HINT}")
|
||||
STRING(REGEX REPLACE "wine/libwinecrt0\\.a.*" "" WINE_32_LIBRARY_DIR "${WINECRT_32}")
|
||||
STRING(REGEX REPLACE "wine/libwinecrt0\\.a.*" "" WINE_64_LIBRARY_DIR "${WINECRT_64}")
|
||||
# Handle winehq
|
||||
STRING(REGEX REPLACE "/libwinecrt0\\.a.*" "/" WINE_32_LIBRARY_DIR "${WINE_32_LIBRARY_DIR}")
|
||||
STRING(REGEX REPLACE "/libwinecrt0\\.a.*" "/" WINE_64_LIBRARY_DIR "${WINE_64_LIBRARY_DIR}")
|
||||
|
||||
IF(BUGGED_WINEGCC)
|
||||
MESSAGE(WARNING "Your winegcc is unusable due to https://bugs.winehq.org/show_bug.cgi?id=46293,\n
|
||||
@@ -175,41 +98,25 @@ find_package_handle_standard_args(Wine DEFAULT_MSG WINE_CXX WINE_INCLUDE_DIRS)
|
||||
mark_as_advanced(WINE_INCLUDE_DIR WINE_LIBRARY WINE_CXX WINE_BUILD)
|
||||
|
||||
IF(WINE_32_LIBRARY_DIR)
|
||||
IF(WINE_32_LIBRARY_DIR MATCHES "^/opt/wine-.*")
|
||||
# winehq uses a singular lib directory
|
||||
SET(WINE_32_FLAGS "-L${WINE_32_LIBRARY_DIR} ${WINE_32_FLAGS}")
|
||||
SET(WINE_32_LIBRARY_DIRS "${WINE_32_LIBRARY_DIR}")
|
||||
ELSEIF(WINE_32_LIBRARY_DIR MATCHES "wine*/lib")
|
||||
SET(WINE_32_FLAGS "-L${WINE_32_LIBRARY_DIR} -L${WINE_32_LIBRARY_DIR}../ ${WINE_32_FLAGS}")
|
||||
IF(WINE_32_LIBRARY_DIR MATCHES "wine*/lib")
|
||||
SET(WINE_32_FLAGS "-L${WINE_32_LIBRARY_DIR} -L${WINE_32_LIBRARY_DIR}../")
|
||||
SET(WINE_32_LIBRARY_DIRS "${WINE_32_LIBRARY_DIR}:${WINE_32_LIBRARY_DIR}/..")
|
||||
ELSE()
|
||||
SET(WINE_32_FLAGS "-L${WINE_32_LIBRARY_DIR} -L${WINE_32_LIBRARY_DIR}wine/ ${WINE_32_FLAGS}")
|
||||
SET(WINE_32_FLAGS "-L${WINE_32_LIBRARY_DIR} -L${WINE_32_LIBRARY_DIR}wine/")
|
||||
SET(WINE_32_LIBRARY_DIRS "${WINE_32_LIBRARY_DIR}:${WINE_32_LIBRARY_DIR}wine/")
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
IF(WINE_64_LIBRARY_DIR)
|
||||
IF(WINE_32_LIBRARY_DIR MATCHES "^/opt/wine-.*")
|
||||
# winehq uses a singular lib directory
|
||||
SET(WINE_64_FLAGS "-L${WINE_64_LIBRARY_DIR} ${WINE_64_FLAGS}")
|
||||
SET(WINE_64_LIBRARY_DIRS "${WINE_64_LIBRARY_DIR}")
|
||||
ELSEIF(WINE_64_LIBRARY_DIR MATCHES "wine*/lib")
|
||||
SET(WINE_64_FLAGS "-L${WINE_64_LIBRARY_DIR} -L${WINE_64_LIBRARY_DIR}../ ${WINE_64_FLAGS}")
|
||||
IF(WINE_64_LIBRARY_DIR MATCHES "wine*/lib")
|
||||
SET(WINE_64_FLAGS "-L${WINE_64_LIBRARY_DIR} -L${WINE_64_LIBRARY_DIR}../")
|
||||
SET(WINE_64_LIBRARY_DIRS "${WINE_64_LIBRARY_DIR}:${WINE_64_LIBRARY_DIR}/..")
|
||||
ELSE()
|
||||
SET(WINE_64_FLAGS "-L${WINE_64_LIBRARY_DIR} -L${WINE_64_LIBRARY_DIR}wine/ ${WINE_64_FLAGS}")
|
||||
SET(WINE_64_FLAGS "-L${WINE_64_LIBRARY_DIR} -L${WINE_64_LIBRARY_DIR}wine/")
|
||||
SET(WINE_64_LIBRARY_DIRS "${WINE_64_LIBRARY_DIR}:${WINE_64_LIBRARY_DIR}wine/")
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
message(STATUS " WINE_INCLUDE_DIR: ${WINE_INCLUDE_DIR}")
|
||||
message(STATUS " WINE_CXX: ${WINE_CXX}")
|
||||
message(STATUS " WINE_GCC: ${WINE_GCC}")
|
||||
message(STATUS " WINE_32_FLAGS: ${WINE_32_FLAGS}")
|
||||
message(STATUS " WINE_64_FLAGS: ${WINE_64_FLAGS}")
|
||||
message(STATUS " WINE_VERSION: ${WINE_VERSION}")
|
||||
message(STATUS " WINE_ASLR_ENABLED: ${WINE_ASLR_ENABLED}")
|
||||
|
||||
# Create winegcc (technically, wineg++) wrapper
|
||||
# Create winegcc wrapper
|
||||
configure_file(${CMAKE_CURRENT_LIST_DIR}/winegcc_wrapper.in winegcc_wrapper @ONLY)
|
||||
SET(WINEGCC "${CMAKE_CURRENT_BINARY_DIR}/winegcc_wrapper")
|
||||
|
||||
@@ -58,7 +58,7 @@ function(add_gen_qrc RCC_OUT QRC_NAME)
|
||||
# generators. See issue #6177.
|
||||
add_custom_command(
|
||||
OUTPUT "${CPP_FILE}"
|
||||
COMMAND Qt${QT_VERSION_MAJOR}::rcc
|
||||
COMMAND Qt5::rcc
|
||||
--name "${RESOURCE_NAME}"
|
||||
--output "${CPP_FILE}"
|
||||
"${QRC_FILE}"
|
||||
|
||||
@@ -44,7 +44,7 @@ function(determine_version_from_source _version_out _target _source)
|
||||
_dvfs_run_result _dvfs_compile_result "${CMAKE_CURRENT_BINARY_DIR}"
|
||||
SOURCES "${_source_file}"
|
||||
LINK_LIBRARIES "${_target}"
|
||||
CXX_STANDARD 20
|
||||
CXX_STANDARD 17
|
||||
RUN_OUTPUT_VARIABLE _run_output
|
||||
COMPILE_OUTPUT_VARIABLE _compile_output
|
||||
)
|
||||
|
||||
@@ -34,13 +34,10 @@ SET(LMMS_PLUGIN_LIST
|
||||
CrossoverEQ
|
||||
Delay
|
||||
Dispersion
|
||||
Disintegrator
|
||||
DualFilter
|
||||
DynamicsProcessor
|
||||
Eq
|
||||
Flanger
|
||||
FrequencyShifter
|
||||
GranularPitchShifter
|
||||
HydrogenImport
|
||||
LadspaBrowser
|
||||
LadspaEffect
|
||||
@@ -63,7 +60,6 @@ SET(LMMS_PLUGIN_LIST
|
||||
Sf2Player
|
||||
Sfxr
|
||||
Sid
|
||||
SlewDistortion
|
||||
SlicerT
|
||||
SpectrumAnalyzer
|
||||
StereoEnhancer
|
||||
@@ -104,3 +100,12 @@ IF(LIST_PLUGINS)
|
||||
UNSET(LIST_PLUGINS CACHE)
|
||||
LIST_ALL_PLUGINS()
|
||||
ENDIF()
|
||||
|
||||
IF(MSVC)
|
||||
SET(MSVC_INCOMPATIBLE_PLUGINS
|
||||
LadspaEffect
|
||||
)
|
||||
message(WARNING "Compiling with MSVC. The following plugins are not available: ${MSVC_INCOMPATIBLE_PLUGINS}")
|
||||
LIST(REMOVE_ITEM PLUGIN_LIST ${MSVC_INCOMPATIBLE_PLUGINS})
|
||||
ENDIF()
|
||||
|
||||
|
||||
@@ -1,141 +0,0 @@
|
||||
# StaticDependencies.cmake - adds features similar to interface properties that
|
||||
# are only transitive over static dependencies.
|
||||
#
|
||||
# Copyright (c) 2024 Dominic Clark
|
||||
#
|
||||
# Redistribution and use is allowed according to the terms of the New BSD license.
|
||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||
|
||||
define_property(TARGET
|
||||
PROPERTY STATIC_COMPILE_DEFINITIONS
|
||||
BRIEF_DOCS "Compile definitions to be used by targets linking statically to this one"
|
||||
FULL_DOCS "Behaves similarly to INTERFACE_COMPILE_DEFINITIONS, but only over static dependencies."
|
||||
"Effectively becomes private once an executable module is reached."
|
||||
)
|
||||
|
||||
define_property(TARGET
|
||||
PROPERTY STATIC_LINK_LIBRARIES
|
||||
BRIEF_DOCS "Link libraries to be included in targets linking statically to this one"
|
||||
FULL_DOCS "Behaves similarly to INTERFACE_LINK_LIBRARIES, but only over static dependencies."
|
||||
"Effectively becomes private once an executable module is reached."
|
||||
)
|
||||
|
||||
# Link a target statically to a set of libraries. Forward the given arguments to
|
||||
# `target_link_libraries`, but also perform two additional functions. Firstly,
|
||||
# ensure that the given libraries will be linked into any module that also
|
||||
# links the given target (allowing, for example, object libraries and private
|
||||
# static libraries to be used transitively). Secondly, add any static compile
|
||||
# definitions from the given libraries to the set of compile definitions used
|
||||
# to build the given target.
|
||||
#
|
||||
# This function must be used in order for static requirements as defined in this
|
||||
# module to be inherited transitively. Using `target_link_libraries` instead
|
||||
# will break the chain for static link libraries and static compile definitions.
|
||||
#
|
||||
# Usage:
|
||||
# target_static_libraries(
|
||||
# <target> # The target to which to add the libraries
|
||||
# [<PRIVATE|PUBLIC|INTERFACE>] # Optionally, the scope to use for the following libraries
|
||||
# <item>... # The libraries to which to link
|
||||
# [<PRIVATE|PUBLIC|INTERFACE> <item>...]...
|
||||
# )
|
||||
function(target_static_libraries target)
|
||||
# Target types that have a link step
|
||||
set(linked_target_types "MODULE_LIBRARY" "SHARED_LIBRARY" "EXECUTABLE")
|
||||
# Possible scopes for dependencies
|
||||
set(scopes "PRIVATE" "PUBLIC" "INTERFACE")
|
||||
|
||||
get_target_property(target_type "${target}" TYPE)
|
||||
set(scope "")
|
||||
|
||||
# Iterate over the dependencies (and possibly scopes) that we were given
|
||||
foreach(dependency IN LISTS ARGN)
|
||||
# If we have a scope, store it so we can apply it to upcoming libraries
|
||||
if(dependency IN_LIST scopes)
|
||||
set(scope "${dependency}")
|
||||
continue()
|
||||
endif()
|
||||
|
||||
# Link the target to the current dependency. (Note: `${scope}` is
|
||||
# unquoted so that the argument disappears if no scope was given.)
|
||||
target_link_libraries("${target}" ${scope} "${dependency}")
|
||||
|
||||
# Store the dependency so it can be linked in with this target later
|
||||
set_property(
|
||||
TARGET "${target}"
|
||||
APPEND
|
||||
PROPERTY STATIC_LINK_LIBRARIES
|
||||
"${dependency}"
|
||||
)
|
||||
|
||||
# If the dependency is a target, it may have some of our custom
|
||||
# properties defined on it, so we have a bit more work to do
|
||||
if(TARGET "${dependency}")
|
||||
# Ensure it makes sense to link statically to this dependency
|
||||
get_target_property(dependency_type "${dependency}" TYPE)
|
||||
if(dependency_type IN_LIST linked_target_types)
|
||||
message(SEND_ERROR "Cannot link statically to shared module ${dependency}")
|
||||
endif()
|
||||
|
||||
# Transitively include static definitions and libraries
|
||||
set(defs "$<TARGET_GENEX_EVAL:${dependency},$<TARGET_PROPERTY:${dependency},STATIC_COMPILE_DEFINITIONS>>")
|
||||
set(libs "$<TARGET_GENEX_EVAL:${dependency},$<TARGET_PROPERTY:${dependency},STATIC_LINK_LIBRARIES>>")
|
||||
set_property(
|
||||
TARGET "${target}"
|
||||
APPEND
|
||||
PROPERTY STATIC_COMPILE_DEFINITIONS
|
||||
"${defs}"
|
||||
)
|
||||
set_property(
|
||||
TARGET "${target}"
|
||||
APPEND
|
||||
PROPERTY STATIC_LINK_LIBRARIES
|
||||
"${libs}"
|
||||
)
|
||||
|
||||
# Add the dependency's transitive static compile definitions.
|
||||
# (Note: definitions are private so dynamically linked dependents
|
||||
# won't pick them up; a static dependent will have them set when
|
||||
# this function is called for it.)
|
||||
target_compile_definitions("${target}" PRIVATE "${defs}")
|
||||
|
||||
# If the target has a link step, add the transitive static
|
||||
# dependencies. (Note: we use `LINK_ONLY` so the caller can still
|
||||
# control usage requirements through the normal use of scopes. Only
|
||||
# transitive dependencies are needed here: the direct dependency was
|
||||
# added earlier on. We have to append to `LINK_LIBRARIES` directly,
|
||||
# rather than use `target_link_libraries(PRIVATE)`, in order to
|
||||
# remain compatible with the scopeless signature of that command.)
|
||||
if(target_type IN_LIST linked_target_types)
|
||||
set_property(
|
||||
TARGET "${target}"
|
||||
APPEND
|
||||
PROPERTY LINK_LIBRARIES
|
||||
"$<LINK_ONLY:${libs}>"
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
endforeach()
|
||||
endfunction()
|
||||
|
||||
# Add compile definitions to a target only for use with dependents linking
|
||||
# statically to it.
|
||||
#
|
||||
# Behaves like `target_compile_definitions(INTERFACE)`, except the definitions
|
||||
# will not be inherited beyond any executable module into which the target is
|
||||
# actually linked. The definitions are added to the `STATIC_COMPILE_DEFINITIONS`
|
||||
# property on the target.
|
||||
#
|
||||
# Usage:
|
||||
# target_static_definitions(
|
||||
# <target> # The target to which to add the definitions
|
||||
# <definition>... # The definitions to add to the target
|
||||
# )
|
||||
function(target_static_definitions target)
|
||||
set_property(
|
||||
TARGET "${target}"
|
||||
APPEND
|
||||
PROPERTY STATIC_COMPILE_DEFINITIONS
|
||||
"${ARGN}"
|
||||
)
|
||||
endfunction()
|
||||
@@ -8,18 +8,6 @@ IF(GIT_FOUND AND NOT FORCE_VERSION)
|
||||
# number from the environment and add it to the build metadata
|
||||
if("$ENV{GITHUB_REF}" MATCHES "refs/pull/([0-9]+)/merge")
|
||||
list(APPEND BUILD_METADATA "pr${CMAKE_MATCH_1}")
|
||||
# Parse hash from merge description
|
||||
# e.g. "Merge abc1234 into def4567"
|
||||
execute_process(
|
||||
COMMAND "${GIT_EXECUTABLE}" log -n 1 --format=%s
|
||||
OUTPUT_VARIABLE COMMIT_HASH
|
||||
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
|
||||
TIMEOUT 10
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
# If successful, use the first 7 characters to mimic github's hash style
|
||||
if(COMMIT_HASH)
|
||||
string(SUBSTRING "${COMMIT_HASH}" 6 7 COMMIT_HASH)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Look for git tag information (e.g. Tagged: "v1.0.0", Untagged: "v1.0.0-123-a1b2c3d")
|
||||
@@ -56,12 +44,7 @@ IF(GIT_FOUND AND NOT FORCE_VERSION)
|
||||
ELSEIF(TAG_LIST_LENGTH EQUAL 3)
|
||||
# Get the number of commits and latest commit hash
|
||||
LIST(GET TAG_LIST 1 EXTRA_COMMITS)
|
||||
# Prefer PR hash from above if present
|
||||
if(NOT COMMIT_HASH)
|
||||
list(GET TAG_LIST 2 COMMIT_HASH)
|
||||
# Mimic github's hash style
|
||||
string(SUBSTRING "${COMMIT_HASH}" 1 7 COMMIT_HASH)
|
||||
endif()
|
||||
LIST(GET TAG_LIST 2 COMMIT_HASH)
|
||||
list(APPEND PRERELEASE_DATA "${EXTRA_COMMITS}")
|
||||
list(APPEND BUILD_METADATA "${COMMIT_HASH}")
|
||||
# Bump the patch version, since a pre-release (as specified by the extra
|
||||
@@ -74,12 +57,7 @@ IF(GIT_FOUND AND NOT FORCE_VERSION)
|
||||
# Get the pre-release stage, number of commits, and latest commit hash
|
||||
LIST(GET TAG_LIST 1 VERSION_STAGE)
|
||||
LIST(GET TAG_LIST 2 EXTRA_COMMITS)
|
||||
# Prefer PR hash from above if present
|
||||
if(NOT COMMIT_HASH)
|
||||
list(GET TAG_LIST 3 COMMIT_HASH)
|
||||
# Mimic github's hash style
|
||||
string(SUBSTRING "${COMMIT_HASH}" 1 7 COMMIT_HASH)
|
||||
endif()
|
||||
LIST(GET TAG_LIST 3 COMMIT_HASH)
|
||||
list(APPEND PRERELEASE_DATA "${VERSION_STAGE}")
|
||||
list(APPEND PRERELEASE_DATA "${EXTRA_COMMITS}")
|
||||
list(APPEND BUILD_METADATA "${COMMIT_HASH}")
|
||||
|
||||
19
cmake/msys/extract_debs.sh
Normal file
@@ -0,0 +1,19 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
ppa_dir=./ppa/
|
||||
|
||||
pushd $ppa_dir
|
||||
|
||||
for f in *.deb; do
|
||||
echo "Extracting $f..."
|
||||
ar xv "$f"
|
||||
rm debian-binary
|
||||
rm control.tar.*
|
||||
tar xf data.tar.* --exclude=*mingw*/bin/fluid
|
||||
rm data.tar.*
|
||||
done
|
||||
|
||||
popd
|
||||
|
||||
echo "Your extracted files should be located in $ppa_dir"
|
||||
53
cmake/msys/fetch_ppa.sh
Normal file
@@ -0,0 +1,53 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Trusty=14.04, Precise=12.04
|
||||
PPA_DISTRO=trusty
|
||||
|
||||
# Architecture=i386, amd64
|
||||
PPA_ARCH=amd64
|
||||
|
||||
# These shouldn't change
|
||||
PPA_HOST=http://ppa.launchpad.net
|
||||
PPA_USER=tobydox
|
||||
PPA_PROJECT=mingw-x-trusty
|
||||
PPA_ROOT=$PPA_HOST/$PPA_USER/$PPA_PROJECT/ubuntu
|
||||
|
||||
PPA_URL=$PPA_ROOT/dists/$PPA_DISTRO/main/binary-$PPA_ARCH/Packages.gz
|
||||
|
||||
ppa_dir=./ppa/
|
||||
|
||||
temp_file=/tmp/ppa_listing_$$
|
||||
temp_temp_file=/tmp/ppa_listing_temp_$$
|
||||
|
||||
skip_files="binutils openssl flac libgig libogg libvorbis x-bootstrap zlib"
|
||||
skip_files="$skip_files x-runtime gcc qt_4 qt5 x-stk pkgconfig"
|
||||
skip_files="$skip_files glib2 libpng"
|
||||
|
||||
echo "Connecting to $PPA_URL to get list of packages..."
|
||||
wget -qO- $PPA_URL | gzip -d -c | grep "Filename:" > $temp_file
|
||||
|
||||
for j in $skip_files ; do
|
||||
grep -v "$j" $temp_file > $temp_temp_file
|
||||
mv $temp_temp_file $temp_file
|
||||
done
|
||||
|
||||
line_count=$(wc -l $temp_file |awk '{print $1}')
|
||||
|
||||
echo "Found $line_count packages for download..."
|
||||
|
||||
echo "Downloading packages. They will be saved to $ppa_dir"
|
||||
|
||||
mkdir $ppa_dir
|
||||
|
||||
while read -r j
|
||||
do
|
||||
echo "Downloading $j..."
|
||||
echo "$PPA_ROOT/$j"
|
||||
wget -qO "$ppa_dir$(basename "$j")" "$(echo "$PPA_ROOT/$j" | sed 's/\/Filename: /\//gi')"
|
||||
done < $temp_file
|
||||
|
||||
|
||||
echo "Cleaning up temporary files..."
|
||||
rm -rf $temp_file
|
||||
|
||||
echo "Packages have been saved to $ppa_dir. Please run extract_debs.sh"
|
||||
226
cmake/msys/msys_helper.sh
Normal file
@@ -0,0 +1,226 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -eu
|
||||
|
||||
# Git repo information
|
||||
fork="lmms" # i.e. "lmms" or "tobydox"
|
||||
branch="master" # i.e. "master" or "stable-1.2"
|
||||
|
||||
# Console colors
|
||||
red="\\x1B[1;31m"
|
||||
green="\\x1B[1;32m"
|
||||
yellow="\\x1B[1;33m"
|
||||
plain="\\x1B[0m"
|
||||
|
||||
function info() { echo -e "\n${green}$1${plain}"; }
|
||||
function warn() { echo -e "\n${yellow}$1${plain}"; }
|
||||
function err() { echo -e "\n${red}$1${plain}"; exit 1;}
|
||||
|
||||
info "Checking for mingw environment"
|
||||
if ! env | grep MINGW; then
|
||||
err " - Failed. Please relaunch using MinGW shell"
|
||||
fi
|
||||
|
||||
info "Preparing the git directory..."
|
||||
mkdir "$HOME/.git" || true
|
||||
touch "$HOME/.git/config" > /dev/null 2>&1
|
||||
git config --global http.sslverify false
|
||||
|
||||
info "Cloning the repository..."
|
||||
if [ -d ./lmms ]; then
|
||||
warn " - Skipping, ./lmms already exists"
|
||||
else
|
||||
git clone -b $branch https://github.com/$fork/lmms.git
|
||||
fi
|
||||
|
||||
info "Fetching ppa using cmake/msys/fetch_ppas.sh..."
|
||||
if [ -d "$HOME/ppa" ]; then
|
||||
warn " - Skipping, $HOME/ppa already exists"
|
||||
else
|
||||
lmms/cmake/msys/fetch_ppa.sh
|
||||
fi
|
||||
|
||||
info "Extracting debs to $HOME/ppa/opt/, etc..."
|
||||
if [ -d "$HOME/ppa/opt" ]; then
|
||||
warn " - Skipping, $HOME/ppa/opt already exists"
|
||||
else
|
||||
lmms/cmake/msys/extract_debs.sh
|
||||
fi
|
||||
|
||||
info "Preparing library merge, making all qt headers writable..."
|
||||
chmod u+w /mingw64/include/qt4 -R
|
||||
chmod u+w /mingw32/include/qt4 -R
|
||||
|
||||
info "Merging mingw headers and libraries from ppa over existing system libraries..."
|
||||
if ! find /mingw64 | grep sndfile.h; then
|
||||
command cp -r "$HOME/ppa/opt/mingw"* /
|
||||
else
|
||||
warn " - Skipping, sndfile.h has already been merged"
|
||||
fi
|
||||
|
||||
fltkver="1.3.3"
|
||||
oggver="1.3.2"
|
||||
vorbisver="1.3.5"
|
||||
flacver="1.3.2"
|
||||
gigver="4.0.0"
|
||||
stkver="4.5.1"
|
||||
|
||||
mingw_root="/$(echo "$MSYSTEM"|tr '[:upper:]' '[:lower:]')"
|
||||
|
||||
info "Downloading and building fltk $fltkver"
|
||||
if ! command -v fluid; then
|
||||
wget http://fltk.org/pub/fltk/$fltkver/fltk-$fltkver-source.tar.gz -O "$HOME/fltk-source.tar.gz"
|
||||
tar zxf "$HOME/fltk-source.tar.gz" -C "$HOME/"
|
||||
pushd "$HOME/fltk-$fltkver"
|
||||
|
||||
info " - Compiling fltk $fltkver..."
|
||||
./configure --prefix="$mingw_root" --enable-shared
|
||||
make
|
||||
|
||||
info " - Installing fltk..."
|
||||
make install
|
||||
|
||||
# ln -s $mingw_root/usr/local/bin/fluid.exe $mingw_root/bin/fluid.exe
|
||||
popd
|
||||
else
|
||||
warn " - Skipping, fluid binary already exists"
|
||||
fi
|
||||
|
||||
info "Downloading and building libogg $oggver"
|
||||
if [ ! -e "$mingw_root/lib/libogg.dll.a" ]; then
|
||||
wget http://downloads.xiph.org/releases/ogg/libogg-$oggver.tar.xz -O "$HOME/libogg-source.tar.xz"
|
||||
tar xf "$HOME/libogg-source.tar.xz" -C "$HOME/"
|
||||
pushd "$HOME/libogg-$oggver"
|
||||
|
||||
info " - Compiling libogg $oggver..."
|
||||
./configure --prefix="$mingw_root"
|
||||
make
|
||||
|
||||
info " - Installing libogg..."
|
||||
make install
|
||||
# for some reason libgig needs this
|
||||
./configure --prefix="/opt$mingw_root"
|
||||
make
|
||||
|
||||
info " - Installing libogg..."
|
||||
make install
|
||||
|
||||
popd
|
||||
else
|
||||
warn " - Skipping, libogg binary already exists"
|
||||
fi
|
||||
|
||||
info "Downloading and building libvorbis $vorbisver"
|
||||
if [ ! -e "$mingw_root/lib/libvorbis.dll.a" ]; then
|
||||
wget http://downloads.xiph.org/releases/vorbis/libvorbis-$vorbisver.tar.xz -O "$HOME/libvorbis-source.tar.xz"
|
||||
tar xf "$HOME/libvorbis-source.tar.xz" -C "$HOME/"
|
||||
pushd "$HOME/libvorbis-$vorbisver"
|
||||
|
||||
info " - Compiling libvorbis $vorbisver..."
|
||||
./configure --prefix="$mingw_root"
|
||||
make
|
||||
|
||||
info " - Installing libvorbis..."
|
||||
make install
|
||||
|
||||
# for some reason libgig needs this
|
||||
./configure --prefix="/opt$mingw_root"
|
||||
make
|
||||
info " - Installing libvorbis..."
|
||||
make install
|
||||
|
||||
popd
|
||||
else
|
||||
warn " - Skipping, libvorbis binary already exists"
|
||||
fi
|
||||
|
||||
info "Downloading and building flac $flacver"
|
||||
|
||||
if [ ! -e "$mingw_root/lib/libFLAC.dll.a" ]; then
|
||||
|
||||
wget http://downloads.xiph.org/releases/flac/flac-$flacver.tar.xz -O "$HOME/flac-source.tar.xz"
|
||||
tar xf "$HOME/flac-source.tar.xz" -C "$HOME/"
|
||||
pushd "$HOME/flac-$flacver"
|
||||
|
||||
info " - Compiling flac $flacver..."
|
||||
./configure --prefix="$mingw_root"
|
||||
make
|
||||
|
||||
info " - Installing flac..."
|
||||
make install
|
||||
|
||||
# for some reason libgig needs this
|
||||
./configure --prefix="/opt$mingw_root"
|
||||
make
|
||||
|
||||
info " - Installing flac..."
|
||||
make install
|
||||
|
||||
popd
|
||||
else
|
||||
warn " - Skipping, libvorbis flac already exists"
|
||||
fi
|
||||
|
||||
info "Downloading and building libgig $gigver"
|
||||
|
||||
if [ ! -e "$mingw_root/lib/libgig/libgig.dll.a" ]; then
|
||||
wget http://download.linuxsampler.org/packages/libgig-$gigver.tar.bz2 -O "$HOME/gig-source.tar.xz"
|
||||
tar xf "$HOME/gig-source.tar.xz" -C "$HOME/"
|
||||
pushd "$HOME/libgig-$gigver"
|
||||
|
||||
info " - Compiling libgig $gigver..."
|
||||
./configure --prefix="$mingw_root"
|
||||
make
|
||||
|
||||
info " - Installing libgig..."
|
||||
make install
|
||||
|
||||
mv "$mingw_root/lib/bin/libakai-0.dll" "$mingw_root/bin"
|
||||
mv "$mingw_root/lib/bin/libgig-7.dll" "$mingw_root/bin"
|
||||
|
||||
popd
|
||||
else
|
||||
warn " - Skipping, libgig binary already exists"
|
||||
fi
|
||||
|
||||
info "Downloading and building stk $stkver"
|
||||
|
||||
if [ ! -e "$mingw_root/lib/libstk.dll" ]; then
|
||||
wget http://ccrma.stanford.edu/software/stk/release/stk-$stkver.tar.gz -O "$HOME/stk-source.tar.xz"
|
||||
tar xf "$HOME/stk-source.tar.xz" -C "$HOME/"
|
||||
pushd "$HOME/stk-$stkver"
|
||||
|
||||
info " - Compiling stk $stkver..."
|
||||
./configure --prefix="$mingw_root"
|
||||
make
|
||||
|
||||
info " - Installing stk..."
|
||||
make install
|
||||
|
||||
mv "$mingw_root/lib/libstk.so" "$mingw_root/lib/libstk.dll"
|
||||
mv "$mingw_root/lib/libstk-$stkver.so" "$mingw_root/lib/libstk-$stkver.dll"
|
||||
|
||||
popd
|
||||
else
|
||||
warn " - Skipping, stk binary already exists"
|
||||
fi
|
||||
|
||||
# make a symlink to make cmake happy
|
||||
if [ "$mingw_root" = "/mingw64" ]; then
|
||||
if [ ! -e /opt/mingw64/bin/x86_64-w64-mingw32-pkg-config ]; then
|
||||
ln -s /usr/bin/pkg-config /opt/mingw64/bin/x86_64-w64-mingw32-pkg-config
|
||||
fi
|
||||
elif [ "$mingw_root" = "/mingw32" ]; then
|
||||
if [ ! -e /opt/mingw32/bin/i686-w64-mingw32-pkg-config ]; then
|
||||
ln -s /usr/bin/pkg-config /opt/mingw32/bin/i686-w64-mingw32-pkg-config
|
||||
fi
|
||||
fi
|
||||
|
||||
info "Cleaning up..."
|
||||
rm -rf "$HOME/fltk-$fltkver"
|
||||
rm -rf "$HOME/libogg-$oggver"
|
||||
rm -rf "$HOME/libvorbis-$vorbisver"
|
||||
rm -rf "$HOME/flac-$flacver"
|
||||
rm -rf "$HOME/libgig-$gigver"
|
||||
rm -rf "$HOME/stk-$stkver"
|
||||
info "Done."
|
||||
@@ -3,9 +3,10 @@ if(LMMS_MSVC_YEAR)
|
||||
SET(WIN_PLATFORM "msvc${LMMS_MSVC_YEAR}")
|
||||
endif()
|
||||
|
||||
# the final slash needs to be flipped for CPACK_PACKAGE_ICON to work:
|
||||
# https://cmake.org/pipermail/cmake/2008-June/022085.html
|
||||
SET(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/cmake/nsis\\\\nsis_branding.bmp")
|
||||
SET(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/cmake/nsis/nsis_branding.bmp")
|
||||
IF(MSVC)
|
||||
STRING(REPLACE "/" "\\\\" CPACK_PACKAGE_ICON ${CPACK_PACKAGE_ICON})
|
||||
ENDIF(MSVC)
|
||||
SET(CPACK_NSIS_MUI_ICON "${CMAKE_SOURCE_DIR}/cmake/nsis/icon.ico")
|
||||
SET(CPACK_NSIS_INSTALLED_ICON_NAME "${CMAKE_PROJECT_NAME}.exe" PARENT_SCOPE)
|
||||
SET(CPACK_NSIS_DISPLAY_NAME "${PROJECT_NAME_UCASE} ${VERSION}" PARENT_SCOPE)
|
||||
@@ -35,11 +36,7 @@ SET(CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS "
|
||||
" PARENT_SCOPE)
|
||||
|
||||
IF(WIN64)
|
||||
if(IS_ARM64)
|
||||
set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${VERSION}-${WIN_PLATFORM}-arm64")
|
||||
else()
|
||||
set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${VERSION}-${WIN_PLATFORM}-win64")
|
||||
endif()
|
||||
SET(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${VERSION}-${WIN_PLATFORM}-win64")
|
||||
SET(CPACK_INSTALL_FIX "$PROGRAMFILES64\\\\${CPACK_PACKAGE_INSTALL_DIRECTORY}\\\\")
|
||||
SET(CPACK_NSIS_DEFINES "
|
||||
${CPACK_NSIS_DEFINES}
|
||||
@@ -47,21 +44,31 @@ IF(WIN64)
|
||||
")
|
||||
ENDIF()
|
||||
|
||||
# Fix windows paths for msys
|
||||
IF(LMMS_BUILD_MSYS)
|
||||
STRING(REPLACE "/" "\\\\" CPACK_PACKAGE_ICON "${CPACK_PACKAGE_ICON}")
|
||||
STRING(REPLACE "/" "\\\\" CPACK_NSIS_MUI_ICON "${CPACK_NSIS_MUI_ICON}")
|
||||
STRING(REPLACE "/" "\\\\" CPACK_NSIS_DEFINES "${CPACK_NSIS_DEFINES}")
|
||||
STRING(REPLACE "/" "\\\\" CMAKE_BINARY_DIR_FIX "${CMAKE_BINARY_DIR}")
|
||||
|
||||
# FIXME: there's no easy way to fix $INST_DIR, so we'll redefine it manually
|
||||
IF(WIN64)
|
||||
SET(NSIS_ARCH "win64")
|
||||
ELSE()
|
||||
SET(NSIS_ARCH "win32")
|
||||
ENDIF()
|
||||
SET(CPACK_NSIS_DEFINES "
|
||||
${CPACK_NSIS_DEFINES}
|
||||
!define /redef INST_DIR ${CMAKE_BINARY_DIR_FIX}\\\\_CPack_Packages\\\\${NSIS_ARCH}\\\\NSIS\\\\${CPACK_PACKAGE_FILE_NAME}
|
||||
")
|
||||
ENDIF()
|
||||
|
||||
# Setup missing parent scopes
|
||||
SET(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_FILE_NAME}" PARENT_SCOPE)
|
||||
SET(CPACK_NSIS_DEFINES "${CPACK_NSIS_DEFINES}" PARENT_SCOPE)
|
||||
SET(CPACK_PACKAGE_ICON "${CPACK_PACKAGE_ICON}" PARENT_SCOPE)
|
||||
SET(CPACK_NSIS_MUI_ICON "${CPACK_NSIS_MUI_ICON}" PARENT_SCOPE)
|
||||
|
||||
# Disable cpack's strip for historic reasons
|
||||
set(CPACK_STRIP_FILES_ORIG "${CPACK_STRIP_FILES}" PARENT_SCOPE)
|
||||
set(CPACK_STRIP_FILES FALSE PARENT_SCOPE)
|
||||
|
||||
if(CPACK_DEBUG)
|
||||
# CMake 3.19+
|
||||
set(CPACK_NSIS_EXECUTABLE_PRE_ARGUMENTS "-V4")
|
||||
endif()
|
||||
|
||||
# Windows resource compilers
|
||||
CONFIGURE_FILE("lmms.rc.in" "${CMAKE_BINARY_DIR}/lmms.rc")
|
||||
CONFIGURE_FILE("zynaddsubfx.rc.in" "${CMAKE_BINARY_DIR}/plugins/ZynAddSubFx/zynaddsubfx.rc")
|
||||
|
||||
4
cmake/toolchains/MSYS-32.cmake
Normal file
@@ -0,0 +1,4 @@
|
||||
INCLUDE(${CMAKE_CURRENT_LIST_DIR}/common/MSYS.cmake)
|
||||
INCLUDE(${CMAKE_CURRENT_LIST_DIR}/common/Win32.cmake)
|
||||
|
||||
SET(MINGW_PREFIX /mingw32)
|
||||
5
cmake/toolchains/MSYS-64.cmake
Normal file
@@ -0,0 +1,5 @@
|
||||
INCLUDE(${CMAKE_CURRENT_LIST_DIR}/common/MSYS.cmake)
|
||||
INCLUDE(${CMAKE_CURRENT_LIST_DIR}/common/Win64.cmake)
|
||||
|
||||
SET(MINGW_PREFIX /mingw64)
|
||||
SET(MINGW_PREFIX32 /mingw32)
|
||||
@@ -1,6 +0,0 @@
|
||||
|
||||
set(WIN64 FALSE)
|
||||
|
||||
set(CMAKE_SYSTEM_PROCESSOR i686)
|
||||
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/common/MinGW-W64.cmake)
|
||||
@@ -1,9 +0,0 @@
|
||||
|
||||
set(WIN64 TRUE)
|
||||
|
||||
set(CMAKE_SYSTEM_PROCESSOR x86_64)
|
||||
set(CMAKE_SYSTEM_PROCESSOR32 i686)
|
||||
|
||||
set(CMAKE_TOOLCHAIN_FILE_32 "${CMAKE_CURRENT_LIST_DIR}/MinGW-W64-32.cmake")
|
||||
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/common/MinGW-W64.cmake)
|
||||
2
cmake/toolchains/Ubuntu-MinGW-W64-32.cmake
Normal file
@@ -0,0 +1,2 @@
|
||||
INCLUDE(${CMAKE_CURRENT_LIST_DIR}/common/Win32.cmake)
|
||||
INCLUDE(${CMAKE_CURRENT_LIST_DIR}/common/Ubuntu-MinGW-W64.cmake)
|
||||
4
cmake/toolchains/Ubuntu-MinGW-W64-64.cmake
Normal file
@@ -0,0 +1,4 @@
|
||||
SET(CMAKE_TOOLCHAIN_FILE_32 "${CMAKE_CURRENT_LIST_DIR}/Ubuntu-MinGW-W64-32.cmake")
|
||||
|
||||
INCLUDE(${CMAKE_CURRENT_LIST_DIR}/common/Win64.cmake)
|
||||
INCLUDE(${CMAKE_CURRENT_LIST_DIR}/common/Ubuntu-MinGW-W64.cmake)
|
||||
3
cmake/toolchains/Ubuntu-MinGW-X-Trusty-32.cmake
Normal file
@@ -0,0 +1,3 @@
|
||||
SET(MINGW_PREFIX /opt/mingw32)
|
||||
|
||||
INCLUDE(${CMAKE_CURRENT_LIST_DIR}/common/Ubuntu-MinGW-X-Trusty.cmake)
|
||||
9
cmake/toolchains/Ubuntu-MinGW-X-Trusty-64.cmake
Normal file
@@ -0,0 +1,9 @@
|
||||
SET(MINGW_PREFIX /opt/mingw64)
|
||||
SET(MINGW_PREFIX32 /opt/mingw32)
|
||||
|
||||
SET(WIN64 TRUE)
|
||||
|
||||
SET(CMAKE_TOOLCHAIN_FILE_32 "${CMAKE_CURRENT_LIST_DIR}/Ubuntu-MinGW-X-Trusty-32.cmake")
|
||||
SET(CMAKE_PREFIX_PATH_32 "${MINGW_PREFIX32}")
|
||||
|
||||
INCLUDE(${CMAKE_CURRENT_LIST_DIR}/common/Ubuntu-MinGW-X-Trusty.cmake)
|
||||
22
cmake/toolchains/common/MSYS.cmake
Normal file
@@ -0,0 +1,22 @@
|
||||
# The target environment
|
||||
SET(CMAKE_FIND_ROOT_PATH ${MINGW_PREFIX})
|
||||
SET(CMAKE_INSTALL_PREFIX ${MINGW_PREFIX})
|
||||
|
||||
# Windows msys mingw ships with a mostly-suitable preconfigured environment
|
||||
SET(STRIP ${MINGW_PREFIX}/bin/strip)
|
||||
SET(CMAKE_RC_COMPILER ${MINGW_PREFIX}/bin/windres)
|
||||
SET(CMAKE_C_COMPILER ${MINGW_PREFIX}/bin/gcc)
|
||||
SET(CMAKE_CXX_COMPILER ${MINGW_PREFIX}/bin/g++)
|
||||
|
||||
# For 32-bit vst support
|
||||
IF(WIN64)
|
||||
# Specify the 32-bit cross compiler
|
||||
SET(CMAKE_C_COMPILER32 ${MINGW_PREFIX32}/bin/gcc)
|
||||
SET(CMAKE_CXX_COMPILER32 ${MINGW_PREFIX32}/bin/g++)
|
||||
ENDIF()
|
||||
|
||||
# Msys compiler does not support @CMakeFiles/Include syntax
|
||||
SET(CMAKE_C_USE_RESPONSE_FILE_FOR_INCLUDES OFF)
|
||||
SET(CMAKE_CXX_USE_RESPONSE_FILE_FOR_INCLUDES OFF)
|
||||
|
||||
SET(LMMS_BUILD_MSYS 1)
|
||||
@@ -1,24 +0,0 @@
|
||||
# Toolchain for MinGW compiler
|
||||
|
||||
set(CMAKE_SYSTEM_NAME Windows)
|
||||
set(CMAKE_SYSTEM_VERSION 1)
|
||||
|
||||
set(TOOLCHAIN_PREFIX ${CMAKE_SYSTEM_PROCESSOR}-w64-mingw32)
|
||||
set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc)
|
||||
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++)
|
||||
set(CMAKE_RC_COMPILER ${TOOLCHAIN_PREFIX}-windres)
|
||||
|
||||
set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_PREFIX})
|
||||
set(ENV{PKG_CONFIG} /usr/bin/${TOOLCHAIN_PREFIX}-pkg-config)
|
||||
|
||||
if(WIN64)
|
||||
set(TOOLCHAIN_PREFIX32 ${CMAKE_SYSTEM_PROCESSOR32}-w64-mingw32)
|
||||
set(CMAKE_C_COMPILER32 ${TOOLCHAIN_PREFIX32}-gcc)
|
||||
set(CMAKE_CXX_COMPILER32 ${TOOLCHAIN_PREFIX32}-g++)
|
||||
endif()
|
||||
|
||||
# Search for programs in the build host directories
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||
# Search for libraries and headers in the target directories
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
||||
17
cmake/toolchains/common/Ubuntu-MinGW-W64.cmake
Normal file
@@ -0,0 +1,17 @@
|
||||
# Toolchain for Ubuntu MinGw compiler shipped with the mingw-w64 and
|
||||
# g++-mingw-w64 packages
|
||||
SET(TOOLCHAIN_PREFIX ${CMAKE_SYSTEM_PROCESSOR}-w64-mingw32)
|
||||
set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc)
|
||||
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++)
|
||||
set(CMAKE_RC_COMPILER ${TOOLCHAIN_PREFIX}-windres)
|
||||
|
||||
set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_PREFIX})
|
||||
SET(ENV{PKG_CONFIG} /usr/bin/${TOOLCHAIN_PREFIX}-pkg-config)
|
||||
|
||||
IF(WIN64)
|
||||
SET(TOOLCHAIN_PREFIX32 ${CMAKE_SYSTEM_PROCESSOR32}-w64-mingw32)
|
||||
SET(CMAKE_C_COMPILER32 ${TOOLCHAIN_PREFIX32}-gcc)
|
||||
SET(CMAKE_CXX_COMPILER32 ${TOOLCHAIN_PREFIX32}-g++)
|
||||
ENDIF()
|
||||
|
||||
INCLUDE(${CMAKE_CURRENT_LIST_DIR}/WinCrossCompile.cmake)
|
||||
58
cmake/toolchains/common/Ubuntu-MinGW-X-Trusty.cmake
Normal file
@@ -0,0 +1,58 @@
|
||||
IF(WIN64)
|
||||
INCLUDE(${CMAKE_CURRENT_LIST_DIR}/Win64.cmake)
|
||||
ELSE()
|
||||
INCLUDE(${CMAKE_CURRENT_LIST_DIR}/Win32.cmake)
|
||||
ENDIF()
|
||||
INCLUDE(${CMAKE_CURRENT_LIST_DIR}/WinCrossCompile.cmake)
|
||||
|
||||
# The target environment
|
||||
SET(CMAKE_FIND_ROOT_PATH ${MINGW_PREFIX})
|
||||
SET(CMAKE_INSTALL_PREFIX ${MINGW_PREFIX})
|
||||
|
||||
# Linux mingw requires explicitly defined tools to prevent clash with native system tools
|
||||
SET(MINGW_TOOL_PREFIX ${MINGW_PREFIX}/bin/${CMAKE_SYSTEM_PROCESSOR}-w64-mingw32-)
|
||||
|
||||
# Specify the cross compiler
|
||||
SET(CMAKE_C_COMPILER ${MINGW_TOOL_PREFIX}gcc)
|
||||
SET(CMAKE_CXX_COMPILER ${MINGW_TOOL_PREFIX}g++)
|
||||
SET(CMAKE_RC_COMPILER ${MINGW_TOOL_PREFIX}windres)
|
||||
|
||||
# Mingw tools
|
||||
SET(STRIP ${MINGW_TOOL_PREFIX}strip)
|
||||
SET(ENV{PKG_CONFIG} ${MINGW_TOOL_PREFIX}pkg-config)
|
||||
|
||||
# For 32-bit vst support
|
||||
IF(WIN64)
|
||||
# Specify the 32-bit cross compiler
|
||||
SET(MINGW_TOOL_PREFIX32 ${MINGW_PREFIX32}/bin/${CMAKE_SYSTEM_PROCESSOR32}-w64-mingw32-)
|
||||
SET(CMAKE_C_COMPILER32 ${MINGW_TOOL_PREFIX32}gcc)
|
||||
SET(CMAKE_CXX_COMPILER32 ${MINGW_TOOL_PREFIX32}g++)
|
||||
ENDIF()
|
||||
|
||||
INCLUDE_DIRECTORIES(${MINGW_PREFIX}/include)
|
||||
|
||||
LINK_DIRECTORIES(${MINGW_PREFIX}/lib ${MINGW_PREFIX}/bin)
|
||||
|
||||
# Qt tools
|
||||
SET(QT_BINARY_DIR ${MINGW_PREFIX}/bin)
|
||||
SET(QT_QMAKE_EXECUTABLE ${QT_BINARY_DIR}/qmake)
|
||||
|
||||
# Echo modified cmake vars to screen for debugging purposes
|
||||
IF(NOT DEFINED ENV{MINGW_DEBUG_INFO})
|
||||
MESSAGE("")
|
||||
MESSAGE("Custom cmake vars: (blank = system default)")
|
||||
MESSAGE("-----------------------------------------")
|
||||
MESSAGE("* CMAKE_C_COMPILER : ${CMAKE_C_COMPILER}")
|
||||
MESSAGE("* CMAKE_CXX_COMPILER : ${CMAKE_CXX_COMPILER}")
|
||||
MESSAGE("* CMAKE_RC_COMPILER : ${CMAKE_RC_COMPILER}")
|
||||
MESSAGE("* ENV{PKG_CONFIG} : $ENV{PKG_CONFIG}")
|
||||
MESSAGE("* MINGW_TOOL_PREFIX32 : ${MINGW_TOOL_PREFIX32}")
|
||||
MESSAGE("* CMAKE_C_COMPILER32 : ${CMAKE_C_COMPILER32}")
|
||||
MESSAGE("* CMAKE_CXX_COMPILER32 : ${CMAKE_CXX_COMPILER32}")
|
||||
MESSAGE("* STRIP : ${STRIP}")
|
||||
MESSAGE("* QT_BINARY_DIR : ${QT_BINARY_DIR}")
|
||||
MESSAGE("* QT_QMAKE_EXECUTABLE : ${QT_QMAKE_EXECUTABLE}")
|
||||
MESSAGE("")
|
||||
# So that the debug info only appears once
|
||||
SET(ENV{MINGW_DEBUG_INFO} SHOWN)
|
||||
ENDIF()
|
||||
6
cmake/toolchains/common/Win32.cmake
Normal file
@@ -0,0 +1,6 @@
|
||||
SET(CMAKE_SYSTEM_NAME Windows)
|
||||
SET(CMAKE_SYSTEM_VERSION 1)
|
||||
|
||||
SET(CMAKE_SYSTEM_PROCESSOR i686)
|
||||
|
||||
SET(WIN64 FALSE)
|
||||
7
cmake/toolchains/common/Win64.cmake
Normal file
@@ -0,0 +1,7 @@
|
||||
SET(CMAKE_SYSTEM_NAME Windows)
|
||||
SET(CMAKE_SYSTEM_VERSION 1)
|
||||
|
||||
SET(CMAKE_SYSTEM_PROCESSOR x86_64)
|
||||
SET(CMAKE_SYSTEM_PROCESSOR32 i686)
|
||||
|
||||
SET(WIN64 TRUE)
|
||||
9
cmake/toolchains/common/WinCrossCompile.cmake
Normal file
@@ -0,0 +1,9 @@
|
||||
# Required by cmake if `uname -s` is inadaquate
|
||||
SET(CMAKE_SYSTEM_NAME Windows)
|
||||
SET(CMAKE_SYSTEM_VERSION 1)
|
||||
|
||||
# Search for programs in the build host directories
|
||||
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||
# For libraries and headers in the target directories
|
||||
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
||||
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
||||
|
Before Width: | Height: | Size: 315 B After Width: | Height: | Size: 442 B |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 15 KiB |
@@ -1,5 +1,5 @@
|
||||
SET(QT_LUPDATE_EXECUTABLE "${Qt${QT_VERSION_MAJOR}_LUPDATE_EXECUTABLE}")
|
||||
SET(QT_LRELEASE_EXECUTABLE "${Qt${QT_VERSION_MAJOR}_LRELEASE_EXECUTABLE}")
|
||||
SET(QT_LUPDATE_EXECUTABLE "${Qt5_LUPDATE_EXECUTABLE}")
|
||||
SET(QT_LRELEASE_EXECUTABLE "${Qt5_LRELEASE_EXECUTABLE}")
|
||||
|
||||
IF(QT_LUPDATE_EXECUTABLE STREQUAL "")
|
||||
EXECUTE_PROCESS(COMMAND "lupdate" "-help" RESULT_VARIABLE LUPDATE_FALLBACK OUTPUT_QUIET)
|
||||
|
||||