build with Meson instead of autotools
[ncmpc-debian.git] / meson.build
1 project('ncmpc', 'c',
2   version: '0.28',
3   default_options: [
4     'c_std=c99',
5   ],
6   license: 'GPLv2+',
7 )
8
9 cc = meson.get_compiler('c')
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       # TODO: find other curses implementation (pdcurses?)
74     endif
75   endif
76 endif
77
78 if curses == 'ncursesw'
79   conf.set('HAVE_NCURSESW', true)
80   curses_enhanced = true
81   curses_color = true
82   if cc.has_header('ncursesw/curses.h', dependencies: curses_dep)
83     conf.set('HAVE_NCURSESW_CURSES_H', true)
84   elif cc.has_header('ncursesw.h', dependencies: curses_dep)
85     conf.set('HAVE_NCURSESW_H', true)
86   else
87     error('No ncursesw header found')
88   endif
89 elif curses == 'ncurses'
90   conf.set('HAVE_NCURSES', true)
91   curses_enhanced = true
92   curses_color = true
93   if cc.has_header('ncurses/curses.h', dependencies: curses_dep)
94     conf.set('HAVE_NCURSES_CURSES_H', true)
95   elif cc.has_header('ncurses.h', dependencies: curses_dep)
96     conf.set('HAVE_NCURSES_H', true)
97   else
98     error('No ncurses header found')
99   endif
100 else
101   if cc.has_header('curses.h', dependencies: curses_dep)
102     conf.set('HAVE_CURSES_H', true)
103
104     # TODO: test this with pdcurses
105     curses_enhanced = cc.has_header_symbol('curses.h', '_XOPEN_CURSES', dependencies: curses_dep)
106     curses_color = curses_enhanced or cc.has_header_symbol('curses.h', 'COLOR_PAIR', dependencies: curses_dep)
107   else
108     error('No curses header found')
109   endif
110 endif
111 conf.set('HAVE_CURSES_ENHANCED', curses_enhanced)
112
113 enable_mouse = get_option('mouse')
114 if enable_mouse == 'false'
115   enable_mouse = false
116 elif cc.has_function('getmouse', dependencies: curses_dep)
117   enable_mouse = true
118 elif enable_mouse == 'auto'
119   enable_mouse = false
120 else
121   error('getmouse() not available')
122 endif
123 conf.set('HAVE_GETMOUSE', enable_mouse)
124
125 enable_lirc = get_option('lirc')
126 if enable_lirc == 'false'
127   enable_lirc = false
128   lirc_dep = []
129 else
130   lirc_dep = dependency('lirc', required: false)
131   if not lirc_dep.found()
132     lirc_dep = dependency('liblircclient0', required: false)
133   endif
134
135   if lirc_dep.found()
136     enable_lirc = true
137   elif enable_lirc == 'auto'
138     enable_lirc = false
139   else
140     error('liblirc not found')
141   endif
142 endif
143 conf.set('ENABLE_LIRC', enable_lirc)
144
145 common_cflags = [
146 ]
147
148 test_cflags = [
149   '-Wall',
150   '-Wextra',
151   '-Wno-deprecated-declarations',
152   '-Wmissing-prototypes',
153   '-Wshadow',
154   '-Wpointer-arith',
155   '-Wstrict-prototypes',
156   '-Wcast-qual',
157   '-Wwrite-strings',
158   '-fvisibility=hidden',
159 ]
160
161 test_ldflags = [
162 ]
163
164 if get_option('buildtype') != 'debug'
165   test_cflags += [
166     '-ffunction-sections',
167     '-fdata-sections',
168   ]
169   test_ldflags += [
170     '-Wl,--gc-sections',
171   ]
172 endif
173
174 foreach f: test_cflags
175   if cc.has_argument(f)
176     common_cflags += [ f ]
177   endif
178 endforeach
179
180 add_global_arguments(common_cflags, language: 'c')
181
182 foreach f: test_ldflags
183   if cc.has_argument(f)
184     add_global_link_arguments(f, language: 'c')
185   endif
186 endforeach
187
188 glib_dep = dependency('glib-2.0', version: '>= 2.30')
189 libmpdclient_dep = dependency('libmpdclient', version: '>= 2.9')
190
191 inc = include_directories(
192   'src',
193
194   # for the generated config.h
195   meson.current_build_dir(),
196 )
197
198 sources = []
199
200 need_screen_text = false
201 need_plugin_library = false
202
203 if host_machine.system() != 'windows'
204   sources += [
205     'src/signals.c',
206   ]
207 endif
208
209 if not mini
210   sources += [
211     'src/db_completion.c',
212     'src/xterm_title.c',
213     'src/hscroll.c',
214     'src/match.c',
215     'src/conf.c',
216   ]
217 endif
218
219 if async_connect
220   sources += [
221     'src/net/socket.c',
222     'src/net/resolver.c',
223     'src/net/async_connect.c',
224     'src/net/async_rconnect.c',
225     'src/aconnect.c',
226   ]
227 endif
228
229 if enable_lirc
230   sources += [
231     'src/lirc.c',
232   ]
233 endif
234
235 enable_help_screen = get_option('help_screen') and not mini
236 conf.set('ENABLE_HELP_SCREEN', enable_help_screen)
237 if enable_help_screen
238   sources += ['src/screen_help.c']
239 endif
240
241 enable_artist_screen = get_option('artist_screen') and not mini
242 conf.set('ENABLE_ARTIST_SCREEN', enable_artist_screen)
243 if enable_artist_screen
244   sources += ['src/screen_artist.c']
245 endif
246
247 enable_search_screen = get_option('search_screen') and not mini
248 conf.set('ENABLE_SEARCH_SCREEN', enable_search_screen)
249 if enable_search_screen
250   sources += ['src/screen_search.c']
251 endif
252
253 enable_song_screen = get_option('song_screen') and not mini
254 conf.set('ENABLE_SONG_SCREEN', enable_song_screen)
255 if enable_song_screen
256   sources += ['src/screen_song.c']
257 endif
258
259 enable_keydef_screen = get_option('key_screen') and not mini
260 conf.set('ENABLE_KEYDEF_SCREEN', enable_keydef_screen)
261 if enable_keydef_screen
262   sources += ['src/screen_keydef.c']
263 endif
264
265 enable_lyrics_screen = get_option('lyrics_screen') and not mini
266 conf.set('ENABLE_LYRICS_SCREEN', enable_lyrics_screen)
267 if enable_lyrics_screen
268   sources += ['src/screen_lyrics.c', 'src/lyrics.c']
269
270   lyrics_plugin_dir = join_paths(get_option('prefix'), get_option('libdir'), meson.project_name(), 'lyrics')
271   conf.set_quoted('LYRICS_PLUGIN_DIR', lyrics_plugin_dir)
272   install_data(
273     'lyrics/10-hd.sh',
274     'lyrics/20-lyricwiki.rb',
275     install_dir: lyrics_plugin_dir)
276
277   need_screen_text = true
278   need_plugin_library = true
279 endif
280
281 enable_outputs_screen = get_option('outputs_screen') and not mini
282 conf.set('ENABLE_OUTPUTS_SCREEN', enable_outputs_screen)
283 if enable_outputs_screen
284   sources += ['src/screen_outputs.c']
285 endif
286
287 enable_chat_screen = get_option('chat_screen') and not mini
288 conf.set('ENABLE_CHAT_SCREEN', enable_chat_screen)
289 if enable_chat_screen
290   sources += ['src/screen_chat.c']
291   need_screen_text = true
292 endif
293
294 if need_screen_text
295   sources += ['src/screen_text.c']
296 endif
297
298 if need_plugin_library
299   if host_machine.system() == 'windows'
300     error('Plugins not yet compatible with Windows')
301   endif
302
303   sources += ['src/plugin.c']
304 endif
305
306 if host_machine.system() == 'windows'
307   subdir('src/win')
308 endif
309
310 ncmpc = executable('ncmpc',
311   'src/main.c',
312   'src/gidle.c',
313   'src/mpdclient.c',
314   'src/callbacks.c',
315   'src/playlist.c',
316   'src/filelist.c',
317   'src/options.c',
318   'src/command.c',
319   'src/keyboard.c',
320   'src/ncu.c',
321   'src/player_command.c',
322   'src/title_bar.c',
323   'src/progress_bar.c',
324   'src/status_bar.c',
325   'src/screen.c',
326   'src/screen_init.c',
327   'src/screen_paint.c',
328   'src/screen_utils.c',
329   'src/screen_status.c',
330   'src/screen_list.c',
331   'src/screen_find.c',
332   'src/screen_client.c',
333   'src/screen_queue.c',
334   'src/screen_browser.c',
335   'src/screen_file.c',
336   'src/list_window.c',
337   'src/save_playlist.c',
338   'src/song_paint.c',
339   'src/colors.c',
340   'src/charset.c',
341   'src/wreadln.c',
342   'src/strfsong.c',
343   'src/time_format.c',
344   'src/utils.c',
345   sources,
346   include_directories: inc,
347   dependencies: [
348     glib_dep,
349     curses_dep,
350     lirc_dep,
351     libmpdclient_dep,
352   ],
353   install: true
354 )
355
356 configure_file(output: 'config.h', configuration: conf)
357
358 install_man('doc/ncmpc.1')
359
360 docdir = join_paths(get_option('datadir'), 'doc', meson.project_name())
361 install_data('AUTHORS', 'COPYING', 'NEWS', 'README.rst',
362   'doc/config.sample',
363   'doc/keys.sample',
364   'doc/ncmpc.lirc',
365   install_dir: docdir)
366
367 if not mini
368   subdir('test')
369 endif
370
371 if get_option('documentation')
372   doxygen = find_program('doxygen', required: false)
373   if doxygen.found()
374     subdir('doc')
375   endif
376 endif