#!/usr/bin/cmake cmake_minimum_required (VERSION 3.18) # ------------------------------------------------------------------------------------------------- project( OpenAL VERSION 1.22.2 DESCRIPTION "Cross platform spatial Audio playback library" ) include("../../BuildSystem/cmake/cplusplus.cmake") if(WIN32) else() find_package(DBus1 REQUIRED) endif() # ------------------------------------------------------------------------------------------------- if(NOT EXISTS ${PROJECT_SOURCE_DIR}/downloads/1.22.2.tar.gz) message(STATUS "Downloading OpenAL sources") file( DOWNLOAD https://github.com/kcat/openal-soft/archive/refs/tags/1.22.2.tar.gz ${PROJECT_SOURCE_DIR}/downloads/1.22.2.tar.gz SHOW_PROGRESS EXPECTED_HASH SHA256=3e58f3d4458f5ee850039b1a6b4dac2343b3a5985a6a2e7ae2d143369c5b8135 STATUS DOWNLOAD_STATUS ) if(NOT DOWNLOAD_STATUS EQUAL 0) file(REMOVE ${PROJECT_SOURCE_DIR}/downloads/1.22.2.tar.gz) message(FATAL_ERROR "Download failed, stopping build (error ${DOWNLOAD_STATUS})") endif() endif() # ------------------------------------------------------------------------------------------------- if(NOT EXISTS ${PROJECT_SOURCE_DIR}/build) message(STATUS "Extracting OpenAL sources") file( ARCHIVE_EXTRACT INPUT ${PROJECT_SOURCE_DIR}/downloads/1.22.2.tar.gz DESTINATION ${CMAKE_BINARY_DIR}/extract ) file( RENAME ${CMAKE_BINARY_DIR}/extract/openal-soft-1.22.2 ${PROJECT_SOURCE_DIR}/build ) endif() file( COPY "${PROJECT_SOURCE_DIR}/config.h" DESTINATION "${PROJECT_SOURCE_DIR}/build/common" ) file( COPY "${PROJECT_SOURCE_DIR}/version.h" DESTINATION "${PROJECT_SOURCE_DIR}/build/common" ) # ------------------------------------------------------------------------------------------------- set( sourceFiles "build/common/alcomplex.cpp" "build/common/alfstream.cpp" "build/common/almalloc.cpp" "build/common/alstring.cpp" "build/common/dynload.cpp" "build/common/polyphase_resampler.cpp" "build/common/ringbuffer.cpp" "build/common/strutils.cpp" "build/common/threads.cpp" "build/core/helpers.cpp" "build/core/ambdec.cpp" "build/core/ambidefs.cpp" "build/core/bformatdec.cpp" "build/core/bs2b.cpp" "build/core/bsinc_tables.cpp" "build/core/buffer_storage.cpp" "build/core/context.cpp" "build/core/converter.cpp" "build/core/cpu_caps.cpp" "build/core/devformat.cpp" "build/core/device.cpp" "build/core/effectslot.cpp" "build/core/except.cpp" "build/core/filters/biquad.cpp" "build/core/filters/nfc.cpp" "build/core/filters/splitter.cpp" "build/core/fmt_traits.cpp" "build/core/fpu_ctrl.cpp" "build/core/hrtf.cpp" "build/core/logging.cpp" "build/core/mastering.cpp" "build/core/mixer/mixer_c.cpp" "build/core/mixer/mixer_sse.cpp" "build/core/mixer/mixer_sse2.cpp" "build/core/mixer/mixer_sse3.cpp" "build/core/mixer/mixer_sse41.cpp" "build/core/mixer.cpp" "build/core/uhjfilter.cpp" "build/core/uiddefs.cpp" "build/core/voice.cpp" "build/al/eax/api.cpp" "build/al/eax/call.cpp" "build/al/eax/exception.cpp" "build/al/eax/fx_slots.cpp" "build/al/eax/fx_slot_index.cpp" "build/al/eax/globals.cpp" "build/al/eax/utils.cpp" "build/al/effects/autowah.cpp" "build/al/effects/chorus.cpp" "build/al/effects/compressor.cpp" "build/al/effects/convolution.cpp" "build/al/effects/dedicated.cpp" "build/al/effects/distortion.cpp" "build/al/effects/echo.cpp" "build/al/effects/effects.cpp" "build/al/effects/equalizer.cpp" "build/al/effects/fshifter.cpp" "build/al/effects/modulator.cpp" "build/al/effects/null.cpp" "build/al/effects/pshifter.cpp" "build/al/effects/reverb.cpp" "build/al/effects/vmorpher.cpp" "build/al/auxeffectslot.cpp" "build/al/buffer.cpp" "build/al/effect.cpp" "build/al/error.cpp" "build/al/event.cpp" "build/al/extension.cpp" "build/al/filter.cpp" "build/al/listener.cpp" "build/al/source.cpp" "build/al/state.cpp" "build/alc/backends/base.cpp" "build/alc/backends/loopback.cpp" "build/alc/backends/null.cpp" #"build/alc/backends/oboe.cpp" #"build/alc/backends/opensl.cpp" #"build/alc/backends/sdl2.cpp" #"build/alc/backends/solaris.cpp" "build/alc/backends/wave.cpp" "build/alc/effects/autowah.cpp" "build/alc/effects/chorus.cpp" "build/alc/effects/compressor.cpp" "build/alc/effects/convolution.cpp" "build/alc/effects/dedicated.cpp" "build/alc/effects/distortion.cpp" "build/alc/effects/echo.cpp" "build/alc/effects/equalizer.cpp" "build/alc/effects/fshifter.cpp" "build/alc/effects/modulator.cpp" "build/alc/effects/null.cpp" "build/alc/effects/pshifter.cpp" "build/alc/effects/reverb.cpp" "build/alc/effects/vmorpher.cpp" "build/alc/alc.cpp" "build/alc/alconfig.cpp" "build/alc/alu.cpp" "build/alc/context.cpp" "build/alc/device.cpp" "build/alc/panning.cpp" ) set( windowsSourceFiles "build/alc/backends/dsound.cpp" "build/alc/backends/wasapi.cpp" "build/alc/backends/winmm.cpp" ) set( linuxSourceFiles "build/core/dbus_wrap.cpp" "build/core/rtkit.cpp" "build/alc/backends/alsa.cpp" #"build/alc/backends/coreaudio.cpp" "build/alc/backends/jack.cpp" "build/alc/backends/oss.cpp" #"build/alc/backends/pipewire.cpp" #"build/alc/backends/portaudio.cpp" "build/alc/backends/pulseaudio.cpp" #"build/alc/backends/sndio.cpp" ) set( headerFiles "build/include/AL/al.h" "build/include/AL/alc.h" "build/include/AL/alext.h" "build/include/AL/efx-creative.h" "build/include/AL/efx-presets.h" "build/include/AL/efx.h" ) # ------------------------------------------------------------------------------------------------- add_library(OpenAL SHARED) add_library(OpenAL::Shared ALIAS OpenAL) target_compile_definitions( OpenAL PUBLIC ALSOFT_EAX PUBLIC AL_ALEXT_PROTOTYPES PRIVATE NOMINMAX ) if(WIN32) set(EXPORT_DECL "__declspec(dllexport)") set(IMPORT_DECL "__declspec(dllimport)") target_compile_definitions( OpenAL PRIVATE RESTRICT=__restrict PRIVATE "AL_API=${EXPORT_DECL}" INTERFACE "AL_API=${IMPORT_DECL}" PRIVATE "ALC_API=${EXPORT_DECL}" INTERFACE "ALC_API=${IMPORT_DECL}" ) else() set(EXPORT_DECL "__attribute__((visibility(\"default\")))") set(EXPORT_DECL "${EXPORT_DECL} __attribute__((force_align_arg_pointer))") target_compile_definitions( OpenAL PRIVATE RESTRICT=__restrict PRIVATE AL_BUILD_LIBRARY PUBLIC AL_ALEXT_PROTOTYPES PUBLIC "ALC_API=${EXPORT_DECL}" PUBLIC "AL_API=${EXPORT_DECL}" ) endif() target_include_directories( OpenAL INTERFACE "build/include/AL/" PUBLIC "build/include/" PUBLIC "build/" PUBLIC "build/common/" ) if(WIN32) else() target_include_directories( OpenAL PRIVATE ${DBus1_INCLUDE_DIRS} ) endif() target_sources( OpenAL PUBLIC ${headerFiles} PRIVATE ${sourceFiles} ) if(WIN32) target_sources( OpenAL PRIVATE ${windowsSourceFiles} ) target_link_libraries( OpenAL PRIVATE winmm PRIVATE dsound ) else() target_sources( OpenAL PRIVATE ${linuxSourceFiles} ) target_link_libraries( OpenAL PRIVATE ${DBus1_LIBRARIES} ) endif() # Make sure the build fails if the shared library is missing any symbols # (otherwise this would only be detected when building the final executable) if(WIN32) else() # Supposedly, there is a portable way to specify these but since it's # CMake, the documentation doesn't give an example and is wrong as well: # https://cmake.org/cmake/help/latest/command/add_link_options.html message(STATUS "Using symbolic link to catch unresolved symbols") # Detect unresolved symbols in shared object set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,defs") # Prevent replacement on shared object syms set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Bsymbolic") endif() #set_target_properties(OpenAL PROPERTIES PREFIX "") set_target_properties(OpenAL PROPERTIES OUTPUT_NAME "openal") # ------------------------------------------------------------------------------------------------- #install( # DIRECTORY build/include/AL # DESTINATION ${PROJECT_SOURCE_DIR}/Include #) install( TARGETS OpenAL ARCHIVE DESTINATION ${PROJECT_SOURCE_DIR}/bin/${NUCLEX_COMPILER_TAG} LIBRARY DESTINATION ${PROJECT_SOURCE_DIR}/bin/${NUCLEX_COMPILER_TAG} RUNTIME DESTINATION ${PROJECT_SOURCE_DIR}/bin/${NUCLEX_COMPILER_TAG} ) # Install .pdb files on Windows platforms. # # CMake forgets installing .pdb files for debug builds. These are needed by # Microsoft compilers when debugging to associate machine code locations to # source files and line numbers. install_debug_symbols(OpenAL) # ------------------------------------------------------------------------------------------------- file( WRITE "${PROJECT_SOURCE_DIR}/OpenALConfig.cmake" "#!/usr/bin/cmake # Configuration to include OpenAL in a CMake-based project. If you want to # reference OpenAL as an externally compiled static library, do this: # # set(OpenAL_DIR \"../ThirdParty/openal\") # find_package(OpenAL REQUIRED CONFIG) # # target_link_libraries( # MyAwesomeProject # PRIVATE GTest::Static # PRIVATE GTest::Main # ) # # Alternatively, if you want to build OpenAL together with your project, # use the normal CMakeLists.txt with CMake's add_subdirectory() command: # # add_subdirectory( # \"\${PROJECT_SOURCE_DIR}/../ThirdParty/openal\" # \"\${CMAKE_BINARY_DIR}/openal\" # ) # # target_link_libraries( # MyAwesomeProject # PRIVATE OpenAL # PRIVATE OpenALMain # ) # # ------------------------------------------------------------------------------------------------- if(NOT DEFINED NUCLEX_COMPILER_TAG) message( FATAL_ERROR \"NUCLEX_COMPILER_TAG not defined! Include cplusplus.cmake before importing this package \\ in order to generate a tag identifying the platform/compiler/architecture/variant!\" ) endif() # ------------------------------------------------------------------------------------------------- if(NOT EXISTS \"\${CMAKE_CURRENT_LIST_DIR}/bin/\${NUCLEX_COMPILER_TAG}\") # TODO: Warn and link release build when compiling in debug mode # TODO: Warn and link build for older compiler version if found message( FATAL_ERROR \"Directory '\${CMAKE_CURRENT_LIST_DIR}/bin/\${NUCLEX_COMPILER_TAG}' not found. \\ Please either build and install this project before importing it via \\ find_package() or use this project's main CMakeFiles.txt via add_subdirectory()!\" ) endif() # ------------------------------------------------------------------------------------------------- add_library(OpenAL::Static STATIC IMPORTED) add_library(OpenAL::Main STATIC IMPORTED) # This may cause warnings on recent GCC versions (10.0.0+?) with LTO because GCC detects # that the headers used during build (residing in build/) are not the same used when # linking the library (copies resising in Include/). # # CMake doesn't run the install step during build, so the only way to get the headers # in place before building would be by copying them rather than installing them. set_target_properties( OpenAL::Static PROPERTIES INTERFACE_INCLUDE_DIRECTORIES \"\${CMAKE_CURRENT_LIST_DIR}/Include\" IMPORTED_LINK_INTERFACE_LANGUAGES \"CXX\" ) set_target_properties( OpenAL::Main PROPERTIES INTERFACE_INCLUDE_DIRECTORIES \"\${CMAKE_CURRENT_LIST_DIR}/Include\" IMPORTED_LINK_INTERFACE_LANGUAGES \"CXX\" ) if(WIN32) set_target_properties( OpenAL::Static PROPERTIES IMPORTED_LOCATION \"\${CMAKE_CURRENT_LIST_DIR}/bin/\${NUCLEX_COMPILER_TAG}/openal.lib\" ) set_target_properties( OpenAL::Main PROPERTIES IMPORTED_LOCATION \"\${CMAKE_CURRENT_LIST_DIR}/bin/\${NUCLEX_COMPILER_TAG}/openal_main.lib\" ) else() set_target_properties( OpenAL::Static PROPERTIES IMPORTED_LOCATION \"\${CMAKE_CURRENT_LIST_DIR}/bin/\${NUCLEX_COMPILER_TAG}/libopenal.a\" ) set_target_properties( OpenAL::Main PROPERTIES IMPORTED_LOCATION \"\${CMAKE_CURRENT_LIST_DIR}/bin/\${NUCLEX_COMPILER_TAG}/libopenal_main.a\" ) endif() message(STATUS \"Imported OpenAL targets with binaries in '\${CMAKE_CURRENT_LIST_DIR}'\")" ) # -------------------------------------------------------------------------------------------------