meson.build 9.38 KB
Newer Older
1 2
project(
  'gnome-control-center', 'c',
Georges Basile Stavracas Neto's avatar
Georges Basile Stavracas Neto committed
3
        version : '3.34.0.1',
4
        license : 'GPL2+',
5
  meson_version : '>= 0.50.0'
6 7 8 9 10 11 12 13 14 15 16 17 18
)

control_center_prefix = get_option('prefix')
control_center_bindir = join_paths(control_center_prefix, get_option('bindir'))
control_center_datadir = join_paths(control_center_prefix, get_option('datadir'))
control_center_libexecdir = join_paths(control_center_prefix, get_option('libexecdir'))
control_center_localedir = join_paths(control_center_prefix, get_option('localedir'))
control_center_mandir = join_paths(control_center_prefix, get_option('mandir'))
control_center_sysconfdir = join_paths(control_center_prefix, get_option('sysconfdir'))

control_center_pkgdatadir = join_paths(control_center_datadir, meson.project_name())
control_center_desktopdir = join_paths(control_center_datadir, 'applications')
control_center_icondir = join_paths(control_center_datadir, 'icons')
19
control_center_schemadir = join_paths (control_center_datadir, 'glib-2.0', 'schemas')
20 21 22

control_center_gettext = meson.project_name() + '-2.0'

23
host_is_linux = host_machine.system().contains('linux')
24
host_is_linux_not_s390 = host_is_linux and not host_machine.cpu().contains('s390')
25 26 27

cc = meson.get_compiler('c')

28 29 30
# Tracing
enable_tracing = get_option('tracing')

31 32
config_h = configuration_data()

33 34 35 36 37
py3 = import('python3')
python = py3.find_python()

config_h.set_quoted('TEST_NM_PYTHON', python.path())

38 39 40 41 42 43 44 45 46 47 48 49 50 51
# defines
set_defines = [
  # package
  ['PACKAGE', meson.project_name()],
  ['PACKAGE_VERSION', meson.project_version()],
  ['VERSION', meson.project_version()],
  # i18n
  ['GETTEXT_PACKAGE', control_center_gettext]
]

foreach define: set_defines
  config_h.set_quoted(define[0], define[1])
endforeach

52 53 54
# meson does not support octal values, so it must be handled as a
# string. See: https://github.com/mesonbuild/meson/issues/2047
config_h.set('USER_DIR_MODE', '0700',
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
             description: 'Permissions for creating the user\'s config, cache and data directories')

# compiler flags
common_flags = ['-DHAVE_CONFIG_H']

# Only add this when optimizing is enabled (default)
optimized_src = '''
  #if __OPTIMIZE__ == 0
  #error No optimization
  #endif
'''

control_center_optimized = get_option('buildtype').contains('optimized') and cc.compiles(optimized_src)

if control_center_optimized
  common_flags += '-Wp,-D_FORTIFY_SOURCE=2'
endif

if get_option('buildtype').contains('debug')
  test_cflags = [
    '-Wcast-align',
    '-Wmissing-field-initializers',
    '-Wmissing-declarations',
    '-Wmissing-prototypes',
    '-Wnested-externs',
    '-Wno-strict-aliasing',
    '-Wno-sign-compare'
  ]

  common_flags += cc.get_supported_arguments(test_cflags)
endif

add_project_arguments(common_flags, language: 'c')

# Check that we meet the dependencies
libgvc = subproject(
  'gvc',
92 93 94 95
  default_options: [
    'static=true',
    'alsa=false',
  ]
96 97 98
)
libgvc_dep = libgvc.get_variable('libgvc_dep')

Adrien Plazas's avatar
Adrien Plazas committed
99
libhandy_dep = dependency('libhandy-0.0', version: '>= 0.0.9', required: false)
100 101 102 103 104
if not libhandy_dep.found()
  libhandy = subproject(
    'libhandy',
    default_options: [
      'examples=false',
Adrien Plazas's avatar
Adrien Plazas committed
105 106
      'glade_catalog=disabled',
      'introspection=disabled',
107
      'static=true',
108 109 110 111 112 113 114
      'tests=false',
      'vapi=false',
    ]
  )
  libhandy_dep = libhandy.get_variable('libhandy_dep')
endif

115 116 117 118 119 120 121 122
goa_req_version = '>= 3.25.3'
pulse_req_version = '>= 2.0'

accounts_dep = dependency('accountsservice', version: '>= 0.6.39')
colord_dep = dependency('colord', version: '>= 0.1.34')
gdk_pixbuf_dep = dependency('gdk-pixbuf-2.0', version: '>= 2.23.0')
gio_dep = dependency('gio-2.0')
glib_dep = dependency('glib-2.0', version: '>= 2.53.0')
123
gnome_desktop_dep = dependency('gnome-desktop-3.0', version: '>= 3.27.90')
124
gnome_settings_dep = dependency('gnome-settings-daemon', version: '>= 3.27.90')
125
goa_dep = dependency('goa-1.0', version: goa_req_version)
126
gsettings_desktop_dep = dependency('gsettings-desktop-schemas', version: '>= 3.31.0')
127 128 129 130
libxml_dep = dependency('libxml-2.0')
polkit_gobject_dep = dependency('polkit-gobject-1', version: '>= 0.103')
pulse_dep = dependency('libpulse', version: pulse_req_version)
pulse_mainloop_dep = dependency('libpulse-mainloop-glib', version: pulse_req_version)
131
upower_glib_dep = dependency('upower-glib', version: '>= 0.99.8')
132
gudev_dep = dependency('gudev-1.0')
133 134 135 136 137 138 139 140 141
x11_dep = dependency('x11')
xi_dep = dependency('xi', version: '>= 1.2')

m_dep = cc.find_library('m')

common_deps = [
  gio_dep,
  glib_dep,
  gsettings_desktop_dep,
142
  libhandy_dep,
143 144
  dependency('gio-unix-2.0'),
  dependency('gthread-2.0'),
145
  dependency('gtk+-3.0', version: '>= 3.22.20')
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
]

# Check for CUPS 1.4 or newer
cups_dep = dependency('cups', version : '>= 1.4', required: false)
assert(cups_dep.found(), 'CUPS 1.4 or newer not found')

# https://bugzilla.gnome.org/show_bug.cgi?id=696766
cups_cflags = []
if cups_dep.version().version_compare('>= 1.6')
  cups_cflags += '-D_PPD_DEPRECATED=""'
endif

# cups headers
check_headers = [
  ['HAVE_CUPS_CUPS_H', 'cups/cups.h'],
  ['HAVE_CUPS_PPD_H', 'cups/ppd.h']
]

foreach header: check_headers
  assert(cc.has_header(header[1], args: cups_cflags), 'CUPS headers not found: ' + header[1])
endforeach

# Optional dependency for the user accounts panel
enable_cheese = get_option('cheese')
if enable_cheese
  cheese_deps = [
172
    dependency('cheese', version: '>= 3.28.0'),
173 174 175 176 177 178 179 180 181 182 183 184 185 186
    dependency('cheese-gtk', version: '>= 3.5.91')
  ]
endif
config_h.set('HAVE_CHEESE', enable_cheese,
             description: 'Define to 1 to enable cheese webcam support')

# IBus support
enable_ibus = get_option('ibus')
if enable_ibus
  ibus_dep = dependency('ibus-1.0', version: '>= 1.5.2')
endif
config_h.set('HAVE_IBUS', enable_ibus,
             description: 'Defined if IBus support is enabled')

187 188 189 190 191
# thunderbolt
config_h.set10('HAVE_FN_EXPLICIT_BZERO',
               cc.has_function('explicit_bzero', prefix: '''#include <string.h>'''),
               description: 'Define if explicit_bzero is available')

192
if host_is_linux
193
  # network manager
194
  network_manager_deps = [
195
    dependency('libnm', version: '>= 1.12.0'),
196
    dependency('libnma', version: '>= 1.8.0'),
197 198
    dependency('mm-glib', version: '>= 0.7')
  ]
199 200 201 202 203 204 205 206 207
endif
config_h.set('BUILD_NETWORK', host_is_linux,
             description: 'Define to 1 to build the Network panel')
config_h.set('HAVE_NETWORK_MANAGER', host_is_linux,
             description: 'Define to 1 if NetworkManager is available')

if host_is_linux_not_s390
  # gnome-bluetooth
  gnome_bluetooth_dep = dependency('gnome-bluetooth-1.0', version: '>= 3.18.2')
208

209 210
  libwacom_dep = dependency('libwacom', version: '>= 0.7')

211
  wacom_deps = [
212
    libwacom_dep,
213
  ]
214 215
  config_h.set('HAVE_WACOM_3D_STYLUS', libwacom_dep.version().version_compare('>= 0.27'),
               description: 'Define to 1 if libwacom provides definition for 3D styli')
216 217
else
  message('Bluetooth and Wacom panels will not be built (no USB support on this platform)')
218
  message('Thunderbolt panel will not be built (not supported on this platform)')
219
endif
220
config_h.set('BUILD_BLUETOOTH', host_is_linux_not_s390,
221
             description: 'Define to 1 to build the Bluetooth panel')
222
config_h.set('HAVE_BLUETOOTH', host_is_linux_not_s390,
223
             description: 'Define to 1 if bluetooth support is available')
224
config_h.set('BUILD_WACOM', host_is_linux_not_s390,
225
             description: 'Define to 1 to build the Wacom panel')
226
config_h.set('HAVE_WACOM', host_is_linux_not_s390,
227
             description: 'Define to 1 if Wacom is supportted')
228 229
config_h.set('BUILD_THUNDERBOLT', host_is_linux_not_s390,
             description: 'Define to 1 to build the Thunderbolt panel')
230 231 232 233 234 235 236 237 238 239 240 241 242 243 244

# Check for info panel
gnome_session_libexecdir = get_option('gnome_session_libexecdir')
if gnome_session_libexecdir == ''
  gnome_session_libexecdir = control_center_libexecdir
endif

gnome = import('gnome')
i18n = import('i18n')
pkg = import('pkgconfig')

desktop_conf = configuration_data()
desktop_conf.set('VERSION', meson.project_version())

po_dir = join_paths(meson.source_root(), 'po')
245
its_dir = join_paths(meson.source_root(), 'gettext')
246

247 248 249 250
install_subdir(
  'gettext',
  install_dir: control_center_datadir
)
251 252 253 254

top_inc = include_directories('.')
shell_inc = include_directories('shell')

255
subdir('build-aux')
256 257 258 259 260
subdir('data/icons')
subdir('po')
subdir('panels')
subdir('shell')
subdir('search-provider')
261 262
subdir('tests')

263 264 265 266 267 268 269 270 271
if get_option('documentation')
  subdir('man')
endif

configure_file(
  output: 'config.h',
  configuration: config_h
)

272 273 274 275 276 277 278
output = ''
output += '\n        ' + meson.project_name() + ' - ' + meson.project_version() + '\n'
output += '    ===================================\n'
output += ' Options \n'
output += '     Documentation .............................. ' + get_option('documentation').to_string() + '\n'
output += '     Tracing .................................... ' + enable_tracing.to_string() + '\n'
output += '     gnome-session libexecdir ................... ' + gnome_session_libexecdir + '\n'
279
output += '     Optimized .................................. ' + control_center_optimized.to_string() + '\n'
280 281 282 283 284 285
output += ' Panels \n'
output += '     GNOME Bluetooth (Bluetooth panel) .......... ' + host_is_linux_not_s390.to_string() + '\n'
output += '     Cheese (Users panel webcam support) ........ ' + enable_cheese.to_string() + '\n'
output += '     IBus (Region panel IBus support) ........... ' + enable_ibus.to_string() + '\n'
output += '     NetworkManager (Network panel) ............. ' + host_is_linux.to_string() + '\n'
output += '     Wacom (Wacom tablet panel) ................. ' + host_is_linux_not_s390.to_string() + '\n'
286

287
message(output)