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