OSDN Git Service

[mpg123] Remove WANT_GETCPUFLAGS
[timidity41/timidity41.git] / CMakeLists.txt
index a4edb9e..ad4008f 100644 (file)
@@ -3,7 +3,10 @@ cmake_minimum_required(VERSION 3.9)
 
 project(timidity41)
 
-set(TIM41_USE_AVX2 FALSE CACHE BOOL "Enable use of Intel AVX2 enhanced instructions")
+set(TIM41_X86_SIMD_LEVEL SSE42 CACHE STRING "x86 SIMD instruction set extension to use")
+set_property(CACHE TIM41_X86_SIMD_LEVEL PROPERTY STRINGS SSE2 SSE42 AVX AVX2 AVX512)
+
+set(TIM41_SPECTRE_MITIGATION FALSE CACHE BOOL "Enable Spectre mitigation")
 
 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/Debug/bin")
 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/Release/bin")
@@ -98,6 +101,7 @@ add_definitions(
 
 # MSVCRT
     -D_CRT_SECURE_NO_WARNINGS
+    -D_CRT_NONSTDC_NO_DEPRECATE
 )
 
 set(
@@ -109,6 +113,7 @@ set(
     -DHAVE_LIBMPG123
     -DENABLE_SFZ
        -DENABLE_DLS
+       -DENABLE_ECW
     -DSNDFNT_INITFILE_NAME="soundfont.ini"
 
 # TiMidity++ audio
@@ -123,8 +128,8 @@ set(
     -DAU_GOGO_DLL
     -DAU_VORBIS
     -DAU_VORBIS_DLL
-    -DVORBIS_DLL_INCLUDE_VORBISENC
-    -DVORBIS_DLL_INCLUDE_VORBISFILE
+    -DVORBIS_DLL_INCLUDE_VORBISENC
+    -DVORBIS_DLL_INCLUDE_VORBISFILE
     -DAU_FLAC
     -DAU_FLAC_DLL
     -DAU_OGGFLAC
@@ -151,10 +156,16 @@ else()
     add_definitions(-DVST_LIBRARY_NAME="timvstwrap.dll")
 endif()
 
-if(TIM41_USE_AVX2)
+if("${TIM41_X86_SIMD_LEVEL}" STREQUAL "AVX512")
+    add_definitions(-DUSE_AVX512)
+elseif("${TIM41_X86_SIMD_LEVEL}" STREQUAL "AVX2")
     add_definitions(-DUSE_AVX2)
-else()
+elseif("${TIM41_X86_SIMD_LEVEL}" STREQUAL "AVX")
+    add_definitions(-DUSE_AVX)
+elseif("${TIM41_X86_SIMD_LEVEL}" STREQUAL "SSE42")
     add_definitions(-DUSE_SSE42)
+elseif("${TIM41_X86_SIMD_LEVEL}" STREQUAL "SSE2")
+    add_definitions(-DUSE_SSE2)
 endif()
 
 if(MSVC)
@@ -162,9 +173,9 @@ if(MSVC)
     string(REGEX REPLACE "/W[0-4]" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
     string(REGEX REPLACE "/W[0-4]" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
 
-    add_compile_options(/W4 /Zi /GS /fp:fast)
+    add_compile_options(/W4 /GS /fp:fast)
 
-    if(NOT ("${CMAKE_C_COMPILER_ID}" MATCHES "Clang"))
+    if("${TIM41_SPECTRE_MITIGATION}")
         add_compile_options(/Qspectre)
     endif()
 
@@ -172,70 +183,110 @@ if(MSVC)
     add_compile_options(/we4028)    # formal parameter %d different from declaration
     add_compile_options(/we4133)    # 'function': incompatible types - from '%s' to '%s'
 
-    if(TIM41_USE_AVX2)
-        add_compile_options(/arch:AVX2)
-    else()
-        if("${CMAKE_C_COMPILER_ID}" MATCHES "Clang")
-            add_compile_options(-msse4.2)
+    if("${TIM41_X86_SIMD_LEVEL}" STREQUAL "AVX512")
+        if("${CMAKE_C_COMPILER_ID}" MATCHES "Intel")
+            add_compile_options(/QxCORE-AVX512)
+        else()
+            add_compile_options(/arch:AVX512)
+            if("${CMAKE_C_COMPILER_ID}" MATCHES "Clang")
+                add_definitions(-D__PRFCHWINTRIN_H)  # Workaround for conflicting _m_prefetchw() definitions
+            endif()
+        endif()
+    elseif("${TIM41_X86_SIMD_LEVEL}" STREQUAL "AVX2")
+        if("${CMAKE_C_COMPILER_ID}" MATCHES "Intel")
+            add_compile_options(/QxCORE-AVX2)
+        else()
+            add_compile_options(/arch:AVX2)
+        endif()
+    elseif("${TIM41_X86_SIMD_LEVEL}" STREQUAL "AVX")
+        if("${CMAKE_C_COMPILER_ID}" MATCHES "Intel")
+            add_compile_options(/QxAVX)
+        else()
+            add_compile_options(/arch:AVX)
+        endif()
+    elseif("${TIM41_X86_SIMD_LEVEL}" STREQUAL "SSE42")
+        if("${CMAKE_C_COMPILER_ID}" MATCHES "Intel")
+            add_compile_options(/QxSSE4.2)
+        elseif("${CMAKE_C_COMPILER_ID}" MATCHES "Clang")
+            add_compile_options(-msse4.2 -mpclmul -mpopcnt)
         endif()
     endif()
     
-       set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc /std:c++17")
-
-    if("${CMAKE_C_COMPILER_ID}" MATCHES "Clang")
-        set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -flto=thin /guard:cf")
-        set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -flto=thin /guard:cf")
-    else()
-        set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /GL /guard:cf")
-        set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /GL /guard:cf")
+       string(APPEND CMAKE_CXX_FLAGS " /EHsc /std:c++17")
+    string(APPEND CMAKE_C_FLAGS_RELEASE " /Zi /guard:cf")
+    string(APPEND CMAKE_CXX_FLAGS_RELEASE " /Zi /guard:cf")
+
+    if("${CMAKE_C_COMPILER_ID}" MATCHES "Intel")
+        string(APPEND CMAKE_C_FLAGS_RELEASE " /Qipo")
+        string(APPEND CMAKE_CXX_FLAGS_RELEASE " /Qipo")
+    elseif("${CMAKE_C_COMPILER_ID}" MATCHES "Clang")
+        string(APPEND CMAKE_C_FLAGS_RELEASE " -flto=thin")
+        string(APPEND CMAKE_CXX_FLAGS_RELEASE " -flto=thin")
+    elseif("${CMAKE_C_COMPILER_ID}" MATCHES "MSVC")
+        string(APPEND CMAKE_C_FLAGS_RELEASE " /GL")
+        string(APPEND CMAKE_CXX_FLAGS_RELEASE " /GL")
 
         if ("${CMAKE_C_COMPILER_VERSION}" VERSION_GREATER_EQUAL "19.20")
             string(REGEX REPLACE "/Ob[0-2]" "" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
             string(REGEX REPLACE "/Ob[0-2]" "" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
-            set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Ob3")
-            set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Ob3")
+            string(APPEND CMAKE_C_FLAGS_RELEASE " /Ob3")
+            string(APPEND CMAKE_CXX_FLAGS_RELEASE " /Ob3")
         endif()
     endif()
 
+    string(APPEND CMAKE_EXE_LINKER_FLAGS " /STACK:16777216")
+
     if("${CMAKE_C_COMPILER_ID}" MATCHES "Clang")
-        set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /DEBUG")
-        set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} /DEBUG")
+        string(APPEND CMAKE_EXE_LINKER_FLAGS_DEBUG " /DEBUG")
+        string(APPEND CMAKE_SHARED_LINKER_FLAGS_DEBUG " /DEBUG")
 
-        set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /OPT:REF /OPT:ICF /DEBUG /GUARD:CF")
-        set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /OPT:REF /OPT:ICF /DEBUG /GUARD:CF")
+        string(APPEND CMAKE_EXE_LINKER_FLAGS_RELEASE " /OPT:REF /OPT:ICF /DEBUG /GUARD:CF")
+        string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE " /OPT:REF /OPT:ICF /DEBUG /GUARD:CF")
 
-        set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO} /OPT:REF /DEBUG")
-        set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO} /OPT:REF /DEBUG")
+        string(APPEND CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO " /OPT:REF /DEBUG")
+        string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO " /OPT:REF /DEBUG")
     else()
-        set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /DEBUG:FASTLINK")
-        set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} /DEBUG:FASTLINK")
+        string(APPEND CMAKE_EXE_LINKER_FLAGS_DEBUG " /DEBUG:FASTLINK")
+        string(APPEND CMAKE_SHARED_LINKER_FLAGS_DEBUG " /DEBUG:FASTLINK")
 
-        set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /OPT:REF /OPT:ICF /LTCG:incremental /DEBUG:FULL /GUARD:CF")
-        set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /OPT:REF /OPT:ICF /LTCG:incremental /DEBUG:FULL /GUARD:CF")
-        set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "${CMAKE_STATIC_LINKER_FLAGS_RELEASE} /LTCG:incremental")
+        string(APPEND CMAKE_EXE_LINKER_FLAGS_RELEASE " /OPT:REF /OPT:ICF /LTCG:incremental /DEBUG:FULL /GUARD:CF")
+        string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE " /OPT:REF /OPT:ICF /LTCG:incremental /DEBUG:FULL /GUARD:CF")
+        string(APPEND CMAKE_STATIC_LINKER_FLAGS_RELEASE " /LTCG:incremental")
 
-        set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO} /OPT:REF /DEBUG:FASTLINK")
-        set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO} /OPT:REF /DEBUG:FASTLINK")
+        string(APPEND CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO " /OPT:REF /DEBUG:FASTLINK")
+        string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO " /OPT:REF /DEBUG:FASTLINK")
     endif()
 
+    string(APPEND CMAKE_RC_FLAGS " /nologo")
+
     add_definitions(
         -DSTDOUT_FILENO=1
     )
 else()
     add_compile_options(-Wall -Wextra -Wno-missing-braces -ffast-math)
 
-    if(TIM41_USE_AVX2)
-        add_compile_options(-mavx2 -mfma)
-    else()
-        add_compile_options(-msse4.2)
+    if("${TIM41_X86_SIMD_LEVEL}" STREQUAL "AVX512")
+        add_compile_options(
+            -mavx512f -mavx512cd -mavx512vl -mavx512dq -mavx512bw # -mavx512ifma -mavx512vbmi # -mavx512vpopcntdq -mavx512vnni -mavx512vbmi2 -mavx512bitalg -mvpclmulqdq -mgfni -mvaes
+            -mpclmul -mpopcnt -maes -mavx2 -mfma -mfsgsbase -mf16c -mmovbe -mrdrnd -mlzcnt -mbmi -mbmi2 -mprfchw -mrdseed -madx
+        )
+    elseif("${TIM41_X86_SIMD_LEVEL}" STREQUAL "AVX2")
+        add_compile_options(-mavx2 -mpclmul -mpopcnt -maes -mavx2 -mfma -mfsgsbase -mf16c -mmovbe -mrdrnd -mlzcnt -mbmi -mbmi2)
+    elseif("${TIM41_X86_SIMD_LEVEL}" STREQUAL "AVX")
+        add_compile_options(-mavx -mpclmul -mpopcnt -maes)
+    elseif("${TIM41_X86_SIMD_LEVEL}" STREQUAL "SSE42")
+        add_compile_options(-msse4.2 -mpclmul -mpopcnt)
+    elseif("${TIM41_X86_SIMD_LEVEL}" STREQUAL "SSE2")
+        add_compile_options(-msse2)
     endif()
 
-       set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
-    set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -flto")
-    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -flto")
-    set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -s")
-    set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} -s")
-    set(CMAKE_RC_FLAGS "-O coff")
+       string(APPEND CMAKE_CXX_FLAGS " -std=c++17")
+    string(APPEND CMAKE_C_FLAGS_RELEASE " -flto")
+    string(APPEND CMAKE_CXX_FLAGS_RELEASE " -flto")
+    string(APPEND CMAKE_EXE_LINKER_FLAGS " -Wl,--stack,16777216")
+    string(APPEND CMAKE_EXE_LINKER_FLAGS_RELEASE " -s")
+    string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE " -s")
+    string(APPEND CMAKE_RC_FLAGS " -O coff")
 endif()
 
 function(DisableMSManifest targetName)
@@ -265,6 +316,7 @@ include_directories(
        twsyn_bridge
     utils
     vorbis/include
+    vorbis-tools/include
 )
 
 add_subdirectory(FLAC)