/* * BuildSettings.h * --------------- * Purpose: Global, user settable compile time flags (and some global system header configuration) * Notes : (currently none) * Authors: OpenMPT Devs * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. */ #pragma once #include "CompilerDetect.h" // set windows version early so that we can deduce dependencies from SDK version #if MPT_OS_WINDOWS #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0601 // _WIN32_WINNT_WIN7 #endif #ifndef WINVER #define WINVER _WIN32_WINNT #endif #endif // MPT_OS_WINDOWS #if defined(MODPLUG_TRACKER) && defined(LIBOPENMPT_BUILD) #error "either MODPLUG_TRACKER or LIBOPENMPT_BUILD has to be defined" #elif defined(MODPLUG_TRACKER) // nothing #elif defined(LIBOPENMPT_BUILD) // nothing #else #error "either MODPLUG_TRACKER or LIBOPENMPT_BUILD has to be defined" #endif // MODPLUG_TRACKER || LIBOPENMPT_BUILD // wrapper for autoconf macros #if defined(HAVE_CONFIG_H) #include "config.h" // Fixup dependencies which are currently not used in libopenmpt itself #ifdef MPT_WITH_FLAC #undef MPT_WITH_FLAC #endif #endif // HAVE_CONFIG_H // Dependencies from the MSVC build system #if defined(MPT_BUILD_MSVC) // This section defines which dependencies are available when building with // MSVC. Other build systems provide MPT_WITH_* macros via command-line or other // means. // OpenMPT and libopenmpt should compile and run successfully (albeit with // reduced functionality) with any or all dependencies missing/disabled. // The defaults match the bundled third-party libraries with the addition of // ASIO and VST SDKs. #if defined(MODPLUG_TRACKER) #if MPT_OS_WINDOWS #if !defined(MPT_BUILD_WINESUPPORT) #define MPT_WITH_MFC #endif // !MPT_BUILD_WINESUPPORT #endif // MPT_OS_WINDOWS // OpenMPT-only dependencies #if !MPT_MSVC_BEFORE(2019,0) // disabled for VS2017 because of multiple initialization of inline variables // https://developercommunity.visualstudio.com/t/static-inline-variable-gets-destroyed-multiple-tim/297876 #define MPT_WITH_ASIO #endif #define MPT_WITH_DMO #define MPT_WITH_LAME #define MPT_WITH_LHASA #define MPT_WITH_MINIZIP #define MPT_WITH_NLOHMANNJSON #define MPT_WITH_OPUS #define MPT_WITH_OPUSENC #define MPT_WITH_OPUSFILE #define MPT_WITH_PORTAUDIO //#define MPT_WITH_PULSEAUDIO //#define MPT_WITH_PULSEAUDIOSIMPLE #define MPT_WITH_RTAUDIO #define MPT_WITH_SMBPITCHSHIFT #define MPT_WITH_UNRAR #define MPT_WITH_VORBISENC // OpenMPT and libopenmpt dependencies (not for openmp123, player plugins or examples) //#define MPT_WITH_DL #define MPT_WITH_FLAC //#define MPT_WITH_LTDL #if MPT_OS_WINDOWS #define MPT_WITH_MEDIAFOUNDATION #endif //#define MPT_WITH_MINIMP3 //#define MPT_WITH_MINIZ #define MPT_WITH_MPG123 #define MPT_WITH_OGG //#define MPT_WITH_STBVORBIS #define MPT_WITH_VORBIS #define MPT_WITH_VORBISFILE #if MPT_OS_WINDOWS #if (_WIN32_WINNT >= 0x0A00) #define MPT_WITH_WINDOWS10 #endif #endif #define MPT_WITH_ZLIB #endif // MODPLUG_TRACKER #if defined(LIBOPENMPT_BUILD) // OpenMPT and libopenmpt dependencies (not for openmp123, player plugins or examples) #if defined(LIBOPENMPT_BUILD_FULL) && defined(LIBOPENMPT_BUILD_SMALL) #error "only one of LIBOPENMPT_BUILD_FULL or LIBOPENMPT_BUILD_SMALL can be defined" #endif // LIBOPENMPT_BUILD_FULL && LIBOPENMPT_BUILD_SMALL #if defined(LIBOPENMPT_BUILD_SMALL) //#define MPT_WITH_DL //#define MPT_WITH_FLAC //#define MPT_WITH_LTDL //#define MPT_WITH_MEDIAFOUNDATION #define MPT_WITH_MINIMP3 #define MPT_WITH_MINIZ //#define MPT_WITH_MPG123 //#define MPT_WITH_OGG #define MPT_WITH_STBVORBIS //#define MPT_WITH_VORBIS //#define MPT_WITH_VORBISFILE //#define MPT_WITH_ZLIB #else // !LIBOPENMPT_BUILD_SMALL //#define MPT_WITH_DL //#define MPT_WITH_FLAC //#define MPT_WITH_LTDL //#define MPT_WITH_MEDIAFOUNDATION //#define MPT_WITH_MINIMP3 //#define MPT_WITH_MINIZ #define MPT_WITH_MPG123 #define MPT_WITH_OGG //#define MPT_WITH_STBVORBIS #define MPT_WITH_VORBIS #define MPT_WITH_VORBISFILE #define MPT_WITH_ZLIB #endif // LIBOPENMPT_BUILD_SMALL #endif // LIBOPENMPT_BUILD #endif // MPT_BUILD_MSVC #if defined(MPT_BUILD_XCODE) #if defined(MODPLUG_TRACKER) // n/a #endif // MODPLUG_TRACKER #if defined(LIBOPENMPT_BUILD) //#define MPT_WITH_DL //#define MPT_WITH_FLAC //#define MPT_WITH_LTDL //#define MPT_WITH_MEDIAFOUNDATION //#define MPT_WITH_MINIMP3 //#define MPT_WITH_MINIZ //#define MPT_WITH_MPG123 //#define MPT_WITH_OGG //#define MPT_WITH_STBVORBIS //#define MPT_WITH_VORBIS //#define MPT_WITH_VORBISFILE //#define MPT_WITH_ZLIB #endif // LIBOPENMPT_BUILD #endif // MPT_BUILD_XCODE #if defined(MODPLUG_TRACKER) // Enable built-in test suite. #if defined(MPT_BUILD_DEBUG) || defined(MPT_BUILD_CHECKED) #define ENABLE_TESTS #endif // Disable any file saving functionality (not really useful except for the player library) //#define MODPLUG_NO_FILESAVE // Disable any debug logging //#define NO_LOGGING #if !defined(MPT_BUILD_DEBUG) && !defined(MPT_BUILD_CHECKED) && !defined(MPT_BUILD_WINESUPPORT) #define MPT_LOG_GLOBAL_LEVEL_STATIC #define MPT_LOG_GLOBAL_LEVEL 0 #endif // Enable all individual logging macros and MPT_LOG calls //#define MPT_ALL_LOGGING // Disable all runtime asserts #if !defined(MPT_BUILD_DEBUG) && !defined(MPT_BUILD_CHECKED) && !defined(MPT_BUILD_WINESUPPORT) #define NO_ASSERTS #endif // Enable callback stream wrapper for FileReader (required by libopenmpt C API). //#define MPT_FILEREADER_CALLBACK_STREAM // Support for externally linked samples e.g. in MPTM files #define MPT_EXTERNAL_SAMPLES // Support mpt::ChartsetLocale #define MPT_ENABLE_CHARSET_LOCALE // Use inline assembly #define ENABLE_ASM // Disable unarchiving support //#define NO_ARCHIVE_SUPPORT // Disable the built-in reverb effect //#define NO_REVERB // Disable built-in miscellaneous DSP effects (surround, mega bass, noise reduction) //#define NO_DSP // Disable the built-in equalizer. //#define NO_EQ // Disable the built-in automatic gain control //#define NO_AGC // Define to build without VST plugin support; makes build possible without VST SDK. //#define NO_VST // (HACK) Define to build without any plugin support //#define NO_PLUGINS // Do not build libopenmpt C api #define NO_LIBOPENMPT_C // Do not build libopenmpt C++ api #define NO_LIBOPENMPT_CXX #endif // MODPLUG_TRACKER #if defined(LIBOPENMPT_BUILD) #if (defined(_DEBUG) || defined(DEBUG)) && !defined(MPT_BUILD_DEBUG) #define MPT_BUILD_DEBUG #endif #if defined(LIBOPENMPT_BUILD_TEST) #define ENABLE_TESTS #else #define MODPLUG_NO_FILESAVE #endif #if defined(MPT_BUILD_ANALZYED) || defined(MPT_BUILD_DEBUG) || defined(MPT_BUILD_CHECKED) || defined(ENABLE_TESTS) // enable asserts #else #define NO_ASSERTS #endif //#define NO_LOGGING //#define MPT_ALL_LOGGING #define MPT_FILEREADER_CALLBACK_STREAM //#define MPT_EXTERNAL_SAMPLES #if defined(ENABLE_TESTS) || defined(MPT_BUILD_HACK_ARCHIVE_SUPPORT) #define MPT_ENABLE_CHARSET_LOCALE #else //#define MPT_ENABLE_CHARSET_LOCALE #endif // Do not use inline asm in library builds. There is just about no codepath which would use it anyway. //#define ENABLE_ASM #if defined(MPT_BUILD_HACK_ARCHIVE_SUPPORT) //#define NO_ARCHIVE_SUPPORT #else #define NO_ARCHIVE_SUPPORT #endif //#define NO_REVERB #define NO_DSP #define NO_EQ #define NO_AGC #define NO_VST //#define NO_PLUGINS //#define NO_LIBOPENMPT_C //#define NO_LIBOPENMPT_CXX #endif // LIBOPENMPT_BUILD #if MPT_OS_WINDOWS #ifndef MPT_ENABLE_CHARSET_LOCALE #define MPT_ENABLE_CHARSET_LOCALE #endif #elif MPT_OS_LINUX #elif MPT_OS_ANDROID #elif MPT_OS_EMSCRIPTEN #ifndef MPT_LOCALE_ASSUME_CHARSET #define MPT_LOCALE_ASSUME_CHARSET Charset::UTF8 #endif #elif MPT_OS_MACOSX_OR_IOS #elif MPT_OS_DJGPP #ifndef MPT_LOCALE_ASSUME_CHARSET #define MPT_LOCALE_ASSUME_CHARSET Charset::CP437 #endif #endif #if MPT_COMPILER_MSVC && !defined(MPT_USTRING_MODE_UTF8_FORCE) // Use wide strings for MSVC because this is the native encoding on // microsoft platforms. #define MPT_USTRING_MODE_WIDE 1 #define MPT_USTRING_MODE_UTF8 0 #else // !MPT_COMPILER_MSVC #define MPT_USTRING_MODE_WIDE 0 #define MPT_USTRING_MODE_UTF8 1 #endif // MPT_COMPILER_MSVC #if MPT_USTRING_MODE_UTF8 // MPT_USTRING_MODE_UTF8 mpt::ustring is implemented via mpt::u8string #define MPT_ENABLE_U8STRING 1 #else #define MPT_ENABLE_U8STRING 0 #endif #if defined(MODPLUG_TRACKER) || MPT_USTRING_MODE_WIDE // mpt::ToWString, mpt::wfmt, ConvertStrTo // Required by the tracker to ease interfacing with WinAPI. // Required by MPT_USTRING_MODE_WIDE to ease type tunneling in mpt::format. #define MPT_WSTRING_FORMAT 1 #else #define MPT_WSTRING_FORMAT 0 #endif #if MPT_OS_WINDOWS || MPT_USTRING_MODE_WIDE || MPT_WSTRING_FORMAT // mpt::ToWide // Required on Windows by mpt::PathString. // Required by MPT_USTRING_MODE_WIDE as they share the conversion functions. // Required by MPT_WSTRING_FORMAT because of std::string<->std::wstring conversion in mpt::ToString and mpt::ToWString. #define MPT_WSTRING_CONVERT 1 #else #define MPT_WSTRING_CONVERT 0 #endif // fixing stuff up #if defined(MPT_BUILD_ANALYZED) || defined(MPT_BUILD_CHECKED) #ifdef NO_ASSERTS #undef NO_ASSERTS // static or dynamic analyzers want assertions on #endif #endif #if defined(MPT_BUILD_FUZZER) #ifndef MPT_FUZZ_TRACKER #define MPT_FUZZ_TRACKER #endif #endif #if defined(ENABLE_ASM) #if MPT_COMPILER_MSVC && defined(_M_IX86) #define ENABLE_CPUID // Generate general x86 inline assembly and intrinsics. #define ENABLE_X86 // Generate MMX instructions (only used when the CPU supports it). #define ENABLE_MMX // Generate SSE instructions (only used when the CPU supports it). #define ENABLE_SSE // Generate SSE2 instructions (only used when the CPU supports it). #define ENABLE_SSE2 // Generate SSE3 instructions (only used when the CPU supports it). #define ENABLE_SSE3 // Generate SSE4 instructions (only used when the CPU supports it). #define ENABLE_SSE4 // Generate AVX instructions (only used when the CPU supports it). #define ENABLE_AVX // Generate AVX2 instructions (only used when the CPU supports it). #define ENABLE_AVX2 #elif MPT_COMPILER_MSVC && defined(_M_X64) #define ENABLE_CPUID // Generate general x64 intrinsics. #define ENABLE_X64 // Generate SSE instructions (only used when the CPU supports it). #define ENABLE_SSE // Generate SSE2 instructions (only used when the CPU supports it). #define ENABLE_SSE2 // Generate SSE3 instructions (only used when the CPU supports it). #define ENABLE_SSE3 // Generate SSE4 instructions (only used when the CPU supports it). #define ENABLE_SSE4 // Generate AVX instructions (only used when the CPU supports it). #define ENABLE_AVX // Generate AVX2 instructions (only used when the CPU supports it). #define ENABLE_AVX2 #elif MPT_BUILD_XCODE && defined(__x86_64__) // No CPUID enabled, only one code path supported anyway // #define ENABLE_CPUID // Enable the SSE2 intrinsic functions unconditionally #define ENABLE_SSE2 #elif MPT_BUILD_XCODE && defined(__arm64__) // No CPUID, it's kind of a pain on ARM anyway // #define ENABLE_CPUID // Enable the NEON intrinsic functions unconditionally #define ENABLE_NEON #else #undef ENABLE_ASM #endif // arch #endif // ENABLE_ASM #if defined(ENABLE_TESTS) && defined(MODPLUG_NO_FILESAVE) #undef MODPLUG_NO_FILESAVE // tests recommend file saving #endif #if defined(MPT_WITH_ZLIB) && defined(MPT_WITH_MINIZ) // Only one deflate implementation should be used. Prefer zlib. #undef MPT_WITH_MINIZ #endif #if !MPT_OS_WINDOWS && defined(MPT_WITH_MEDIAFOUNDATION) #undef MPT_WITH_MEDIAFOUNDATION // MediaFoundation requires Windows #endif #if !MPT_COMPILER_MSVC && !MPT_COMPILER_CLANG && defined(MPT_WITH_MEDIAFOUNDATION) #undef MPT_WITH_MEDIAFOUNDATION // MediaFoundation requires MSVC or Clang due to ATL (no MinGW support) #endif #if defined(MPT_WITH_MEDIAFOUNDATION) && !defined(MPT_ENABLE_TEMPFILE) #define MPT_ENABLE_TEMPFILE #endif #if defined(MODPLUG_TRACKER) && !defined(MPT_ENABLE_TEMPFILE) #define MPT_ENABLE_TEMPFILE #endif #if defined(MODPLUG_TRACKER) && !defined(MPT_ENABLE_DYNBIND) #define MPT_ENABLE_DYNBIND // Tracker requires dynamic library loading for export codecs #endif #if defined(MPT_WITH_MEDIAFOUNDATION) && !defined(MPT_ENABLE_DYNBIND) #define MPT_ENABLE_DYNBIND // MediaFoundation needs dynamic loading in order to test availability of delay loaded libs #endif #if (defined(MPT_WITH_MPG123) || defined(MPT_WITH_MINIMP3)) && !defined(MPT_ENABLE_MP3_SAMPLES) #define MPT_ENABLE_MP3_SAMPLES #endif #if defined(ENABLE_TESTS) #define MPT_ENABLE_FILEIO // Test suite requires PathString for file loading. #endif #if defined(MODPLUG_TRACKER) && !defined(MPT_ENABLE_FILEIO) #define MPT_ENABLE_FILEIO // Tracker requires disk file io #endif #if defined(MODPLUG_TRACKER) && !defined(MPT_ENABLE_THREAD) #define MPT_ENABLE_THREAD // Tracker requires threads #endif #if defined(MPT_EXTERNAL_SAMPLES) && !defined(MPT_ENABLE_FILEIO) #define MPT_ENABLE_FILEIO // External samples require disk file io #endif #if defined(NO_PLUGINS) // Any plugin type requires NO_PLUGINS to not be defined. #define NO_VST #endif #if defined(ENABLE_ASM) || !defined(NO_VST) #define MPT_ENABLE_ALIGNED_ALLOC #endif #if defined(MODPLUG_TRACKER) && !defined(MPT_BUILD_WINESUPPORT) && !defined(MPT_BUILD_WINESUPPORT_WRAPPER) #ifndef MPT_NO_NAMESPACE #define MPT_NO_NAMESPACE #endif #endif #if defined(MPT_NO_NAMESPACE) #ifdef OPENMPT_NAMESPACE #undef OPENMPT_NAMESPACE #endif #define OPENMPT_NAMESPACE #ifdef OPENMPT_NAMESPACE_BEGIN #undef OPENMPT_NAMESPACE_BEGIN #endif #define OPENMPT_NAMESPACE_BEGIN #ifdef OPENMPT_NAMESPACE_END #undef OPENMPT_NAMESPACE_END #endif #define OPENMPT_NAMESPACE_END #else #ifndef OPENMPT_NAMESPACE #define OPENMPT_NAMESPACE OpenMPT #endif #ifndef OPENMPT_NAMESPACE_BEGIN #define OPENMPT_NAMESPACE_BEGIN namespace OPENMPT_NAMESPACE { #endif #ifndef OPENMPT_NAMESPACE_END #define OPENMPT_NAMESPACE_END } #endif #endif // platform configuration #ifdef MPT_WITH_MFC //#define MPT_MFC_FULL // use full MFC, including MFC controls #endif // MPT_WITH_MFC #if defined(MODPLUG_TRACKER) #if MPT_OS_WINDOWS #if !defined(MPT_BUILD_WINESUPPORT) #ifndef MPT_MFC_FULL #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS // Do not include support for MFC controls in dialogs (reduces binary bloat; remove this #define if you want to use MFC controls) #endif // !MPT_MFC_FULL #endif // !MPT_BUILD_WINESUPPORT #endif // MPT_OS_WINDOWS #endif // MODPLUG_TRACKER #if MPT_OS_WINDOWS #define WIN32_LEAN_AND_MEAN // windows.h excludes #define NOMEMMGR // GMEM_*, LMEM_*, GHND, LHND, associated routines #define NOMINMAX // Macros min(a,b) and max(a,b) #define NOSERVICE // All Service Controller routines, SERVICE_ equates, etc. #define NOCOMM // COMM driver routines #define NOKANJI // Kanji support stuff. #define NOPROFILER // Profiler interface. #define NOMCX // Modem Configuration Extensions // mmsystem.h excludes #define MMNODRV //#define MMNOSOUND //#define MMNOWAVE //#define MMNOMIDI #define MMNOAUX #define MMNOMIXER //#define MMNOTIMER #define MMNOJOY #define MMNOMCI //#define MMNOMMIO //#define MMNOMMSYSTEM // mmreg.h excludes #define NOMMIDS //#define NONEWWAVE #define NONEWRIFF #define NOJPEGDIB #define NONEWIC #define NOBITMAP #endif // MPT_OS_WINDOWS // stdlib configuration #if MPT_COMPILER_CLANG #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wreserved-id-macro" #endif #define __STDC_CONSTANT_MACROS #define __STDC_LIMIT_MACROS #define _USE_MATH_DEFINES #ifndef _FILE_OFFSET_BITS #define _FILE_OFFSET_BITS 64 #endif #if MPT_COMPILER_CLANG #pragma clang diagnostic pop #endif // compiler configuration #if MPT_COMPILER_MSVC #define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers #ifndef _CRT_SECURE_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS // Define to disable the "This function or variable may be unsafe" warnings. #endif #define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 #define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 1 #ifndef _SCL_SECURE_NO_WARNINGS #define _SCL_SECURE_NO_WARNINGS #endif #ifndef NO_WARN_MBCS_MFC_DEPRECATION #define NO_WARN_MBCS_MFC_DEPRECATION #endif #pragma warning(disable:4355) // 'this' : used in base member initializer list // happens for immutable classes (i.e. classes containing const members) #pragma warning(disable:4512) // assignment operator could not be generated #pragma warning(error:4309) // Treat "truncation of constant value"-warning as error. #pragma warning(error:4463) // Treat overflow; assigning value to bit-field that can only hold values from low_value to high_value"-warning as error. #ifdef MPT_BUILD_ANALYZED // Disable Visual Studio static analyzer warnings that generate too many false positives in VS2010. //#pragma warning(disable:6246) //#pragma warning(disable:6262) #pragma warning(disable:6297) // 32-bit value is shifted, then cast to 64-bit value. Results might not be an expected value. #pragma warning(disable:6326) // Potential comparison of a constant with another constant //#pragma warning(disable:6385) //#pragma warning(disable:6386) #endif // MPT_BUILD_ANALYZED #endif // MPT_COMPILER_MSVC #if MPT_COMPILER_CLANG #if defined(MPT_BUILD_MSVC) #pragma clang diagnostic warning "-Wimplicit-fallthrough" #endif // MPT_BUILD_MSVC #if defined(MODPLUG_TRACKER) #pragma clang diagnostic ignored "-Wunused-local-typedef" #endif // MODPLUG_TRACKER #endif // MPT_COMPILER_CLANG // standard library quirks // third-party library configuration #ifdef MPT_WITH_FLAC #ifdef MPT_BUILD_MSVC_STATIC #define FLAC__NO_DLL #endif #endif #ifdef MPT_WITH_SMBPITCHSHIFT #ifdef MPT_BUILD_MSVC_SHARED #define SMBPITCHSHIFT_USE_DLL #endif #endif #ifdef MPT_WITH_STBVORBIS #define STB_VORBIS_HEADER_ONLY #ifndef STB_VORBIS_NO_PULLDATA_API #define STB_VORBIS_NO_PULLDATA_API #endif #ifndef STB_VORBIS_NO_STDIO #define STB_VORBIS_NO_STDIO #endif #endif #ifdef MPT_WITH_VORBISFILE #ifndef OV_EXCLUDE_STATIC_CALLBACKS #define OV_EXCLUDE_STATIC_CALLBACKS #endif #endif #ifdef MPT_WITH_ZLIB #ifdef MPT_BUILD_MSVC_SHARED #define ZLIB_DLL #endif #endif