Files
munt/mt32emu/CMakeLists.txt
sergm f8bc0be842 Fixed packaging of libmt32emu with RPM generator
The pkgconfig directory is no longer marked for creation assuming that
the system directory is specified in libmt32emu_PKGCONFIG_INSTALL_PREFIX
property so to avoid conflicts
2021-03-20 20:23:58 +02:00

326 lines
12 KiB
CMake

cmake_minimum_required(VERSION 2.8.12)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/Modules/")
project(libmt32emu CXX)
set(libmt32emu_DESCRIPTION "C/C++ library to emulate (approximately) the Roland MT-32, CM-32L and LAPC-I synthesiser modules")
set(libmt32emu_URL "http://munt.sourceforge.net/")
set(libmt32emu_VERSION_MAJOR 2)
set(libmt32emu_VERSION_MINOR 4)
set(libmt32emu_VERSION_PATCH 2)
set(libmt32emu_VERSION "${libmt32emu_VERSION_MAJOR}.${libmt32emu_VERSION_MINOR}.${libmt32emu_VERSION_PATCH}")
if(${munt_WITH_MT32EMU_SMF2WAV} OR ${munt_WITH_MT32EMU_QT})
set(libmt32emu_STANDALONE_BUILD FALSE)
else()
set(libmt32emu_STANDALONE_BUILD TRUE)
endif()
option(libmt32emu_SHARED "Build shared library" ${libmt32emu_STANDALONE_BUILD})
option(libmt32emu_C_INTERFACE "Provide C-compatible API" TRUE)
option(${PROJECT_NAME}_WITH_INTERNAL_RESAMPLER "Use built-in sample rate conversion" TRUE)
option(libmt32emu_REQUIRE_ANSI "Require ANSI C++ compatibility when compiling with GNU C++ or Clang" TRUE)
mark_as_advanced(libmt32emu_REQUIRE_ANSI)
if(munt_WITH_MT32EMU_SMF2WAV AND NOT libmt32emu_C_INTERFACE)
message(STATUS "Option libmt32emu_C_INTERFACE implied TRUE when building for mt32emu_smf2wav")
set(libmt32emu_C_INTERFACE TRUE)
endif()
if(${libmt32emu_SHARED} AND NOT ${munt_WITH_MT32EMU_QT})
option(libmt32emu_CPP_INTERFACE "Provide C++ classes (compiler-specific ABI)" TRUE)
else(${libmt32emu_SHARED} AND NOT ${munt_WITH_MT32EMU_QT})
if(NOT ${libmt32emu_CPP_INTERFACE})
message(STATUS "Option libmt32emu_CPP_INTERFACE implied TRUE for static library builds and when building for mt32emu_qt")
endif(NOT ${libmt32emu_CPP_INTERFACE})
set(libmt32emu_CPP_INTERFACE TRUE)
endif(${libmt32emu_SHARED} AND NOT ${munt_WITH_MT32EMU_QT})
set(LIB_INSTALL_DIR lib CACHE PATH "Relative installation path to libraries")
set(libmt32emu_PACKAGE_TYPE Complete CACHE STRING "Selects output binary package type: Complete, Runtime or Devel")
mark_as_advanced(libmt32emu_PACKAGE_TYPE)
set_property(CACHE libmt32emu_PACKAGE_TYPE PROPERTY STRINGS Complete Runtime Devel)
set(libmt32emu_PKGCONFIG_INSTALL_PREFIX lib CACHE PATH "Installation path prefix for pkgconfig files")
mark_as_advanced(libmt32emu_PKGCONFIG_INSTALL_PREFIX)
if(libmt32emu_SHARED)
option(libmt32emu_INSTALL_DEFAULT_LOCALE "Install user-preferred system locale as C locale when initialising shared library.\
This is generally not necessary, although may be required in some cases\
(for instance, when builing shared library with old versions of MS VC with the C runtime statically linked)\
to open ROM files with localised pathnames successfully." FALSE)
mark_as_advanced(libmt32emu_INSTALL_DEFAULT_LOCALE)
endif()
set(libmt32emu_SOURCES
src/Analog.cpp
src/BReverbModel.cpp
src/File.cpp
src/FileStream.cpp
src/LA32FloatWaveGenerator.cpp
src/LA32Ramp.cpp
src/LA32WaveGenerator.cpp
src/MidiStreamParser.cpp
src/Part.cpp
src/Partial.cpp
src/PartialManager.cpp
src/Poly.cpp
src/ROMInfo.cpp
src/Synth.cpp
src/Tables.cpp
src/TVA.cpp
src/TVF.cpp
src/TVP.cpp
src/sha1/sha1.cpp
src/SampleRateConverter.cpp
)
# Public headers that always need to be installed:
set(libmt32emu_COMMON_HEADERS
mt32emu.h
globals.h
Enumerations.h
Types.h
)
# Public headers used by C++ clients:
set(libmt32emu_CPP_HEADERS
File.h
FileStream.h
MidiStreamParser.h
ROMInfo.h
SampleRateConverter.h
Synth.h
)
# Public headers that support C-compatible and plugin-style API:
set(libmt32emu_C_HEADERS
c_interface/c_interface.h
c_interface/c_types.h
c_interface/cpp_interface.h
)
if(libmt32emu_CPP_INTERFACE AND NOT libmt32emu_C_INTERFACE)
# C++ API type
set(libmt32emu_EXPORTS_TYPE 0)
set(libmt32emu_HEADERS
${libmt32emu_COMMON_HEADERS}
${libmt32emu_CPP_HEADERS}
)
else(libmt32emu_CPP_INTERFACE AND NOT libmt32emu_C_INTERFACE)
list(APPEND libmt32emu_SOURCES
src/c_interface/c_interface.cpp
)
# All API types
if(libmt32emu_CPP_INTERFACE)
set(libmt32emu_EXPORTS_TYPE 3)
set(libmt32emu_HEADERS
${libmt32emu_COMMON_HEADERS}
${libmt32emu_CPP_HEADERS}
${libmt32emu_C_HEADERS}
)
else(libmt32emu_CPP_INTERFACE)
if(libmt32emu_C_INTERFACE)
# C API type
set(libmt32emu_EXPORTS_TYPE 1)
else(libmt32emu_C_INTERFACE)
# Plugin API type
set(libmt32emu_EXPORTS_TYPE 2)
endif(libmt32emu_C_INTERFACE)
set(libmt32emu_HEADERS
${libmt32emu_COMMON_HEADERS}
${libmt32emu_C_HEADERS}
)
endif(libmt32emu_CPP_INTERFACE)
endif(libmt32emu_CPP_INTERFACE AND NOT libmt32emu_C_INTERFACE)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID STREQUAL Clang)
add_compile_options(-Wall -Wextra -Wnon-virtual-dtor -Wshadow -Wold-style-cast)
if(libmt32emu_REQUIRE_ANSI)
add_compile_options(-ansi -pedantic)
endif()
endif()
if(MSVC)
add_definitions(-D_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1)
endif()
if(libmt32emu_SHARED)
add_definitions(-DMT32EMU_SHARED)
set(libmt32emu_BUILD_TYPE SHARED)
if(NOT OS2)
# A workaround for the OS/2 port of GCC 9 that emits lots of warnings otherwise.
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
endif()
if(libmt32emu_INSTALL_DEFAULT_LOCALE)
add_definitions(-DMT32EMU_INSTALL_DEFAULT_LOCALE)
endif()
endif(libmt32emu_SHARED)
if(NOT libmt32emu_CURRENT_EXPORTS_TYPE STREQUAL libmt32emu_EXPORTS_TYPE)
set(libmt32emu_CURRENT_EXPORTS_TYPE ${libmt32emu_EXPORTS_TYPE} CACHE INTERNAL "Stores current exports type")
file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/include/mt32emu)
endif()
foreach(HEADER ${libmt32emu_HEADERS})
configure_file("src/${HEADER}" "include/mt32emu/${HEADER}" COPYONLY)
endforeach(HEADER)
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/include/mt32emu.h" "#include <mt32emu/mt32emu.h>")
configure_file("src/config.h.in" "include/mt32emu/config.h")
include_directories(${CMAKE_CURRENT_BINARY_DIR}/include/mt32emu)
if(${PROJECT_NAME}_WITH_INTERNAL_RESAMPLER)
add_definitions(-DMT32EMU_WITH_INTERNAL_RESAMPLER)
set(${PROJECT_NAME}_SOURCES ${${PROJECT_NAME}_SOURCES}
src/srchelper/srctools/src/FIRResampler.cpp
src/srchelper/srctools/src/SincResampler.cpp
src/srchelper/srctools/src/IIR2xResampler.cpp
src/srchelper/srctools/src/LinearResampler.cpp
src/srchelper/srctools/src/ResamplerModel.cpp
src/srchelper/InternalResampler.cpp
)
else(${PROJECT_NAME}_WITH_INTERNAL_RESAMPLER)
# Prefer using SOXR if it is available
find_package(LibSoxr)
if(LIBSOXR_FOUND)
set(libmt32emu_PC_REQUIRES_PRIVATE "soxr >= 0.1.2")
add_definitions(-DMT32EMU_WITH_LIBSOXR_RESAMPLER)
set(libmt32emu_EXT_LIBS ${libmt32emu_EXT_LIBS} ${LIBSOXR_LIBRARY})
include_directories(${LIBSOXR_INCLUDE_DIR})
set(${PROJECT_NAME}_SOURCES ${${PROJECT_NAME}_SOURCES}
src/srchelper/SoxrAdapter.cpp
)
else(LIBSOXR_FOUND)
message(STATUS "Could NOT find libsoxr")
# Try Samplerate if SOXR is unavailable
find_package(LibSamplerate)
if(LIBSAMPLERATE_FOUND)
set(libmt32emu_PC_REQUIRES_PRIVATE "samplerate >= 0.1.8")
add_definitions(-DMT32EMU_WITH_LIBSAMPLERATE_RESAMPLER)
set(libmt32emu_EXT_LIBS ${libmt32emu_EXT_LIBS} ${LIBSAMPLERATE_LIBRARY})
include_directories(${LIBSAMPLERATE_INCLUDE_DIR})
set(${PROJECT_NAME}_SOURCES ${${PROJECT_NAME}_SOURCES}
src/srchelper/SamplerateAdapter.cpp
)
else(LIBSAMPLERATE_FOUND)
message(STATUS "Could NOT find libsamplerate")
endif(LIBSAMPLERATE_FOUND)
endif(LIBSOXR_FOUND)
endif(${PROJECT_NAME}_WITH_INTERNAL_RESAMPLER)
configure_file("src/mt32emu.pc.in" "mt32emu.pc" @ONLY)
add_library(mt32emu ${libmt32emu_BUILD_TYPE} ${libmt32emu_SOURCES})
if(libmt32emu_EXT_LIBS)
if(libmt32emu_SHARED)
target_link_libraries(mt32emu
${libmt32emu_EXT_LIBS}
)
unset(MT32EMU_EXT_LIBS CACHE)
else(libmt32emu_SHARED)
# Locations are exported for the benefit of a higher-level CMakeLists.txt.
# This is irrelevant if compiling stand-alone.
set(MT32EMU_EXT_LIBS ${libmt32emu_EXT_LIBS} CACHE FILEPATH "")
endif(libmt32emu_SHARED)
endif(libmt32emu_EXT_LIBS)
set_target_properties(mt32emu
PROPERTIES VERSION ${libmt32emu_VERSION}
SOVERSION ${libmt32emu_VERSION_MAJOR}
)
if(libmt32emu_SHARED AND CMAKE_SYSTEM_NAME STREQUAL Windows)
set_target_properties(mt32emu
PROPERTIES RUNTIME_OUTPUT_NAME mt32emu-${libmt32emu_VERSION_MAJOR}
)
endif()
if(libmt32emu_PACKAGE_TYPE STREQUAL "Runtime")
if(libmt32emu_SHARED)
install(TARGETS mt32emu
LIBRARY DESTINATION ${LIB_INSTALL_DIR} NAMELINK_SKIP
RUNTIME DESTINATION bin
)
endif()
elseif(libmt32emu_PACKAGE_TYPE STREQUAL "Devel")
if(WIN32 OR CYGWIN)
install(TARGETS mt32emu ARCHIVE DESTINATION ${LIB_INSTALL_DIR})
else()
install(TARGETS mt32emu LIBRARY DESTINATION ${LIB_INSTALL_DIR} NAMELINK_ONLY)
endif()
else()
install(TARGETS mt32emu
ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
LIBRARY DESTINATION ${LIB_INSTALL_DIR}
RUNTIME DESTINATION bin
)
endif()
if(NOT libmt32emu_PACKAGE_TYPE STREQUAL "Runtime")
install(DIRECTORY
"${CMAKE_CURRENT_BINARY_DIR}/include/mt32emu"
DESTINATION include
)
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/include/mt32emu.h
DESTINATION include
)
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/mt32emu.pc
DESTINATION ${libmt32emu_PKGCONFIG_INSTALL_PREFIX}/pkgconfig
)
endif()
if(NOT(libmt32emu_SHARED AND libmt32emu_PACKAGE_TYPE STREQUAL "Devel"))
install(FILES
AUTHORS.txt COPYING.txt COPYING.LESSER.txt NEWS.txt README.md TODO.txt
DESTINATION share/doc/munt/libmt32emu
)
endif()
# Locations are exported for the benefit of a higher-level CMakeLists.txt.
# These lines are irrelevant if compiling stand-alone.
set(MT32EMU_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/include" CACHE PATH "")
set(MT32EMU_LIBRARY $<TARGET_LINKER_FILE:mt32emu> CACHE FILEPATH "")
# build a CPack driven installer package
set(CPACK_PACKAGE_VERSION_MAJOR "${libmt32emu_VERSION_MAJOR}")
set(CPACK_PACKAGE_VERSION_MINOR "${libmt32emu_VERSION_MINOR}")
set(CPACK_PACKAGE_VERSION_PATCH "${libmt32emu_VERSION_PATCH}")
set(CPACK_PACKAGE_VENDOR "muntemu.org")
set(CPACK_PACKAGE_CONTACT "sergm@muntemu.org")
set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/../FreeBSD/usr/ports/audio/libmt32emu/pkg-descr")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY ${libmt32emu_DESCRIPTION})
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/COPYING.LESSER.txt")
set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/README.md")
# The default package file name has "-${CPACK_SYSTEM_NAME}" at the end, which doesn't match our previous releases
set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${libmt32emu_VERSION}")
set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_FILE_NAME}")
set(CPACK_SOURCE_GENERATOR TGZ)
set(CPACK_SOURCE_STRIP_FILES TRUE)
set(CPACK_RPM_PACKAGE_GROUP "Audio/Emulators")
set(CPACK_RPM_PACKAGE_LICENSE "LGPLv2.1+")
set(CPACK_RPM_PACKAGE_URL ${libmt32emu_URL})
# Normally, pkgconfig files are installed into the system directory that should pre-exist on the target system,
# and hence cause conflict if not excluded
set(CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION /usr/${libmt32emu_PKGCONFIG_INSTALL_PREFIX}/pkgconfig)
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS "ON")
set(CPACK_DEBIAN_PACKAGE_HOMEPAGE ${libmt32emu_URL})
set(CPACK_DEBIAN_PACKAGE_SECTION "sound")
if(libmt32emu_SHARED AND libmt32emu_PACKAGE_TYPE STREQUAL "Devel")
set(CPACK_RPM_PACKAGE_NAME "${CMAKE_PROJECT_NAME}-devel")
set(CPACK_RPM_FILE_NAME "${CPACK_RPM_PACKAGE_NAME}-${libmt32emu_VERSION}.rpm")
set(CPACK_DEBIAN_PACKAGE_NAME "${CMAKE_PROJECT_NAME}-dev")
set(CPACK_DEBIAN_FILE_NAME "${CPACK_DEBIAN_PACKAGE_NAME}-${libmt32emu_VERSION}.deb")
endif()
include(CPack)