1 project('ncmpc', 'c',
2 version: '0.29',
3 default_options: [
4 'c_std=c99',
5 ],
6 license: 'GPLv2+',
7 )
9 cc = meson.get_compiler('c')
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')))
17 mini = get_option('mini')
18 conf.set('NCMPC_MINI', mini)
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)
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
48 if get_option('tcp')
49 conf.set('ENABLE_TCP', true)
50 conf.set('HAVE_GETADDRINFO', cc.has_function('getaddrinfo'))
51 endif
53 async_connect = get_option('async_connect')
54 conf.set('ENABLE_ASYNC_CONNECT', async_connect)
56 conf.set('ENABLE_MULTIBYTE', get_option('multibyte'))
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)
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
78 # TODO: find other curses implementation (pdcurses?)
79 endif
80 endif
81 endif
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)
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)
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)
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
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)
150 conf.set('ENABLE_COLORS', curses_color)
152 common_cflags = [
153 # for getaddrinfo() and sigaction() with glibc
154 '-D_GNU_SOURCE',
155 ]
157 test_cflags = [
158 '-Wall',
159 '-Wextra',
160 '-Wno-deprecated-declarations',
161 '-Wmissing-prototypes',
162 '-Wshadow',
163 '-Wpointer-arith',
164 '-Wstrict-prototypes',
165 '-Wcast-qual',
166 '-Wwrite-strings',
167 '-fvisibility=hidden',
168 ]
170 test_ldflags = [
171 ]
173 if get_option('buildtype') != 'debug'
174 test_cflags += [
175 '-ffunction-sections',
176 '-fdata-sections',
177 ]
178 test_ldflags += [
179 '-Wl,--gc-sections',
180 ]
181 endif
183 foreach f: test_cflags
184 if cc.has_argument(f)
185 common_cflags += [ f ]
186 endif
187 endforeach
189 add_global_arguments(common_cflags, language: 'c')
191 foreach f: test_ldflags
192 if cc.has_argument(f)
193 add_global_link_arguments(f, language: 'c')
194 endif
195 endforeach
197 glib_dep = dependency('glib-2.0', version: '>= 2.30')
198 libmpdclient_dep = dependency('libmpdclient', version: '>= 2.9')
200 inc = include_directories(
201 'src',
203 # for the generated config.h
204 '.',
205 )
207 sources = []
209 need_screen_text = false
210 need_plugin_library = false
212 if host_machine.system() != 'windows'
213 sources += [
214 'src/signals.c',
215 ]
216 endif
218 if not mini
219 sources += [
220 'src/db_completion.c',
221 'src/xterm_title.c',
222 'src/hscroll.c',
223 'src/match.c',
224 'src/conf.c',
225 ]
226 endif
228 if async_connect
229 sources += [
230 'src/net/socket.c',
231 'src/net/resolver.c',
232 'src/net/async_connect.c',
233 'src/net/async_rconnect.c',
234 'src/aconnect.c',
235 ]
236 endif
238 if enable_lirc
239 sources += [
240 'src/lirc.c',
241 ]
242 endif
244 enable_help_screen = get_option('help_screen') and not mini
245 conf.set('ENABLE_HELP_SCREEN', enable_help_screen)
246 if enable_help_screen
247 sources += ['src/screen_help.c']
248 endif
250 enable_artist_screen = get_option('artist_screen') and not mini
251 conf.set('ENABLE_ARTIST_SCREEN', enable_artist_screen)
252 if enable_artist_screen
253 sources += ['src/screen_artist.c']
254 endif
256 enable_search_screen = get_option('search_screen') and not mini
257 conf.set('ENABLE_SEARCH_SCREEN', enable_search_screen)
258 if enable_search_screen
259 sources += ['src/screen_search.c']
260 endif
262 enable_song_screen = get_option('song_screen') and not mini
263 conf.set('ENABLE_SONG_SCREEN', enable_song_screen)
264 if enable_song_screen
265 sources += ['src/screen_song.c']
266 endif
268 enable_keydef_screen = get_option('key_screen') and not mini
269 conf.set('ENABLE_KEYDEF_SCREEN', enable_keydef_screen)
270 if enable_keydef_screen
271 sources += ['src/screen_keydef.c']
272 endif
274 enable_lyrics_screen = get_option('lyrics_screen') and not mini
275 conf.set('ENABLE_LYRICS_SCREEN', enable_lyrics_screen)
276 if enable_lyrics_screen
277 sources += ['src/screen_lyrics.c', 'src/lyrics.c']
279 lyrics_plugin_dir = get_option('lyrics_plugin_dir')
280 if lyrics_plugin_dir == ''
281 lyrics_plugin_dir = join_paths(get_option('prefix'), get_option('libdir'), meson.project_name(), 'lyrics')
282 endif
284 conf.set_quoted('LYRICS_PLUGIN_DIR', lyrics_plugin_dir)
285 install_data(
286 'lyrics/10-hd.sh',
287 'lyrics/20-lyricwiki.rb',
288 install_dir: lyrics_plugin_dir)
290 need_screen_text = true
291 need_plugin_library = true
292 endif
294 enable_outputs_screen = get_option('outputs_screen') and not mini
295 conf.set('ENABLE_OUTPUTS_SCREEN', enable_outputs_screen)
296 if enable_outputs_screen
297 sources += ['src/screen_outputs.c']
298 endif
300 enable_chat_screen = get_option('chat_screen') and not mini
301 conf.set('ENABLE_CHAT_SCREEN', enable_chat_screen)
302 if enable_chat_screen
303 sources += ['src/screen_chat.c']
304 need_screen_text = true
305 endif
307 if need_screen_text
308 sources += ['src/screen_text.c']
309 endif
311 if need_plugin_library
312 if host_machine.system() == 'windows'
313 error('Plugins not yet compatible with Windows')
314 endif
316 sources += ['src/plugin.c']
317 endif
319 if host_machine.system() == 'windows'
320 subdir('src/win')
321 endif
323 ncmpc = executable('ncmpc',
324 'src/main.c',
325 'src/gidle.c',
326 'src/mpdclient.c',
327 'src/callbacks.c',
328 'src/playlist.c',
329 'src/filelist.c',
330 'src/options.c',
331 'src/command.c',
332 'src/keyboard.c',
333 'src/ncu.c',
334 'src/player_command.c',
335 'src/title_bar.c',
336 'src/progress_bar.c',
337 'src/status_bar.c',
338 'src/screen.c',
339 'src/screen_init.c',
340 'src/screen_paint.c',
341 'src/screen_utils.c',
342 'src/screen_status.c',
343 'src/screen_list.c',
344 'src/screen_find.c',
345 'src/screen_client.c',
346 'src/screen_queue.c',
347 'src/screen_browser.c',
348 'src/screen_file.c',
349 'src/list_window.c',
350 'src/save_playlist.c',
351 'src/song_paint.c',
352 'src/colors.c',
353 'src/charset.c',
354 'src/wreadln.c',
355 'src/strfsong.c',
356 'src/time_format.c',
357 'src/utils.c',
358 sources,
359 include_directories: inc,
360 dependencies: [
361 glib_dep,
362 curses_dep,
363 lirc_dep,
364 libmpdclient_dep,
365 ],
366 install: true
367 )
369 configure_file(output: 'config.h', configuration: conf)
371 install_man('doc/ncmpc.1')
373 docdir = join_paths(get_option('datadir'), 'doc', meson.project_name())
374 install_data('AUTHORS', 'COPYING', 'NEWS', 'README.rst',
375 'doc/config.sample',
376 'doc/keys.sample',
377 'doc/ncmpc.lirc',
378 install_dir: docdir)
380 if not mini
381 subdir('test')
382 endif
384 if get_option('documentation')
385 doxygen = find_program('doxygen', required: false)
386 if doxygen.found()
387 subdir('doc')
388 endif
389 endif