2 cmake_minimum_required(VERSION 3.9)
6 set(TIM41_X86_SIMD_LEVEL SSE42 CACHE STRING "x86 SIMD instruction set extension to use")
7 set_property(CACHE TIM41_X86_SIMD_LEVEL PROPERTY STRINGS SSE2 SSE42 AVX AVX2 AVX512)
9 set(TIM41_SPECTRE_MITIGATION FALSE CACHE BOOL "Enable Spectre mitigation")
11 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/Debug/bin")
12 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/Release/bin")
13 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_BINARY_DIR}/RelWithDebInfo/bin")
14 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_BINARY_DIR}/MinSizeRel/bin")
16 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/Debug/bin")
17 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/Release/bin")
18 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_BINARY_DIR}/RelWithDebInfo/bin")
19 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_BINARY_DIR}/MinSizeRel/bin")
21 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/Debug/bin")
22 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/Release/bin")
23 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_BINARY_DIR}/RelWithDebInfo/bin")
24 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_BINARY_DIR}/MinSizeRel/bin")
28 if("${Git_FOUND}" AND EXISTS "${CMAKE_SOURCE_DIR}/.git")
31 COMMAND "${CMAKE_COMMAND}"
32 -DGIT_EXECUTABLE="${GIT_EXECUTABLE}"
33 -DINFILE="${CMAKE_CURRENT_SOURCE_DIR}/version.h.in"
34 -DOUTFILE="${CMAKE_CURRENT_BINARY_DIR}/version.h"
35 -P "${CMAKE_CURRENT_SOURCE_DIR}/WriteVersion.cmake"
36 BYPRODUCTS "${CMAKE_CURRENT_BINARY_DIR}/version.h"
37 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
38 COMMENT "Updating version info..."
41 set(tim41VersionStr "current")
42 set(tim41Version4Comma "41,0,0,0")
43 configure_file(version.h.in version.h)
47 COMMAND "${CMAKE_COMMAND}" -E echo "automatic version detection is not available"
51 include_directories("${CMAKE_CURRENT_BINARY_DIR}")
84 -DTIMW32G_USE_NEW_CONSOLE
100 -D_WIN32_WINNT=0x0A00
103 -D_CRT_SECURE_NO_WARNINGS
104 -D_CRT_NONSTDC_NO_DEPRECATE
108 TIMIDITY_FE_DEFINITIONS
117 -DSNDFNT_INITFILE_NAME="soundfont.ini"
131 # -DVORBIS_DLL_INCLUDE_VORBISENC
132 # -DVORBIS_DLL_INCLUDE_VORBISFILE
153 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
154 add_definitions(-DVST_LIBRARY_NAME="timvstwrap_x64.dll")
156 add_definitions(-DVST_LIBRARY_NAME="timvstwrap.dll")
159 if("${TIM41_X86_SIMD_LEVEL}" STREQUAL "AVX512")
160 add_definitions(-DUSE_AVX512)
161 elseif("${TIM41_X86_SIMD_LEVEL}" STREQUAL "AVX2")
162 add_definitions(-DUSE_AVX2)
163 elseif("${TIM41_X86_SIMD_LEVEL}" STREQUAL "AVX")
164 add_definitions(-DUSE_AVX)
165 elseif("${TIM41_X86_SIMD_LEVEL}" STREQUAL "SSE42")
166 add_definitions(-DUSE_SSE42)
167 elseif("${TIM41_X86_SIMD_LEVEL}" STREQUAL "SSE2")
168 add_definitions(-DUSE_SSE2)
172 # remove existing /W3 options
173 string(REGEX REPLACE "/W[0-4]" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
174 string(REGEX REPLACE "/W[0-4]" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
176 add_compile_options(/W4 /GS /fp:fast)
178 if("${TIM41_SPECTRE_MITIGATION}")
179 add_compile_options(/Qspectre)
182 add_compile_options(/we4013) # '%s' undefined; assuming extern returning int
183 add_compile_options(/we4028) # formal parameter %d different from declaration
184 add_compile_options(/we4133) # 'function': incompatible types - from '%s' to '%s'
186 if("${TIM41_X86_SIMD_LEVEL}" STREQUAL "AVX512")
187 if("${CMAKE_C_COMPILER_ID}" MATCHES "Intel")
188 add_compile_options(/QxCORE-AVX512)
190 add_compile_options(/arch:AVX512)
191 if("${CMAKE_C_COMPILER_ID}" MATCHES "Clang")
192 add_definitions(-D__PRFCHWINTRIN_H) # Workaround for conflicting _m_prefetchw() definitions
195 elseif("${TIM41_X86_SIMD_LEVEL}" STREQUAL "AVX2")
196 if("${CMAKE_C_COMPILER_ID}" MATCHES "Intel")
197 add_compile_options(/QxCORE-AVX2)
199 add_compile_options(/arch:AVX2)
201 elseif("${TIM41_X86_SIMD_LEVEL}" STREQUAL "AVX")
202 if("${CMAKE_C_COMPILER_ID}" MATCHES "Intel")
203 add_compile_options(/QxAVX)
205 add_compile_options(/arch:AVX)
207 elseif("${TIM41_X86_SIMD_LEVEL}" STREQUAL "SSE42")
208 if("${CMAKE_C_COMPILER_ID}" MATCHES "Intel")
209 add_compile_options(/QxSSE4.2)
210 elseif("${CMAKE_C_COMPILER_ID}" MATCHES "Clang")
211 add_compile_options(-msse4.2 -mpclmul -mpopcnt)
215 string(APPEND CMAKE_CXX_FLAGS " /EHsc /std:c++17")
216 string(APPEND CMAKE_C_FLAGS_RELEASE " /Zi /guard:cf")
217 string(APPEND CMAKE_CXX_FLAGS_RELEASE " /Zi /guard:cf")
219 if("${CMAKE_C_COMPILER_ID}" MATCHES "Intel")
220 string(APPEND CMAKE_C_FLAGS_RELEASE " /Qipo")
221 string(APPEND CMAKE_CXX_FLAGS_RELEASE " /Qipo")
222 elseif("${CMAKE_C_COMPILER_ID}" MATCHES "Clang")
223 string(APPEND CMAKE_C_FLAGS_RELEASE " -flto=thin")
224 string(APPEND CMAKE_CXX_FLAGS_RELEASE " -flto=thin")
225 elseif("${CMAKE_C_COMPILER_ID}" MATCHES "MSVC")
226 string(APPEND CMAKE_C_FLAGS_RELEASE " /GL")
227 string(APPEND CMAKE_CXX_FLAGS_RELEASE " /GL")
229 if ("${CMAKE_C_COMPILER_VERSION}" VERSION_GREATER_EQUAL "19.20")
230 string(REGEX REPLACE "/Ob[0-2]" "" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
231 string(REGEX REPLACE "/Ob[0-2]" "" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
232 string(APPEND CMAKE_C_FLAGS_RELEASE " /Ob3")
233 string(APPEND CMAKE_CXX_FLAGS_RELEASE " /Ob3")
237 string(APPEND CMAKE_EXE_LINKER_FLAGS " /STACK:16777216")
239 if("${CMAKE_C_COMPILER_ID}" MATCHES "Clang")
240 string(APPEND CMAKE_EXE_LINKER_FLAGS_DEBUG " /DEBUG")
241 string(APPEND CMAKE_SHARED_LINKER_FLAGS_DEBUG " /DEBUG")
243 string(APPEND CMAKE_EXE_LINKER_FLAGS_RELEASE " /OPT:REF /OPT:ICF /DEBUG /GUARD:CF")
244 string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE " /OPT:REF /OPT:ICF /DEBUG /GUARD:CF")
246 string(APPEND CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO " /OPT:REF /DEBUG")
247 string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO " /OPT:REF /DEBUG")
249 string(APPEND CMAKE_EXE_LINKER_FLAGS_DEBUG " /DEBUG:FASTLINK")
250 string(APPEND CMAKE_SHARED_LINKER_FLAGS_DEBUG " /DEBUG:FASTLINK")
252 string(APPEND CMAKE_EXE_LINKER_FLAGS_RELEASE " /OPT:REF /OPT:ICF /LTCG:incremental /DEBUG:FULL /GUARD:CF")
253 string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE " /OPT:REF /OPT:ICF /LTCG:incremental /DEBUG:FULL /GUARD:CF")
254 string(APPEND CMAKE_STATIC_LINKER_FLAGS_RELEASE " /LTCG:incremental")
256 string(APPEND CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO " /OPT:REF /DEBUG:FASTLINK")
257 string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO " /OPT:REF /DEBUG:FASTLINK")
260 string(APPEND CMAKE_RC_FLAGS " /nologo")
266 add_compile_options(-Wall -Wextra -Wno-missing-braces -ffast-math)
268 if("${TIM41_X86_SIMD_LEVEL}" STREQUAL "AVX512")
270 -mavx512f -mavx512cd -mavx512vl -mavx512dq -mavx512bw # -mavx512ifma -mavx512vbmi # -mavx512vpopcntdq -mavx512vnni -mavx512vbmi2 -mavx512bitalg -mvpclmulqdq -mgfni -mvaes
271 -mpclmul -mpopcnt -maes -mavx2 -mfma -mfsgsbase -mf16c -mmovbe -mrdrnd -mlzcnt -mbmi -mbmi2 -mprfchw -mrdseed -madx
273 elseif("${TIM41_X86_SIMD_LEVEL}" STREQUAL "AVX2")
274 add_compile_options(-mavx2 -mpclmul -mpopcnt -maes -mavx2 -mfma -mfsgsbase -mf16c -mmovbe -mrdrnd -mlzcnt -mbmi -mbmi2)
275 elseif("${TIM41_X86_SIMD_LEVEL}" STREQUAL "AVX")
276 add_compile_options(-mavx -mpclmul -mpopcnt -maes)
277 elseif("${TIM41_X86_SIMD_LEVEL}" STREQUAL "SSE42")
278 add_compile_options(-msse4.2 -mpclmul -mpopcnt)
279 elseif("${TIM41_X86_SIMD_LEVEL}" STREQUAL "SSE2")
280 add_compile_options(-msse2)
283 string(APPEND CMAKE_CXX_FLAGS " -std=c++17")
284 string(APPEND CMAKE_C_FLAGS_RELEASE " -flto")
285 string(APPEND CMAKE_CXX_FLAGS_RELEASE " -flto")
286 string(APPEND CMAKE_EXE_LINKER_FLAGS " -Wl,--stack,16777216")
287 string(APPEND CMAKE_EXE_LINKER_FLAGS_RELEASE " -s")
288 string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE " -s")
289 string(APPEND CMAKE_RC_FLAGS " -O coff")
292 function(DisableMSManifest targetName)
294 get_property(linkFlags TARGET ${targetName} PROPERTY LINK_FLAGS)
295 set_target_properties(${targetName} PROPERTIES LINK_FLAGS "${linkFlags} /MANIFEST:NO")
322 add_subdirectory(FLAC)
323 add_subdirectory(lame)
324 add_subdirectory(libmpg123)
325 add_subdirectory(ogg)
326 add_subdirectory(opus)
327 add_subdirectory(pdcurses)
328 add_subdirectory(portaudio)
329 add_subdirectory(portmidi)
330 add_subdirectory(speex)
331 add_subdirectory(vorbis)
333 add_subdirectory(cfgforsf)
334 add_subdirectory(interface)
335 add_subdirectory(libarc)
336 add_subdirectory(libunimod)
337 add_subdirectory(sf_view_gui)
338 add_subdirectory(timidity)
339 add_subdirectory(twsyn_bridge)
340 add_subdirectory(utils)