OSDN Git Service

[mpg123] Remove WANT_GETCPUFLAGS
[timidity41/timidity41.git] / CMakeLists.txt
index 38b6050..ad4008f 100644 (file)
@@ -3,22 +3,25 @@ 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")
 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_BINARY_DIR}/RelWithDebInfo/bin")
 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_BINARY_DIR}/MinSizeRel/bin")
 
-set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/Debug/lib")
-set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/Release/lib")
-set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_BINARY_DIR}/RelWithDebInfo/lib")
-set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_BINARY_DIR}/MinSizeRel/lib")
+set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/Debug/bin")
+set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/Release/bin")
+set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_BINARY_DIR}/RelWithDebInfo/bin")
+set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_BINARY_DIR}/MinSizeRel/bin")
 
-set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/Debug/lib")
-set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/Release/lib")
-set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_BINARY_DIR}/RelWithDebInfo/lib")
-set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_BINARY_DIR}/MinSizeRel/lib")
+set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/Debug/bin")
+set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/Release/bin")
+set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_BINARY_DIR}/RelWithDebInfo/bin")
+set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_BINARY_DIR}/MinSizeRel/bin")
 
 find_package(Git)
 
@@ -30,6 +33,7 @@ if("${Git_FOUND}" AND EXISTS "${CMAKE_SOURCE_DIR}/.git")
             -DINFILE="${CMAKE_CURRENT_SOURCE_DIR}/version.h.in"
             -DOUTFILE="${CMAKE_CURRENT_BINARY_DIR}/version.h"
             -P "${CMAKE_CURRENT_SOURCE_DIR}/WriteVersion.cmake"
+        BYPRODUCTS "${CMAKE_CURRENT_BINARY_DIR}/version.h"
         WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
         COMMENT "Updating version info..."
     )
@@ -37,12 +41,19 @@ else()
     set(tim41VersionStr "current")
     set(tim41Version4Comma "41,0,0,0")
     configure_file(version.h.in version.h)
+
+    add_custom_target(
+        UpdateTim41Version
+        COMMAND "${CMAKE_COMMAND}" -E echo "automatic version detection is not available"
+    )
 endif()
 
 include_directories("${CMAKE_CURRENT_BINARY_DIR}")
 
+# base definitions
 add_definitions(
 # TiMidity++ common
+    -DWIN32
     -DRETSIGTYPE=int
     -DSTDC_HEADERS
     -DHAVE_GETCWD
@@ -59,10 +70,9 @@ add_definitions(
     -DHAVE_LIMITS_H
     -DHAVE_MALLOC_H
     -DHAVE_STDLIB_H
+       -DHAVE_SYS_STAT_H
     -DHAVE_SYS_TYPES_H
     -DHAVE_FCNTL_H
-    -DHAVE_LIBVORBIS
-    -DHAVE_LIBGOGO
     -DHAVE_MMSYSTEM_H
     -DENABLE_SHERRY
     -DENABLE_THREAD
@@ -71,21 +81,55 @@ add_definitions(
     -D__W32__
     -D__W32READDIR__
        -DUSE_TWSYN_BRIDGE
-    -DENABLE_SFZ
+       -DTIMW32G_USE_NEW_CONSOLE
 
 # TiMidity++ audio
     -DAU_W32
+
+# network
+    -DWINSOCK
+    -DHAVE_SOCKET
+    -DSUPPORT_SOCKET
+
+# pdcurses
+    -DPDC_DLL_BUILD
+
+# Windows
+    -DWIN32_LEAN_AND_MEAN
+    -DWINVER=0x0A00
+    -D_WIN32_WINNT=0x0A00
+
+# MSVCRT
+    -D_CRT_SECURE_NO_WARNINGS
+    -D_CRT_NONSTDC_NO_DEPRECATE
+)
+
+set(
+       TIMIDITY_FE_DEFINITIONS
+
+# TiMidity++ common
+    -DHAVE_LIBVORBIS
+    -DHAVE_LIBGOGO
+    -DHAVE_LIBMPG123
+    -DENABLE_SFZ
+       -DENABLE_DLS
+       -DENABLE_ECW
+    -DSNDFNT_INITFILE_NAME="soundfont.ini"
+
+# TiMidity++ audio
     -DAU_WASAPI
     -DAU_WDMKS
     -DAU_OPUS
     -DAU_OPUS_DLL
     -DAU_SPEEX
+       -DAU_SPEEX_DLL
     -DAU_LAME
     -DAU_GOGO
     -DAU_GOGO_DLL
     -DAU_VORBIS
     -DAU_VORBIS_DLL
-    -DVORBIS_DLL_INCLUDE_VORBISENC
+    # -DVORBIS_DLL_INCLUDE_VORBISENC
+    # -DVORBIS_DLL_INCLUDE_VORBISFILE
     -DAU_FLAC
     -DAU_FLAC_DLL
     -DAU_OGGFLAC
@@ -102,49 +146,118 @@ add_definitions(
     -DAU_VOLUME_CALC
     -DAU_BENCHMARK
 
-# network
-    -DWINSOCK
-    -DHAVE_SOCKET
-    -DSUPPORT_SOCKET
-
-# pdcurses
-    -DPDC_DLL_BUILD
-
-# Windows
-    -DWIN32_LEAN_AND_MEAN
-    -DWINVER=0x0A00
-    -D_WIN32_WINNT=0x0A00
-
-# MSVCRT
-    -D_CRT_SECURE_NO_WARNINGS
+# FLAC
+    -DFLAC__NO_DLL
 )
 
-if(TIM41_USE_AVX2)
-    add_definitions(-DUSE_AVX2)
+if(CMAKE_SIZEOF_VOID_P EQUAL 8)
+    add_definitions(-DVST_LIBRARY_NAME="timvstwrap_x64.dll")
 else()
+    add_definitions(-DVST_LIBRARY_NAME="timvstwrap.dll")
+endif()
+
+if("${TIM41_X86_SIMD_LEVEL}" STREQUAL "AVX512")
+    add_definitions(-DUSE_AVX512)
+elseif("${TIM41_X86_SIMD_LEVEL}" STREQUAL "AVX2")
+    add_definitions(-DUSE_AVX2)
+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)
-    add_compile_options(/W4 /Zi /GS /fp:fast /permissive- /MP /Qspectre)
+    # remove existing /W3 options
+    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 /GS /fp:fast)
+
+    if("${TIM41_SPECTRE_MITIGATION}")
+        add_compile_options(/Qspectre)
+    endif()
+
     add_compile_options(/we4013)    # '%s' undefined; assuming extern returning int
-    
-    if(TIM41_USE_AVX2)
-        add_compile_options(/arch:AVX2)
+    add_compile_options(/we4028)    # formal parameter %d different from declaration
+    add_compile_options(/we4133)    # 'function': incompatible types - from '%s' to '%s'
+
+    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")
+       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}")
+            string(APPEND CMAKE_C_FLAGS_RELEASE " /Ob3")
+            string(APPEND CMAKE_CXX_FLAGS_RELEASE " /Ob3")
+        endif()
+    endif()
 
-    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_EXE_LINKER_FLAGS " /STACK:16777216")
 
-    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")
-    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")
-    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")
+    if("${CMAKE_C_COMPILER_ID}" MATCHES "Clang")
+        string(APPEND CMAKE_EXE_LINKER_FLAGS_DEBUG " /DEBUG")
+        string(APPEND CMAKE_SHARED_LINKER_FLAGS_DEBUG " /DEBUG")
+
+        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")
+
+        string(APPEND CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO " /OPT:REF /DEBUG")
+        string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO " /OPT:REF /DEBUG")
+    else()
+        string(APPEND CMAKE_EXE_LINKER_FLAGS_DEBUG " /DEBUG:FASTLINK")
+        string(APPEND CMAKE_SHARED_LINKER_FLAGS_DEBUG " /DEBUG:FASTLINK")
+
+        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")
+
+        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
@@ -152,18 +265,28 @@ if(MSVC)
 else()
     add_compile_options(-Wall -Wextra -Wno-missing-braces -ffast-math)
 
-    if(TIM41_USE_AVX2)
-        add_compile_options(-mavx2)
-    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)
@@ -180,6 +303,7 @@ include_directories(
     lame/DLL
     lame/include
     libarc
+    libmpg123/include
     libunimod
     ogg/include
     opus/include
@@ -192,10 +316,12 @@ include_directories(
        twsyn_bridge
     utils
     vorbis/include
+    vorbis-tools/include
 )
 
 add_subdirectory(FLAC)
 add_subdirectory(lame)
+add_subdirectory(libmpg123)
 add_subdirectory(ogg)
 add_subdirectory(opus)
 add_subdirectory(pdcurses)