cmake_minimum_required( VERSION 2.8.7 )

use_fast_math()
require_stricmp()
require_strnicmp()

if( ZD_CMAKE_COMPILER_IS_GNUC_COMPATIBLE )
	set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" )
endif()

include( CheckFunctionExists )

if( NOT WIN32 AND NOT APPLE )
	find_package( Threads )
endif()

find_package( ALSA )
if (WIN32 OR ALSA_FOUND)
    add_definitions( -DHAVE_SYSTEM_MIDI )
endif()

if( DYN_SNDFILE)
	add_definitions( -DHAVE_SNDFILE -DDYN_SNDFILE )
else()
	find_package( SndFile )

	if( SNDFILE_FOUND )
		add_definitions( -DHAVE_SNDFILE )
	endif()
endif()

if( DYN_MPG123)
	add_definitions( -DHAVE_MPG123 -DDYN_MPG123 )
else()
	find_package( MPG123 )

	if( MPG123_FOUND )
		add_definitions( -DHAVE_MPG123 )
	endif()
endif()

if( DYN_FLUIDSYNTH )
	add_definitions( -DHAVE_FLUIDSYNTH -DDYN_FLUIDSYNTH )
else()
	find_package( FluidSynth )

	if( FLUIDSYNTH_FOUND )
		add_definitions( -DHAVE_FLUIDSYNTH )
	endif()
endif()


if( WIN32 )
	add_definitions( -D_WIN32 )
	set( SYS_LIBS winmm )
else()
	set( SYS_LIBS ${CMAKE_DL_LIBS} )
endif() 

include_directories( "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/zmusic" "${CMAKE_CURRENT_SOURCE_DIR}/../include" "${CMAKE_CURRENT_SOURCE_DIR}/../thirdparty/dumb/include" "${ZLIB_INCLUDE_DIR}" "${ADL_INCLUDE_DIR}" "${OPN_INCLUDE_DIR}" "${TIMIDITYPP_INCLUDE_DIR}" "${TIMIDITY_INCLUDE_DIR}" "${WILDMIDI_INCLUDE_DIR}" "${OPLSYNTH_INCLUDE_DIR}" "${GME_INCLUDE_DIR}" )

if (WIN32)
    set( PLAT_SOURCES
        mididevices/music_win_mididevice.cpp
        musicformats/win32/i_cd.cpp
        musicformats/win32/helperthread.cpp
    )
elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
    if (ALSA_FOUND)
        set( PLAT_SOURCES
            mididevices/music_alsa_mididevice.cpp
            mididevices/music_alsa_state.cpp
        )
    endif()
endif()


file( GLOB HEADER_FILES
	zmusic/*.h
	loader/*.h
	mididevices/*.h
	midisources/*.h
	musicformats/*.h
	musicformats/win32/*.h
	decoder/*.h
	streamsources/*.h
	../thirdparty/*.h
	../include/*.h
	)
set( all_files
	${HEADER_FILES}
	loader/i_module.cpp
	mididevices/music_base_mididevice.cpp
	mididevices/music_adlmidi_mididevice.cpp
	mididevices/music_opl_mididevice.cpp
	mididevices/music_opnmidi_mididevice.cpp
	mididevices/music_timiditypp_mididevice.cpp
	mididevices/music_fluidsynth_mididevice.cpp
	mididevices/music_softsynth_mididevice.cpp
	mididevices/music_timidity_mididevice.cpp
	mididevices/music_wildmidi_mididevice.cpp
	mididevices/music_wavewriter_mididevice.cpp
	midisources/midisource.cpp
	midisources/midisource_mus.cpp
	midisources/midisource_smf.cpp
	midisources/midisource_hmi.cpp
	midisources/midisource_xmi.cpp
	midisources/midisource_mids.cpp
	streamsources/music_dumb.cpp
	streamsources/music_gme.cpp
	streamsources/music_libsndfile.cpp
	streamsources/music_opl.cpp
	streamsources/music_xa.cpp
	musicformats/music_stream.cpp
	musicformats/music_midi.cpp
	musicformats/music_cd.cpp
	decoder/sounddecoder.cpp
	decoder/sndfile_decoder.cpp
	decoder/mpg123_decoder.cpp
	zmusic/configuration.cpp
	zmusic/zmusic.cpp
	zmusic/critsec.cpp
	loader/test.c
	${PLAT_SOURCES}
	)

option( BUILD_SHARED_LIBS "Build shared libraries" ON )

add_library( zmusic ${all_files} )
add_library( zmusiclite ${all_files} )
target_compile_definitions(zmusiclite PRIVATE ZMUSIC_LITE=1)

if( MSVC )
	option( GENERATE_MAPFILE "Generate .map file for debugging." OFF )

	if( GENERATE_MAPFILE )
		set( LINKERSTUFF "${LINKERSTUFF} /MAP" )
		set_target_properties(zmusic PROPERTIES LINK_FLAGS ${LINKERSTUFF})
		set_target_properties(zmusiclite PROPERTIES LINK_FLAGS ${LINKERSTUFF})
	endif()
 
endif()
	

target_link_libraries( zmusic "${SYS_LIBS}" adl dumb gme oplsynth opn timidity timidityplus wildmidi "${ZLIB_LIBRARIES}" )
target_link_libraries( zmusiclite "${SYS_LIBS}" dumb gme "${ZLIB_LIBRARIES}" )

if( NOT DYN_SNDFILE AND SNDFILE_FOUND )
	include_directories( "${SNDFILE_INCLUDE_DIRS}" )
	target_link_libraries( zmusic ${SNDFILE_LIBRARIES} )
	target_link_libraries( zmusiclite ${SNDFILE_LIBRARIES} )
endif()

if( NOT DYN_MPG123 AND MPG123_FOUND )
	include_directories( "${MPG123_INCLUDE_DIR}" )
	target_link_libraries( zmusic ${MPG123_LIBRARIES} )
	target_link_libraries( zmusiclite ${MPG123_LIBRARIES} )
endif()

if( NOT DYN_FLUIDSYNTH AND FLUIDSYNTH_FOUND )
	include_directories( "${FLUIDSYNTH_INCLUDE_DIR}" )
	target_link_libraries( zmusic ${FLUIDSYNTH_LIBRARIES} )
	target_link_libraries( zmusiclite ${FLUIDSYNTH_LIBRARIES} )
endif()

if(ALSA_FOUND)
	include_directories( "${ALSA_INCLUDE_DIR}" )
	target_link_libraries( zmusic ${ALSA_LIBRARIES} )
	target_link_libraries( zmusiclite ${ALSA_LIBRARIES} )
endif()

if(APPLE)
	set_target_properties(zmusic PROPERTIES MACOSX_RPATH TRUE)
	set_target_properties(zmusiclite PROPERTIES MACOSX_RPATH TRUE)
endif()

set_target_properties(zmusic zmusiclite PROPERTIES
	PUBLIC_HEADER ../include/zmusic.h
	VERSION ${ZMUSIC_VERSION}
	SOVERSION ${ZMUSIC_VERSION_MAJOR}
)

include(GNUInstallDirs)

install(TARGETS zmusic zmusiclite
	PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
	LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
)

source_group("MIDI Devices" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/mididevices/.+")
source_group("MIDI Sources" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/midisources/.+")
source_group("Music Formats" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/musicformats/.+")
source_group("Music Formats\\Win32" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/musicformats/win32/.+")
source_group("ZMusic Core" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/zmusic/.+")
source_group("Sound Decoding" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/decoder/.+")
source_group("Stream Sources" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/streamsources/.+")
source_group("Third Party" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/../thirdparty/.+")
source_group("Public Interface" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/../include/.+")
