OSDN Git Service

Split vorbisenc and vorbisfile from vorbis
[timidity41/timidity41.git] / CMakeLists.txt
1
2 cmake_minimum_required(VERSION 3.9)
3
4 project(timidity41)
5
6 set(TIM41_USE_AVX2 FALSE CACHE BOOL "Enable use of Intel AVX2 enhanced instructions")
7 set(TIM41_SPECTRE_MITIGATION FALSE CACHE BOOL "Enable Spectre mitigation")
8
9 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/Debug/bin")
10 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/Release/bin")
11 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_BINARY_DIR}/RelWithDebInfo/bin")
12 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_BINARY_DIR}/MinSizeRel/bin")
13
14 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/Debug/bin")
15 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/Release/bin")
16 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_BINARY_DIR}/RelWithDebInfo/bin")
17 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_BINARY_DIR}/MinSizeRel/bin")
18
19 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/Debug/bin")
20 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/Release/bin")
21 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_BINARY_DIR}/RelWithDebInfo/bin")
22 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_BINARY_DIR}/MinSizeRel/bin")
23
24 find_package(Git)
25
26 if("${Git_FOUND}" AND EXISTS "${CMAKE_SOURCE_DIR}/.git")
27     add_custom_target(
28         UpdateTim41Version
29         COMMAND "${CMAKE_COMMAND}"
30             -DGIT_EXECUTABLE="${GIT_EXECUTABLE}"
31             -DINFILE="${CMAKE_CURRENT_SOURCE_DIR}/version.h.in"
32             -DOUTFILE="${CMAKE_CURRENT_BINARY_DIR}/version.h"
33             -P "${CMAKE_CURRENT_SOURCE_DIR}/WriteVersion.cmake"
34         BYPRODUCTS "${CMAKE_CURRENT_BINARY_DIR}/version.h"
35         WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
36         COMMENT "Updating version info..."
37     )
38 else()
39     set(tim41VersionStr "current")
40     set(tim41Version4Comma "41,0,0,0")
41     configure_file(version.h.in version.h)
42
43     add_custom_target(
44         UpdateTim41Version
45         COMMAND "${CMAKE_COMMAND}" -E echo "automatic version detection is not available"
46     )
47 endif()
48
49 include_directories("${CMAKE_CURRENT_BINARY_DIR}")
50
51 # base definitions
52 add_definitions(
53 # TiMidity++ common
54     -DWIN32
55     -DRETSIGTYPE=int
56     -DSTDC_HEADERS
57     -DHAVE_GETCWD
58     -DHAVE_POPEN
59     -DHAVE_SIGNAL
60     -DHAVE_SNPRINTF
61     -DHAVE_STRDUP
62     -DHAVE_STRERROR
63     -DHAVE_STRNCASECMP
64     -DHAVE_STRSTR
65     -DHAVE_VPRINTF
66     -DHAVE_VSNPRINTF
67     -DHAVE_ERRNO_H
68     -DHAVE_LIMITS_H
69     -DHAVE_MALLOC_H
70     -DHAVE_STDLIB_H
71         -DHAVE_SYS_STAT_H
72     -DHAVE_SYS_TYPES_H
73     -DHAVE_FCNTL_H
74     -DHAVE_MMSYSTEM_H
75     -DENABLE_SHERRY
76     -DENABLE_THREAD
77     -DSUPPORT_SOUNDSPEC
78     -DANOTHER_MAIN
79     -D__W32__
80     -D__W32READDIR__
81         -DUSE_TWSYN_BRIDGE
82         -DTIMW32G_USE_NEW_CONSOLE
83
84 # TiMidity++ audio
85     -DAU_W32
86
87 # network
88     -DWINSOCK
89     -DHAVE_SOCKET
90     -DSUPPORT_SOCKET
91
92 # pdcurses
93     -DPDC_DLL_BUILD
94
95 # Windows
96     -DWIN32_LEAN_AND_MEAN
97     -DWINVER=0x0A00
98     -D_WIN32_WINNT=0x0A00
99
100 # MSVCRT
101     -D_CRT_SECURE_NO_WARNINGS
102     -D_CRT_NONSTDC_NO_DEPRECATE
103 )
104
105 set(
106         TIMIDITY_FE_DEFINITIONS
107
108 # TiMidity++ common
109     -DHAVE_LIBVORBIS
110     -DHAVE_LIBGOGO
111     -DHAVE_LIBMPG123
112     -DENABLE_SFZ
113         -DENABLE_DLS
114     -DSNDFNT_INITFILE_NAME="soundfont.ini"
115
116 # TiMidity++ audio
117     -DAU_WASAPI
118     -DAU_WDMKS
119     -DAU_OPUS
120     -DAU_OPUS_DLL
121     -DAU_SPEEX
122         -DAU_SPEEX_DLL
123     -DAU_LAME
124     -DAU_GOGO
125     -DAU_GOGO_DLL
126     -DAU_VORBIS
127     -DAU_VORBIS_DLL
128     # -DVORBIS_DLL_INCLUDE_VORBISENC
129     # -DVORBIS_DLL_INCLUDE_VORBISFILE
130     -DAU_FLAC
131     -DAU_FLAC_DLL
132     -DAU_OGGFLAC
133     -DAU_PORTAUDIO
134     -DAU_PORTAUDIO_DLL
135     -DPORTAUDIO_V19
136     -DPORTAUDIO_V19_6
137     -DVST_LOADER_ENABLE
138     -DVSTWRAP_EXT
139     -DAU_NPIPE
140     -DAU_LIST
141     -DAU_WRITE_MIDI
142     -DAU_MODMIDI
143     -DAU_VOLUME_CALC
144     -DAU_BENCHMARK
145
146 # FLAC
147     -DFLAC__NO_DLL
148 )
149
150 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
151     add_definitions(-DVST_LIBRARY_NAME="timvstwrap_x64.dll")
152 else()
153     add_definitions(-DVST_LIBRARY_NAME="timvstwrap.dll")
154 endif()
155
156 if(TIM41_USE_AVX2)
157     add_definitions(-DUSE_AVX2)
158 else()
159     add_definitions(-DUSE_SSE42)
160 endif()
161
162 if(MSVC)
163     # remove existing /W3 options
164     string(REGEX REPLACE "/W[0-4]" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
165     string(REGEX REPLACE "/W[0-4]" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
166
167     add_compile_options(/W4 /GS /fp:fast)
168
169     if("${TIM41_SPECTRE_MITIGATION}")
170         add_compile_options(/Qspectre)
171     endif()
172
173     add_compile_options(/we4013)    # '%s' undefined; assuming extern returning int
174     add_compile_options(/we4028)    # formal parameter %d different from declaration
175     add_compile_options(/we4133)    # 'function': incompatible types - from '%s' to '%s'
176
177     if(TIM41_USE_AVX2)
178         add_compile_options(/arch:AVX2)
179     else()
180         if("${CMAKE_C_COMPILER_ID}" MATCHES "Clang")
181             add_compile_options(-msse4.2)
182         endif()
183     endif()
184     
185         string(APPEND CMAKE_CXX_FLAGS " /EHsc /std:c++17")
186     string(APPEND CMAKE_C_FLAGS_RELEASE " /Zi /guard:cf")
187     string(APPEND CMAKE_CXX_FLAGS_RELEASE " /Zi /guard:cf")
188
189     if("${CMAKE_C_COMPILER_ID}" MATCHES "Clang")
190         string(APPEND CMAKE_C_FLAGS_RELEASE " -flto=thin")
191         string(APPEND CMAKE_CXX_FLAGS_RELEASE " -flto=thin")
192     else()
193         string(APPEND CMAKE_C_FLAGS_RELEASE " /GL")
194         string(APPEND CMAKE_CXX_FLAGS_RELEASE " /GL")
195
196         if ("${CMAKE_C_COMPILER_VERSION}" VERSION_GREATER_EQUAL "19.20")
197             string(REGEX REPLACE "/Ob[0-2]" "" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
198             string(REGEX REPLACE "/Ob[0-2]" "" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
199             string(APPEND CMAKE_C_FLAGS_RELEASE " /Ob3")
200             string(APPEND CMAKE_CXX_FLAGS_RELEASE " /Ob3")
201         endif()
202     endif()
203
204     if("${CMAKE_C_COMPILER_ID}" MATCHES "Clang")
205         string(APPEND CMAKE_EXE_LINKER_FLAGS_DEBUG " /DEBUG")
206         string(APPEND CMAKE_SHARED_LINKER_FLAGS_DEBUG " /DEBUG")
207
208         string(APPEND CMAKE_EXE_LINKER_FLAGS_RELEASE " /OPT:REF /OPT:ICF /DEBUG /GUARD:CF")
209         string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE " /OPT:REF /OPT:ICF /DEBUG /GUARD:CF")
210
211         string(APPEND CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO " /OPT:REF /DEBUG")
212         string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO " /OPT:REF /DEBUG")
213     else()
214         string(APPEND CMAKE_EXE_LINKER_FLAGS_DEBUG " /DEBUG:FASTLINK")
215         string(APPEND CMAKE_SHARED_LINKER_FLAGS_DEBUG " /DEBUG:FASTLINK")
216
217         string(APPEND CMAKE_EXE_LINKER_FLAGS_RELEASE " /OPT:REF /OPT:ICF /LTCG:incremental /DEBUG:FULL /GUARD:CF")
218         string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE " /OPT:REF /OPT:ICF /LTCG:incremental /DEBUG:FULL /GUARD:CF")
219         string(APPEND CMAKE_STATIC_LINKER_FLAGS_RELEASE " /LTCG:incremental")
220
221         string(APPEND CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO " /OPT:REF /DEBUG:FASTLINK")
222         string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO " /OPT:REF /DEBUG:FASTLINK")
223     endif()
224
225     string(APPEND CMAKE_RC_FLAGS " /nologo")
226
227     add_definitions(
228         -DSTDOUT_FILENO=1
229     )
230 else()
231     add_compile_options(-Wall -Wextra -Wno-missing-braces -ffast-math)
232
233     if(TIM41_USE_AVX2)
234         add_compile_options(-mavx2 -mfma)
235     else()
236         add_compile_options(-msse4.2)
237     endif()
238
239         string(APPEND CMAKE_CXX_FLAGS " -std=c++17")
240     string(APPEND CMAKE_C_FLAGS_RELEASE " -flto")
241     string(APPEND CMAKE_CXX_FLAGS_RELEASE " -flto")
242     string(APPEND CMAKE_EXE_LINKER_FLAGS_RELEASE " -s")
243     string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELEASE " -s")
244     string(APPEND CMAKE_RC_FLAGS " -O coff")
245 endif()
246
247 function(DisableMSManifest targetName)
248     if(MSVC)
249         get_property(linkFlags TARGET ${targetName} PROPERTY LINK_FLAGS)
250         set_target_properties(${targetName} PROPERTIES LINK_FLAGS "${linkFlags} /MANIFEST:NO")
251     endif()
252 endfunction()
253
254 include_directories(
255     "."
256     FLAC/include
257     interface
258     lame/DLL
259     lame/include
260     libarc
261     libmpg123/include
262     libunimod
263     ogg/include
264     opus/include
265     pdcurses
266     portaudio/include
267     portmidi/pm_common
268     portmidi/pm_win
269     portmidi/porttime
270     timidity
271         twsyn_bridge
272     utils
273     vorbis/include
274 )
275
276 add_subdirectory(FLAC)
277 add_subdirectory(lame)
278 add_subdirectory(libmpg123)
279 add_subdirectory(ogg)
280 add_subdirectory(opus)
281 add_subdirectory(pdcurses)
282 add_subdirectory(portaudio)
283 add_subdirectory(portmidi)
284 add_subdirectory(speex)
285 add_subdirectory(vorbis)
286
287 add_subdirectory(cfgforsf)
288 add_subdirectory(interface)
289 add_subdirectory(libarc)
290 add_subdirectory(libunimod)
291 add_subdirectory(sf_view_gui)
292 add_subdirectory(timidity)
293 add_subdirectory(twsyn_bridge)
294 add_subdirectory(utils)