/
CMakeLists.txt
427 lines (390 loc) · 16.2 KB
1
2
3
# NOTE: If you installed SDL2 at an unusual place and find_package()
# fails, define SDL2_DIR environment variable to point to your SDL2
# installation.
4
5
set(SDLSOUND_VERSION 2.0.3)
6
7
# Increment this if/when we break backwards compatibility.
8
set(SDLSOUND_SOVERSION 2)
9
10
11
12
13
14
15
16
cmake_minimum_required(VERSION 3.0)
project(SDL_sound
VERSION ${SDLSOUND_VERSION}
LANGUAGES C
)
17
18
19
include(CMakePackageConfigHelpers)
include(GNUInstallDirs)
20
21
include_directories(src)
22
if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID MATCHES "Clang")
23
add_compile_options(-Wall)
24
25
26
endif()
if(CMAKE_C_COMPILER_ID STREQUAL "SunPro")
27
28
add_compile_options(-erroff=E_EMPTY_TRANSLATION_UNIT)
add_compile_options(-xldscope=hidden)
29
30
31
endif()
find_package(SDL2 REQUIRED)
32
33
34
35
36
37
38
39
40
41
if(WIN32)
# -lmingw32: gcc adds it automatically.
# -mwindows: doesn't make sense.
# -lSDL2main: the dll doesn't need it, the test apps are console-only
# and specifically define SDL_MAIN_HANDLED. it will be ignored.
string(REGEX REPLACE "-mwindows" "" SDL2_LIBRARIES "${SDL2_LIBRARIES}")
string(REGEX REPLACE "-lmingw32" "" SDL2_LIBRARIES "${SDL2_LIBRARIES}")
# string(REGEX REPLACE "-lSDL2main" "" SDL2_LIBRARIES "${SDL2_LIBRARIES}")
string(STRIP "${SDL2_LIBRARIES}" SDL2_LIBRARIES)
endif()
42
43
44
45
46
47
48
49
if(UNIX AND NOT (WIN32 OR APPLE OR HAIKU OR EMSCRIPTEN))
find_library(LIBM_LIBRARY m)
if(LIBM_LIBRARY)
set(LIBM_LIBRARY m)
endif()
endif()
50
51
52
53
# Decoders ...
# These are (mostly) on by default now, so these options are only useful for
# disabling them.
54
55
macro(sdlsound_decoder_option _VAR _NAME _EXTS _DEFLT)
option(SDLSOUND_DECODER_${_VAR} "Enable ${_NAME} support (${_EXTS})" ${_DEFLT})
56
57
58
59
60
if(NOT SDLSOUND_DECODER_${_VAR})
add_definitions("-DSOUND_SUPPORTS_${_VAR}=0")
endif()
endmacro()
61
62
63
64
65
66
67
68
69
70
71
72
73
sdlsound_decoder_option(WAV "Wave" ".WAV" TRUE)
sdlsound_decoder_option(AIFF "Audio Interchange" ".AIFF" TRUE)
sdlsound_decoder_option(AU "Sun/NeXT audio" ".AU" TRUE)
sdlsound_decoder_option(VOC "Creative Labs voice" ".VOC" TRUE)
sdlsound_decoder_option(FLAC "Free Lossless Audio Codec" ".FLAC" TRUE)
sdlsound_decoder_option(VORBIS "Ogg Vorbis" ".OGG" TRUE)
sdlsound_decoder_option(RAW "raw PCM audio" ".RAW" TRUE)
sdlsound_decoder_option(SHN "Shorten" ".SHN" TRUE)
sdlsound_decoder_option(MODPLUG "ModPlug" "various tracker formats" TRUE)
sdlsound_decoder_option(MP3 "MPEG-1 Layers I-III" ".MP3, .MP2, .MP1" TRUE)
# timidity is not public domain code, so default to not building it.
sdlsound_decoder_option(MIDI "Midi" ".MID" FALSE)
74
75
if(SDLSOUND_DECODER_VORBIS AND LIBM_LIBRARY)
76
# stb_vorbis uses exp(), SDL_exp() is available as of SDL2-2.0.9
77
78
# Instead of testing SDL_exp() presence, we unconditionally link
# with -lm which is just harmless.
79
set(OPTIONAL_LIBRARY_LIBS ${OPTIONAL_LIBRARY_LIBS} ${LIBM_LIBRARY})
80
set(PC_LIBS ${PC_LIBS} -l${LIBM_LIBRARY})
81
82
endif()
83
if(APPLE)
84
sdlsound_decoder_option(COREAUDIO "CoreAudio" "various audio formats" TRUE)
85
86
if(SDLSOUND_DECODER_COREAUDIO)
set(OPTIONAL_LIBRARY_LIBS ${OPTIONAL_LIBRARY_LIBS} "-framework AudioToolbox")
87
set(PC_LIBS ${PC_LIBS} "-framework AudioToolbox")
88
89
90
endif()
endif()
91
92
93
94
95
96
97
98
99
100
101
102
if(SDLSOUND_DECODER_MIDI)
set(TIMIDITY_SRCS
src/timidity/common.c
src/timidity/instrum.c
src/timidity/mix.c
src/timidity/output.c
src/timidity/playmidi.c
src/timidity/readmidi.c
src/timidity/resample.c
src/timidity/tables.c
src/timidity/timidity.c
)
103
104
105
106
107
108
109
110
111
112
113
114
115
set(TIMIDITY_HDRS
src/timidity/common.h
src/timidity/instrum.h
src/timidity/mix.h
src/timidity/options.h
src/timidity/output.h
src/timidity/playmidi.h
src/timidity/readmidi.h
src/timidity/resample.h
src/timidity/tables.h
src/timidity/timidity.h
)
source_group("src/timidity" FILES ${TIMIDITY_SRCS} ${TIMIDITY_HDRS})
116
endif()
117
118
if(SDLSOUND_DECODER_MODPLUG)
set(LIBMODPLUG_SRCS
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
src/libmodplug/fastmix.c
src/libmodplug/load_669.c
src/libmodplug/load_amf.c
src/libmodplug/load_ams.c
src/libmodplug/load_dbm.c
src/libmodplug/load_dmf.c
src/libmodplug/load_dsm.c
src/libmodplug/load_far.c
src/libmodplug/load_it.c
src/libmodplug/load_mdl.c
src/libmodplug/load_med.c
src/libmodplug/load_mod.c
src/libmodplug/load_mt2.c
src/libmodplug/load_mtm.c
src/libmodplug/load_okt.c
134
src/libmodplug/load_gdm.c
135
136
137
138
139
140
141
src/libmodplug/load_psm.c
src/libmodplug/load_ptm.c
src/libmodplug/load_s3m.c
src/libmodplug/load_stm.c
src/libmodplug/load_ult.c
src/libmodplug/load_umx.c
src/libmodplug/load_xm.c
142
src/libmodplug/mmcmp.c
143
144
145
146
147
148
src/libmodplug/modplug.c
src/libmodplug/snd_dsp.c
src/libmodplug/snd_flt.c
src/libmodplug/snd_fx.c
src/libmodplug/sndfile.c
src/libmodplug/sndmix.c
149
)
150
151
152
153
154
155
set(LIBMODPLUG_HDRS
src/libmodplug/libmodplug.h
src/libmodplug/modplug.h
src/libmodplug/tables.h
)
source_group("src/libmodplug" FILES ${LIBMODPLUG_SRCS} ${LIBMODPLUG_HDRS})
156
endif()
157
158
159
160
161
if(WIN32)
set(SDLSOUND_SHARED_SRCS
src/version.rc
)
endif()
162
163
164
165
166
167
168
169
170
171
172
# Almost everything is "compiled" here, but things that don't apply to the
# build are #ifdef'd out. This is to make it easy to embed SDL_sound into
# another project or bring up a new build system: just compile all the source
# code and #define the things you want.
set(SDLSOUND_SRCS
src/SDL_sound.c
src/SDL_sound_aiff.c
src/SDL_sound_au.c
src/SDL_sound_coreaudio.c
src/SDL_sound_flac.c
173
src/SDL_sound_midi.c
174
src/SDL_sound_modplug.c
175
src/SDL_sound_mp3.c
176
177
178
src/SDL_sound_raw.c
src/SDL_sound_shn.c
src/SDL_sound_voc.c
179
src/SDL_sound_vorbis.c
180
src/SDL_sound_wav.c
181
182
183
184
185
186
187
188
189
190
191
192
193
)
set(SDLSOUND_HDRS
src/dr_flac.h
src/dr_mp3.h
src/SDL_sound.h
src/SDL_sound_internal.h
src/stb_vorbis.h
)
source_group("src" FILES ${SDLSOUND_SRCS} ${SDLSOUND_HDRS} ${SDLSOUND_SHARED_SRCS})
set(SDLSOUND_ALL_SRCS
${SDLSOUND_SRCS}
${SDLSOUND_HDRS}
194
${TIMIDITY_SRCS}
195
${TIMIDITY_HDRS}
196
${LIBMODPLUG_SRCS}
197
${LIBMODPLUG_HDRS}
198
199
200
)
option(SDLSOUND_BUILD_STATIC "Build static library" TRUE)
201
202
203
if(OS2) # no static library on os/2
set(SDLSOUND_BUILD_STATIC FALSE)
endif()
204
if(SDLSOUND_BUILD_STATIC)
205
add_library(SDL2_sound-static STATIC ${SDLSOUND_ALL_SRCS})
206
add_library(SDL2_sound::SDL2_sound-static ALIAS SDL2_sound-static)
207
208
209
210
211
212
213
# Don't rename this on Windows, since DLLs will also produce an import
# library named "SDL2_sound.lib" which would conflict; Unix tend to like
# the same library name with a different extension for static libs, but
# Windows can just have a separate name.
if(NOT MSVC)
set_target_properties(SDL2_sound-static PROPERTIES OUTPUT_NAME "SDL2_sound")
endif()
214
215
216
217
target_include_directories(SDL2_sound-static PUBLIC
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/SDL2>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>)
218
219
target_include_directories(SDL2_sound-static PUBLIC "$<BUILD_INTERFACE:${SDL2_INCLUDE_DIRS}>")
target_link_libraries(SDL2_sound-static PRIVATE "$<BUILD_INTERFACE:${SDL2_LIBRARIES}>" ${OPTIONAL_LIBRARY_LIBS} ${OTHER_LDFLAGS})
220
221
222
223
224
set(SDLSOUND_LIB_TARGET SDL2_sound-static)
endif()
option(SDLSOUND_BUILD_SHARED "Build shared library" TRUE)
if(SDLSOUND_BUILD_SHARED)
225
add_library(SDL2_sound SHARED ${SDLSOUND_ALL_SRCS} ${SDLSOUND_SHARED_SRCS})
226
add_library(SDL2_sound::SDL2_sound ALIAS SDL2_sound)
227
228
229
set_target_properties(SDL2_sound PROPERTIES MACOSX_RPATH 1)
set_target_properties(SDL2_sound PROPERTIES VERSION ${SDLSOUND_VERSION})
set_target_properties(SDL2_sound PROPERTIES SOVERSION ${SDLSOUND_SOVERSION})
230
231
232
# Use `Compatible Interface Properties` to ensure a shared SDL_sound is linked to a shared SDL library
set_property(TARGET SDL2_sound PROPERTY INTERFACE_SDL2_SHARED ON)
set_property(TARGET SDL2_sound APPEND PROPERTY COMPATIBLE_INTERFACE_BOOL SDL2_SHARED)
233
if(WIN32 OR OS2)
234
SET_TARGET_PROPERTIES(SDL2_sound PROPERTIES DEFINE_SYMBOL SDL_SOUND_DLL_EXPORTS)
235
236
# avoid DLL having "lib" prefix
SET(CMAKE_SHARED_LIBRARY_PREFIX "")
237
endif()
238
239
240
if(OS2) # OS/2 does not support a DLL name longer than 8 characters.
SET_TARGET_PROPERTIES(SDL2_sound PROPERTIES OUTPUT_NAME "SDL2snd")
endif()
241
242
243
244
target_include_directories(SDL2_sound PUBLIC
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/SDL2>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
245
)
246
247
target_include_directories(SDL2_sound PUBLIC "$<BUILD_INTERFACE:${SDL2_INCLUDE_DIRS}>")
target_link_libraries(SDL2_sound PRIVATE "$<BUILD_INTERFACE:${SDL2_LIBRARIES}>" ${OPTIONAL_LIBRARY_LIBS} ${OTHER_LDFLAGS})
248
249
250
set(SDLSOUND_LIB_TARGET SDL2_sound)
endif()
251
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/SDL2_sound.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/SDL2_sound.pc" @ONLY)
252
253
254
255
256
257
258
259
if(NOT SDLSOUND_BUILD_SHARED AND NOT SDLSOUND_BUILD_STATIC)
message(FATAL "Both shared and static libraries are disabled!")
endif()
option(SDLSOUND_BUILD_TEST "Build stdio test program." TRUE)
mark_as_advanced(SDLSOUND_BUILD_TEST)
if(SDLSOUND_BUILD_TEST)
260
add_executable(playsound examples/playsound.c)
261
262
263
264
265
266
267
if(TARGET SDL2::SDL2)
target_link_libraries(playsound PRIVATE SDL2::SDL2)
else()
target_include_directories(playsound PRIVATE ${SDL2_INCLUDE_DIRS})
target_link_libraries(playsound PRIVATE ${SDL2_LIBRARIES})
endif()
target_link_libraries(playsound PRIVATE ${SDLSOUND_LIB_TARGET} ${OTHER_LDFLAGS})
268
269
270
271
272
# assuming assert.h, signal.h and setbuf() being available universally
target_compile_definitions(playsound PRIVATE "HAVE_SETBUF")
target_compile_definitions(playsound PRIVATE "HAVE_ASSERT_H")
target_compile_definitions(playsound PRIVATE "HAVE_SIGNAL_H")
273
list(APPEND SDLSOUND_INSTALL_TARGETS playsound)
274
add_executable(playsound_simple examples/playsound_simple.c)
275
276
277
278
279
280
281
if(TARGET SDL2::SDL2)
target_link_libraries(playsound_simple PRIVATE SDL2::SDL2)
else()
target_include_directories(playsound_simple PRIVATE ${SDL2_INCLUDE_DIRS})
target_link_libraries(playsound_simple PRIVATE ${SDL2_LIBRARIES})
endif()
target_link_libraries(playsound_simple PRIVATE ${SDLSOUND_LIB_TARGET} ${OTHER_LDFLAGS})
282
#list(APPEND SDLSOUND_INSTALL_TARGETS playsound_simple)
283
284
285
286
287
288
289
290
291
292
IF (WIN32 AND MSVC)
SET_TARGET_PROPERTIES(playsound PROPERTIES LINK_FLAGS "/SUBSYSTEM:CONSOLE")
SET_TARGET_PROPERTIES(playsound_simple PROPERTIES LINK_FLAGS "/SUBSYSTEM:CONSOLE")
SET_TARGET_PROPERTIES(playsound PROPERTIES COMPILE_DEFINITIONS _CONSOLE)
SET_TARGET_PROPERTIES(playsound_simple PROPERTIES COMPILE_DEFINITIONS _CONSOLE)
ENDIF ()
IF (CMAKE_COMPILER_IS_MINGW)
SET_TARGET_PROPERTIES(playsound PROPERTIES LINK_FLAGS "-mconsole")
SET_TARGET_PROPERTIES(playsound_simple PROPERTIES LINK_FLAGS "-mconsole")
ENDIF ()
293
294
295
296
if(NOT SDLSOUND_BUILD_SHARED)
target_link_libraries(playsound ${SDL2_LIBRARIES} ${OPTIONAL_LIBRARY_LIBS} ${OTHER_LDFLAGS})
target_link_libraries(playsound_simple ${SDL2_LIBRARIES} ${OPTIONAL_LIBRARY_LIBS} ${OTHER_LDFLAGS})
endif()
297
298
endif()
299
set(PKGCONFIG_INSTALLDIR "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
300
301
if(WIN32 AND NOT MINGW)
302
set(SDLSOUND_INSTALL_CMAKEDIR_DEFAULT "cmake")
303
else()
304
set(SDLSOUND_INSTALL_CMAKEDIR_DEFAULT "${CMAKE_INSTALL_LIBDIR}/cmake/SDL2_sound")
305
endif()
306
set(SDLSOUND_INSTALL_CMAKEDIR "${SDLSOUND_INSTALL_CMAKEDIR_DEFAULT}" CACHE STRING "Location where to install SDL2_sound.cmake")
307
308
309
310
311
312
313
314
315
316
317
configure_package_config_file(cmake/SDL2_soundConfig.cmake.in SDL2_soundConfig.cmake
INSTALL_DESTINATION "${SDLSOUND_INSTALL_CMAKEDIR}"
)
write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/SDL2_soundConfigVersion.cmake"
VERSION "${SDLSOUND_VERSION}"
COMPATIBILITY AnyNewerVersion
)
if(SDLSOUND_BUILD_SHARED)
install(TARGETS SDL2_sound
EXPORT SDLSoundSharedExports
318
319
320
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
)
install(EXPORT SDLSoundSharedExports
FILE "${SDLSOUND_LIB_TARGET}-shared-targets.cmake"
NAMESPACE SDL2_sound::
DESTINATION "${SDLSOUND_INSTALL_CMAKEDIR}"
)
endif()
if(SDLSOUND_BUILD_STATIC)
install(TARGETS SDL2_sound-static
EXPORT SDLSoundStaticExports
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
install(EXPORT SDLSoundStaticExports
FILE "${SDLSOUND_LIB_TARGET}-static-targets.cmake"
NAMESPACE SDL2_sound::
DESTINATION "${SDLSOUND_INSTALL_CMAKEDIR}"
)
340
endif()
341
342
343
344
345
346
347
348
349
350
351
352
353
354
install(TARGETS ${SDLSOUND_INSTALL_TARGETS}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/SDL2_soundConfig.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/SDL2_soundConfigVersion.cmake"
DESTINATION "${SDLSOUND_INSTALL_CMAKEDIR}"
)
install(FILES src/SDL_sound.h
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/SDL2)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/SDL2_sound.pc
DESTINATION "${PKGCONFIG_INSTALLDIR}")
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
option(SDLSOUND_BUILD_DOCS "Build documentation" TRUE)
mark_as_advanced(SDLSOUND_BUILD_DOCS)
if(SDLSOUND_BUILD_DOCS)
find_package(Doxygen)
if(DOXYGEN_FOUND)
set(SDLSOUND_OUTPUT_DOXYFILE "${CMAKE_CURRENT_BINARY_DIR}/Doxyfile")
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/docs/Doxyfile"
"${SDLSOUND_OUTPUT_DOXYFILE}"
COPYONLY
)
file(APPEND "${SDLSOUND_OUTPUT_DOXYFILE}" "\n\n# Below auto-generated by cmake...\n\n")
file(APPEND "${SDLSOUND_OUTPUT_DOXYFILE}" "PROJECT_NUMBER = \"${SDLSOUND_VERSION}\"\n")
file(APPEND "${SDLSOUND_OUTPUT_DOXYFILE}" "OUTPUT_DIRECTORY = \"${CMAKE_CURRENT_BINARY_DIR}/docs\"\n")
file(APPEND "${SDLSOUND_OUTPUT_DOXYFILE}" "\n# End auto-generated section.\n\n")
add_custom_target(
SDL2_sound-docs
${DOXYGEN_EXECUTABLE} "${SDLSOUND_OUTPUT_DOXYFILE}"
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
COMMENT "Building documentation..."
)
else()
message(STATUS "Doxygen not found. You won't be able to build documentation.")
endif()
382
383
endif()
384
385
386
387
388
389
390
391
392
393
394
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
IMMEDIATE @ONLY)
add_custom_target(
SDL2_sound-uninstall
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
COMMENT "Uninstall the project..."
)
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
macro(message_bool_option _NAME _VALUE)
if(${_VALUE})
message(STATUS " ${_NAME}: enabled")
else()
message(STATUS " ${_NAME}: disabled")
endif()
endmacro()
message(STATUS "SDL_sound will build with the following options:")
message_bool_option("WAV support" SDLSOUND_DECODER_WAV)
message_bool_option("AIFF support" SDLSOUND_DECODER_AIFF)
message_bool_option("AU support" SDLSOUND_DECODER_AU)
message_bool_option("VOC support" SDLSOUND_DECODER_VOC)
message_bool_option("FLAC support" SDLSOUND_DECODER_FLAC)
410
message_bool_option("VORBIS support" SDLSOUND_DECODER_VORBIS)
411
412
413
message_bool_option("RAW support" SDLSOUND_DECODER_RAW)
message_bool_option("SHN support" SDLSOUND_DECODER_SHN)
message_bool_option("MODPLUG support" SDLSOUND_DECODER_MODPLUG)
414
message_bool_option("MP3 support" SDLSOUND_DECODER_MP3)
415
message_bool_option("TiMidity support" SDLSOUND_DECODER_MIDI)
416
417
418
419
message_bool_option("COREAUDIO support" SDLSOUND_DECODER_COREAUDIO)
message_bool_option("Build static library" SDLSOUND_BUILD_STATIC)
message_bool_option("Build shared library" SDLSOUND_BUILD_SHARED)
message_bool_option("Build stdio test program" SDLSOUND_BUILD_TEST)
420
message_bool_option("Build documentation" SDLSOUND_BUILD_DOCS)
421
422
423
424
425
426
# Make sure SDL2_sound::SDL2_sound always exists
if(TARGET SDL2_sound::SDL2_sound-static AND NOT TARGET SDL2_sound::SDL2_sound)
add_library(SDL2_sound::SDL2_sound ALIAS SDL2_sound-static)
endif()
427
# end of CMakeLists.txt