OSDN Git Service

[mpg123] Remove WANT_GETCPUFLAGS
[timidity41/timidity41.git] / CMakeLists.txt
1
2 cmake_minimum_required(VERSION 3.9)
3
4 project(timidity41)
5
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)
8
9 set(TIM41_SPECTRE_MITIGATION FALSE CACHE BOOL "Enable Spectre mitigation")
10
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")
15
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")
20
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")
25
26 find_package(Git)
27
28 if("${Git_FOUND}" AND EXISTS "${CMAKE_SOURCE_DIR}/.git")
29     add_custom_target(
30         UpdateTim41Version
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..."
39     )
40 else()
41     set(tim41VersionStr "current")
42     set(tim41Version4Comma "41,0,0,0")
43     configure_file(version.h.in version.h)
44
45     add_custom_target(
46         UpdateTim41Version
47         COMMAND "${CMAKE_COMMAND}" -E echo "automatic version detection is not available"
48     )
49 endif()
50
51 include_directories("${CMAKE_CURRENT_BINARY_DIR}")
52
53 # base definitions
54 add_definitions(
55 # TiMidity++ common
56     -DWIN32
57     -DRETSIGTYPE=int
58     -DSTDC_HEADERS
59     -DHAVE_GETCWD
60     -DHAVE_POPEN
61     -DHAVE_SIGNAL
62     -DHAVE_SNPRINTF
63     -DHAVE_STRDUP
64     -DHAVE_STRERROR
65     -DHAVE_STRNCASECMP
66     -DHAVE_STRSTR
67     -DHAVE_VPRINTF
68     -DHAVE_VSNPRINTF
69     -DHAVE_ERRNO_H
70     -DHAVE_LIMITS_H
71     -DHAVE_MALLOC_H
72     -DHAVE_STDLIB_H
73         -DHAVE_SYS_STAT_H
74     -DHAVE_SYS_TYPES_H
75     -DHAVE_FCNTL_H
76     -DHAVE_MMSYSTEM_H
77     -DENABLE_SHERRY
78     -DENABLE_THREAD
79     -DSUPPORT_SOUNDSPEC
80     -DANOTHER_MAIN
81     -D__W32__
82     -D__W32READDIR__
83         -DUSE_TWSYN_BRIDGE
84         -DTIMW32G_USE_NEW_CONSOLE
85
86 # TiMidity++ audio
87     -DAU_W32
88
89 # network
90     -DWINSOCK
91     -DHAVE_SOCKET
92     -DSUPPORT_SOCKET
93
94 # pdcurses
95     -DPDC_DLL_BUILD
96
97 # Windows
98     -DWIN32_LEAN_AND_MEAN
99     -DWINVER=0x0A00
100     -D_WIN32_WINNT=0x0A00
101
102 # MSVCRT
103     -D_CRT_SECURE_NO_WARNINGS
104     -D_CRT_NONSTDC_NO_DEPRECATE
105 )
106
107 set(
108         TIMIDITY_FE_DEFINITIONS
109
110 # TiMidity++ common
111     -DHAVE_LIBVORBIS
112     -DHAVE_LIBGOGO
113     -DHAVE_LIBMPG123
114     -DENABLE_SFZ
115         -DENABLE_DLS
116         -DENABLE_ECW
117     -DSNDFNT_INITFILE_NAME="soundfont.ini"
118
119 # TiMidity++ audio
120     -DAU_WASAPI
121     -DAU_WDMKS
122     -DAU_OPUS
123     -DAU_OPUS_DLL
124     -DAU_SPEEX
125         -DAU_SPEEX_DLL
126     -DAU_LAME
127     -DAU_GOGO
128     -DAU_GOGO_DLL
129     -DAU_VORBIS
130     -DAU_VORBIS_DLL
131     # -DVORBIS_DLL_INCLUDE_VORBISENC
132     # -DVORBIS_DLL_INCLUDE_VORBISFILE
133     -DAU_FLAC
134     -DAU_FLAC_DLL
135     -DAU_OGGFLAC
136     -DAU_PORTAUDIO
137     -DAU_PORTAUDIO_DLL
138     -DPORTAUDIO_V19
139     -DPORTAUDIO_V19_6
140     -DVST_LOADER_ENABLE
141     -DVSTWRAP_EXT
142     -DAU_NPIPE
143     -DAU_LIST
144     -DAU_WRITE_MIDI
145     -DAU_MODMIDI
146     -DAU_VOLUME_CALC
147     -DAU_BENCHMARK
148
149 # FLAC
150     -DFLAC__NO_DLL
151 )
152
153 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
154     add_definitions(-DVST_LIBRARY_NAME="timvstwrap_x64.dll")
155 else()
156     add_definitions(-DVST_LIBRARY_NAME="timvstwrap.dll")
157 endif()
158
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)
169 endif()
170
171 if(MSVC)
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}")
175
176     add_compile_options(/W4 /GS /fp:fast)
177
178     if("${TIM41_SPECTRE_MITIGATION}")
179         add_compile_options(/Qspectre)
180     endif()
181
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'
185
186     if("${TIM41_X86_SIMD_LEVEL}" STREQUAL "AVX512")
187         if("${CMAKE_C_COMPILER_ID}" MATCHES "Intel")
188             add_compile_options(/QxCORE-AVX512)
189         else()
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
193             endif()
194         endif()
195     elseif("${TIM41_X86_SIMD_LEVEL}" STREQUAL "AVX2")
196         if("${CMAKE_C_COMPILER_ID}" MATCHES "Intel")
197             add_compile_options(/QxCORE-AVX2)
198         else()
199             add_compile_options(/arch:AVX2)
200         endif()
201     elseif("${TIM41_X86_SIMD_LEVEL}" STREQUAL "AVX")
202         if("${CMAKE_C_COMPILER_ID}" MATCHES "Intel")
203             add_compile_options(/QxAVX)
204         else()
205             add_compile_options(/arch:AVX)
206         endif()
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)
212         endif()
213     endif()
214     
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")
218
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")
228
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")
234         endif()
235     endif()
236
237     string(APPEND CMAKE_EXE_LINKER_FLAGS " /STACK:16777216")
238
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")
242
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")
245
246         string(APPEND CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO " /OPT:REF /DEBUG")
247         string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO " /OPT:REF /DEBUG")
248     else()
249         string(APPEND CMAKE_EXE_LINKER_FLAGS_DEBUG " /DEBUG:FASTLINK")
250         string(APPEND CMAKE_SHARED_LINKER_FLAGS_DEBUG " /DEBUG:FASTLINK")
251
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")
255
256         string(APPEND CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO " /OPT:REF /DEBUG:FASTLINK")
257         string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO " /OPT:REF /DEBUG:FASTLINK")
258     endif()
259
260     string(APPEND CMAKE_RC_FLAGS " /nologo")
261
262     add_definitions(
263         -DSTDOUT_FILENO=1
264     )
265 else()
266     add_compile_options(-Wall -Wextra -Wno-missing-braces -ffast-math)
267
268     if("${TIM41_X86_SIMD_LEVEL}" STREQUAL "AVX512")
269         add_compile_options(
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
272         )
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)
281     endif()
282
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")
290 endif()
291
292 function(DisableMSManifest targetName)
293     if(MSVC)
294         get_property(linkFlags TARGET ${targetName} PROPERTY LINK_FLAGS)
295         set_target_properties(${targetName} PROPERTIES LINK_FLAGS "${linkFlags} /MANIFEST:NO")
296     endif()
297 endfunction()
298
299 include_directories(
300     "."
301     FLAC/include
302     interface
303     lame/DLL
304     lame/include
305     libarc
306     libmpg123/include
307     libunimod
308     ogg/include
309     opus/include
310     pdcurses
311     portaudio/include
312     portmidi/pm_common
313     portmidi/pm_win
314     portmidi/porttime
315     timidity
316         twsyn_bridge
317     utils
318     vorbis/include
319     vorbis-tools/include
320 )
321
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)
332
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)