openmohaa/code/libmad/CMakeLists.txt
smallmodel eac8580f64
Add libmad 0.16.4
This new version introduces patches against crashes and exploits. CMake is also fully supported and platforms are properly detected so architecture specific optimizations are used.

To use it, USE_SOUND_NEW must be non-zero when configuring the project
2024-07-11 23:04:04 +02:00

240 lines
6.8 KiB
CMake

cmake_minimum_required(VERSION 3.1.0)
project(mad VERSION 0.16.4)
option(BUILD_SHARED_LIBS "Build dynamic library" ON)
# The library SOVERSION. This is set to 0 for backward compatibility.
# The general policy is that minor versions of the library (e.g., 0.16.1,
# 0.16.2) don't constitute a major ABI breakage. Major versions (e.g., 0.17,
# 0.18) do.
set(LIBRARY_SOVERSION 0)
include(GNUInstallDirs)
include(CheckTypeSize)
#
# Build
#
add_library(mad
bit.c
decoder.c
fixed.c
frame.c
huffman.c
layer12.c
layer3.c
stream.c
synth.c
timer.c
version.c
)
target_include_directories(mad PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)
if(WIN32 AND BUILD_SHARED_LIBS)
set_target_properties(mad PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON)
endif()
set_target_properties(mad PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION ${LIBRARY_SOVERSION}
)
#
# Compile definitions
#
option(OPTIMIZE "Optimize for SPEED (default) or ACCURACY" SPEED)
if(OPTIMIZE STREQUAL "SPEED")
message(STATUS "Optimizing for speed over accuracy.")
target_compile_definitions(mad PRIVATE OPT_SPEED)
else()
message(STATUS "Optimizing for accuracy over speed.")
target_compile_definitions(mad PRIVATE OPT_ACCURACY)
endif()
option(ASO "Enable CPU Architecture Specific Optimizations (x86, ARM, and MIPS only)" ON)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
message(STATUS "Using 64 bit fixed point math")
option(FPM_64BIT "64 bit fixed point math" ON)
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86" OR "i386")
message(STATUS "Using x86 fixed point math")
option (FPM_INTEL "x86 fixed point math" ON)
if(ASO)
target_compile_definitions(mad PRIVATE ASO_ZEROCHECK)
endif()
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES ".*(arm|ARM).*")
message(STATUS "Using ARM fixed point math")
option (FPM_ARM "ARM fixed point math" ON)
if(ASO)
enable_language(ASM)
target_compile_definitions(mad PRIVATE ASO_INTERLEAVE1 ASO_IMDCT)
target_sources(mad PRIVATE imdct_l_arm.S)
endif()
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES ".*(mips|MIPS).*")
message(STATUS "Using MIPS fixed point math")
option(FPM_MIPS "MIPS fixed point math" ON)
if(ASO)
target_compile_definitions(mad PRIVATE ASO_INTERLEAVE2 ASO_ZEROCHECK)
endif()
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES ".*(sparc|SPARC).*")
message(STATUS "Using SPARC fixed point math")
option(FPM_SPARC "SPARC fixed point math" ON)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES ".(ppc|PPC|powerpc).*")
message(STATUS "Using PowerPC fixed point math")
option(FPM_PPC "PowerPC fixed point math" ON)
else()
message(WARNING "Target CPU architecture not detected. Fixed-point math will yield limited accuracy.")
option(FPM_DEFAULT "Generic fixed-point math" ON)
endif()
check_type_size(int SIZEOF_INT BUILTIN_TYPES_ONLY LANGUAGE C)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/mad.h.in ${CMAKE_CURRENT_BINARY_DIR}/mad.h @ONLY)
include(CheckIncludeFile)
check_include_file(sys/types.h HAVE_SYS_TYPES_H)
if(HAVE_SYS_TYPES_H)
target_compile_definitions(mad PRIVATE HAVE_SYS_TYPES_H)
endif()
check_include_file(sys/wait.h HAVE_SYS_WAIT_H)
if(HAVE_SYS_WAIT_H)
target_compile_definitions(mad PRIVATE HAVE_SYS_WAIT_H)
endif()
check_include_file(sys/mman.h HAVE_SYS_MMAN_H)
if(HAVE_SYS_MMAN_H)
target_compile_definitions(mad PRIVATE HAVE_SYS_MMAN_H)
endif()
check_include_file(sys/stat.h HAVE_SYS_STAT_H)
if(HAVE_SYS_STAT_H)
target_compile_definitions(mad PRIVATE HAVE_SYS_STAT_H)
endif()
check_include_file(unistd.h HAVE_UNISTD_H)
if(HAVE_UNISTD_H)
target_compile_definitions(mad PRIVATE HAVE_UNISTD_H)
endif()
check_include_file(assert.h HAVE_ASSERT_H)
if(HAVE_ASSERT_H)
target_compile_definitions(mad PRIVATE HAVE_ASSERT_H)
endif()
check_include_file(fcntl.h HAVE_FCNTL_H)
if(HAVE_FCNTL_H)
target_compile_definitions(mad PRIVATE HAVE_FCNTL_H)
endif()
check_include_file(limits.h HAVE_LIMITS_H)
if(HAVE_LIMITS_H)
target_compile_definitions(mad PRIVATE HAVE_LIMITS_H)
endif()
include(CheckFunctionExists)
check_function_exists(ftruncate HAVE_FTRUNCATE)
if(HAVE_FTRUNCATE)
target_compile_definitions(mad PRIVATE HAVE_FTRUNCATE)
endif()
check_function_exists(pipe HAVE_PIPE)
if(HAVE_PIPE)
target_compile_definitions(mad PRIVATE HAVE_PIPE)
endif()
check_function_exists(fork HAVE_FORK)
if(HAVE_FORK)
target_compile_definitions(mad PRIVATE HAVE_FORK)
endif()
check_function_exists(waitpid HAVE_WAITPID)
if(HAVE_WAITPID)
target_compile_definitions(mad PRIVATE HAVE_WAITPID)
endif()
option(MADD_ASM "Enable if your MIPS CPU supports a 2-operand MADD instruction." OFF)
if(MADD_ASM)
target_compile_definitions(mad PRIVATE HAVE_MADD_ASM)
endif()
option(MADD16_ASM "Enable if your MIPS CPU supports a 2-operand MADD16 instruction." OFF)
if(MADD16_ASM)
target_compile_definitions(mad PRIVATE HAVE_MADD_ASM)
endif()
#
# Example application
#
include(CMakeDependentOption)
cmake_dependent_option(EXAMPLE "Build example executable" ON "HAVE_UNISTD_H;HAVE_SYS_STAT_H;HAVE_SYS_MMAN_H" OFF)
if(EXAMPLE)
add_executable(mad_example minimad.c)
target_link_libraries(mad_example PRIVATE mad)
endif()
#
# Installation
#
include(CMakePackageConfigHelpers)
# Library files
install(TARGETS mad
EXPORT madTargets
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
)
# Header files
install(
FILES "${CMAKE_CURRENT_BINARY_DIR}/mad.h"
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
)
# pkgconfig
if(IS_ABSOLUTE "${CMAKE_INSTALL_LIBDIR}")
set(PKGCONFIG_LIBDIR "${CMAKE_INSTALL_LIBDIR}")
else()
set(PKGCONFIG_LIBDIR "\${prefix}/${CMAKE_INSTALL_LIBDIR}")
endif()
if(IS_ABSOLUTE "${CMAKE_INSTALL_INCLUDEDIR}")
set(PKGCONFIG_INCLUDEDIR "${CMAKE_INSTALL_INCLUDEDIR}")
else()
set(PKGCONFIG_INCLUDEDIR "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
endif()
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/packaging/mad.pc.in
${CMAKE_CURRENT_BINARY_DIR}/packaging/mad.pc @ONLY)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/packaging/mad.pc DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
# CMake config
set(MAD_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/mad")
install(
EXPORT madTargets
FILE madTargets.cmake
NAMESPACE mad::
DESTINATION "${MAD_INSTALL_CMAKEDIR}"
)
configure_package_config_file(packaging/madConfig.cmake.in
"${CMAKE_CURRENT_BINARY_DIR}/packaging/madConfig.cmake"
INSTALL_DESTINATION "${MAD_INSTALL_CMAKEDIR}"
)
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/packaging/madConfigVersion.cmake"
VERSION "${PROJECT_VERSION}"
COMPATIBILITY SameMajorVersion
)
install(
FILES
"${CMAKE_CURRENT_BINARY_DIR}/packaging/madConfig.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/packaging/madConfigVersion.cmake"
DESTINATION "${MAD_INSTALL_CMAKEDIR}"
)