1 cmake_minimum_required(VERSION 3.0)
4 IF(COMMAND CMAKE_POLICY)
5 CMAKE_POLICY(SET CMP0003 NEW)
6 CMAKE_POLICY(SET CMP0005 NEW)
8 CMAKE_POLICY(SET CMP0042 NEW)
10 ENDIF(COMMAND CMAKE_POLICY)
12 set(CMAKE_MODULE_PATH "${alure_SOURCE_DIR}/cmake")
14 include(CheckCXXCompilerFlag)
15 include(CheckCXXSourceCompiles)
16 include(GNUInstallDirs)
18 find_package(OpenAL REQUIRED)
23 option(ALURE_DISABLE_RTTI "Disable run-time type information" OFF)
25 if(ALURE_DISABLE_RTTI)
26 check_cxx_compiler_flag(/GR- HAVE_GRX_SWITCH)
28 set(CXX_FLAGS ${CXX_FLAGS} /GR-)
32 check_cxx_compiler_flag(-std=c++11 HAVE_STD_CXX11)
34 set(CXX_FLAGS -std=c++11 ${CXX_FLAGS})
37 check_cxx_compiler_flag(-Wall HAVE_WALL_SWITCH)
39 set(CXX_FLAGS ${CXX_FLAGS} -Wall)
41 check_cxx_compiler_flag(-Wextra HAVE_WEXTRA_SWITCH)
42 if(HAVE_WEXTRA_SWITCH)
43 set(CXX_FLAGS ${CXX_FLAGS} -Wextra)
46 if(ALURE_DISABLE_RTTI)
47 check_cxx_compiler_flag(-fno-rtti HAVE_NO_RTTI_SWITCH)
48 if(HAVE_NO_RTTI_SWITCH)
49 set(CXX_FLAGS ${CXX_FLAGS} -fno-rtti)
55 set(VISIBILITY_FLAGS )
57 set(EXPORT_DECL "__declspec(dllexport)")
59 set(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
60 # Yes GCC, really don't accept visibility modes you don't support
61 set(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -Wattributes -Werror")
63 check_cxx_source_compiles("int foo() __attribute__((visibility(\"default\")));
64 int main() {return 0;}" HAVE_GCC_DEFAULT_VISIBILITY)
65 if(HAVE_GCC_DEFAULT_VISIBILITY)
66 set(EXPORT_DECL "__attribute__((visibility(\"default\")))")
69 if(HAVE_GCC_DEFAULT_VISIBILITY)
70 check_cxx_compiler_flag(-fvisibility=hidden HAVE_VISIBILITY_HIDDEN_SWITCH)
71 if(HAVE_VISIBILITY_HIDDEN_SWITCH)
72 set(VISIBILITY_FLAGS ${VISIBILITY_FLAGS} -fvisibility=hidden)
76 set(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}")
82 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH:NO")
83 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /SAFESEH:NO")
84 set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /SAFESEH:NO")
86 option(ALURE_STATIC_GCCRT "Static-link libgcc and libstdc++ runtimes" OFF)
87 if(ALURE_STATIC_GCCRT)
88 set(OLD_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
89 set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} -static-libgcc -static-libstdc++)
90 check_cxx_source_compiles(
94 std::vector<int> test;
97 HAVE_STATIC_GCCRT_SWITCHES
99 if(HAVE_STATIC_GCCRT_SWITCHES)
100 set(LINKER_OPTS ${LINKER_OPTS} -static-libgcc -static-libstdc++)
102 set(CMAKE_REQUIRED_LIBRARIES ${OLD_REQUIRED_LIBRARIES})
103 unset(OLD_REQUIRED_LIBRARIES)
108 set(alure_srcs src/devicemanager.cpp
114 src/auxeffectslot.cpp
117 set(alure_libs ${OPENAL_LIBRARY})
121 unset(HAVE_VORBISFILE)
124 unset(HAVE_LIBSNDFILE)
128 option(ALURE_BUILD_SHARED "Build shared library" ON)
129 option(ALURE_BUILD_STATIC "Build static library" ON)
131 if(NOT ALURE_BUILD_SHARED AND NOT ALURE_BUILD_STATIC)
132 message(FATAL_ERROR "Neither shared or static libraries are enabled!")
135 option(ALURE_ENABLE_WAVE "Enables the built-in wave file decoder" ON)
136 option(ALURE_ENABLE_VORBIS "Enables the built-in libvorbisfile decoder" ON)
137 option(ALURE_ENABLE_FLAC "Enables the built-in FLAC decoder" ON)
138 option(ALURE_ENABLE_OPUS "Enables the built-in libopusfile decoder" ON)
139 option(ALURE_ENABLE_SNDFILE "Enables the built-in libsndfile decoder" ON)
140 option(ALURE_ENABLE_MPG123 "Enables the built-in libmpg123 decoder" ON)
141 option(ALURE_ENABLE_MINIMP3 "Enables the built-in MINIMP3 decoder" ON)
143 if(ALURE_ENABLE_WAVE)
144 set(alure_srcs ${alure_srcs} src/decoders/wave.cpp)
150 set(decoder_incls ${decoder_incls} ${OGG_INCLUDE_DIRS})
152 if(VORBIS_FOUND AND ALURE_ENABLE_VORBIS)
153 set(decoder_incls ${decoder_incls} ${VORBIS_INCLUDE_DIRS})
154 set(alure_libs ${alure_libs} ${VORBIS_LIBRARIES})
155 set(alure_srcs ${alure_srcs} src/decoders/vorbisfile.cpp)
156 set(HAVE_VORBISFILE 1)
160 if(OPUS_FOUND AND ALURE_ENABLE_OPUS)
161 set(decoder_incls ${decoder_incls} ${OPUS_INCLUDE_DIRS})
162 set(alure_libs ${alure_libs} ${OPUS_LIBRARIES})
163 set(alure_srcs ${alure_srcs} src/decoders/opusfile.cpp)
166 set(alure_libs ${alure_libs} ${OGG_LIBRARIES})
169 if(ALURE_ENABLE_FLAC)
170 set(alure_srcs ${alure_srcs} src/decoders/dr_flac.h src/decoders/flac.cpp)
174 find_package(SndFile)
175 if(SNDFILE_FOUND AND ALURE_ENABLE_SNDFILE)
176 set(decoder_incls ${decoder_incls} ${SNDFILE_INCLUDE_DIRS})
177 set(alure_libs ${alure_libs} ${SNDFILE_LIBRARIES})
178 set(alure_srcs ${alure_srcs} src/decoders/sndfile.cpp)
179 set(HAVE_LIBSNDFILE 1)
183 if(MPG123_FOUND AND ALURE_ENABLE_MPG123)
184 set(decoder_incls ${decoder_incls} ${MPG123_INCLUDE_DIRS})
185 set(alure_libs ${alure_libs} ${MPG123_LIBRARIES})
186 set(alure_srcs ${alure_srcs} src/decoders/mpg123.cpp)
190 if(ALURE_ENABLE_MINIMP3)
191 set(alure_srcs ${alure_srcs} src/decoders/minimp3.h src/decoders/mp3.hpp src/decoders/mp3.cpp)
197 "${alure_SOURCE_DIR}/config.h.in"
198 "${alure_BINARY_DIR}/config.h")
204 if(ALURE_BUILD_SHARED)
205 add_library(alure2 SHARED ${alure_srcs})
207 target_compile_definitions(alure2 PRIVATE ALURE_API=${EXPORT_DECL} ALURE_TEMPLATE=template
210 target_include_directories(alure2
211 PUBLIC $<BUILD_INTERFACE:${alure_SOURCE_DIR}/include/AL> ${OPENAL_INCLUDE_DIR}
212 PRIVATE ${alure_SOURCE_DIR}/include ${alure_SOURCE_DIR}/src ${alure_BINARY_DIR}
215 target_compile_options(alure2 PRIVATE ${CXX_FLAGS} ${VISIBILITY_FLAGS})
216 target_link_libraries(alure2 PUBLIC ${alure_libs} PRIVATE Threads::Threads ${LINKER_OPTS})
218 set(TARGET_NAMES ${TARGET_NAMES} alure2)
220 set(MAIN_TARGET alure2)
224 if(ALURE_BUILD_STATIC)
225 add_library(alure2_s STATIC ${alure_srcs})
226 target_compile_definitions(alure2_s PUBLIC ALURE_STATIC_LIB PRIVATE NOMINMAX)
227 target_include_directories(alure2_s
228 PUBLIC $<BUILD_INTERFACE:${alure_SOURCE_DIR}/include/AL> ${OPENAL_INCLUDE_DIR}
229 PRIVATE ${alure_SOURCE_DIR}/include ${alure_SOURCE_DIR}/src ${alure_BINARY_DIR}
232 target_compile_options(alure2_s PRIVATE ${CXX_FLAGS} ${VISIBILITY_FLAGS})
233 target_link_libraries(alure2_s PUBLIC ${alure_libs} PRIVATE Threads::Threads)
235 set(TARGET_NAMES ${TARGET_NAMES} alure2_s)
237 set(MAIN_TARGET alure2_s)
241 install(TARGETS ${TARGET_NAMES} EXPORT alure2
242 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
243 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
244 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
245 INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ${CMAKE_INSTALL_INCLUDEDIR}/AL
248 TARGETS ${TARGET_NAMES}
250 FILE Alure2Config.cmake
254 DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Alure2
256 FILE Alure2Config.cmake
260 include/AL/alure2-aliases.h
261 include/AL/alure2-typeviews.h
262 include/AL/alure2-alext.h
264 include/AL/efx-presets.h
265 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/AL
269 option(ALURE_BUILD_EXAMPLES "Build example programs" ON)
270 if(ALURE_BUILD_EXAMPLES)
271 add_executable(alure-enum examples/alure-enum.cpp)
272 target_compile_options(alure-enum PRIVATE ${CXX_FLAGS})
273 target_link_libraries(alure-enum PRIVATE ${MAIN_TARGET} ${LINKER_OPTS})
275 add_executable(alure-play examples/alure-play.cpp)
276 target_compile_options(alure-play PRIVATE ${CXX_FLAGS})
277 target_link_libraries(alure-play PRIVATE ${MAIN_TARGET} ${LINKER_OPTS})
279 add_executable(alure-stream examples/alure-stream.cpp)
280 target_compile_options(alure-stream PRIVATE ${CXX_FLAGS})
281 target_link_libraries(alure-stream PRIVATE ${MAIN_TARGET} ${LINKER_OPTS})
283 add_executable(alure-reverb examples/alure-reverb.cpp)
284 target_compile_options(alure-reverb PRIVATE ${CXX_FLAGS})
285 target_link_libraries(alure-reverb PRIVATE ${MAIN_TARGET} ${LINKER_OPTS})
287 add_executable(alure-hrtf examples/alure-hrtf.cpp)
288 target_compile_options(alure-hrtf PRIVATE ${CXX_FLAGS})
289 target_link_libraries(alure-hrtf PRIVATE ${MAIN_TARGET} ${LINKER_OPTS})
293 add_executable(alure-physfs examples/alure-physfs.cpp)
294 target_include_directories(alure-physfs PRIVATE ${PHYSFS_INCLUDE_DIR})
295 target_compile_options(alure-physfs PRIVATE ${CXX_FLAGS})
296 target_link_libraries(alure-physfs PRIVATE ${MAIN_TARGET} ${PHYSFS_LIBRARY} ${LINKER_OPTS})
301 add_executable(alure-dumb examples/alure-dumb.cpp)
302 target_include_directories(alure-dumb PRIVATE ${DUMB_INCLUDE_DIRS})
303 target_compile_options(alure-dumb PRIVATE ${CXX_FLAGS})
304 target_link_libraries(alure-dumb PRIVATE ${MAIN_TARGET} ${DUMB_LIBRARIES} ${LINKER_OPTS})