Blame meson.build

Packit Service 3749ba
project('p11-kit', 'c',
Packit Service f30af4
        version: '0.23.22',
Packit Service 3749ba
        meson_version: '>= 0.49')
Packit Service 3749ba
Packit Service 3749ba
version_arr = meson.project_version().split('.')
Packit Service 3749ba
major_version = version_arr[0].to_int()
Packit Service 3749ba
minor_version = version_arr[1].to_int()
Packit Service 3749ba
micro_version = version_arr[2].to_int()
Packit Service 3749ba
Packit Service 3749ba
cc = meson.get_compiler('c')
Packit Service 3749ba
Packit Service 3749ba
current = 3
Packit Service 3749ba
revision = 0
Packit Service 3749ba
age = 3
Packit Service 3749ba
Packit Service 3749ba
soversion = current - age
Packit Service 3749ba
library_version = '@0@.@1@.@2@'.format(soversion, age, revision)
Packit Service 3749ba
Packit Service 3749ba
configinc = include_directories('.')
Packit Service 3749ba
commoninc = include_directories('common')
Packit Service 3749ba
p11kitinc = include_directories('p11-kit')
Packit Service 3749ba
trustinc = include_directories('trust')
Packit Service 3749ba
Packit Service 3749ba
add_project_arguments(['-D_GNU_SOURCE', '-DP11_KIT_FUTURE_UNSTABLE_API'],
Packit Service 3749ba
                      language: 'c')
Packit Service 3749ba
Packit Service 3749ba
conf = configuration_data()
Packit Service 3749ba
Packit Service 3749ba
conf.set('PACKAGE_MAJOR', major_version)
Packit Service 3749ba
conf.set('PACKAGE_MINOR', minor_version)
Packit Service 3749ba
Packit Service 3749ba
host_system = host_machine.system()
Packit Service f30af4
if host_system == 'windows'
Packit Service f30af4
  conf.set('OS_WIN32', 1)
Packit Service f30af4
else
Packit Service f30af4
  conf.set('OS_UNIX', 1)
Packit Service f30af4
endif
Packit Service 3749ba
Packit Service 3749ba
if host_system == 'windows'
Packit Service 3749ba
  shlext = '.dll'
Packit Service 3749ba
  exeext = '.exe'
Packit Service 3749ba
else
Packit Service 3749ba
  shlext = '.so'
Packit Service 3749ba
  exeext = ''
Packit Service 3749ba
endif
Packit Service 3749ba
Packit Service 3749ba
conf.set_quoted('SHLEXT', shlext)
Packit Service 3749ba
conf.set_quoted('EXEEXT', exeext)
Packit Service 3749ba
Packit Service 3749ba
if host_machine.endian() == 'big'
Packit Service 3749ba
  conf.set('WORDS_BIGENDIAN', 1)
Packit Service 3749ba
endif
Packit Service 3749ba
Packit Service 3749ba
if get_option('debug')
Packit Service 3749ba
  conf.set('WITH_DEBUG', 1)
Packit Service 3749ba
  conf.set('_DEBUG', 1)
Packit Service 3749ba
endif
Packit Service 3749ba
Packit Service 3749ba
conf.set10('WITH_STRICT', get_option('strict'))
Packit Service 3749ba
Packit Service 3749ba
prefix = get_option('prefix')
Packit Service 3749ba
datadir = get_option('datadir')
Packit Service 3749ba
bindir = get_option('bindir')
Packit Service 3749ba
libdir = get_option('libdir')
Packit Service 3749ba
libexecdir = get_option('libexecdir')
Packit Service 3749ba
sysconfdir = get_option('sysconfdir')
Packit Service 3749ba
mandir = get_option('mandir')
Packit Service 3749ba
pkgdatadir = datadir / meson.project_name()
Packit Service 3749ba
privatedir = libexecdir / meson.project_name()
Packit Service 3749ba
Packit Service 3749ba
common_c_args = [
Packit Service 3749ba
  '-DBINDIR="@0@"'.format(prefix / bindir),
Packit Service 3749ba
  '-DPRIVATEDIR="@0@"'.format(prefix / privatedir),
Packit Service 3749ba
  '-DSYSCONFDIR="@0@"'.format(prefix / sysconfdir)
Packit Service 3749ba
]
Packit Service 3749ba
Packit Service 3749ba
top_source_dir = meson.current_source_dir()
Packit Service 3749ba
top_build_dir = meson.current_build_dir()
Packit Service 3749ba
Packit Service 3749ba
tests_c_args = [
Packit Service 3749ba
  '-DSRCDIR="@0@"'.format(top_source_dir),
Packit Service 3749ba
  '-DBUILDDIR="@0@"'.format(top_build_dir)
Packit Service 3749ba
]
Packit Service 3749ba
Packit Service 3749ba
conf.set('SIZEOF_UNSIGNED_LONG', cc.sizeof('unsigned long'))
Packit Service 3749ba
Packit Service 3749ba
nanosleep_deps = []
Packit Service 3749ba
dlopen_deps = []
Packit Service 3749ba
socket_deps = []
Packit Service 3749ba
thread_deps = []
Packit Service 3749ba
Packit Service 3749ba
if host_system != 'windows'
Packit Service 3749ba
  thread_deps += dependency('threads')
Packit Service 3749ba
  if not cc.has_function('pthread_create', dependencies: thread_deps)
Packit Service 3749ba
    error('could not find pthread_create')
Packit Service 3749ba
  endif
Packit Service 3749ba
Packit Service 3749ba
  if not cc.has_function('nanosleep')
Packit Service 3749ba
    librt = cc.find_library('rt', required: false)
Packit Service 3749ba
    if cc.has_function('nanosleep', dependencies: librt)
Packit Service 3749ba
      nanosleep_deps += librt
Packit Service 3749ba
    else
Packit Service 3749ba
      error('could not find nanosleep')
Packit Service 3749ba
    endif
Packit Service 3749ba
  endif
Packit Service 3749ba
Packit Service 3749ba
  if not cc.has_function('dlopen')
Packit Service 3749ba
    libdl = cc.find_library('dl', required: false)
Packit Service 3749ba
    if cc.has_function('dlopen', dependencies: libdl)
Packit Service 3749ba
      dlopen_deps += libdl
Packit Service 3749ba
    else
Packit Service 3749ba
      error('could not find dlopen')
Packit Service 3749ba
    endif
Packit Service 3749ba
  endif
Packit Service 3749ba
Packit Service 3749ba
  # for Solaris we need -lsocket -lnsl for socket stuff, gethostbyname
Packit Service 3749ba
  # is just a dummy to find -lnsl
Packit Service 3749ba
  libnsl = cc.find_library('nsl', required: false)
Packit Service 3749ba
  if libnsl.found()
Packit Service 3749ba
    if cc.has_function('gethostbyname', dependencies: libnsl)
Packit Service 3749ba
      socket_deps += libnsl
Packit Service 3749ba
    endif
Packit Service 3749ba
Packit Service 3749ba
    libsocket = cc.find_library('socket', required: false)
Packit Service 3749ba
    if libsocket.found()
Packit Service 3749ba
      if cc.has_function('connect', dependencies: [libsocket, libnsl])
Packit Service 3749ba
        socket_deps += libsocket
Packit Service 3749ba
      else
Packit Service 3749ba
        error('could not find socket')
Packit Service 3749ba
      endif
Packit Service 3749ba
    endif
Packit Service 3749ba
  endif
Packit Service 3749ba
Packit Service 3749ba
  if cc.has_header('locale.h')
Packit Service 3749ba
    conf.set('HAVE_LOCALE_H', 1)
Packit Service 3749ba
    if cc.has_type('locale_t', prefix: '#include <locale.h>')
Packit Service 3749ba
      conf.set('HAVE_LOCALE_T', 1)
Packit Service 3749ba
      if cc.has_function('newlocale', prefix: '#include <locale.h>')
Packit Service 3749ba
        conf.set('HAVE_NEWLOCALE', 1)
Packit Service 3749ba
      endif
Packit Service 3749ba
      if cc.has_function('strerror_l', prefix: '#include <string.h>')
Packit Service 3749ba
        conf.set('HAVE_STRERROR_L', 1)
Packit Service 3749ba
      endif
Packit Service 3749ba
    endif
Packit Service 3749ba
  endif
Packit Service 3749ba
Packit Service 3749ba
  # These are things we can work around
Packit Service 3749ba
  headers = [
Packit Service 3749ba
    'sys/resource.h',
Packit Service 3749ba
    'ucred.h'
Packit Service 3749ba
  ]
Packit Service 3749ba
Packit Service 3749ba
  foreach h : headers
Packit Service 3749ba
    if cc.has_header(h)
Packit Service 3749ba
      conf.set('HAVE_' + h.underscorify().to_upper(), 1)
Packit Service 3749ba
    endif
Packit Service 3749ba
  endforeach
Packit Service 3749ba
Packit Service 3749ba
  functions = [
Packit Service 3749ba
    'fdwalk',
Packit Service 3749ba
    'getauxval',
Packit Service 3749ba
    'getexecname',
Packit Service 3749ba
    'getpeereid',
Packit Service 3749ba
    'getpeerucred',
Packit Service 3749ba
    'getprogname',
Packit Service 3749ba
    'getresuid',
Packit Service 3749ba
    'issetugid',
Packit Service 3749ba
    'mkdtemp',
Packit Service 3749ba
    'mkstemp',
Packit Service 3749ba
    'secure_getenv',
Packit Service 3749ba
    'strndup'
Packit Service 3749ba
  ]
Packit Service 3749ba
Packit Service 3749ba
  foreach f : functions
Packit Service 3749ba
    if cc.has_function(f)
Packit Service 3749ba
      conf.set('HAVE_' + f.underscorify().to_upper(), 1)
Packit Service 3749ba
    endif
Packit Service 3749ba
  endforeach
Packit Service 3749ba
Packit Service 3749ba
  if cc.has_member('struct dirent', 'd_type', prefix: '#include <dirent.h>')
Packit Service 3749ba
    conf.set('HAVE_STRUCT_DIRENT_D_TYPE', 1)
Packit Service 3749ba
  endif
Packit Service 3749ba
Packit Service 3749ba
  tls_test_code_template = '''
Packit Service 3749ba
#include <stdlib.h>
Packit Service 3749ba
int main (void) {
Packit Service 3749ba
static @0@ foo;
Packit Service 3749ba
return 0;
Packit Service 3749ba
}
Packit Service 3749ba
'''
Packit Service 3749ba
  foreach keyword : ['_Thread_local', '__thread']
Packit Service 3749ba
    if cc.compiles(tls_test_code_template.format(keyword),
Packit Service 3749ba
                   name: 'thread-local storage class')
Packit Service 3749ba
      conf.set('P11_TLS_KEYWORD', keyword)
Packit Service 3749ba
      break
Packit Service 3749ba
    endif
Packit Service 3749ba
  endforeach
Packit Service 3749ba
Packit Service 3749ba
  if cc.has_function('gmtime_r')
Packit Service 3749ba
    conf.set('HAVE_GMTIME_R', 1)
Packit Service 3749ba
  else
Packit Service 3749ba
    error('could not find required gmtime_r() function')
Packit Service 3749ba
  endif
Packit Service 3749ba
Packit Service 3749ba
  # Check if these are declared and/or available to link against
Packit Service 3749ba
  program_invocation_short_name_test_code = '''
Packit Service 3749ba
#define _GNU_SOURCE
Packit Service 3749ba
#include <errno.h>
Packit Service 3749ba
int main (void) { program_invocation_short_name = "test"; }
Packit Service 3749ba
'''
Packit Service 3749ba
  if cc.links(program_invocation_short_name_test_code,
Packit Service 3749ba
              name: 'program_invocation_short_name_test_code')
Packit Service 3749ba
    conf.set('HAVE_PROGRAM_INVOCATION_SHORT_NAME', 1)
Packit Service 3749ba
  else
Packit Service 3749ba
    __progname_test_code = '''
Packit Service 3749ba
extern char *__progname;
Packit Service 3749ba
int main (void) { __progname = (char*)0; return 0; }
Packit Service 3749ba
'''
Packit Service 3749ba
    if cc.links(__progname_test_code, name: '__progname')
Packit Service 3749ba
      conf.set('HAVE___PROGNAME', 1)
Packit Service 3749ba
    endif
Packit Service 3749ba
  endif
Packit Service 3749ba
Packit Service 3749ba
  __libc_enable_secure_test_code = '''
Packit Service 3749ba
extern int __libc_enable_secure;
Packit Service 3749ba
int main (void) { __libc_enable_secure = 0; return 0; }
Packit Service 3749ba
'''
Packit Service 3749ba
  if cc.links(__libc_enable_secure_test_code, name: '__libc_enable_secure')
Packit Service 3749ba
    conf.set('HAVE___LIBC_ENABLE_SECURE', 1)
Packit Service 3749ba
  endif
Packit Service 3749ba
Packit Service 3749ba
  vsock_availability_test_code = '''
Packit Service 3749ba
#include <sys/socket.h>
Packit Service 3749ba
#include <linux/vm_sockets.h>
Packit Service 3749ba
struct sockaddr_vm sa = { .svm_family = AF_VSOCK, .svm_cid = VMADDR_CID_ANY };
Packit Service 3749ba
'''
Packit Service 3749ba
  if cc.compiles(vsock_availability_test_code, name: 'vsock_test')
Packit Service 3749ba
    conf.set('HAVE_VSOCK', 1)
Packit Service 3749ba
  endif
Packit Service 3749ba
Packit Service 3749ba
  foreach h : ['sys/types.h', 'signal.h']
Packit Service 3749ba
    foreach t : ['sighandler_t', 'sig_t', '__sighandler_t']
Packit Service 3749ba
      if cc.has_type(t, prefix: '#include <@0@>'.format(h))
Packit Service 3749ba
        define = 'HAVE_' + t.underscorify().to_upper()
Packit Service 3749ba
        conf.set(define, 1)
Packit Service 3749ba
      endif
Packit Service 3749ba
    endforeach
Packit Service 3749ba
  endforeach
Packit Service 3749ba
endif
Packit Service 3749ba
Packit Service 3749ba
headers = [
Packit Service 3749ba
  'stdbool.h',
Packit Service 3749ba
]
Packit Service 3749ba
Packit Service 3749ba
foreach h : headers
Packit Service 3749ba
  if cc.has_header(h)
Packit Service 3749ba
    conf.set('HAVE_' + h.underscorify().to_upper(), 1)
Packit Service 3749ba
  endif
Packit Service 3749ba
endforeach
Packit Service 3749ba
Packit Service 3749ba
functions = [
Packit Service 3749ba
  'asprintf',
Packit Service 3749ba
  'basename',
Packit Service 3749ba
  'memdup',
Packit Service 3749ba
  'reallocarray',
Packit Service 3749ba
  'secure_getenv',
Packit Service 3749ba
  'setenv',
Packit Service 3749ba
  'strerror_r',
Packit Service 3749ba
  'strnstr',
Packit Service 3749ba
  'vasprintf'
Packit Service 3749ba
]
Packit Service 3749ba
Packit Service 3749ba
foreach f : functions
Packit Service 3749ba
  if cc.has_function(f)
Packit Service 3749ba
    conf.set('HAVE_' + f.underscorify().to_upper(), 1)
Packit Service 3749ba
  endif
Packit Service 3749ba
endforeach
Packit Service 3749ba
Packit Service 3749ba
conf.set10('HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME',
Packit Service 3749ba
           cc.has_header_symbol('errno.h',
Packit Service 3749ba
                                'program_invocation_short_name',
Packit Service 3749ba
                                prefix: '#define _GNU_SOURCE'))
Packit Service 3749ba
Packit Service 3749ba
conf.set10('HAVE_DECL_ASPRINTF',
Packit Service 3749ba
           cc.has_header_symbol('stdio.h', 'asprintf',
Packit Service 3749ba
                                prefix: '#define _GNU_SOURCE'))
Packit Service 3749ba
Packit Service 3749ba
conf.set10('HAVE_DECL_VASPRINTF',
Packit Service 3749ba
           cc.has_header_symbol('stdio.h', 'vasprintf',
Packit Service 3749ba
                                prefix: '#define _GNU_SOURCE'))
Packit Service 3749ba
Packit Service 3749ba
conf.set10('HAVE_DECL_REALLOCARRAY',
Packit Service 3749ba
           cc.has_header_symbol('stdlib.h', 'reallocarray'))
Packit Service 3749ba
Packit Service 3749ba
# --------------------------------------------------------------------
Packit Service 3749ba
# libffi
Packit Service 3749ba
Packit Service 3749ba
libffi_deps = []
Packit Service 3749ba
libffi = dependency('libffi', version: '>= 3.0.0', required: get_option('libffi'))
Packit Service 3749ba
if libffi.found()
Packit Service 3749ba
  conf.set('WITH_FFI', 1)
Packit Service 3749ba
  libffi_deps += libffi
Packit Service 3749ba
endif
Packit Service 3749ba
Packit Service 3749ba
closures = get_option('closures')
Packit Service 3749ba
if closures < 1
Packit Service 3749ba
  error('at least one closure must be compiled in')
Packit Service 3749ba
endif
Packit Service 3749ba
Packit Service 3749ba
conf.set('P11_VIRTUAL_MAX_FIXED', closures)
Packit Service 3749ba
Packit Service 3749ba
# ------------------------------------------------------------------------------
Packit Service 3749ba
# PKCS#11 Directories
Packit Service 3749ba
Packit Service 3749ba
p11_package_config_modules = get_option('module_config')
Packit Service 3749ba
if p11_package_config_modules == ''
Packit Service 3749ba
  p11_package_config_modules = pkgdatadir / 'modules'
Packit Service 3749ba
endif
Packit Service 3749ba
Packit Service 3749ba
p11_system_config = get_option('system_config')
Packit Service 3749ba
if p11_system_config == ''
Packit Service 3749ba
  p11_system_config = sysconfdir / 'pkcs11'
Packit Service 3749ba
endif
Packit Service 3749ba
Packit Service 3749ba
p11_user_config = get_option('user_config')
Packit Service 3749ba
p11_module_path = get_option('module_path')
Packit Service 3749ba
if p11_module_path == ''
Packit Service 3749ba
  p11_module_path = libdir / 'pkcs11'
Packit Service 3749ba
endif
Packit Service 3749ba
Packit Service 3749ba
p11_system_config_file = p11_system_config / 'pkcs11.conf'
Packit Service 3749ba
p11_system_config_modules = p11_system_config / 'modules'
Packit Service 3749ba
p11_user_config_file = p11_user_config / 'pkcs11.conf'
Packit Service 3749ba
p11_user_config_modules = p11_user_config / 'modules'
Packit Service 3749ba
Packit Service 3749ba
# --------------------------------------------------------------------
Packit Service 3749ba
# Hash implementation
Packit Service 3749ba
Packit Service 3749ba
hash_impl = get_option('hash_impl')
Packit Service 3749ba
if hash_impl == 'freebl'
Packit Service 3749ba
  libfreebl3 = cc.find_library('freebl3', required: false)
Packit Service 3749ba
  if libfreebl3.found() and cc.has_function('NSSLOW_Init',
Packit Service 3749ba
                                            dependencies: libfreebl3)
Packit Service 3749ba
    conf.set('WITH_FREEBL', 1)
Packit Service 3749ba
  else
Packit Service 3749ba
    error('could not find the freebl3 library')
Packit Service 3749ba
  endif
Packit Service 3749ba
endif
Packit Service 3749ba
Packit Service 3749ba
# --------------------------------------------------------------------
Packit Service 3749ba
# Trust Module
Packit Service 3749ba
Packit Service 3749ba
with_trust_module = false
Packit Service 3749ba
libtasn1_deps = []
Packit Service 3749ba
libtasn1 = dependency('libtasn1', version: '>= 2.3',
Packit Service 3749ba
                      required: get_option('trust_module'))
Packit Service 3749ba
if libtasn1.found()
Packit Service 3749ba
  asn1Parser = find_program('asn1Parser', required: get_option('trust_module'))
Packit Service 3749ba
  if asn1Parser.found()
Packit Service 3749ba
    conf.set('WITH_ASN1', 1)
Packit Service 3749ba
    libtasn1_deps += libtasn1
Packit Service 3749ba
    with_trust_module = true
Packit Service 3749ba
  endif
Packit Service 3749ba
endif
Packit Service 3749ba
Packit Service 3749ba
trust_paths = get_option('trust_paths')
Packit Service 3749ba
conf.set_quoted('TRUST_PATHS', trust_paths)
Packit Service 3749ba
Packit Service 3749ba
# --------------------------------------------------------------------
Packit Service 3749ba
# systemd
Packit Service 3749ba
Packit Service 3749ba
with_systemd = false
Packit Service 3749ba
libsystemd_deps = []
Packit Service 3749ba
libsystemd = dependency('libsystemd', required: get_option('systemd'))
Packit Service 3749ba
systemd = dependency('systemd', required: get_option('systemd'))
Packit Service 3749ba
if libsystemd.found() and systemd.found()
Packit Service 3749ba
  systemduserunitdir = systemd.get_pkgconfig_variable('systemduserunitdir')
Packit Service 3749ba
  conf.set('WITH_SYSTEMD', 1)
Packit Service 3749ba
  libsystemd_deps += libsystemd
Packit Service 3749ba
  with_systemd = true
Packit Service 3749ba
endif
Packit Service 3749ba
Packit Service 3749ba
configure_file(output: 'config.h', configuration: conf)
Packit Service 3749ba
Packit Service 3749ba
gnome = import('gnome')
Packit Service 3749ba
i18n = import('i18n')
Packit Service 3749ba
pkg = import('pkgconfig')
Packit Service 3749ba
Packit Service 3749ba
subdir('common')
Packit Service 3749ba
subdir('p11-kit')
Packit Service 3749ba
if with_trust_module
Packit Service 3749ba
  subdir('trust')
Packit Service 3749ba
endif
Packit Service 3749ba
subdir('doc/manual')
Packit Service 3749ba
if get_option('nls')
Packit Service 3749ba
  subdir('po')
Packit Service 3749ba
endif
Packit Service 3749ba
subdir('bash-completion')