meson.build 15.7 KB
Newer Older
1
project('tracker', 'c', 'vala', version: '2.2.0-alpha1')
2 3 4 5 6 7

gnome = import('gnome')
i18n = import('i18n')
cc = meson.get_compiler('c')

# This is the X.Y used in -llibtracker-FOO-X.Y
8
tracker_api_version = '2.0'
9

10 11 12 13 14 15 16
tracker_version = meson.project_version().split('-')[0]
tracker_major_version = tracker_version.split('.')[0].to_int()
tracker_minor_version = tracker_version.split('.')[1].to_int()
tracker_micro_version = tracker_version.split('.')[2].to_int()
tracker_interface_age = 0
tracker_binary_age = 100 * tracker_minor_version + tracker_micro_version - tracker_interface_age

17
# This the .Z used in libtracker-sparql-2.0.so.Z
18 19
soversion = '0'
libversion = '@0@.@1@.@2@'.format(soversion, tracker_binary_age - tracker_interface_age, tracker_interface_age)
20

21 22 23
libdir = join_paths(get_option('prefix'), get_option('libdir'))
datadir = join_paths(get_option('prefix'), get_option('datadir'))

24 25 26 27 28 29 30
glib_required = '2.40.0'

# 3.6.11 for sqlite_backup API
# 3.6.16 to fix test failures
# 3.6.17 for shared cache mode with virtual tables
# 3.7.0 for WAL
# 3.7.9 for FTS4 content= support
31 32 33
# 3.7.15 for sqlite3_errstr() support
# 3.8.3 for SQLITE_DETERMINISTIC
sqlite_required = '3.8.3'
34 35 36 37 38 39 40

dbus = dependency('dbus-1', version: '> 1.3.1')
gio = dependency('gio-2.0', version: '>' + glib_required)
gio_unix = dependency('gio-unix-2.0', version: '>' + glib_required)
glib = dependency('glib-2.0', version: '>' + glib_required)
gmodule = dependency('gmodule-2.0', version: '>' + glib_required)
gobject = dependency('gobject-2.0', version: '>' + glib_required)
41
gobject_introspection = dependency('gobject-introspection-1.0')
42 43 44 45 46 47 48
icu_i18n = dependency('icu-i18n', version: '> 4.8.1.1', required: false)
icu_uc = dependency('icu-uc', version: '> 4.8.1.1', required: false)
json_glib = dependency('json-glib-1.0', version: '>= 1.0', required: true)
libsoup = dependency('libsoup-2.4', version: '> 2.40', required: true)
libxml2 = dependency('libxml-2.0', version: '> 2.6')
sqlite = dependency('sqlite3', version: '>' + sqlite_required)

49
libmath = cc.find_library('m', required: false)
50 51 52 53 54 55 56 57 58

# FIXME: here we work around a quirk todo with Meson and Vala: the 'uuid'
# pkg-config component corresponds to 'libuuid.vapi', but Meson assumes that
# .vapi name always matches pkg-config name, and will add `--pkg uuid` to the
# Vala commandline. By finding 'uuid' using find_library() instead, we get
# a dependency object back that won't cause any `--pkg` arguments to be added
# to the Vala commandline, but still works as expected for C code.
uuid = cc.find_library('uuid')

59 60
add_project_arguments('-Wformat', '-Wformat-security', language: 'c')

61 62 63
# There are various gchar vs. unsigned char warnings that occur in extract
# modules, it's not worth adding casts everywhere so we disable the warning.
add_project_arguments('-Wno-pointer-sign', language: 'c')
64

65
add_project_arguments('-DTRACKER_COMPILATION', language: 'c')
66 67 68

enable_fts = get_option('fts')

69 70 71 72 73 74
have_network_manager = false
if get_option('network_manager') != 'no'
    network_manager = dependency('libnm', required: get_option('network_manager') == 'yes')
    have_network_manager = network_manager.found()
endif

75 76 77 78 79 80
##################################################################
# Check for libtracker-common, make sure libstemmer exists
##################################################################

have_libstemmer = false
if get_option('stemmer') != 'no'
81 82
    libstemmer = cc.find_library('stemmer', required: false)
    if libstemmer.found()
83 84 85 86 87 88 89 90 91 92 93 94 95
        have_libstemmer = true
    elif get_option('stemmer') == 'yes'
        error('stemmer support explicitly requested, but stemmer library couldn\'t be found')
    endif
endif

##################################################################
# Check for tracker-fts, allow disabling FTS support
##################################################################

if enable_fts
  sqlite3_builtin_fts5_test = '''
    #include <sqlite3.h>
96 97 98 99 100 101 102 103 104 105 106

    int main (int argc, char *argv[]) {
      sqlite3 *db;
      int rc;
      rc = sqlite3_open(":memory:", &db);
      if (rc!=SQLITE_OK) return -1;
      rc = sqlite3_exec(db, "create table a(text)", 0, 0, 0);
      if (rc!=SQLITE_OK) return -1;
      rc = sqlite3_exec(db, "create virtual table t using fts5(content='a',text)", 0, 0, 0);
      if (rc!=SQLITE_OK) return -1;
    }
107 108
  '''

109 110 111
  result = cc.run(sqlite3_builtin_fts5_test,
    name: 'sqlite3 has builtin FTS5 module',
    dependencies: sqlite)
112

113 114
  if not result.compiled()
    error('Failed to compile SQLite FTS test.')
115
  endif
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131

  if result.returncode() == 0
    message('Using sqlite3 builtin FTS module')
    sqlite3_has_builtin_fts5 = true
  else
    message('FTS support was enabled but SQLite doesn\'t have the FTS module built in')
    if sqlite.version().version_compare('>= 3.20.0')
      error('sqlite3 >= 3.20.0 must be compiled with --enable-fts5 in order to get FTS support.')
    else
      message('sqlite3 is older than version 3.20.0, using FTS module that is bundled with Tracker')
      sqlite3_has_builtin_fts5 = false
    endif
  endif

else
  sqlite3_has_builtin_fts5 = false
132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
endif

##################################################################
# Check for libtracker-data and libtracker-fts: Unicode support
#
# By default, AUTO with this order of preference:
#  1)  libunistring
#  2)  libicu
##################################################################

have_libicu = false
unicode_library_name = ''

if icu_i18n.found() and icu_uc.found()
  have_libicu = true
endif

if have_libicu
  if get_option('unicode_support') == 'auto' or get_option('unicode_support') == 'icu'
    unicode_library = declare_dependency(
        dependencies: [icu_uc, icu_i18n]
    )
    unicode_library_name = 'icu'
  endif
elif get_option('unicode_support') == 'icu'
  error('libicu explicitly requested, but icu-i18n and icu-uc libraries were not found')
endif

if unicode_library_name == ''
161
  libunistring = cc.find_library('unistring', required: false)
162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177

  if libunistring.found()
    unicode_library = libunistring
    unicode_library_name = 'unistring'
  elif get_option('unicode_support') == 'unistring'
    error('libunistring explicitly requested, but not found')
  else
    error('Neither libicu or libunistring were found for Unicode support.')
  endif
endif

####################################################################
# D-Bus service files
####################################################################

if get_option('dbus_services') == ''
178 179
  dbus_services_dir = dbus.get_pkgconfig_variable('session_bus_services_dir',
                                                  define_variable: [ 'datadir', datadir ])
180 181 182 183 184 185 186 187 188 189 190 191
else
  dbus_services_dir = get_option('dbus_services')
endif

####################################################################
# systemd user services
####################################################################

install_systemd_user_services = false
if get_option('systemd_user_services') == 'yes' or get_option('systemd_user_services') == 'auto'
  systemd = dependency('systemd', required: false)
  if systemd.found()
192 193 194 195
    # FIXME: this would ideally use the systemduserunitdir pkgconfig variable, but
    # it does not depend on variables we can override to install within prefix.
    install_systemd_user_services = true
    systemd_user_services_dir = join_paths(libdir, 'systemd', 'user')
196
  else
197 198
    install_systemd_user_services = false
    systemd_user_services_dir = '(not found)'
199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215
  endif
elif get_option('systemd_user_services') == 'no' or get_option('systemd_user_services') == ''
  install_systemd_user_services = false
  systemd_user_services_dir = '(disabled)'
else
  install_systemd_user_services = true
  systemd_user_services_dir = get_option('systemd_user_services')
endif

####################################################################
# bash-completion
####################################################################

install_bash_completion = false
if get_option('bash_completion') == 'yes' or get_option('bash_completion') == 'auto'
  bash_completion_package = dependency('bash-completion', required: false)
  if bash_completion_package.found()
216 217
    bash_completion_dir = bash_completion_package.get_pkgconfig_variable('completionsdir',
                                                                         define_variable:  [ 'prefix', get_option('prefix') ])
218
  else
219
    bash_completion_dir = join_paths(datadir, 'bash-completion', 'completions')
220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
  endif
  install_bash_completion = true
elif get_option('bash_completion') == 'no' or get_option('bash_completion') == ''
  install_bash_completion = false
  bash_completion_dir = '(disabled)'
else
  install_bash_completion = true
  bash_completion_dir = get_option('bash_completion')
endif

conf = configuration_data()

# Config that goes in config.h
conf.set('DISABLE_JOURNAL', get_option('journal') == false)

conf.set10('HAVE_TRACKER_FTS', enable_fts)

conf.set('HAVE_BUILTIN_FTS', sqlite3_has_builtin_fts5)
238
conf.set('HAVE_LIBICU', unicode_library_name == 'icu')
239 240
conf.set('HAVE_LIBSTEMMER', have_libstemmer)
conf.set('HAVE_LIBUNISTRING', unicode_library_name == 'unistring')
241
conf.set('HAVE_NETWORK_MANAGER', have_network_manager)
242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262

conf.set('HAVE_GETLINE', cc.has_function('getline', prefix : '#include <stdio.h>'))
conf.set('HAVE_POSIX_FADVISE', cc.has_function('posix_fadvise', prefix : '#include <fcntl.h>'))
conf.set('HAVE_STATVFS64', cc.has_header_symbol('sys/statvfs.h', 'statvfs64', args: '-D_LARGEFILE64_SOURCE'))
conf.set('HAVE_STRNLEN', cc.has_function('strnlen', prefix : '#include <string.h>'))

conf.set('LOCALEDIR', '"@0@/@1@"'.format(get_option('prefix'), get_option('localedir')))
conf.set('SHAREDIR', '"@0@/@1@"'.format(get_option('prefix'), get_option('datadir')))
conf.set('TRACKER_MINERS_DIR', '"@0@/@1@/tracker/miners"'.format(get_option('prefix'), get_option('datadir')))

conf.set('GETTEXT_PACKAGE', '"tracker"')
conf.set('PACKAGE_VERSION', '"@0@"'.format(meson.project_version()))
conf.set('TRACKER_VERSION', '"@0@"'.format(meson.project_version()))
conf.set('TRACKER_MAJOR_VERSION', tracker_major_version)
conf.set('TRACKER_MINOR_VERSION', tracker_minor_version)
conf.set('TRACKER_MICRO_VERSION', tracker_micro_version)
conf.set('TRACKER_INTERFACE_AGE', 0)
conf.set('TRACKER_BINARY_AGE', 100 * tracker_minor_version + tracker_micro_version)

# Config that goes in some other generated files (.desktop, .pc, etc)
conf.set('exec_prefix', get_option('prefix'))
263
conf.set('bindir', join_paths(get_option('prefix'), get_option('bindir')))
264
conf.set('datadir', datadir)
265
conf.set('datarootdir', join_paths(get_option('prefix'), get_option('datadir')))
266
conf.set('includedir', join_paths(get_option('prefix'), get_option('includedir')))
267
conf.set('libdir', libdir)
268 269
conf.set('libexecdir', join_paths(get_option('prefix'), get_option('libexecdir')))
conf.set('prefix', get_option('prefix'))
270
conf.set('TRACKER_API_VERSION', tracker_api_version)
271
conf.set('VERSION', meson.project_version())
272 273 274
conf.set('tracker_store', join_paths ('${libexecdir}', 'tracker-store'))
conf.set('ontologies_dir', join_paths ('${datadir}', 'tracker', 'ontologies'))
conf.set('domain_ontologies_dir', join_paths('${datadir}', 'tracker', 'domain-ontologies'))
275

276 277 278 279 280 281 282 283 284 285 286 287 288
# Configure functional tests to run completely from source tree.
conf.set('FUNCTIONAL_TESTS_ONTOLOGIES_DIR', join_paths(meson.current_source_dir(), 'tests', 'functional-tests', 'test-ontologies'))
conf.set('FUNCTIONAL_TESTS_TRACKER_STORE_PATH', join_paths(meson.current_build_dir(), 'src', 'tracker-store', 'tracker-store'))

# This is set in an awkward way for compatibility with Autoconf. Switch it
# to a normal boolean once we get rid of the Autotools build system. It's
# only used in tests/functional-tests/common/utils/configuration.py.in.
if get_option('journal')
    conf.set('DISABLE_JOURNAL_TRUE', 'true')
else
    conf.set('DISABLE_JOURNAL_TRUE', '')
endif

289 290 291 292
configure_file(input: 'config.h.meson.in',
               output: 'config.h',
               configuration: conf)

293 294 295 296 297 298 299 300 301
# Global compiler defines. We avoid add_global_arguments() as it breaks
# when we are included by another project as a subproject.
tracker_c_args = [
  # Needed for O_NOATIME, and probably other stuff.
  '-D_GNU_SOURCE',

  # Needed for statvfs64, and probably other stuff
  '-D_LARGEFILE64_SOURCE',
]
302 303 304 305

configinc = include_directories('./')
srcinc = include_directories('src/')

306 307 308 309
source_root = meson.current_source_dir()
build_root = meson.current_build_dir()
po_subdir = join_paths(source_root, 'po')

310 311
gsettings_schema_dir = join_paths(get_option('datadir'), 'glib-2.0', 'schemas')

312 313 314 315
tracker_internal_libs_dir = join_paths(get_option('prefix'), get_option('libdir'), 'tracker-' + tracker_api_version)

# NOTE: We don't use ${TRACKER_API_VERSION} because other content like
# the ontology is installed to the same location.
316
tracker_ontologies_dir = join_paths(get_option('prefix'), get_option('datadir'), 'tracker/ontologies')
317 318 319

vapi_dir = join_paths(get_option('prefix'), get_option('datadir'), 'vala', 'vapi')

320
glib_mkenums = find_program('glib-mkenums')
321
g_ir_compiler = find_program('g-ir-compiler', gobject_introspection.get_pkgconfig_variable('g_ir_compiler'))
322
g_ir_merge = find_program('g-ir-merge', join_paths(meson.current_source_dir(), 'utils', 'g-ir-merge', 'g-ir-merge'))
323

324 325 326 327
gir_dir = gobject_introspection.get_pkgconfig_variable('girdir',
                                                       define_variable:  [ 'datadir', datadir ])
typelib_dir = gobject_introspection.get_pkgconfig_variable('typelibdir',
                                                           define_variable:  [ 'libdir', libdir ])
328

329
subdir('src')
330
subdir('data')
331 332 333 334 335 336 337 338

if get_option('docs')
  subdir('docs')
endif

subdir('examples')
subdir('utils')

339 340 341 342 343
test_c_args = tracker_c_args + [
    '-DTOP_BUILDDIR="@0@"'.format(build_root),
    '-DTOP_SRCDIR="@0@"'.format(source_root),
]

344 345 346 347
tracker_uninstalled_domain_rule = join_paths(meson.current_source_dir(), 'src', 'tracker-store', 'default.rule')
tracker_uninstalled_nepomuk_ontologies_dir = join_paths(meson.current_source_dir(), 'src', 'ontologies', 'nepomuk')
tracker_uninstalled_stop_words_dir = join_paths(meson.current_source_dir(), 'src', 'libtracker-common', 'stop-words')

348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369
subdir('tests')

subdir('po')

# Make sure we're not using versions of SQLite which cause problems.
#
# Avoid versions:
sqlite_safe = true
if sqlite.version().version_compare('>= 3.7.10') and sqlite.version().version_compare('<= 3.7.13')
  # See https://mail.gnome.org/archives/tracker-list/2012-October/msg00028.html
  sqlite_safe = false
elif sqlite.version().version_compare('3.8.1')
  # See https://mail.gnome.org/archives/tracker-list/2013-November/msg00021.html
  sqlite_safe = false
elif sqlite.version().version_compare('3.8.4.2')
  # See https://mail.gnome.org/archives/tracker-list/2014-April/msg00001.html
  sqlite_safe = false
endif

summary = [
  '\nBuild Configuration:',
  '    Prefix:                                 ' + get_option('prefix'),
370
  '    Source code location:                   ' + meson.current_source_dir(),
371 372
  '    Compiler:                               ' + cc.get_id(),
  '\nFeature Support:',
373
  '    Support for network status detection:   ' + have_network_manager.to_string(),
374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391
  '    Unicode support library:                ' + unicode_library_name,
  '    Build with Journal support:             ' + get_option('journal').to_string(),
  '    Build with SQLite FTS support:          @0@ (built-in FTS: @1@)'.format(
     get_option('fts'), sqlite3_has_builtin_fts5),
  '    Build with Stemming support:            ' + have_libstemmer.to_string(),
  '    Bash completion support:                ' + bash_completion_dir,
]

message('\n'.join(summary))

if not sqlite_safe
  message('''WARNING:
        SQLite3 version @0@ is not safe. For detail
        3.7.10 - 3.7.13: https://mail.gnome.org/archives/tracker-list/2012-October/msg00028.html
        3.8.1:           https://mail.gnome.org/archives/tracker-list/2013-November/msg00021.html
        3.8.4.2:         https://mail.gnome.org/archives/tracker-list/2014-April/msg00001.html
  ''').format(sqlite.version())
endif