cmake_minimum_required(VERSION 3.1)
project(SDL2_MIXER C)

find_path(SDL_INCLUDE_DIR SDL.h PATH_SUFFIXES SDL2)
find_package(SDL2 CONFIG REQUIRED)
set(SDL_MIXER_INCLUDES ${SDL_INCLUDE_DIR})

set(SDL_MIXER_LIBRARIES SDL2::SDL2)

# builtin formats
set(SDL_MIXER_DEFINES MUSIC_WAV)

# MP3 support
if(SDL_MIXER_ENABLE_MP3)
    find_path(MPG123_INCLUDE_DIR mpg123.h)
    find_library(MPG123_LIBRARY NAMES libmpg123 mpg123)
    list(APPEND SDL_MIXER_INCLUDES ${MPG123_INCLUDE_DIR})
    list(APPEND SDL_MIXER_DEFINES MUSIC_MP3_MPG123)
    list(APPEND SDL_MIXER_LIBRARIES ${MPG123_LIBRARY})
    if (SDL_DYNAMIC_LOAD)
        get_filename_component(MPG123_LIBRARY_NAME "${MPG123_LIBRARY}" NAME_WE)
        list(APPEND SDL_MIXER_LOAD_DEFINES -DMPG123_DYNAMIC="${MPG123_LIBRARY_NAME}${LIBRARY_SUFFIX}")
    endif()
endif()

# FLAC support
if(SDL_MIXER_ENABLE_FLAC)
    find_path(FLAC_INCLUDE_DIR FLAC/all.h)
    find_library(FLAC_LIBRARY FLAC)
    list(APPEND SDL_MIXER_INCLUDES ${FLAC_INCLUDE_DIR})
    list(APPEND SDL_MIXER_DEFINES MUSIC_FLAC)
    list(APPEND SDL_MIXER_LIBRARIES ${FLAC_LIBRARY})
    if (SDL_DYNAMIC_LOAD)
        get_filename_component(FLAC_LIBRARY_NAME "${FLAC_LIBRARY}" NAME_WE)
        list(APPEND SDL_MIXER_LOAD_DEFINES -DFLAC_DYNAMIC="${FLAC_LIBRARY_NAME}${LIBRARY_SUFFIX}")
    endif()
endif()

# MOD support
if(SDL_MIXER_ENABLE_MOD)
    find_path(MODPLUG_INCLUDE_DIR libmodplug/modplug.h)
    find_library(MODPLUG_LIBRARY modplug)
    list(APPEND SDL_MIXER_INCLUDES ${MODPLUG_INCLUDE_DIR})
    list(APPEND SDL_MIXER_DEFINES MUSIC_MOD_MODPLUG)
    list(APPEND SDL_MIXER_LIBRARIES ${MODPLUG_LIBRARY})
    if (SDL_DYNAMIC_LOAD)
        get_filename_component(MODPLUG_LIBRARY_NAME "${MODPLUG_LIBRARY}" NAME_WE)
        list(APPEND SDL_MIXER_LOAD_DEFINES -DMODPLUG_DYNAMIC="${MODPLUG_LIBRARY_NAME}${LIBRARY_SUFFIX}")
    endif()
endif()

# Ogg-Vorbis support
if(SDL_MIXER_ENABLE_OGGVORBIS)
    find_path(VORBIS_INCLUDE_DIR vorbis/codec.h)
    find_library(VORBISFILE_LIBRARY vorbisfile)
    list(APPEND SDL_MIXER_INCLUDES ${VORBIS_INCLUDE_DIR})
    list(APPEND SDL_MIXER_DEFINES MUSIC_OGG)
    list(APPEND SDL_MIXER_LIBRARIES ${VORBISFILE_LIBRARY})
    if (SDL_DYNAMIC_LOAD)
        get_filename_component(VORBISFILE_LIBRARY_NAME "${VORBISFILE_LIBRARY}" NAME_WE)
        list(APPEND SDL_MIXER_LOAD_DEFINES -DOGG_DYNAMIC="${VORBISFILE_LIBRARY_NAME}${LIBRARY_SUFFIX}")
    endif()
endif()

# Opus support
if(SDL_MIXER_ENABLE_OPUS)
    find_path(OPUS_INCLUDE_DIR opus/opusfile.h)
    find_library(OPUSFILE_LIBRARY opusfile)
    list(APPEND SDL_MIXER_INCLUDES ${OPUS_INCLUDE_DIR})
    list(APPEND SDL_MIXER_DEFINES MUSIC_OPUS)
    list(APPEND SDL_MIXER_LIBRARIES ${OPUSFILE_LIBRARY})
    if (SDL_DYNAMIC_LOAD)
        get_filename_component(OPUSFILE_LIBRARY_NAME "${OPUSFILE_LIBRARY}" NAME_WE)
        list(APPEND SDL_MIXER_LOAD_DEFINES -DOPUS_DYNAMIC="${OPUSFILE_LIBRARY_NAME}${LIBRARY_SUFFIX}")
    endif()
endif()

# Fluidsynth support
if(SDL_MIXER_ENABLE_FLUIDSYNTH)
    find_path(FLUIDSYNTH_INCLUDE_DIR fluidsynth.h)
    find_library(FLUIDSYNTH_LIBRARY fluidsynth)
    list(APPEND SDL_MIXER_INCLUDES ${FLUIDSYNTH_INCLUDE_DIR})
    list(APPEND SDL_MIXER_DEFINES MUSIC_MID_FLUIDSYNTH)
    list(APPEND SDL_MIXER_LIBRARIES ${FLUIDSYNTH_LIBRARY})
    if (SDL_DYNAMIC_LOAD)
        get_filename_component(FLUIDSYNTH_LIBRARY_NAME "${FLUIDSYNTH_LIBRARY}" NAME_WE)
        list(APPEND SDL_MIXER_LOAD_DEFINES -DFLUIDSYNTH_DYNAMIC="${FLUIDSYNTH_LIBRARY_NAME}${LIBRARY_SUFFIX}")
    endif()
endif()

add_library(SDL2_mixer
    effect_position.c
    effect_stereoreverse.c
    effects_internal.c
    load_aiff.c
    load_voc.c
    mixer.c
    music.c
    music_cmd.c
    music_flac.c
    music_fluidsynth.c
    music_mad.c
    music_mikmod.c
    music_modplug.c
    music_mpg123.c
    music_ogg.c
    music_opus.c
    music_timidity.c
    music_wav.c
    version.rc)

if((WIN32 OR APPLE) AND SDL_MIXER_ENABLE_NATIVEMIDI)
    list(APPEND SDL_MIXER_DEFINES MUSIC_MID_NATIVE)
    target_sources(SDL2_mixer PRIVATE music_nativemidi.c native_midi/native_midi_common.c)
    target_link_libraries(SDL2_mixer ${SDL_MIXER_LIBRARIES})
    if(WIN32)
        target_sources(SDL2_mixer PRIVATE native_midi/native_midi_win32.c)
        target_link_libraries(SDL2_mixer Winmm)
    elseif(APPLE)
        target_sources(SDL2_mixer PRIVATE native_midi/native_midi_macosx.c)
    endif()
endif()

set_target_properties(SDL2_mixer PROPERTIES DEFINE_SYMBOL DLL_EXPORT)
target_compile_definitions(SDL2_mixer PRIVATE ${SDL_MIXER_DEFINES} ${SDL_MIXER_LOAD_DEFINES})
target_include_directories(SDL2_mixer PRIVATE ${SDL_MIXER_INCLUDES} ./native_midi)

install(TARGETS SDL2_mixer
    EXPORT SDL2_mixer
    RUNTIME DESTINATION bin
    ARCHIVE DESTINATION lib
    LIBRARY DESTINATION lib)

install(EXPORT SDL2_mixer
    DESTINATION share/sdl2-mixer/
    FILE sdl2-mixer-config.cmake
    NAMESPACE SDL2::
)

set(prefix "")
set(exec_prefix [[${prefix}]])
set(libdir [[${prefix}/lib]])
set(includedir [[${prefix}/include]])
set(PACKAGE "SDL2_mixer")
file(READ "SDL_mixer.h" header_contents)
#    #define SDL_MIXER_MAJOR_VERSION 2
#    #define SDL_MIXER_MINOR_VERSION 0
#    #define SDL_MIXER_PATCHLEVEL    5
string(REGEX MATCH "define *SDL_MIXER_MAJOR_VERSION *([0-9]+)" _ "${header_contents}")
set(VERSION ${CMAKE_MATCH_1})
string(REGEX MATCH "define *SDL_MIXER_MINOR_VERSION *([0-9]+)" _ "${header_contents}")
string(APPEND VERSION ".${CMAKE_MATCH_1}")
string(REGEX MATCH "define *SDL_MIXER_PATCHLEVEL *([0-9]+)" _ "${header_contents}")
string(APPEND VERSION ".${CMAKE_MATCH_1}")
set(SDL_VERSION 0.0)
configure_file(SDL2_mixer.pc.in "${CMAKE_CURRENT_BINARY_DIR}/SDL2_mixer.pc" @ONLY)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/SDL2_mixer.pc DESTINATION lib/pkgconfig)

if(NOT SDL_MIXER_SKIP_HEADERS)
    install(FILES SDL_mixer.h DESTINATION include/SDL2)
endif()

message(STATUS "Link-time dependencies:")
foreach(LIBRARY ${SDL_MIXER_LIBRARIES})
    message(STATUS "  " ${LIBRARY})
endforeach()