Skip to content

Commit ee4edd1

Browse files
committed
examples: only enable module examples when modules
1 parent c82de19 commit ee4edd1

15 files changed

Lines changed: 188 additions & 87 deletions

File tree

.github/workflows/build_cmake.yml

Lines changed: 81 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ concurrency:
2020

2121
jobs:
2222
build:
23-
name: ${{ matrix.config.name }}-${{ matrix.library_mode }}-${{ matrix.boost }}Boost
23+
name: ${{ matrix.config.name }} ${{ matrix.library_mode }} ${{ matrix.boost && 'Boost' }}
2424
runs-on: ${{ matrix.config.os }}
2525
strategy:
2626
fail-fast: false
@@ -32,7 +32,7 @@ jobs:
3232
name: "MSVC x86_64",
3333
os: windows-latest,
3434
generator: "",
35-
cmakeflags: "-DLIBREMIDI_NO_WINUWP=0 -DBOOST_ROOT=$PWD/boost_1_90_0",
35+
cmakeflags: "-DBOOST_ROOT=$PWD/boost_1_90_0",
3636
test_target: "RUN_TESTS",
3737
tests: 1,
3838
examples: 1
@@ -41,13 +41,13 @@ jobs:
4141
name: "MSVC arm64",
4242
os: windows-11-arm,
4343
generator: "",
44-
cmakeflags: "-DLIBREMIDI_NO_WINUWP=0 -DBOOST_ROOT=$PWD/boost_1_90_0",
44+
cmakeflags: "-DBOOST_ROOT=$PWD/boost_1_90_0",
4545
test_target: "RUN_TESTS",
4646
tests: 1,
4747
examples: 1
4848
}
4949
- {
50-
name: "Ubuntu gcc",
50+
name: "Ubuntu gcc-13",
5151
os: ubuntu-latest,
5252
generator: "",
5353
cmakeflags: "-DCMAKE_CXX_FLAGS='-Werror=return-type -fsanitize=address -fsanitize=undefined -D_GLIBCXX_DEBUG=1 -D_GLIBCXX_DEBUG_PEDANTIC=1 -D_GLIBCXX_ASSERTIONS=1 -D_GLIBCXX_SANITIZE_VECTOR=1'",
@@ -56,10 +56,19 @@ jobs:
5656
examples: 1
5757
}
5858
- {
59-
name: "Ubuntu clang-19 libstdc++",
59+
name: "Ubuntu gcc-14",
6060
os: ubuntu-latest,
6161
generator: "",
62-
cmakeflags: "-DCMAKE_CXX_COMPILER=clang++-19 -DCMAKE_CXX_FLAGS='-Werror=return-type -fsanitize=address -fsanitize=undefined'",
62+
cmakeflags: "-DCMAKE_CXX_COMPILER=g++-14 -DCMAKE_CXX_FLAGS='-Werror=return-type -fsanitize=address -fsanitize=undefined -D_GLIBCXX_DEBUG=1 -D_GLIBCXX_DEBUG_PEDANTIC=1 -D_GLIBCXX_ASSERTIONS=1 -D_GLIBCXX_SANITIZE_VECTOR=1' -DBOOST_ROOT=$PWD/boost_1_90_0",
63+
test_target: "test",
64+
tests: 1,
65+
examples: 1
66+
}
67+
- {
68+
name: "Ubuntu clang-20 libstdc++",
69+
os: ubuntu-latest,
70+
generator: "",
71+
cmakeflags: "-DCMAKE_CXX_COMPILER=clang++-20 -DCMAKE_CXX_FLAGS='-Werror=return-type -fsanitize=address -fsanitize=undefined' -DBOOST_ROOT=$PWD/boost_1_90_0",
6372
test_target: "test",
6473
tests: 1,
6574
examples: 1
@@ -68,7 +77,7 @@ jobs:
6877
name: "Ubuntu clang libc++",
6978
os: ubuntu-latest,
7079
generator: "",
71-
cmakeflags: "-DCMAKE_CXX_COMPILER=clang++ -DCMAKE_CXX_FLAGS='-stdlib=libc++ -Werror=return-type'",
80+
cmakeflags: "-DCMAKE_CXX_COMPILER=clang++ -DCMAKE_CXX_FLAGS='-stdlib=libc++ -Werror=return-type' -DBOOST_ROOT=$PWD/boost_1_90_0",
7281
test_target: "test",
7382
tests: 1,
7483
examples: 1
@@ -105,6 +114,31 @@ jobs:
105114
- config: { name: "iOS" }
106115
boost: 1
107116

117+
# Modules not yet working on VS2022
118+
- config: { name: "MSVC x86_64" }
119+
library_mode: MODULE
120+
- config: { name: "MSVC arm64" }
121+
library_mode: MODULE
122+
123+
# Modules not supported at all on gcc 13
124+
- config: { name: "Ubuntu gcc-13" }
125+
library_mode: MODULE
126+
127+
# ICE
128+
- config: { name: "Ubuntu gcc-14" }
129+
library_mode: MODULE
130+
131+
# Modules not yet supported by ubuntu 24.04 default clang version
132+
- config: { name: "Ubuntu clang libc++" }
133+
library_mode: MODULE
134+
135+
# Modules not supported at all by AppleClang as of Xcode 26
136+
- config: { name: "macOS" }
137+
library_mode: MODULE
138+
139+
- config: { name: "iOS" }
140+
library_mode: MODULE
141+
108142
steps:
109143
- uses: actions/checkout@v4
110144

@@ -119,26 +153,32 @@ jobs:
119153

120154
- name: Install dependencies
121155
if: matrix.config.name != 'Tarball'
156+
shell: bash
122157
run: |
123158
if [ "$RUNNER_OS" == "Linux" ]; then
124159
sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"
125160
sudo apt update
126-
sudo apt install cmake libboost-dev libasound-dev libjack-jackd2-dev clang libc++-dev
127-
else
128-
curl -L https://github.com/ossia/sdk/releases/download/sdk31/boost_1_90_0.tar.gz > boost.tar.gz
129-
tar -xzf boost.tar.gz
130-
rm boost.tar.gz
161+
sudo apt install cmake ninja-build curl libboost-dev libasound-dev libjack-jackd2-dev clang libc++-dev gcc gcc-14
162+
elif [ "$RUNNER_OS" == "macOS" ]; then
163+
brew install ninja
131164
fi
132-
shell: bash
165+
166+
curl -L https://github.com/ossia/sdk/releases/download/sdk31/boost_1_90_0.tar.gz > boost.tar.gz
167+
tar -xzf boost.tar.gz
168+
rm boost.tar.gz
133169
134170
- name: Configure
135171
if: matrix.config.name != 'Tarball'
136172
shell: bash
137173
run: |
138174
CMAKE_GENERATOR=${{ matrix.config.generator }}
139-
if [[ "$RUNNER_OS" == "Linux" ]]; then
175+
if [[ -z "$CMAKE_GENERATOR" ]]; then
140176
if [[ "${{ matrix.library_mode }}" == "MODULE" ]]; then
141-
CMAKE_GENERATOR=-GNinja
177+
if [[ "$RUNNER_OS" == "Linux" ]]; then
178+
CMAKE_GENERATOR=-GNinja
179+
elif [[ "$RUNNER_OS" == "macOS" ]]; then
180+
CMAKE_GENERATOR=-GNinja
181+
fi
142182
fi
143183
fi
144184
@@ -160,7 +200,7 @@ jobs:
160200
cmake --build build --config Debug --target install
161201
162202
- name: Test
163-
if: matrix.config.name != 'Tarball' && matrix.config.name != 'iOS'
203+
if: matrix.config.name != 'Tarball' && matrix.config.name != 'iOS' && matrix.library_mode != 'MODULE'
164204
run: |
165205
# Not available on GH actions...
166206
# if [ "$RUNNER_OS" == "Linux" ]; then
@@ -185,8 +225,9 @@ jobs:
185225
- uses: vmactions/freebsd-vm@v1
186226
with:
187227
usesh: true
228+
188229
prepare: |
189-
pkg install -y jackit boost-libs cmake git
230+
pkg install -y jackit boost-libs cmake git ninja
190231
191232
run: |
192233
pwd
@@ -195,7 +236,7 @@ jobs:
195236
env
196237
freebsd-version
197238
CMAKE_GENERATOR=
198-
if [[ "${{ matrix.library_mode }}" == "MODULE" ]]; then
239+
if [ "${{ matrix.library_mode }}" = "MODULE" ]; then
199240
CMAKE_GENERATOR=-GNinja
200241
fi
201242
@@ -210,11 +251,13 @@ jobs:
210251
-DCMAKE_INSTALL_PREFIX=install
211252
212253
cmake --build build
213-
cmake --build build --target install
214-
cmake --build build --target test
254+
if [ "${{ matrix.library_mode }}" != "MODULE" ]; then
255+
cmake --build build --target install
256+
cmake --build build --target test
257+
fi
215258
216259
build_debian:
217-
name: Debian ${{ matrix.distro }}
260+
name: Debian ${{ matrix.distro }} ${{ matrix.library_mode }} ${{ matrix.cxx }} ${{ matrix.boost && 'Boost' }}
218261
runs-on: ubuntu-latest
219262
container:
220263
image: debian:${{ matrix.distro }}
@@ -224,17 +267,18 @@ jobs:
224267
boost: [0, 1]
225268
library_mode: [LIBRARY, HEADER_ONLY, MODULE]
226269
distro: [bookworm, trixie, testing]
270+
cxx: [c++, clang++]
227271

228272
exclude:
229273
- distro: bookworm
230274
library_mode: MODULE
275+
- distro: trixie
276+
library_mode: MODULE
277+
- distro: testing
278+
library_mode: MODULE
279+
cxx: c++
231280

232281
steps:
233-
- name: Add backports repo if necessary
234-
if: matrix.distro == 'bullseye'
235-
run: |
236-
echo "deb http://ftp.debian.org/debian/ ${{ matrix.distro }}-backports main non-free contrib" > /etc/apt/sources.list.d/${{ matrix.distro }}-backports.list
237-
238282
- name: Install git
239283
run: |
240284
apt-get update -qq
@@ -255,30 +299,38 @@ jobs:
255299
libjack-jackd2-dev \
256300
libudev-dev \
257301
libpipewire-0.3-dev \
258-
cmake
302+
cmake ninja-build curl
303+
304+
curl -L https://github.com/ossia/sdk/releases/download/sdk31/boost_1_90_0.tar.gz > boost.tar.gz
305+
tar -xzf boost.tar.gz
306+
rm boost.tar.gz
259307

260308
- name: Configure
309+
shell: bash
261310
run: |
262-
CMAKE_GENERATOR=${{ matrix.config.generator }}
311+
CMAKE_GENERATOR=
263312
if [[ "${{ matrix.library_mode }}" == "MODULE" ]]; then
264313
CMAKE_GENERATOR=-GNinja
265314
fi
266315
cmake -S . -B build \
267316
$CMAKE_GENERATOR \
317+
-DCMAKE_CXX_COMPILER=${{ matrix.cxx }} \
268318
-DLIBREMIDI_FIND_BOOST=${{ matrix.boost }} \
269319
-DLIBREMIDI_LIBRARY_MODE=${{ matrix.library_mode }} \
270320
-DLIBREMIDI_EXAMPLES=1 \
271321
-DLIBREMIDI_TESTS=1 \
272322
-DLIBREMIDI_CI=1 \
273323
-DCMAKE_CTEST_ARGUMENTS="--rerun-failed;--output-on-failure" \
274-
-DCMAKE_INSTALL_PREFIX=install
324+
-DCMAKE_INSTALL_PREFIX=install \
325+
-DBOOST_ROOT=$PWD/boost_1_90_0
275326
276327
- name: Build
277328
run: |
278329
cmake --build build --config Debug
279330
cmake --build build --config Debug --target install
280331
281332
- name: Test
333+
if: matrix.library_mode != 'MODULE'
282334
run: |
283335
cmake --build build --config Debug --target test
284336

CMakeLists.txt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ project(libremidi
66
HOMEPAGE_URL "https://github.com/jcelerier/libremidi"
77
)
88

9+
# Still support BOOST_ROOT
10+
if(POLICY CMP0167)
11+
cmake_policy(SET CMP0167 OLD)
12+
endif()
13+
914
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
1015

1116
include(CMakeDependentOption)
@@ -24,9 +29,11 @@ if("${LIBREMIDI_LIBRARY_MODE}" MATCHES "HEADER_ONLY")
2429
set(LIBREMIDI_HEADER_ONLY ON)
2530
set(LIBREMIDI_MODULE_BUILD OFF)
2631
elseif("${LIBREMIDI_LIBRARY_MODE}" MATCHES "MODULE")
32+
set(CMAKE_CXX_SCAN_FOR_MODULES ON)
2733
set(LIBREMIDI_HEADER_ONLY OFF)
2834
set(LIBREMIDI_MODULE_BUILD ON)
29-
else()
35+
set(LIBREMIDI_TESTS OFF)
36+
elseif("${LIBREMIDI_LIBRARY_MODE}" MATCHES "LIBRARY")
3037
set(LIBREMIDI_HEADER_ONLY OFF)
3138
set(LIBREMIDI_MODULE_BUILD OFF)
3239
endif()

cmake/libremidi.examples.cmake

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
if(NOT LIBREMIDI_MODULE_BUILD)
12
macro(setup_example _example)
23
target_link_libraries("${_example}" PRIVATE libremidi)
34
endmacro()
@@ -110,14 +111,16 @@ if(Boost_cobalt_FOUND)
110111
target_link_libraries(coroutines PRIVATE Boost::cobalt)
111112
endif()
112113

113-
if(NOT LIBREMIDI_MODULE_BUILD)
114-
add_executable(libremidi_c_api examples/c_api.c)
115-
target_link_libraries(libremidi_c_api PRIVATE libremidi)
116-
if(LIBREMIDI_HEADER_ONLY)
117-
target_sources(libremidi_c_api PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/include/libremidi/libremidi-c.cpp")
118-
endif()
114+
add_executable(libremidi_c_api examples/c_api.c)
115+
target_link_libraries(libremidi_c_api PRIVATE libremidi)
116+
if(LIBREMIDI_HEADER_ONLY)
117+
target_sources(libremidi_c_api PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/include/libremidi/libremidi-c.cpp")
118+
endif()
119119
endif()
120120

121-
122-
add_executable(libremidi_modules examples/modules.cpp)
123-
target_link_libraries(libremidi_modules PRIVATE libremidi)
121+
if(LIBREMIDI_MODULE_BUILD)
122+
add_executable(libremidi_modules
123+
examples/modules.cpp
124+
)
125+
target_link_libraries(libremidi_modules PRIVATE libremidi)
126+
endif()

cmake/libremidi.library.cmake

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
### Create the library ###
22
if(LIBREMIDI_MODULE_BUILD)
3-
add_library(libremidi STATIC)
3+
add_library(libremidi)
44
set(_public PUBLIC)
55
set(_private PRIVATE)
66
target_sources(libremidi
@@ -9,6 +9,10 @@ if(LIBREMIDI_MODULE_BUILD)
99
FILES
1010
"src/libremidi.ixx"
1111
)
12+
target_compile_options(libremidi PRIVATE
13+
$<$<CXX_COMPILER_ID:Clang>:-Wno-include-angled-in-module-purview>
14+
$<$<CXX_COMPILER_ID:AppleClang>:-Wno-include-angled-in-module-purview>
15+
)
1216
elseif(LIBREMIDI_HEADER_ONLY)
1317
add_library(libremidi INTERFACE)
1418
set(_public INTERFACE)

cmake/libremidi.sources.cmake

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,9 @@ target_sources(libremidi PRIVATE
4444

4545
include/libremidi/backends/emscripten/config.hpp
4646
include/libremidi/backends/emscripten/helpers.hpp
47-
include/libremidi/backends/emscripten/midi_access.cpp
4847
include/libremidi/backends/emscripten/midi_access.hpp
49-
include/libremidi/backends/emscripten/midi_in.cpp
5048
include/libremidi/backends/emscripten/midi_in.hpp
51-
include/libremidi/backends/emscripten/midi_out.cpp
5249
include/libremidi/backends/emscripten/midi_out.hpp
53-
include/libremidi/backends/emscripten/observer.cpp
5450
include/libremidi/backends/emscripten/observer.hpp
5551
include/libremidi/backends/emscripten.hpp
5652

@@ -150,14 +146,24 @@ target_sources(libremidi PRIVATE
150146
include/libremidi/reader.hpp
151147
include/libremidi/writer.hpp
152148

149+
include/libremidi/api-c.h
150+
include/libremidi/libremidi-c.h
151+
)
152+
153+
if(NOT LIBREMIDI_HEADER_ONLY AND NOT LIBREMIDI_MODULE_BUILD)
154+
target_sources(libremidi PRIVATE
153155
include/libremidi/libremidi.cpp
154156
include/libremidi/midi_in.cpp
155157
include/libremidi/midi_out.cpp
156158
include/libremidi/observer.cpp
157159
include/libremidi/reader.cpp
158160
include/libremidi/writer.cpp
159161

160-
include/libremidi/api-c.h
161-
include/libremidi/libremidi-c.h
162+
include/libremidi/backends/emscripten/midi_access.cpp
163+
include/libremidi/backends/emscripten/midi_in.cpp
164+
include/libremidi/backends/emscripten/midi_out.cpp
165+
include/libremidi/backends/emscripten/observer.cpp
166+
162167
include/libremidi/libremidi-c.cpp
163-
)
168+
)
169+
endif()

examples/modules.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,20 @@
11
import libremidi;
22

3-
#define LIBREMIDI_USE_MODULES 1
4-
#include "utils.hpp"
5-
63
#include <cstdlib>
74
#include <iostream>
85

6+
inline std::ostream& operator<<(std::ostream& s, const libremidi::message& message)
7+
{
8+
auto nBytes = message.size();
9+
s << "[ ";
10+
for (auto i = 0U; i < nBytes; i++)
11+
s << std::hex << (int)message[i] << std::dec << " ";
12+
s << "]";
13+
if (nBytes > 0)
14+
s << " ; stamp = " << message.timestamp;
15+
return s;
16+
}
17+
918
int main()
1019
{
1120
libremidi::observer observer;

0 commit comments

Comments
 (0)