OSDN Git Service

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