summaryrefslogtreecommitdiffstats
path: root/CMakeLists.txt
diff options
context:
space:
mode:
authorJan Holthuis <jan.holthuis@ruhr-uni-bochum.de>2021-03-17 22:01:30 +0100
committerJan Holthuis <jan.holthuis@ruhr-uni-bochum.de>2021-03-18 00:53:19 +0100
commitbd9e196c9bd032a7633d8f20326097acf210b645 (patch)
tree9c56418c40cae7faf2d56f7c5cd1c2ea684b96dd /CMakeLists.txt
parentc49b9a6a6fd598d9566b7101cf3d571fa96bd2e9 (diff)
CMake: Use default_option instead of cmake_dependent_option for defaults
Before, we often used `cmake_dependent_option` for options depending on the availability of dependencies. However, this is not the proper way to use that macro, because if the dependencies is missing, it will forcibly set the option to off and not cause a warning if the user tries to set it to on. `cmake_dependent_option` should only be used for disabling options based on the platform, where that option will never be available, not based on dependencies that may be present or not. Instead, this adds a new macro `default_option` that allows to provide a default depending on the value of other variables/options. The user may still override that default and will run into an error message in that case. From the user's perspective this is preferable instead of silently dropping the option, because then the user will only notice afterwards that some functionality is missing (despite setting the corresponding feature flag `-DUSE_FOO=ON` on the command line).
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r--CMakeLists.txt162
1 files changed, 82 insertions, 80 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0ed21cf49e..fd2a8c8844 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -32,6 +32,13 @@ if(POLICY CMP0069)
cmake_policy(SET CMP0069 NEW)
endif()
+list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules")
+include(CMakeDependentOption)
+include(CheckSymbolExists)
+include(ExternalProject)
+include(GNUInstallDirs)
+include(DefaultOption)
+
#######################################################################
# Compilers and toolchains
@@ -62,20 +69,22 @@ endif()
set(CMAKE_CXX_STANDARD 17)
# Speed up builds on HDDs and prevent wearing of SDDs
-if(GNU_GCC OR LLVM_CLANG)
- option(BUILD_LOW_MEMORY "Store temporary build files on disk by disabling the build option -pipe" OFF)
- if(NOT BUILD_LOW_MEMORY)
- add_compile_options(-pipe)
- endif()
+#
+# This is only applies to gcc/clang, therefore this option is forcibly set on on
+# all other compilers.
+cmake_dependent_option(BUILD_LOW_MEMORY "Store temporary build files on disk by disabling the build option -pipe" OFF "GNU_GCC OR LLVM_CLANG" ON)
+if(NOT BUILD_LOW_MEMORY)
+ add_compile_options(-pipe)
endif()
# Profiling
-if(UNIX AND NOT APPLE)
- option(PROFILING "Profiling (e.g. gprof) support" OFF)
- if(PROFILING)
- add_compile_options(-pg)
- add_link_options(-pg)
- endif()
+#
+# This is only available on Linux, therefore this option is forcibly set off on
+# all other platforms.
+cmake_dependent_option(PROFILING "Profiling (e.g. gprof) support" OFF "UNIX;NOT APPLE" OFF)
+if(PROFILING)
+ add_compile_options(-pg)
+ add_link_options(-pg)
endif()
#
@@ -300,13 +309,6 @@ elseif(GNU_GCC OR LLVM_CLANG)
endif()
endif()
-include(CMakeDependentOption)
-include(CheckSymbolExists)
-include(ExternalProject)
-include(GNUInstallDirs)
-
-list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules")
-
if(WIN32)
# Add support for lib prefix on Windows
set(CMAKE_FIND_LIBRARY_PREFIXES "" "lib")
@@ -369,7 +371,7 @@ if(MSVC)
else()
message(STATUS "Could NOT find sccache (missing executable)")
endif()
- cmake_dependent_option(SCCACHE_SUPPORT "Enable sccache support" ON "SCCACHE_EXECUTABLE" OFF)
+ default_option(SCCACHE_SUPPORT "Enable sccache support" "SCCACHE_EXECUTABLE")
message(STATUS "Support for sccache: ${SCCACHE_SUPPORT}")
if(SCCACHE_SUPPORT)
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "sccache")
@@ -382,7 +384,7 @@ else()
else()
message(STATUS "Could NOT find ccache (missing executable)")
endif()
- cmake_dependent_option(CCACHE_SUPPORT "Enable ccache support" ON "CCACHE_EXECUTABLE" OFF)
+ default_option(CCACHE_SUPPORT "Enable ccache support" "CCACHE_EXECUTABLE")
if(CCACHE_SUPPORT)
if(GNU_GCC OR LLVM_CLANG)
# without this compiler messages in `make` backend would be uncolored
@@ -1090,12 +1092,10 @@ target_compile_definitions(mixxx-lib PUBLIC
)
# Mac-specific options
-if(APPLE)
- option(MACOS_BUNDLE "Install files to proper locations to make an .app bundle" OFF)
- option(MACAPPSTORE "Build for Mac App Store" OFF)
- if(MACAPPSTORE)
- target_compile_definitions(mixxx-lib PUBLIC __MACAPPSTORE__)
- endif()
+cmake_dependent_option(MACOS_BUNDLE "Install files to proper locations to make an .app bundle" OFF "APPLE" OFF)
+cmake_dependent_option(MACAPPSTORE "Build for Mac App Store" OFF "APPLE" OFF)
+if(MACAPPSTORE)
+ target_compile_definitions(mixxx-lib PUBLIC __MACAPPSTORE__)
endif()
# Windows-specific options
@@ -1685,7 +1685,7 @@ endif()
# Ebur128
find_package(Ebur128)
-cmake_dependent_option(EBUR128_STATIC "Link libebur128 statically" OFF "Ebur128_FOUND" ON)
+default_option(EBUR128_STATIC "Link libebur128 statically" "NOT Ebur128_FOUND")
if(EBUR128_STATIC)
message(STATUS "Preparing internal Ebur128")
set(EBUR128_CMAKE_ARGS "-DBUILD_STATIC_LIBS=ON")
@@ -2104,7 +2104,7 @@ endif()
# SoundTouch
find_package(SoundTouch)
-cmake_dependent_option(SoundTouch_STATIC "Link libSoundTouch statically" OFF "SoundTouch_FOUND" ON)
+default_option(SoundTouch_STATIC "Link libSoundTouch statically" "NOT SoundTouch_FOUND")
if(SoundTouch_STATIC)
message(STATUS "Preparing internal libSoundTouch")
add_library(SoundTouch STATIC EXCLUDE_FROM_ALL
@@ -2176,6 +2176,9 @@ endif()
#
# Battery meter
+#
+# The battery meter is only available on Linux, macOS and Windows, therefore
+# this option is forcibly set off on all other platforms.
cmake_dependent_option(BATTERY "Battery meter support" ON "WIN32 OR UNIX" OFF)
if(BATTERY)
if(WIN32)
@@ -2236,6 +2239,9 @@ if(NOT CLANG_SANITIZERS STREQUAL "")
endif()
# CoreAudio MP3/AAC Decoder
+#
+# The CoreAudio API is only available on macOS, therefore
+# this option is forcibly set off on all other platforms.
cmake_dependent_option(COREAUDIO "CoreAudio MP3/AAC Decoder" ON "APPLE" OFF)
if(COREAUDIO)
target_sources(mixxx-lib PRIVATE
@@ -2252,14 +2258,9 @@ endif()
# FAAD AAC audio file decoder plugin
find_package(MP4)
find_package(MP4v2)
-# It is enabled by default on Linux only, because other targets have other solutions.
-# Used FAAD_DEFAULT because the complex expression is not supported by cmake_dependent_option()
-if(UNIX AND NOT APPLE AND (MP4_FOUND OR MP4v2_FOUND))
- set(FAAD_DEFAULT TRUE)
-else()
- set(FAAD_DEFAULT FALSE)
-endif()
-cmake_dependent_option(FAAD "FAAD AAC audio file decoder support" ON "FAAD_DEFAULT" OFF)
+# It is enabled by default on Linux only, because other targets have other
+# solutions. It requires MP4 or MP4v2.
+default_option(FAAD "FAAD AAC audio file decoder support" "UNIX;NOT APPLE;(MP4_FOUND OR MP4v2_FOUND)")
if(FAAD)
if(NOT MP4_FOUND AND NOT MP4v2_FOUND)
message(FATAL_ERROR "FAAD AAC audio support requires libmp4 or libmp4v2 with development headers.")
@@ -2301,7 +2302,7 @@ endif()
# FFmpeg 4.x support
# FFmpeg is multimedia library that can be found http://ffmpeg.org/
find_package(FFMPEG COMPONENTS libavcodec libavformat libavutil libswresample)
-cmake_dependent_option(FFMPEG "FFmpeg 4.x support" ON "FFMPEG_FOUND" OFF)
+default_option(FFMPEG "FFmpeg 4.x support" "FFMPEG_FOUND")
if(FFMPEG)
if(NOT FFMPEG_FOUND)
message(FATAL_ERROR "FFMPEG was not found")
@@ -2349,27 +2350,30 @@ if(GPERFTOOLS OR GPERFTOOLSPROFILER)
endif()
# HSS1394 MIDI device
+#
+# The HSS1394 library is only available on macOS, therefore this option is
+# forcibly set off on all other platforms.
if(WIN32 OR APPLE)
find_package(HSS1394)
- cmake_dependent_option(HSS1394 "HSS1394 MIDI device support" ON "HSS1394_FOUND;WIN32 OR APPLE" OFF)
- if(HSS1394)
- target_sources(mixxx-lib PRIVATE
- src/controllers/midi/hss1394controller.cpp
- src/controllers/midi/hss1394enumerator.cpp
- )
- target_compile_definitions(mixxx-lib PUBLIC __HSS1394__)
- if(WIN32 OR APPLE)
- if(NOT HSS1394_FOUND)
- message(FATAL_ERROR "HSS1394 MIDI device support requires the libhss1394 and its development headers.")
- endif()
- target_link_libraries(mixxx-lib PUBLIC HSS1394::HSS1394)
- endif()
+else()
+ set(HSS1394 OFF)
+endif()
+cmake_dependent_option(HSS1394 "HSS1394 MIDI device support" "${HSS1394_FOUND}" "WIN32 OR APPLE" OFF)
+if(HSS1394)
+ target_sources(mixxx-lib PRIVATE
+ src/controllers/midi/hss1394controller.cpp
+ src/controllers/midi/hss1394enumerator.cpp
+ )
+ target_compile_definitions(mixxx-lib PUBLIC __HSS1394__)
+ if(NOT HSS1394_FOUND)
+ message(FATAL_ERROR "HSS1394 MIDI device support requires the libhss1394 and its development headers.")
endif()
+ target_link_libraries(mixxx-lib PUBLIC HSS1394::HSS1394)
endif()
# Lilv (LV2)
find_package(lilv)
-cmake_dependent_option(LILV "Lilv (LV2) support" ON "lilv_FOUND" OFF)
+default_option(LILV "Lilv (LV2) support" "lilv_FOUND")
if(LILV)
if(NOT TARGET lilv::lilv)
message(FATAL_ERROR "Lilv (LV2) support requires the liblilv-0 and its development headers.")
@@ -2416,10 +2420,10 @@ endif()
# Locale Aware Compare for SQLite
find_package(SQLite3)
-# FIXME
-# It is difficult to get qmake to link Qt to a custom built SQLite on macOS instead of the system SQLite,
-# which results in a crash on startup when LOCALECOMPARE is enabled.
-cmake_dependent_option(LOCALECOMPARE "Locale Aware Compare support for SQLite" ON "SQLite3_FOUND AND NOT APPLE" OFF)
+# FIXME: It is difficult to get qmake to link Qt to a custom built SQLite on
+# macOS instead of the system SQLite, which results in a crash on startup when
+# LOCALECOMPARE is enabled, therefore this option is forcibly set off on macOS.
+cmake_dependent_option(LOCALECOMPARE "Locale Aware Compare support for SQLite" "${SQLite3_FOUND}" "NOT APPLE" OFF)
if(LOCALECOMPARE)
if(NOT SQLite3_FOUND)
message(FATAL_ERROR "Locale Aware Compare for SQLite requires libsqlite and its development headers.")
@@ -2431,7 +2435,7 @@ endif()
# Opus (RFC 6716)
find_package(Opus)
-cmake_dependent_option(OPUS "Opus (RFC 6716) support" ON "Opus_FOUND" OFF)
+default_option(OPUS "Opus (RFC 6716) support" "Opus_FOUND")
if(OPUS)
if(NOT Opus_FOUND)
message(FATAL_ERROR "Opus support requires libopus and libopusfile with development headers.")
@@ -2462,7 +2466,7 @@ endif()
# MAD MP3 Decoder
find_package(MAD)
find_package(ID3Tag)
-cmake_dependent_option(MAD "MAD MP3 Decoder" ON "MAD_FOUND;ID3Tag_FOUND" OFF)
+default_option(MAD "MAD MP3 Decoder" "MAD_FOUND;ID3Tag_FOUND")
if(MAD)
if(NOT MAD_FOUND)
message(FATAL_ERROR "MAD support requires libmad and its development headers.")
@@ -2476,29 +2480,27 @@ if(MAD)
endif()
# Media Foundation AAC Decoder Plugin
-if(WIN32)
- find_package(MediaFoundation)
- cmake_dependent_option(MEDIAFOUNDATION "Media Foundation AAC decoder plugin" ON "MediaFoundation_FOUND" OFF)
- if(MEDIAFOUNDATION)
- if(NOT MediaFoundation_FOUND)
- message(FATAL_ERROR "MediaFoundation support requires the MediaFoundation libraries and its development headers.")
- endif()
- target_sources(mixxx-lib PRIVATE
- src/sources/soundsourcemediafoundation.cpp
- )
- target_compile_definitions(mixxx-lib PUBLIC __MEDIAFOUNDATION__)
- target_include_directories(mixxx-lib SYSTEM PRIVATE
- ${MediaFoundation_INCLUDE_DIRS}
- )
- target_link_libraries(mixxx-lib PUBLIC
- ${MediaFoundation_LIBRARIES}
- )
- endif()
+#
+# The Media Foundtation API is only available on Windows, therefore this option
+# is forcibly set off on all other platforms.
+cmake_dependent_option(MEDIAFOUNDATION "Media Foundation AAC decoder plugin" ON "WIN32" OFF)
+if(MEDIAFOUNDATION)
+ find_package(MediaFoundation REQUIRED)
+ target_sources(mixxx-lib PRIVATE
+ src/sources/soundsourcemediafoundation.cpp
+ )
+ target_compile_definitions(mixxx-lib PUBLIC __MEDIAFOUNDATION__)
+ target_include_directories(mixxx-lib SYSTEM PRIVATE
+ ${MediaFoundation_INCLUDE_DIRS}
+ )
+ target_link_libraries(mixxx-lib PUBLIC
+ ${MediaFoundation_LIBRARIES}
+ )
endif()
# Modplug support
find_package(Modplug)
-cmake_dependent_option(MODPLUG "Modplug module decoder support" ON "Modplug_FOUND" OFF)
+default_option(MODPLUG "Modplug module decoder support" "Modplug_FOUND")
if(MODPLUG)
if(NOT Modplug_FOUND)
message(FATAL_ERROR "Modplug module decoder support requires libmodplug and its development headers.")
@@ -2530,7 +2532,7 @@ find_package(LibUSB)
# USB HID controller support
find_package(hidapi)
option(HID "USB HID controller support" ON)
-cmake_dependent_option(HIDAPI_STATIC "Link HIDAPI library statically" OFF "HIDAPI_FOUND" ON)
+default_option(HIDAPI_STATIC "Link HIDAPI library statically" "NOT HIDAPI_FOUND")
if(HID)
target_sources(mixxx-lib PRIVATE
src/controllers/hid/hidcontroller.cpp
@@ -2571,7 +2573,7 @@ if(HID)
endif()
# USB Bulk controller support
-cmake_dependent_option(BULK "USB Bulk controller support" ON "LibUSB_FOUND" OFF)
+default_option(BULK "USB Bulk controller support" "LibUSB_FOUND")
if(BULK)
if(NOT LibUSB_FOUND)
message(FATAL_ERROR "USB Bulk controller support requires libusb 1.0 and its development headers.")
@@ -2591,7 +2593,7 @@ if(BULK)
endif()
# Vinyl Control
-cmake_dependent_option(VINYLCONTROL "Vinyl Control support" ON "NOT MACAPPSTORE" OFF)
+default_option(VINYLCONTROL "Vinyl Control support" "NOT MACAPPSTORE")
if(VINYLCONTROL)
if(MACAPPSTORE)
message(FATAL_ERROR "Mac App Store and Vinyl Control support are mutually exclusive due to licensing issues.")
@@ -2622,7 +2624,7 @@ endif()
# WavPack audio file support
find_package(wavpack)
-cmake_dependent_option(WAVPACK "WavPack audio file support" ON "wavpack_FOUND" OFF)
+default_option(WAVPACK "WavPack audio file support" "wavpack_FOUND")
if(WAVPACK)
if(NOT wavpack_FOUND)
message(FATAL_ERROR "WavPack audio file support requires libwv and its development headers.")