Update changelog, new upstream version fixed #631121
[ncmpc-debian.git] / meson.build
1 project('ncmpc', 'cpp',
2   version: '0.34',
3   meson_version: '>= 0.47',
4   default_options: [
5     'cpp_std=c++14'
6   ],
7   license: 'GPLv2+',
8 )
9
10 cc = meson.get_compiler('cpp')
11
12 conf = configuration_data()
13 conf.set_quoted('PACKAGE', meson.project_name())
14 conf.set_quoted('VERSION', meson.project_version())
15 conf.set_quoted('SYSCONFDIR', join_paths(get_option('prefix'), get_option('sysconfdir')))
16 conf.set_quoted('LOCALE_DIR', join_paths(get_option('prefix'), get_option('localedir')))
17
18 mini = get_option('mini')
19 conf.set('NCMPC_MINI', mini)
20
21 enable_locale = get_option('locale')
22 if enable_locale.disabled() or mini
23   enable_locale = false
24 elif cc.has_header('locale.h')
25   enable_locale = true
26 elif enable_locale.auto()
27   enable_locale = false
28 else
29   error('locale.h not found')
30 endif
31 conf.set('ENABLE_LOCALE', enable_locale)
32
33 enable_nls = get_option('nls')
34 if enable_nls.disabled() or mini
35   enable_nls = false
36 elif cc.has_header('libintl.h')
37   enable_nls = true
38 elif enable_nls.auto()
39   enable_nls = false
40 else
41   error('libintl.h not found')
42 endif
43 conf.set('ENABLE_NLS', enable_nls)
44 if enable_nls
45   conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
46   subdir('po')
47 endif
48
49 conf.set('HAVE_LOCALE_T', enable_locale and cc.has_header_symbol('locale.h', 'locale_t'))
50 conf.set('HAVE_ICONV', enable_locale and cc.has_function('iconv'))
51
52 async_connect = get_option('async_connect')
53 conf.set('ENABLE_ASYNC_CONNECT', async_connect)
54
55 conf.set('ENABLE_MULTIBYTE', get_option('multibyte'))
56
57 curses = get_option('curses')
58 if curses == 'ncursesw'
59   curses_dep = dependency('ncursesw')
60 elif curses == 'ncurses'
61   curses_dep = dependency('ncurses')
62 else
63   curses_dep = dependency('ncursesw', required: false)
64   if curses_dep.found()
65     curses = 'ncursesw'
66   else
67     curses_dep = dependency('ncurses', required: false)
68
69     if curses_dep.found()
70       curses = 'ncurses'
71     else
72       curses_dep = cc.find_library('ncursesw', required: false)
73       if not curses_dep.found()
74         curses_dep = cc.find_library('ncurses')
75       endif
76
77       # TODO: find other curses implementation (pdcurses?)
78     endif
79   endif
80 endif
81
82 if not cc.has_header('curses.h', dependencies: curses_dep)
83   error('No curses header found')
84 endif
85
86 if curses == 'ncursesw'
87   conf.set('HAVE_NCURSESW', true)
88   curses_enhanced = true
89   curses_color = true
90 elif curses == 'ncurses'
91   conf.set('HAVE_NCURSES', true)
92   curses_enhanced = true
93   curses_color = true
94 else
95   # TODO: test this with pdcurses
96   curses_enhanced = cc.has_header_symbol('curses.h', '_XOPEN_CURSES', dependencies: curses_dep)
97   curses_color = curses_enhanced or cc.has_header_symbol('curses.h', 'COLOR_PAIR', dependencies: curses_dep)
98 endif
99 conf.set('HAVE_CURSES_ENHANCED', curses_enhanced)
100
101 enable_mouse = get_option('mouse')
102 if enable_mouse.disabled()
103   enable_mouse = false
104 elif cc.has_function('getmouse', dependencies: curses_dep)
105   enable_mouse = true
106 elif enable_mouse.auto()
107   enable_mouse = false
108 else
109   error('getmouse() not available')
110 endif
111 conf.set('HAVE_GETMOUSE', enable_mouse)
112
113 lirc_dep = dependency('lirc', required: get_option('lirc'))
114 conf.set('ENABLE_LIRC', lirc_dep.found())
115
116 conf.set('ENABLE_COLORS', curses_color and get_option('colors'))
117
118 common_cflags = [
119   # for getaddrinfo() and sigaction() with glibc
120   '-D_GNU_SOURCE',
121
122   # no header bloat for the iostream library we don't use
123   '-DBOOST_NO_IOSTREAM',
124
125   # avoid the runtime dependency on libboost_system
126   '-DBOOST_ERROR_CODE_HEADER_ONLY',
127
128   # disable deprecated boost::system features
129   '-DBOOST_SYSTEM_NO_DEPRECATED',
130 ]
131
132 test_cflags = [
133   '-Wall',
134   '-Wextra',
135   '-Wno-deprecated-declarations',
136   '-Wshadow',
137   '-Wpointer-arith',
138   '-Wcast-qual',
139   '-Wcast-align',
140   '-Wwrite-strings',
141   '-Wmissing-declarations', '-Wmissing-noreturn', '-Wmissing-format-attribute',
142   '-Wredundant-decls', '-Wundef',
143   '-Wno-non-virtual-dtor',
144   '-fvisibility=hidden',
145
146   # the only warnings we got from this are from formatted error
147   # messages, and their truncation is harmless
148   '-Wno-format-truncation',
149 ]
150
151 if get_option('buildtype') != 'debug'
152   test_cflags += [
153     '-ffunction-sections',
154     '-fdata-sections',
155   ]
156 endif
157
158 foreach f: test_cflags
159   if cc.has_argument(f)
160     common_cflags += [ f ]
161   endif
162 endforeach
163
164 add_global_arguments(common_cflags, language: 'cpp')
165
166 thread_dep = dependency('threads')
167 boost_dep = dependency('boost', version: '>= 1.62')
168 libmpdclient_dep = dependency('libmpdclient', version: '>= 2.9')
169
170 if not mini
171   pcre_dep = dependency('libpcre', required: get_option('regex'))
172   conf.set('HAVE_PCRE', pcre_dep.found())
173 else
174   pcre_dep = declare_dependency()
175 endif
176
177 inc = include_directories(
178   'src',
179
180   # for the generated config.h
181   '.',
182 )
183
184 sources = []
185
186 need_screen_text = false
187 need_plugin_library = false
188
189 if host_machine.system() != 'windows'
190   sources += [
191     'src/signals.cxx',
192   ]
193 endif
194
195 if not mini
196   sources += [
197     'src/db_completion.cxx',
198     'src/xterm_title.cxx',
199     'src/BasicMarquee.cxx',
200     'src/hscroll.cxx',
201     'src/conf.cxx',
202   ]
203 endif
204
205 if async_connect
206   sources += [
207     'src/net/AsyncConnect.cxx',
208     'src/net/AsyncResolveConnect.cxx',
209     'src/aconnect.cxx',
210   ]
211 endif
212
213 if lirc_dep.found()
214   sources += [
215     'src/lirc.cxx',
216   ]
217 endif
218
219 enable_help_screen = get_option('help_screen') and not mini
220 conf.set('ENABLE_HELP_SCREEN', enable_help_screen)
221 if enable_help_screen
222   sources += ['src/HelpPage.cxx']
223 endif
224
225 enable_library_screen = get_option('library_screen') and not mini
226 conf.set('ENABLE_LIBRARY_PAGE', enable_library_screen)
227 if enable_library_screen
228   sources += [
229     'src/LibraryPage.cxx',
230     'src/TagListPage.cxx',
231     'src/TagFilter.cxx',
232   ]
233 endif
234
235 enable_search_screen = get_option('search_screen') and not mini
236 conf.set('ENABLE_SEARCH_SCREEN', enable_search_screen)
237 if enable_search_screen
238   sources += ['src/SearchPage.cxx']
239 endif
240
241 enable_song_screen = get_option('song_screen') and not mini
242 conf.set('ENABLE_SONG_SCREEN', enable_song_screen)
243 if enable_song_screen
244   sources += ['src/SongPage.cxx']
245 endif
246
247 enable_keydef_screen = get_option('key_screen') and not mini
248 conf.set('ENABLE_KEYDEF_SCREEN', enable_keydef_screen)
249 if enable_keydef_screen
250   sources += ['src/screen_keydef.cxx']
251 endif
252
253 enable_lyrics_screen = get_option('lyrics_screen') and not mini
254 conf.set('ENABLE_LYRICS_SCREEN', enable_lyrics_screen)
255 if enable_lyrics_screen
256   sources += ['src/LyricsPage.cxx', 'src/lyrics.cxx']
257
258   lyrics_plugin_dir = get_option('lyrics_plugin_dir')
259   if lyrics_plugin_dir == ''
260     lyrics_plugin_dir = join_paths(get_option('prefix'), get_option('libdir'), meson.project_name(), 'lyrics')
261   endif
262
263   conf.set_quoted('LYRICS_PLUGIN_DIR', lyrics_plugin_dir)
264   install_data(
265     'lyrics/10-hd.sh',
266     'lyrics/20-lyricwiki.rb',
267     install_dir: lyrics_plugin_dir)
268
269   need_screen_text = true
270   need_plugin_library = true
271 endif
272
273 enable_outputs_screen = get_option('outputs_screen') and not mini
274 conf.set('ENABLE_OUTPUTS_SCREEN', enable_outputs_screen)
275 if enable_outputs_screen
276   sources += ['src/OutputsPage.cxx']
277 endif
278
279 enable_chat_screen = get_option('chat_screen') and not mini
280 conf.set('ENABLE_CHAT_SCREEN', enable_chat_screen)
281 if enable_chat_screen
282   sources += ['src/ChatPage.cxx']
283   need_screen_text = true
284 endif
285
286 if need_screen_text
287   sources += ['src/TextPage.cxx']
288 endif
289
290 if need_plugin_library
291   if host_machine.system() == 'windows'
292     error('Plugins not yet compatible with Windows')
293   endif
294
295   sources += ['src/plugin.cxx']
296 endif
297
298 if host_machine.system() == 'windows'
299   subdir('src/win')
300 endif
301
302 ncmpc = executable('ncmpc',
303   'src/Main.cxx',
304   'src/Instance.cxx',
305   'src/gidle.cxx',
306   'src/mpdclient.cxx',
307   'src/callbacks.cxx',
308   'src/Queue.cxx',
309   'src/filelist.cxx',
310   'src/Options.cxx',
311   'src/Command.cxx',
312   'src/Bindings.cxx',
313   'src/GlobalBindings.cxx',
314   'src/UserInput.cxx',
315   'src/AsyncUserInput.cxx',
316   'src/KeyName.cxx',
317   'src/Match.cxx',
318   'src/ncu.cxx',
319   'src/player_command.cxx',
320   'src/DelayedSeek.cxx',
321   'src/TabBar.cxx',
322   'src/TitleBar.cxx',
323   'src/ProgressBar.cxx',
324   'src/StatusBar.cxx',
325   'src/screen.cxx',
326   'src/screen_init.cxx',
327   'src/screen_paint.cxx',
328   'src/screen_utils.cxx',
329   'src/screen_status.cxx',
330   'src/screen_list.cxx',
331   'src/screen_find.cxx',
332   'src/screen_client.cxx',
333   'src/QueuePage.cxx',
334   'src/FileListPage.cxx',
335   'src/FileBrowserPage.cxx',
336   'src/ProxyPage.cxx',
337   'src/ListCursor.cxx',
338   'src/ListWindow.cxx',
339   'src/TextListRenderer.cxx',
340   'src/save_playlist.cxx',
341   'src/song_paint.cxx',
342   'src/BasicColors.cxx',
343   'src/CustomColors.cxx',
344   'src/Styles.cxx',
345   'src/charset.cxx',
346   'src/wreadln.cxx',
347   'src/Completion.cxx',
348   'src/strfsong.cxx',
349   'src/time_format.cxx',
350   'src/util/LocaleString.cxx',
351   'src/util/StringStrip.cxx',
352   'src/util/StringUTF8.cxx',
353   'src/util/UriUtil.cxx',
354   sources,
355   include_directories: inc,
356   dependencies: [
357     thread_dep,
358     boost_dep,
359     pcre_dep,
360     curses_dep,
361     lirc_dep,
362     libmpdclient_dep,
363   ],
364   install: true
365 )
366
367 configure_file(output: 'config.h', configuration: conf)
368
369 docdir = join_paths(get_option('datadir'), 'doc', meson.project_name())
370 install_data('AUTHORS', 'COPYING', 'NEWS', 'README.rst',
371   'doc/config.sample',
372   'doc/keys.sample',
373   'doc/ncmpc.lirc',
374   install_dir: docdir)
375
376 if not mini
377   subdir('test')
378 endif
379
380 subdir('doc')