303 lines
9.7 KiB
CMake
303 lines
9.7 KiB
CMake
# ########## Project setup ##########
|
|
PROJECT(wildmidi C)
|
|
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.11)
|
|
|
|
# WildMIDI Version
|
|
SET(VERSION_MAJOR 0)
|
|
SET(VERSION_MINOR 4)
|
|
SET(VERSION_RELEASE 3)
|
|
SET(WILDMIDI_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_RELEASE}")
|
|
|
|
# Lib Versions
|
|
SET(SOVERSION 2)
|
|
SET(VERSION 2.1.0)
|
|
|
|
# Find Macros
|
|
SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
|
|
|
|
INCLUDE(CMakeDependentOption)
|
|
INCLUDE(CheckCCompilerFlag)
|
|
INCLUDE(CheckCSourceCompiles)
|
|
INCLUDE(CheckIncludeFile)
|
|
INCLUDE(TestBigEndian)
|
|
|
|
# Set a default build type if none was specified
|
|
IF (NOT DEFINED CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE STREQUAL "")
|
|
MESSAGE(STATUS "Setting build type to 'Debug' as none was specified.")
|
|
SET(CMAKE_BUILD_TYPE Debug CACHE STRING "Choose the type of build." FORCE)
|
|
# Set the possible values of build type for cmake-gui
|
|
SET_PROPERTY(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
|
|
ENDIF ()
|
|
SET(CMAKE_CONFIGURATION_TYPES "${CMAKE_BUILD_TYPE}")
|
|
MESSAGE(STATUS "Build Type: ${CMAKE_BUILD_TYPE}")
|
|
|
|
# Set our options
|
|
OPTION(BUILD_SHARED_LIBS "Build a dynamic wildmidi library" ON)
|
|
OPTION(WANT_PLAYER "Build WildMIDI player in addition to the libraries" ON)
|
|
OPTION(WANT_STATIC "Build static library in addition to dynamic library" OFF)
|
|
CMAKE_DEPENDENT_OPTION(WANT_PLAYERSTATIC "Build a statically linked WildMIDI player" ON "WANT_STATIC;WANT_PLAYER" OFF)
|
|
OPTION(WANT_ALSA "Include ALSA (Advanced Linux Sound Architecture) support" OFF)
|
|
OPTION(WANT_OSS "Include OSS (Open Sound System) support" OFF)
|
|
OPTION(WANT_OPENAL "Include OpenAL (Cross Platform) support" OFF)
|
|
OPTION(WANT_DEVTEST "Build WildMIDI DevTest file to check files" OFF)
|
|
OPTION(WANT_OSX_DEPLOYMENT "OSX Deployment" OFF)
|
|
IF (WIN32 AND MSVC)
|
|
OPTION(WANT_MP_BUILD "Build with Multiple Processes (/MP)" OFF)
|
|
ENDIF ()
|
|
IF (UNIX AND NOT APPLE AND NOT RISCOS)
|
|
SET(WILDMIDI_CFG "/etc/wildmidi/wildmidi.cfg" CACHE STRING "default config location")
|
|
ELSE ()
|
|
SET(WILDMIDI_CFG "wildmidi.cfg" CACHE STRING "default config location")
|
|
ENDIF ()
|
|
|
|
IF ((NOT BUILD_SHARED_LIBS) AND (NOT WANT_STATIC))
|
|
MESSAGE(FATAL_ERROR "Neither dynamic nor static library build is selected.")
|
|
ENDIF ()
|
|
|
|
|
|
# Platform specific defines
|
|
IF (UNIX)
|
|
# allow 'large' files in 32 bit builds
|
|
ADD_DEFINITIONS(
|
|
-D_LARGEFILE_SOURCE
|
|
-D_FILE_OFFSET_BITS=64
|
|
-D_LARGE_FILES
|
|
)
|
|
ENDIF (UNIX)
|
|
|
|
# Usage of RPATH for macOS is enabled by default; this just suppresses the CMP0042 warning
|
|
# when building libwildmidi_dynamic.
|
|
IF (POLICY CMP0042)
|
|
CMAKE_POLICY(SET CMP0042 NEW)
|
|
ENDIF ()
|
|
|
|
IF (OPENBSD) # Set RPATH for OpenBSD so WildMIDI can find libWildMidi.so
|
|
# use, i.e. don't skip the full RPATH for the build tree
|
|
SET(CMAKE_SKIP_BUILD_RPATH FALSE)
|
|
|
|
# when building, don't use the install RPATH already
|
|
# (but later on when installing)
|
|
SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
|
|
|
|
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
|
|
|
|
# add the automatically determined parts of the RPATH
|
|
# which point to directories outside the build tree to the install RPATH
|
|
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
|
|
|
|
# the RPATH to be used when installing, but only if it's not a system directory
|
|
LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir)
|
|
IF ("${isSystemDir}" STREQUAL "-1")
|
|
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
|
|
ENDIF ()
|
|
ENDIF (OPENBSD)
|
|
|
|
IF (WIN32)
|
|
ADD_DEFINITIONS(
|
|
-DNOMINMAX
|
|
-DWIN32_LEAN_AND_MEAN
|
|
-D_CRT_SECURE_NO_WARNINGS
|
|
)
|
|
ENDIF (WIN32)
|
|
|
|
# Compiler specific settings
|
|
IF (CMAKE_COMPILER_IS_GNUCC OR (CMAKE_C_COMPILER_ID MATCHES "Clang"))
|
|
ADD_DEFINITIONS(
|
|
-Wall -W
|
|
-fno-common
|
|
)
|
|
|
|
IF (NOT WIN32 AND NOT CYGWIN)
|
|
SET(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
|
|
SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -Werror")
|
|
CHECK_C_SOURCE_COMPILES("int foo(void) __attribute__((visibility(\"default\")));
|
|
int main(void) {return 0;}" HAVE_VISIBILITY_DEFAULT)
|
|
IF (HAVE_VISIBILITY_DEFAULT)
|
|
CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_HIDDEN)
|
|
ENDIF ()
|
|
SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}")
|
|
ENDIF ()
|
|
|
|
IF (CMAKE_BUILD_TYPE STREQUAL "Debug")
|
|
ADD_DEFINITIONS(-ggdb3 -O0)
|
|
ELSEIF (CMAKE_BUILD_TYPE STREQUAL "Release")
|
|
ADD_DEFINITIONS(-O3)
|
|
ENDIF (CMAKE_BUILD_TYPE STREQUAL "Debug")
|
|
ENDIF ()
|
|
|
|
IF (CMAKE_C_COMPILER_ID MATCHES "SunPro")
|
|
SET(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
|
|
SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -xldscope=hidden")
|
|
# __SUNPRO_C >= 0x590
|
|
# CHECK_C_SOURCE_COMPILES("int foo(void) __attribute__((visibility(\"default\")));
|
|
# int main(void) {return 0;}" HAVE_VISIBILITY_DEFAULT)
|
|
# __SUNPRO_C >= 0x550
|
|
CHECK_C_SOURCE_COMPILES("__global int foo(void);
|
|
int main(void) {return 0;}" HAVE_LDSCOPE_GLOBAL)
|
|
IF (HAVE_LDSCOPE_GLOBAL)# OR HAVE_VISIBILITY_DEFAULT
|
|
SET(HAVE_LDSCOPE_HIDDEN 1)
|
|
ENDIF ()
|
|
SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}")
|
|
ENDIF ()
|
|
|
|
CHECK_C_SOURCE_COMPILES("int main(void) {__builtin_expect(0,0); return 0;}" HAVE___BUILTIN_EXPECT)
|
|
|
|
CHECK_C_SOURCE_COMPILES("static inline int static_foo() {return 0;}
|
|
int main(void) {return 0;}" HAVE_C_INLINE)
|
|
CHECK_C_SOURCE_COMPILES("static __inline__ int static_foo() {return 0;}
|
|
int main(void) {return 0;}" HAVE_C___INLINE__)
|
|
CHECK_C_SOURCE_COMPILES("static __inline int static_foo() {return 0;}
|
|
int main(void) {return 0;}" HAVE_C___INLINE)
|
|
|
|
# we must not have any unresolved symbols:
|
|
if (APPLE)
|
|
SET(EXTRA_LDFLAGS "-Wl,-undefined,error")
|
|
ELSE()
|
|
SET(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
|
|
SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -Wl,--no-undefined")
|
|
CHECK_C_COMPILER_FLAG("" HAVE_NO_UNDEFINED)
|
|
SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}")
|
|
IF (HAVE_NO_UNDEFINED)
|
|
SET(EXTRA_LDFLAGS "-Wl,--no-undefined -lm")
|
|
ELSE()
|
|
SET(EXTRA_LDFLAGS "")
|
|
ENDIF()
|
|
ENDIF()
|
|
|
|
CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
|
|
CHECK_INCLUDE_FILE(inttypes.h HAVE_INTTYPES_H)
|
|
|
|
TEST_BIG_ENDIAN(WORDS_BIGENDIAN)
|
|
|
|
SET(AUDIODRV_ALSA)
|
|
SET(AUDIODRV_OSS)
|
|
SET(AUDIODRV_OPENAL)
|
|
|
|
# UNIX-like environments
|
|
IF (UNIX AND NOT APPLE)
|
|
|
|
# Go looking for available sound packages for WildMIDI player
|
|
IF (WANT_PLAYER)
|
|
FIND_PACKAGE(ALSA)
|
|
FIND_PACKAGE(OpenAL)
|
|
FIND_PACKAGE(OSS)
|
|
|
|
# Set preferred output
|
|
IF (WANT_ALSA)
|
|
IF (NOT ALSA_FOUND)
|
|
MESSAGE(FATAL_ERROR "ALSA required but not found.")
|
|
ENDIF ()
|
|
SET(AUDIODRV_ALSA 1)
|
|
SET(AUDIO_LIBRARY ${ALSA_LIBRARY})
|
|
|
|
ELSEIF (WANT_OSS)
|
|
IF (NOT OSS_FOUND)
|
|
MESSAGE(FATAL_ERROR "OSS required but not found.")
|
|
ENDIF ()
|
|
# no special header paths
|
|
SET(AUDIODRV_OSS 1)
|
|
SET(AUDIO_LIBRARY ${OSS_LIBRARY})
|
|
|
|
ELSEIF (WANT_OPENAL)
|
|
IF (NOT OPENAL_FOUND)
|
|
MESSAGE(FATAL_ERROR "OpenAL required but not found.")
|
|
ENDIF ()
|
|
SET(AUDIODRV_OPENAL 1)
|
|
SET(AUDIO_LIBRARY ${OPENAL_LIBRARY})
|
|
|
|
ELSE () # Try to auto-detect
|
|
|
|
IF (ALSA_FOUND)
|
|
SET(AUDIO_LIBRARY ${ALSA_LIBRARY})
|
|
SET(AUDIODRV_ALSA 1)
|
|
|
|
ELSEIF (OSS_FOUND)
|
|
# no special header paths
|
|
SET(AUDIO_LIBRARY ${OSS_LIBRARY})
|
|
SET(AUDIODRV_OSS 1)
|
|
|
|
ELSEIF (OPENAL_FOUND)
|
|
SET(AUDIO_LIBRARY ${OPENAL_LIBRARY})
|
|
SET(AUDIODRV_OPENAL 1)
|
|
|
|
ELSE ()
|
|
MESSAGE(WARNING "Could not find an audio sub-system!")
|
|
SET(AUDIO_LIBRARY "")
|
|
ENDIF ()
|
|
|
|
ENDIF ()
|
|
ENDIF ()
|
|
|
|
# find our math lib
|
|
FIND_LIBRARY(M_LIBRARY m)
|
|
MESSAGE(STATUS "M_LIBRARY: ${M_LIBRARY}")
|
|
IF (NOT M_LIBRARY)
|
|
SET(M_LIBRARY "")
|
|
ENDIF ()
|
|
|
|
## Debian and non debian Linux building
|
|
IF (DPKG_PROGRAM)
|
|
## Debian specific
|
|
ELSE ()
|
|
## Non debian specific
|
|
ENDIF ()
|
|
ENDIF (UNIX AND NOT APPLE)
|
|
|
|
IF (APPLE AND WANT_PLAYER)
|
|
FIND_PACKAGE(OpenAL)
|
|
|
|
IF (WANT_OPENAL)
|
|
IF (NOT OPENAL_FOUND)
|
|
MESSAGE(FATAL_ERROR "OpenAL required but not found.")
|
|
ENDIF ()
|
|
SET(AUDIO_LIBRARY ${OPENAL_LIBRARY})
|
|
|
|
ELSE ()
|
|
IF (OPENAL_FOUND)
|
|
SET(AUDIO_LIBRARY ${OPENAL_LIBRARY})
|
|
SET(AUDIODRV_OPENAL 1)
|
|
|
|
ELSE ()
|
|
MESSAGE(WARNING "Could not find an audio sub-system!")
|
|
SET(AUDIO_LIBRARY "")
|
|
ENDIF ()
|
|
|
|
ENDIF ()
|
|
ENDIF ()
|
|
|
|
IF (WIN32)
|
|
IF (WANT_PLAYER)
|
|
LINK_LIBRARIES(winmm)
|
|
ENDIF ()
|
|
ENDIF (WIN32)
|
|
|
|
# ######### General setup ##########
|
|
INCLUDE_DIRECTORIES(BEFORE "${CMAKE_SOURCE_DIR}/include")
|
|
FILE(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/include")
|
|
INCLUDE_DIRECTORIES(BEFORE "${CMAKE_BINARY_DIR}/include")
|
|
IF (NOT HAVE_STDINT_H) # AND NOT HAVE_INTTYPES_H
|
|
INCLUDE_DIRECTORIES(BEFORE "${CMAKE_SOURCE_DIR}/include/stdint")
|
|
ENDIF ()
|
|
|
|
IF (AMIGA OR AROS)
|
|
SET(WILDMIDI_AMIGA 1)
|
|
ENDIF ()
|
|
|
|
IF (APPLE)
|
|
SET(APP_BUNDLE_NAME "${CMAKE_PROJECT_NAME}.app")
|
|
SET(APP_BUNDLE_DIR "${wildmidi_BINARY_DIR}/${APP_BUNDLE_NAME}")
|
|
IF (WANT_OSX_DEPLOYMENT)
|
|
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
|
|
ENDIF ()
|
|
ENDIF (APPLE)
|
|
|
|
IF (APPLE)
|
|
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${APP_BUNDLE_DIR}/Contents/MacOS")
|
|
ELSE (APPLE)
|
|
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${wildmidi_BINARY_DIR}")
|
|
ENDIF (APPLE)
|
|
|
|
# Setup up our config file
|
|
CONFIGURE_FILE("${CMAKE_SOURCE_DIR}/include/config.h.cmake" "${CMAKE_BINARY_DIR}/include/config.h")
|
|
|
|
ADD_SUBDIRECTORY(src)
|