SRB2/libs/SDLMixerX/CMakeLists.txt
2019-08-04 12:03:57 +01:00

818 lines
30 KiB
CMake

cmake_minimum_required (VERSION 2.8.11)
project(SDLMixerX C)
include(FindPkgConfig)
include(CheckIncludeFiles)
include(CheckFunctionExists)
include(CheckLibraryExists)
#include(CheckCSourceRuns)
#include(CheckCCompilerFlag)
if(NOT CMAKE_VERSION VERSION_LESS 2.8.12)
set(CMAKE_MACOSX_RPATH 0)
endif()
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE)
message("== Using default build configuration which is a Release!")
endif()
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(MIX_DEBUG_SUFFIX "d")
else()
set(MIX_DEBUG_SUFFIX "")
endif()
if(WIN32)
set(CMAKE_SHARED_LIBRARY_PREFIX "")
endif()
if(POLICY CMP0058)
cmake_policy(SET CMP0058 NEW)
endif()
option(SSEMATH "Allow GCC to use SSE floating point math" ${OPT_DEF_SSEMATH})
option(MMX "Use MMX assembly routines" ${OPT_DEF_ASM})
option(3DNOW "Use 3Dnow! MMX assembly routines" ${OPT_DEF_ASM})
option(SSE "Use SSE assembly routines" ${OPT_DEF_ASM})
option(SSE2 "Use SSE2 assembly routines" ${OPT_DEF_SSEMATH})
option(SSE3 "Use SSE3 assembly routines" ${OPT_DEF_SSEMATH})
# Settings
option(SDL_MIXER_X_STATIC "Build static library of SDL Mixer X" ON)
option(SDL_MIXER_X_SHARED "Build shared library of SDL Mixer X" ON)
option(DOWNLOAD_AUDIO_CODECS_DEPENDENCY "Downloads and compiles AudioCodecs dependencies pack directly" OFF)
set(AUDIO_CODECS_REPO_PATH "" CACHE PATH "Path to the AudioCodecs dependencies pack")
set(AUDIO_CODECS_INSTALL_PATH "" CACHE PATH "Path to installed AudioCodecs prefix")
if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
# Turn on warnings and legacy C/C++ standards to support more compilers
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -std=c90")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pedantic -std=c++98")
# Deny undefined symbols
if(NOT APPLE)
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined" )
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--no-undefined" )
endif()
endif()
set(SDL_MIXER_INCLUDE_PATHS)
if(NOT AUDIO_CODECS_REPO_PATH AND NOT AUDIO_CODECS_INSTALL_PATH)
# Try to resolve sqlite dependency
if(DOWNLOAD_AUDIO_CODECS_DEPENDENCY)
# Download and configure AudioCodecs dependency
set(SDL2_REPO_PATH ${CMAKE_INSTALL_PREFIX})
set(SDL2_INCLUDE_PATH ${CMAKE_INSTALL_PREFIX}/include/SDL2)
set(SDL2_LIBS_PATH ${CMAKE_INSTALL_PREFIX}/lib)
include(cmake/DownloadAudioCodecs.cmake)
set(AUDIO_CODECS_REPO_PATH ${AUDIO_CODECS_REPOSITORY_PATH})
set(AUDIO_CODECS_INSTALL_PATH ${AUDIO_CODECS_INSTALL_DIR})
endif()
endif()
set(FIND_PREFER_STATIC
"-static${MIX_DEBUG_SUFFIX}.a"
"-static${MIX_DEBUG_SUFFIX}.lib"
"${MIX_DEBUG_SUFFIX}.a"
"${MIX_DEBUG_SUFFIX}.lib"
"-static.a"
"-static.lib"
".a"
".lib"
"${MIX_DEBUG_SUFFIX}.dll.a"
"${MIX_DEBUG_SUFFIX}.dll.lib"
".dll.a"
".dll.lib"
"${MIX_DEBUG_SUFFIX}.so"
"${MIX_DEBUG_SUFFIX}.dylib"
".so"
".dylib"
)
set(FIND_PREFER_SHARED
"${MIX_DEBUG_SUFFIX}.dll.a"
"${MIX_DEBUG_SUFFIX}.dll.lib"
".dll.a"
".dll.lib"
"${MIX_DEBUG_SUFFIX}.so"
"${MIX_DEBUG_SUFFIX}.dylib"
".so"
".dylib"
"-static${MIX_DEBUG_SUFFIX}.a"
"-static${MIX_DEBUG_SUFFIX}.lib"
"${MIX_DEBUG_SUFFIX}.a"
"${MIX_DEBUG_SUFFIX}.lib"
"-static.a"
"-static.lib"
".a"
".lib"
)
if(AUDIO_CODECS_REPO_PATH OR AUDIO_CODECS_INSTALL_PATH)
set(AUDIO_CODECS_PATH ${AUDIO_CODECS_REPO_PATH})
set(AUDIO_CODECS_INSTALL_DIR ${AUDIO_CODECS_INSTALL_PATH})
set(SDL2_REPO_PATH ${AUDIO_CODECS_INSTALL_DIR})
set(SDL2_INCLUDE_PATH ${AUDIO_CODECS_INSTALL_DIR}/include/SDL2)
link_directories(${AUDIO_CODECS_INSTALL_DIR}/lib)
list(APPEND SDL_MIXER_INCLUDE_PATHS ${AUDIO_CODECS_INSTALL_DIR}/include ${SDL2_INCLUDE_PATH})
message("AudioCodecs will be used. No needed extra libraries installed in the system.")
set(USE_SYSTEM_AUDIO_LIBRARIES 0)
set(CMAKE_FIND_LIBRARY_SUFFIXES ${FIND_PREFER_STATIC})
else()
message("AudioCodecs will NOT be used. Libraries will be recognized in the system.")
set(USE_SYSTEM_AUDIO_LIBRARIES 1)
endif()
add_definitions(-DHAVE_INTTYPES_H -DHAVE_SETENV -DHAVE_SINF)
add_definitions(-Dmain=SDL_main -DPIC -D_REENTRANT -D_USE_MATH_DEFINES)
set(SDLMixerX_SOURCES)
set(SDLMixerX_LINK_LIBS)
# Recognize SDL2 library from the system
if(USE_SYSTEM_AUDIO_LIBRARIES)
find_package(PkgConfig)
pkg_check_modules(SDL2 REQUIRED sdl2)
list(APPEND SDL_MIXER_INCLUDE_PATHS ${SDL2_INCLUDE_DIRS})
list(APPEND SDLMixerX_LINK_LIBS ${SDL2_LIBRARIES})
message("== SDL2: ${SDL2_INCLUDE_DIRS} ${SDL2_LIBRARIES} ==")
endif()
option(USE_WAV "Build with WAV codec" ON)
if(USE_WAV)
add_definitions(-DMUSIC_WAV)
list(APPEND SDLMixerX_SOURCES
${SDLMixerX_SOURCE_DIR}/src/codecs/load_aiff.c
${SDLMixerX_SOURCE_DIR}/src/codecs/load_voc.c
${SDLMixerX_SOURCE_DIR}/src/codecs/music_wav.c)
endif()
option(USE_OGG_VORBIS "Build with OGG Vorbis codec" ON)
if(USE_OGG_VORBIS)
if(USE_SYSTEM_AUDIO_LIBRARIES)
check_library_exists(vorbisfile ov_open "vorbis/vorbisfile.h" FOUND_VORBIS)
find_path(LIBVORBIS_INCLUDE_DIR vorbis/codec.h)
find_library(LIBVORBISFILE_LIB NAMES vorbisfile)
find_library(LIBVORBIS_LIB NAMES vorbis)
message("Vorbis: ${LIBVORBIS_INCLUDE_DIR} ${LIBVORBIS_LIB}")
else()
set(FOUND_VORBIS 1)
if(DOWNLOAD_AUDIO_CODECS_DEPENDENCY)
set(LIBVORBISFILE_LIB vorbisfile)
set(LIBVORBIS_LIB vorbis)
else()
find_library(LIBVORBISFILE_LIB NAMES vorbisfile
HINTS "${AUDIO_CODECS_INSTALL_PATH}/lib")
find_library(LIBVORBIS_LIB NAMES vorbis
HINTS "${AUDIO_CODECS_INSTALL_PATH}/lib")
endif()
endif()
if(FOUND_VORBIS)
message("== using Vorbis ==")
add_definitions(-DMUSIC_OGG)
list(APPEND SDL_MIXER_INCLUDE_PATHS
${AUDIO_CODECS_PATH}/libogg/include
${AUDIO_CODECS_PATH}/libvorbis/include
)
list(APPEND SDLMixerX_LINK_LIBS ${LIBVORBISFILE_LIB} ${LIBVORBIS_LIB})
set(LIBOGG_NEEDED ON)
list(APPEND SDLMixerX_SOURCES
${SDLMixerX_SOURCE_DIR}/src/codecs/music_ogg.c)
endif()
endif()
option(USE_OPUS "Build with OPUS codec" ON)
if(USE_OPUS)
if(USE_SYSTEM_AUDIO_LIBRARIES)
check_library_exists(opusfile op_open_file "opus/opusfile.h" FOUND_OPUS)
find_path(LIBOPUS_INCLUDE_DIR opus/opusfile.h)
find_library(LIBOPUSFILE_LIB NAMES opusfile)
find_library(LIBOPUS_LIB NAMES opusfile)
message("Opus: ${LIBOPUS_INCLUDE_DIR} ${LIBOPUSFILE_LIB} ${LIBOPUS_LIB}")
else()
set(FOUND_OPUS 1)
if(DOWNLOAD_AUDIO_CODECS_DEPENDENCY)
set(LIBOPUSFILE_LIB opusfile)
set(LIBOPUS_LIB opus)
else()
find_library(LIBOPUSFILE_LIB NAMES opusfile
HINTS "${AUDIO_CODECS_INSTALL_PATH}/lib")
find_library(LIBOPUS_LIB NAMES opus
HINTS "${AUDIO_CODECS_INSTALL_PATH}/lib")
endif()
endif()
if(FOUND_OPUS)
message("== using Opus ==")
add_definitions(-DMUSIC_OPUS)
if(AUDIO_CODECS_REPO_PATH)
list(APPEND SDL_MIXER_INCLUDE_PATHS
${AUDIO_CODECS_PATH}/libogg/include
${AUDIO_CODECS_PATH}/libopus/include
${AUDIO_CODECS_PATH}/libopusfile/include
)
endif()
if(AUDIO_CODECS_INSTALL_DIR)
list(APPEND SDL_MIXER_INCLUDE_PATHS ${AUDIO_CODECS_INSTALL_DIR}/include/opus)
endif()
list(APPEND SDLMixerX_LINK_LIBS ${LIBOPUSFILE_LIB} ${LIBOPUS_LIB})
set(LIBOGG_NEEDED ON)
list(APPEND SDLMixerX_SOURCES
${SDLMixerX_SOURCE_DIR}/src/codecs/music_opus.c)
endif()
endif()
option(USE_FLAC "Build with FLAC codec" ON)
if(USE_FLAC)
if(USE_SYSTEM_AUDIO_LIBRARIES)
check_library_exists(FLAC FLAC__format_sample_rate_is_valid "FLAC/format.h" FOUND_FLAC)
find_path(LIBFLAC_INCLUDE_DIR "FLAC/all.h")
find_library(LIBFLAC_LIB NAMES FLAC)
message("FLAC: ${LIBFLAC_INCLUDE_DIR} ${LIBFLAC_LIB}")
else()
set(FOUND_FLAC 1)
if(DOWNLOAD_AUDIO_CODECS_DEPENDENCY)
set(LIBFLAC_LIB FLAC)
else()
find_library(LIBFLAC_LIB NAMES FLAC
HINTS "${AUDIO_CODECS_INSTALL_PATH}/lib")
endif()
endif()
if(FOUND_FLAC)
message("== using FLAC ==")
add_definitions(-DMUSIC_FLAC -DFLAC__NO_DLL)
if(AUDIO_CODECS_REPO_PATH)
list(APPEND SDL_MIXER_INCLUDE_PATHS
${AUDIO_CODECS_PATH}/libogg/include
${AUDIO_CODECS_PATH}/libFLAC/include
)
endif()
set(LIBOGG_NEEDED ON)
list(APPEND SDLMixerX_LINK_LIBS ${LIBFLAC_LIB})
list(APPEND SDLMixerX_SOURCES
${SDLMixerX_SOURCE_DIR}/src/codecs/music_flac.c)
endif()
endif()
if(LIBOGG_NEEDED)
if(USE_SYSTEM_AUDIO_LIBRARIES)
find_library(LIBOGG_LIB NAMES ogg)
else()
if(DOWNLOAD_AUDIO_CODECS_DEPENDENCY)
set(LIBOGG_LIB ogg)
else()
find_library(LIBOGG_LIB NAMES ogg
HINTS "${AUDIO_CODECS_INSTALL_PATH}/lib")
endif()
endif()
list(APPEND SDLMixerX_LINK_LIBS ${LIBOGG_LIB})
endif()
option(USE_MP3_ID3TAG "Build with MP3 Meta tags support provided by libID3Tag library" ON)
if(USE_MP3_ID3TAG AND NOT USE_SYSTEM_AUDIO_LIBRARIES)
message("== using ID3Tag (custom) ==")
add_definitions(-DMUSIC_MP3_ID3TAG)
if(AUDIO_CODECS_REPO_PATH)
list(APPEND SDL_MIXER_INCLUDE_PATHS ${AUDIO_CODECS_PATH}/libid3tag/include)
endif()
if(DOWNLOAD_AUDIO_CODECS_DEPENDENCY)
set(LIBID3TAG_LIB id3tag)
else()
find_library(LIBID3TAG_LIB NAMES id3tag
HINTS "${AUDIO_CODECS_INSTALL_PATH}/lib")
endif()
list(APPEND SDLMixerX_LINK_LIBS ${LIBID3TAG_LIB})
endif()
option(USE_MP3_MAD "Build with MAD MP3 codec" ON)
option(USE_MP3_MAD_GPL_DITHERING "Enable GPL-Licensed dithering functions for MAD library" ON)
if(USE_MP3_MAD)
if(USE_SYSTEM_AUDIO_LIBRARIES)
check_library_exists(mad mad_frame_init "mad.h" FOUND_MAD)
find_path(LIBMAD_INCLUDE_DIR "FLAC/all.h")
find_library(LIBMAD_LIB NAMES mad)
message("MAD: ${LIBMAD_INCLUDE_DIR} ${LIBMAD_LIB}")
else()
set(FOUND_MAD 1)
if(DOWNLOAD_AUDIO_CODECS_DEPENDENCY)
set(LIBMAD_LIB mad)
else()
find_library(LIBMAD_LIB NAMES mad
HINTS "${AUDIO_CODECS_INSTALL_PATH}/lib")
endif()
endif()
if(FOUND_MAD)
message("== using MAD ==")
add_definitions(-DMUSIC_MP3_MAD)
if(USE_MP3_MAD_GPL_DITHERING)
add_definitions(-DMUSIC_MP3_MAD_GPL_DITHERING)
endif()
list(APPEND SDLMixerX_LINK_LIBS ${LIBMAD_LIB})
if(AUDIO_CODECS_REPO_PATH)
list(APPEND SDL_MIXER_INCLUDE_PATHS ${AUDIO_CODECS_PATH}/libmad/include)
endif()
list(APPEND SDLMixerX_SOURCES
${SDLMixerX_SOURCE_DIR}/src/codecs/music_mad.c)
endif()
endif()
option(USE_MP3_SMPEG "Build with SMPEG MP3 codec" OFF)
if(USE_MP3_SMPEG)
if(USE_SYSTEM_AUDIO_LIBRARIES)
check_library_exists(smpeg SMPEG_new "smpeg/smpeg.h" FOUND_SMPEG)
find_path(LIBSMPEG_INCLUDE_DIR "smpeg/smpeg.h")
find_library(LIBSMPEG_LIB NAMES smpeg)
message("SMPEG: ${LIBSMPEG_INCLUDE_DIR} ${LIBSMPEG_LIB}")
else()
set(FOUND_SMPEG 1)
if(DOWNLOAD_AUDIO_CODECS_DEPENDENCY)
set(LIBSMPEG_LIB smpeg)
else()
find_library(LIBSMPEG_LIB NAMES smpeg
HINTS "${AUDIO_CODECS_INSTALL_PATH}/lib")
endif()
endif()
if(FOUND_SMPEG)
message("== using SMPEG ==")
add_definitions(-DMUSIC_MP3_SMPEG)
list(APPEND SDLMixerX_LINK_LIBS ${LIBSMPEG_LIB})
if(AUDIO_CODECS_REPO_PATH)
list(APPEND SDL_MIXER_INCLUDE_PATHS ${AUDIO_CODECS_PATH}/smpeg/include)
endif()
list(APPEND SDLMixerX_SOURCES
${SDLMixerX_SOURCE_DIR}/src/codecs/music_smpeg.c)
endif()
endif()
option(USE_MP3_MPG123 "[WIP, DON'T USE IT] Build with MPG123 MP3 codec" OFF)
if(USE_MP3_MPG123)
add_definitions(-DMUSIC_MP3_MPG123)
message(WARNING "MPG123 SUPPORT IS WIP, DON'T USE IT IN PRODUCTION!!!")
# ======= Until AudioCodecs will receive buildable mpg123, detect it externally =======
include(cmake/FindMpg123.cmake)
if(NOT MPG123_FOUND)
message(FATAL_ERROR "MPG123 is not found!")
else()
message("MPG123 found in ${MPG123_INCLUDE_DIR} folder")
endif()
list(APPEND SDL_MIXER_INCLUDE_PATHS ${MPG123_INCLUDE_DIRS})
set(LIBS ${LIBS} ${MPG123_LIBRARIES})
list(APPEND SDLMixerX_LINK_LIBS mpg123)
list(APPEND SDLMixerX_SOURCES
${SDLMixerX_SOURCE_DIR}/src/codecs/music_mpg123.c)
endif()
if(USE_MP3_MAD OR USE_MP3_MPG123 OR USE_MP3_SMPEG)
list(APPEND SDLMixerX_SOURCES
${SDLMixerX_SOURCE_DIR}/src/codecs/music_id3tag.c)
endif()
option(USE_MODPLUG "Build with ModPlug library" ON)
if(USE_MODPLUG)
if(USE_SYSTEM_AUDIO_LIBRARIES)
check_library_exists(modplug ModPlug_Load "libmodplug/modplug.h" FOUND_MODPLUG)
find_path(LIBMODPLUG_INCLUDE_DIR libmodplug/modplug.h)
find_library(LIBMODPLUG_LIB NAMES modplug)
message("ModPlug: ${LIBMODPLUG_INCLUDE_DIR} ${LIBMODPLUG_LIB}")
else()
set(FOUND_MODPLUG 1)
if(DOWNLOAD_AUDIO_CODECS_DEPENDENCY)
set(LIBMODPLUG_LIB modplug)
else()
find_library(LIBMODPLUG_LIB NAMES modplug
HINTS "${AUDIO_CODECS_INSTALL_PATH}/lib")
endif()
endif()
if(FOUND_MODPLUG)
message("== using libModPlug ==")
add_definitions(-DMUSIC_MOD_MODPLUG -DMODPLUG_STATIC)
if(AUDIO_CODECS_REPO_PATH)
list(APPEND SDL_MIXER_INCLUDE_PATHS ${AUDIO_CODECS_PATH}/libmodplug/include)
endif()
list(APPEND SDLMixerX_LINK_LIBS ${LIBMODPLUG_LIB})
list(APPEND SDLMixerX_SOURCES
${SDLMixerX_SOURCE_DIR}/src/codecs/music_modplug.c)
endif()
endif()
option(USE_MIKMOD "Build with MikMod library" OFF)
if(USE_MIKMOD)
if(USE_SYSTEM_AUDIO_LIBRARIES)
check_library_exists(mikmod Player_Load "mikmod.h" FOUND_MIKMOD)
find_path(LIBMIKMOD_INCLUDE_DIR "mikmod.h")
find_library(LIBMIKMOD_LIB NAMES mikmod)
message("MikMod: ${LIBMIKMOD_INCLUDE_DIR} ${LIBMIKMOD_LIB}")
else()
set(FOUND_MIKMOD 1)
if(DOWNLOAD_AUDIO_CODECS_DEPENDENCY)
set(LIBMIKMOD_LIB mikmod)
else()
find_library(LIBMIKMOD_LIB NAMES mikmod
HINTS "${AUDIO_CODECS_INSTALL_PATH}/lib")
endif()
endif()
if(FOUND_MIKMOD)
message("== using MikMod ==")
add_definitions(-DMUSIC_MOD_MIKMOD)
if(AUDIO_CODECS_REPO_PATH)
list(APPEND SDL_MIXER_INCLUDE_PATHS ${AUDIO_CODECS_PATH}/libmikmod/include)
endif()
list(APPEND SDLMixerX_LINK_LIBS ${LIBMIKMOD_LIB})
list(APPEND SDLMixerX_SOURCES
${SDLMixerX_SOURCE_DIR}/src/codecs/music_mikmod.c)
endif()
endif()
option(USE_GME "Build with Game Music Emulators library" ON)
if(USE_GME)
if(USE_SYSTEM_AUDIO_LIBRARIES)
check_library_exists(gme gme_load_file "gme.h" FOUND_GME)
find_path(LIBGME_INCLUDE_DIR "gme.h")
find_library(LIBGME_LIB NAMES gme)
find_library(LIBZLIB_LIB NAMES z zlib)
message("GME: ${LIBGME_INCLUDE_DIR} ${LIBGME_LIB}")
else()
set(FOUND_GME 1)
if(DOWNLOAD_AUDIO_CODECS_DEPENDENCY)
set(LIBGME_LIB gme)
set(LIBZLIB_LIB zlib)
else()
find_library(LIBGME_LIB NAMES gme
HINTS "${AUDIO_CODECS_INSTALL_PATH}/lib")
find_library(LIBZLIB_LIB NAMES zlib z
HINTS "${AUDIO_CODECS_INSTALL_PATH}/lib")
endif()
endif()
if(FOUND_GME)
message("== using GME ==")
add_definitions(-DMUSIC_GME)
if(AUDIO_CODECS_REPO_PATH)
list(APPEND SDL_MIXER_INCLUDE_PATHS ${AUDIO_CODECS_PATH}/libgme/include)
list(APPEND SDL_MIXER_INCLUDE_PATHS ${AUDIO_CODECS_PATH}/zlib/include)
endif()
list(APPEND SDLMixerX_LINK_LIBS ${LIBGME_LIB} ${LIBZLIB_LIB})
list(APPEND SDLMixerX_SOURCES
${SDLMixerX_SOURCE_DIR}/src/codecs/music_gme.c)
endif()
endif()
if(NOT WIN32) # CMD Music is not supported on Windows
option(USE_CMD "Build with CMD music player support" ON)
if(USE_CMD)
message("== using CMD Music ==")
add_definitions(-DMUSIC_CMD -D_POSIX_C_SOURCE=1)
CHECK_FUNCTION_EXISTS(fork HAVE_FORK)
if(HAVE_FORK)
add_definitions(-DHAVE_FORK)
endif()
list(APPEND SDLMixerX_SOURCES
${SDLMixerX_SOURCE_DIR}/src/codecs/music_cmd.c)
endif()
endif()
option(USE_MIDI "Build with MIDI support" ON)
if(USE_MIDI)
option(USE_MIDI_ADLMIDI "Build with libADLMIDI OPL3 Emulator based MIDI sequencer support" ON)
if(USE_MIDI_ADLMIDI)
if(USE_SYSTEM_AUDIO_LIBRARIES)
check_library_exists(ADLMIDI adl_init "adlmidi.h" FOUND_ADLMIDI)
find_path(LIBADLMIDI_INCLUDE_DIR "adlmidi.h")
find_library(LIBADLMIDI_LIB NAMES ADLMIDI)
message("ADLMIDI: ${LIBADLMIDI_INCLUDE_DIR} ${LIBADLMIDI_LIB}")
else()
set(FOUND_ADLMIDI 1)
if(DOWNLOAD_AUDIO_CODECS_DEPENDENCY)
set(LIBADLMIDI_LIB ADLMIDI)
else()
find_library(LIBADLMIDI_LIB NAMES ADLMIDI
HINTS "${AUDIO_CODECS_INSTALL_PATH}/lib")
endif()
endif()
if(FOUND_ADLMIDI)
message("== using ADLMIDI ==")
add_definitions(-DMUSIC_MID_ADLMIDI)
if(AUDIO_CODECS_REPO_PATH)
list(APPEND SDL_MIXER_INCLUDE_PATHS ${AUDIO_CODECS_PATH}/libADLMIDI/include)
endif()
set(LIBMATH_NEEDED 1)
list(APPEND SDLMixerX_LINK_LIBS ${LIBADLMIDI_LIB})
list(APPEND SDLMixerX_SOURCES
${SDLMixerX_SOURCE_DIR}/src/codecs/music_midi_adl.c)
endif()
endif()
option(USE_MIDI_OPNMIDI "Build with libOPNMIDI OPN2 Emulator based MIDI sequencer support" ON)
if(USE_MIDI_OPNMIDI)
if(USE_SYSTEM_AUDIO_LIBRARIES)
check_library_exists(OPNMIDI opn_init "opnmidi.h" FOUND_OPNMIDI)
find_path(LIBOPNMIDI_INCLUDE_DIR "opnmidi.h")
find_library(LIBOPNMIDI_LIB NAMES OPNMIDI)
message("OPNMIDI: ${LIBOPNMIDI_INCLUDE_DIR} ${LIBOPNMIDI_LIB}")
else()
set(FOUND_OPNMIDI 1)
if(DOWNLOAD_AUDIO_CODECS_DEPENDENCY)
set(LIBOPNMIDI_LIB OPNMIDI)
else()
find_library(LIBOPNMIDI_LIB NAMES OPNMIDI
HINTS "${AUDIO_CODECS_INSTALL_PATH}/lib")
endif()
endif()
if(FOUND_OPNMIDI)
message("== using OPNMIDI ==")
add_definitions(-DMUSIC_MID_OPNMIDI)
if(AUDIO_CODECS_REPO_PATH)
list(APPEND SDL_MIXER_INCLUDE_PATHS ${AUDIO_CODECS_PATH}/libOPNMIDI/include)
endif()
set(LIBMATH_NEEDED 1)
list(APPEND SDLMixerX_LINK_LIBS ${LIBOPNMIDI_LIB})
list(APPEND SDLMixerX_SOURCES
${SDLMixerX_SOURCE_DIR}/src/codecs/music_midi_opn.c)
endif()
endif()
option(USE_MIDI_TIMIDITY "Build with Timidity wave table MIDI sequencer support" ON)
if(USE_MIDI_TIMIDITY AND NOT USE_SYSTEM_AUDIO_LIBRARIES)
message("== using Timidity (custom) ==")
add_definitions(-DMUSIC_MID_TIMIDITY)
if(AUDIO_CODECS_REPO_PATH)
list(APPEND SDL_MIXER_INCLUDE_PATHS ${AUDIO_CODECS_PATH}/libtimidity/include)
endif()
if(DOWNLOAD_AUDIO_CODECS_DEPENDENCY)
set(LIBTIMIDITY_LIB timidity)
else()
find_library(LIBTIMIDITY_LIB NAMES timidity
HINTS "${AUDIO_CODECS_INSTALL_PATH}/lib")
endif()
list(APPEND SDLMixerX_LINK_LIBS ${LIBTIMIDITY_LIB})
list(APPEND SDLMixerX_SOURCES
${SDLMixerX_SOURCE_DIR}/src/codecs/music_timidity.c)
endif()
option(USE_MIDI_FLUIDSYNTH "Build with FluidSynth wave table MIDI sequencer support" OFF)
if(USE_MIDI_FLUIDSYNTH)
if(USE_SYSTEM_AUDIO_LIBRARIES)
check_library_exists(fluidsynth new_fluid_midi_router "fluidsynth.h" FOUND_FLUIDSYNTH)
find_path(LIBFLUIDSYNTH_INCLUDE_DIR "fluidsynth.h")
find_library(LIBFLUIDSYNTH_LIB NAMES fluidsynth)
message("FluidSynth: ${LIBFLUIDSYNTH_INCLUDE_DIR} ${LIBFLUIDSYNTH_LIB}")
else()
set(FOUND_FLUIDSYNTH 1)
if(DOWNLOAD_AUDIO_CODECS_DEPENDENCY)
set(LIBFLUIDSYNTH_LIB fluidsynth)
else()
find_library(LIBFLUIDSYNTH_LIB NAMES fluidsynth
HINTS "${AUDIO_CODECS_INSTALL_PATH}/lib")
endif()
endif()
if(FOUND_FLUIDSYNTH)
message("== using FluidSynth ==")
add_definitions(-DMUSIC_MID_FLUIDSYNTH)
if(AUDIO_CODECS_REPO_PATH)
list(APPEND SDL_MIXER_INCLUDE_PATHS ${AUDIO_CODECS_PATH}/FluidLite/include)
endif()
list(APPEND SDLMixerX_LINK_LIBS ${LIBFLUIDSYNTH_LIB})
list(APPEND SDLMixerX_SOURCES
${SDLMixerX_SOURCE_DIR}/src/codecs/music_fluidsynth.c)
endif()
endif()
# Native MIDI correctly works on Windows and macOS only.
if(WIN32 OR APPLE)
set(NATIVE_MIDI_SUPPORTED ON)
else()
set(NATIVE_MIDI_SUPPORTED OFF)
endif()
option(USE_MIDI_NATIVE "Build with operating system native MIDI output support" ${NATIVE_MIDI_SUPPORTED})
if(USE_MIDI_NATIVE)
add_definitions(-DMUSIC_MID_NATIVE)
list(APPEND SDLMixerX_SOURCES
${SDLMixerX_SOURCE_DIR}/src/codecs/music_nativemidi.c
${SDLMixerX_SOURCE_DIR}/src/codecs/native_midi/native_midi_common.c)
if(WIN32)
list(APPEND SDLMixerX_SOURCES
${SDLMixerX_SOURCE_DIR}/src/codecs/native_midi/native_midi_win32.c)
list(APPEND SDLMixerX_LINK_LIBS winmm)
endif()
if(APPLE)
list(APPEND SDLMixerX_SOURCES
${SDLMixerX_SOURCE_DIR}/src/codecs/native_midi/native_midi_macosx.c)
endif()
endif()
if(NOT USE_MIDI_ADLMIDI AND
NOT USE_MIDI_OPNMIDI AND
NOT USE_MIDI_TIMIDITY AND
NOT USE_MIDI_FLUIDSYNTH AND
NOT USE_MIDI_NATIVE)
message_error("To have MIDI support you must enable at least one MIDI sequencer library")
endif()
endif()
if(USE_SYSTEM_AUDIO_LIBRARIES)
find_library(LIBSDL2CUSTOM_LIB NAMES SDL2)
else()
if(DOWNLOAD_AUDIO_CODECS_DEPENDENCY)
set(LIBSDL2CUSTOM_LIB SDL2$<$<CONFIG:Debug>:d>)
else()
set(CMAKE_FIND_LIBRARY_SUFFIXES ${FIND_PREFER_SHARED})
find_library(LIBSDL2CUSTOM_LIB NAMES SDL2
HINTS "${AUDIO_CODECS_INSTALL_PATH}/lib")
endif()
endif()
list(APPEND SDLMixerX_LINK_LIBS ${LIBSDL2CUSTOM_LIB})
if(LIBMATH_NEEDED AND NOT MSVC)
list(APPEND SDLMixerX_LINK_LIBS m)
endif()
if(WIN32)
option(BUILD_AS_VB6_BINDING "Compile library into solid module compatible with VisualBasic 6" OFF)
if(BUILD_AS_VB6_BINDING)
message("== SDL Mixer X will be built as solid module that is ready for MS-VB6 binding! ==")
list(APPEND SDLMixerX_SOURCES ${SDLMixerX_SOURCE_DIR}/src/vb6_binding/vb6_sdl_binds.c)
list(REMOVE_ITEM SDLMixerX_LINK_LIBS SDL2)
list(REMOVE_ITEM SDLMixerX_LINK_LIBS SDL2$<$<CONFIG:Debug>:d>)
list(APPEND SDLMixerX_LINK_LIBS
SDL2-static
uuid winmm ole32 imm32 version oleaut32 user32 gdi32)
if(NOT MSVC)
list(APPEND SDLMixerX_LINK_LIBS stdc++ gcc pthread)
endif()
endif()
endif()
if(APPLE)
find_library(APPLE_CORE_AUDIO CoreAudio)
find_library(APPLE_IOKIT IOKit)
find_library(APPLE_COCOA Cocoa)
find_library(APPLE_AUDIOTOOLBOX AudioToolbox)
find_library(APPLE_CORE_VIDEO CoreVideo)
find_library(APPLE_CORE_FOUNDATION CoreFoundation)
find_library(APPLE_CARBON Carbon)
find_library(APPLE_FORCE_FEEDBACK ForceFeedback)
find_library(ICONV_LIB iconv)
list(APPEND SDLMixerX_LINK_LIBS
${APPLE_CORE_AUDIO}
${APPLE_COCOA}
${APPLE_CORE_VIDEO}
${APPLE_CORE_FOUNDATION}
${APPLE_FORCE_FEEDBACK}
${APPLE_IOKIT}
${APPLE_CARBON}
${APPLE_AUDIOTOOLBOX}
${ICONV_LIB})
list(APPEND SDLMixerX_LINK_LIBS objc)
endif()
if(NOT MSVC)
list(APPEND SDLMixerX_LINK_LIBS stdc++)
endif()
list(APPEND SDLMixerX_SOURCES
${SDLMixerX_SOURCE_DIR}/src/effect_position.c
${SDLMixerX_SOURCE_DIR}/src/effects_internal.c
${SDLMixerX_SOURCE_DIR}/src/effect_stereoreverse.c
${SDLMixerX_SOURCE_DIR}/src/mixer.c
${SDLMixerX_SOURCE_DIR}/src/music.c
${SDLMixerX_SOURCE_DIR}/src/mixer_x_deprecated.c
)
file(GLOB SDLMixerX_SOURCES ${SDLMixerX_SOURCES})
set(SDLMixerX_INSTALLS)
if(SDL_MIXER_X_STATIC AND NOT BUILD_AS_VB6_BINDING)
add_library(SDL2_mixer_ext_Static STATIC ${SDLMixerX_SOURCES})
if(WIN32)
set_target_properties(SDL2_mixer_ext_Static PROPERTIES OUTPUT_NAME SDL2_mixer_ext-static)
else()
set_target_properties(SDL2_mixer_ext_Static PROPERTIES OUTPUT_NAME SDL2_mixer_ext)
endif()
target_include_directories(SDL2_mixer_ext_Static PRIVATE
${SDLMixerX_SOURCE_DIR}/include/SDL_mixer_ext
${SDLMixerX_SOURCE_DIR}/src
${SDLMixerX_SOURCE_DIR}/src/codecs
${AUDIO_CODECS_INSTALL_DIR}/include/SDL2
)
target_include_directories(SDL2_mixer_ext_Static PUBLIC
${SDLMixerX_SOURCE_DIR}/include
${SDL_MIXER_INCLUDE_PATHS}
)
if(DOWNLOAD_AUDIO_CODECS_DEPENDENCY AND AUDIO_CODECS_INSTALL_PATH)
add_dependencies(SDL2_mixer_ext_Static AudioCodecs)
endif()
set_target_properties(SDL2_mixer_ext_Static
PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
)
if(DOWNLOAD_AUDIO_CODECS_DEPENDENCY)
add_custom_command(
TARGET SDL2_mixer_ext_Static POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_SOURCE_DIR}/include/SDL_mixer_ext/SDL_mixer_ext.h
${AUDIO_CODECS_INSTALL_DIR}/include/SDL2)
endif()
list(APPEND SDLMixerX_INSTALLS SDL2_mixer_ext_Static)
endif()
if(WIN32)
list(APPEND SDLMixerX_SOURCES ${SDLMixerX_SOURCE_DIR}/version.rc)
endif()
if(SDL_MIXER_X_SHARED AND NOT BUILD_AS_VB6_BINDING)
add_library(SDL2_mixer_ext SHARED ${SDLMixerX_SOURCES})
target_link_libraries(SDL2_mixer_ext ${SDLMixerX_LINK_LIBS})
target_include_directories(SDL2_mixer_ext PRIVATE
${SDLMixerX_SOURCE_DIR}/include/SDL_mixer_ext
${SDLMixerX_SOURCE_DIR}/src
${SDLMixerX_SOURCE_DIR}/src/codecs
${AUDIO_CODECS_INSTALL_DIR}/include/SDL2
)
target_include_directories(SDL2_mixer_ext PUBLIC
${SDLMixerX_SOURCE_DIR}/include
${SDL_MIXER_INCLUDE_PATHS}
)
if(DOWNLOAD_AUDIO_CODECS_DEPENDENCY AND AUDIO_CODECS_INSTALL_PATH)
add_dependencies(SDL2_mixer_ext AudioCodecs)
endif()
set_target_properties(SDL2_mixer_ext
PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
)
if(DOWNLOAD_AUDIO_CODECS_DEPENDENCY)
add_custom_command(
TARGET SDL2_mixer_ext POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_SOURCE_DIR}/include/SDL_mixer_ext/SDL_mixer_ext.h
${AUDIO_CODECS_INSTALL_DIR}/include/SDL2)
endif()
list(APPEND SDLMixerX_INSTALLS SDL2_mixer_ext)
endif()
if(BUILD_AS_VB6_BINDING)
add_library(SDL2_mixer_ext_VB6 MODULE ${SDLMixerX_SOURCES})
set_target_properties(SDL2_mixer_ext_VB6 PROPERTIES OUTPUT_NAME SDL2MixerVB)
set_target_properties(SDL2_mixer_ext_VB6 PROPERTIES PREFIX "")
target_compile_definitions(SDL2_mixer_ext_VB6 PRIVATE -DFORCE_STDCALLS)
target_link_libraries(SDL2_mixer_ext_VB6 ${SDLMixerX_LINK_LIBS})
target_include_directories(SDL2_mixer_ext_VB6 PUBLIC
${SDLMixerX_SOURCE_DIR}/include/SDL_mixer_ext
${SDLMixerX_SOURCE_DIR}/src
${SDLMixerX_SOURCE_DIR}/src/codecs
${AUDIO_CODECS_INSTALL_DIR}/include/SDL2
)
target_include_directories(SDL2_mixer_ext_VB6 PUBLIC
${SDLMixerX_SOURCE_DIR}/include
${SDL_MIXER_INCLUDE_PATHS}
)
set_target_properties(SDL2_mixer_ext_VB6 PROPERTIES LINK_FLAGS
"-Wl,--add-stdcall-alias -static-libgcc -static-libstdc++ -static -lpthread")
if(DOWNLOAD_AUDIO_CODECS_DEPENDENCY AND AUDIO_CODECS_INSTALL_PATH)
add_dependencies(SDL2_mixer_ext_VB6 AudioCodecs)
endif()
set_target_properties(SDL2_mixer_ext_VB6
PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/sdl-mixer-vb6"
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/sdl-mixer-vb6"
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/sdl-mixer-vb6"
)
add_custom_command(
TARGET SDL2_mixer_ext_VB6 POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_SOURCE_DIR}/VB6_Wrapper/modSDL2_mixer_ext_vb6.bas
${CMAKE_BINARY_DIR}/sdl-mixer-vb6)
list(APPEND SDLMixerX_INSTALLS SDL2_mixer_ext_VB6)
endif()
install(TARGETS ${SDLMixerX_INSTALLS}
RUNTIME DESTINATION "bin"
LIBRARY DESTINATION "lib"
ARCHIVE DESTINATION "lib"
FRAMEWORK DESTINATION "lib"
INCLUDES DESTINATION "include")
if(DOWNLOAD_AUDIO_CODECS_DEPENDENCY)
install(DIRECTORY ${AUDIO_CODECS_INSTALL_DIR}/bin
DESTINATION .)
install(DIRECTORY ${AUDIO_CODECS_INSTALL_DIR}/lib
DESTINATION .)
install(DIRECTORY ${AUDIO_CODECS_INSTALL_DIR}/include
DESTINATION .)
endif()
install(FILES
include/SDL_mixer_ext/begin_code.h
include/SDL_mixer_ext/close_code.h
include/SDL_mixer_ext/SDL_mixer_ext.h
DESTINATION include/SDL2)