Blob Blame History Raw
install_headers('deprecated.h',
                'iter.h',
                'p11-kit.h',
                'pin.h',
                'remote.h',
                'uri.h',
                subdir: 'p11-kit-1/p11-kit')

libp11_kit_internal_sources = [
  'conf.c',
  'log.c',
  'filter.c',
  'rpc-transport.c',
  'rpc-message.c',
  'rpc-client.c'
]

libp11_kit_internal_sources += custom_target('generate virtual-fixed-generated.h',
                                             output: 'virtual-fixed-generated.h',
                                             command: [
                                               meson.current_source_dir() / 'gen-virtual-fixed.sh',
                                               '@OUTPUT@', '64'
                                             ])
libp11_kit_internal_sources += 'virtual.c'

libp11_kit_internal_c_args = [
  '-DP11_SYSTEM_CONFIG_FILE="@0@"'.format(prefix / p11_system_config_file),
  '-DP11_SYSTEM_CONFIG_MODULES="@0@"'.format(prefix / p11_system_config_modules),
  '-DP11_PACKAGE_CONFIG_MODULES="@0@"'.format(prefix / p11_package_config_modules),
  '-DP11_USER_CONFIG_FILE="@0@"'.format(p11_user_config_file),
  '-DP11_USER_CONFIG_MODULES="@0@"'.format(p11_user_config_modules),
  '-DP11_MODULE_PATH="@0@"'.format(prefix / p11_module_path)
]

libp11_kit_internal = static_library('p11-kit-internal',
                                     libp11_kit_internal_sources,
                                     dependencies: [libp11_library_dep] + libffi_deps,
                                     c_args: libp11_kit_internal_c_args,
                                     implicit_include_directories: false,
                                     gnu_symbol_visibility: 'hidden')

libp11_kit_sources = [
  'iter.c',
  'messages.c',
  'modules.c',
  'pin.c',
  'proxy.c',
  'proxy-init.c',
  'rpc-server.c',
  'uri.c',
  'util.c'
]

libp11_kit_symbol_map = meson.current_source_dir() / 'libp11-kit.map'
libp11_kit_ldflags = cc.get_supported_link_arguments([
  '-Wl,--version-script,' + libp11_kit_symbol_map
])
libp11_kit_symbol_def = meson.current_source_dir() / 'libp11-kit-@0@.dll.def'.format(soversion)

libp11_kit = shared_library('p11-kit',
                            libp11_kit_sources,
                            install: true,
                            version: library_version,
                            soversion: soversion,
                            dependencies: libffi_deps + dlopen_deps,
                            include_directories: [configinc, commoninc],
                            implicit_include_directories: false,
                            c_args: libp11_kit_internal_c_args,
                            link_args: libp11_kit_ldflags,
                            link_depends: [libp11_kit_symbol_map,
                                           libp11_kit_symbol_def],
                            link_with: libp11_kit_internal,
                            vs_module_defs: libp11_kit_symbol_def)

libp11_kit_dep = declare_dependency(link_with: libp11_kit,
                                    include_directories: [configinc, commoninc])

meson.add_install_script(
  'meson_post_install.sh',
  libdir,
  datadir / 'p11-kit' / 'modules'
)

p11_module_symbol_map = meson.current_source_dir() / 'p11-module.map'
p11_module_ldflags = cc.get_supported_link_arguments([
  '-Wl,--version-script,' + p11_module_symbol_map
])
p11_module_symbol_def = meson.current_source_dir() / 'p11-module.def'

if host_system != 'windows'
  shared_module('p11-kit-client',
                'client.c', 'client-init.c',
                name_prefix: '',
                include_directories: [configinc, commoninc],
                link_args: p11_module_ldflags,
                link_depends: [p11_module_symbol_map,
                               p11_module_symbol_def],
                link_with: [libp11_kit_internal],
                vs_module_defs: p11_module_symbol_def,
                install: true,
                install_dir: p11_module_path)
endif

if get_option('test')
  fixtures_dir = meson.current_source_dir() / 'fixtures'

  if host_system == 'windows'
    libp11_kit_testable_c_args = [
      '-DP11_SYSTEM_CONFIG_FILE="@0@"'.format(fixtures_dir / 'system-pkcs11.conf'),
      '-DP11_SYSTEM_CONFIG_MODULES="@0@"'.format(fixtures_dir / 'system-modules' / 'win32'),
      '-DP11_PACKAGE_CONFIG_MODULES="@0@"'.format(fixtures_dir / 'package-modules' / 'win32'),
      '-DP11_USER_CONFIG_FILE="@0@"'.format(fixtures_dir / 'user-pkcs11.conf'),
      '-DP11_USER_CONFIG_MODULES="@0@"'.format(fixtures_dir / 'user-modules' / 'win32')
    ]
  else
    libp11_kit_testable_c_args = [
      '-DP11_SYSTEM_CONFIG_FILE="@0@"'.format(fixtures_dir / 'system-pkcs11.conf'),
      '-DP11_SYSTEM_CONFIG_MODULES="@0@"'.format(fixtures_dir / 'system-modules'),
      '-DP11_PACKAGE_CONFIG_MODULES="@0@"'.format(fixtures_dir / 'package-modules'),
      '-DP11_USER_CONFIG_FILE="@0@"'.format(fixtures_dir / 'user-pkcs11.conf'),
      '-DP11_USER_CONFIG_MODULES="@0@"'.format(fixtures_dir / 'user-modules')
    ]
  endif

  libp11_kit_testable_c_args += '-DP11_MODULE_PATH="@0@"'.format(meson.current_build_dir())

  libp11_kit_testable = static_library('p11-kit-testable',
                                       libp11_kit_internal_sources,
                                       libp11_kit_sources,
                                       c_args: libp11_kit_testable_c_args,
                                       implicit_include_directories: false,
                                       dependencies: [libp11_library_dep] + libffi_deps + dlopen_deps)
endif

p11_kit_sources = [
  'lists.c',
  'p11-kit.c'
]

executable('p11-kit',
           p11_kit_sources,
           c_args: common_c_args,
           dependencies: [libp11_tool_dep] + libffi_deps + dlopen_deps,
           link_with: libp11_kit,
           install: true)

executable('p11-kit-remote',
           'remote.c',
           c_args: common_c_args,
           dependencies: [libp11_tool_dep] + libffi_deps + dlopen_deps,
           link_with: libp11_kit,
           install: true,
           install_dir: prefix / privatedir)

if get_option('test')
  executable('p11-kit-remote-testable',
             'remote.c',
             c_args: common_c_args,
             dependencies: [libp11_tool_dep] + libffi_deps + dlopen_deps,
             link_with: libp11_kit_testable)
endif

executable('p11-kit-server',
           'server.c',
           c_args: common_c_args + [
             '-DP11_KIT_REMOTE="p11-kit-remote"'
           ],
           dependencies: [libp11_tool_dep] + libsystemd_deps + libffi_deps + dlopen_deps,
           implicit_include_directories: false,
           link_with: libp11_kit,
           install: true,
           install_dir: prefix / privatedir)

if get_option('test')
  executable('p11-kit-server-testable',
             'server.c',
             c_args: common_c_args + [
               '-DP11_KIT_REMOTE="p11-kit-remote-testable"'
             ],
             implicit_include_directories: false,
             dependencies: [libp11_tool_dep] + libsystemd_deps + libffi_deps + dlopen_deps,
             link_with: libp11_kit_testable)
endif

if with_systemd
  p11_kit_server_service_conf = configuration_data({
    'bindir': prefix / bindir
  })
  p11_kit_server_service = configure_file(input: 'p11-kit-server.service.in',
                                          output: '@BASENAME@',
                                          configuration: p11_kit_server_service_conf)
  install_data([p11_kit_server_service, 'p11-kit-server.socket'],
               install_dir: systemduserunitdir)
endif

# Check if compilation succeeds with CRYPTOKI_GNU=1

pkcs11_gnu_headers = [
  'iter.h',
  'pin.h',
  'uri.h'
]

gnu_h_gen = generator(find_program('gen-pkcs11-gnu.sh'),
                      output: 'pkcs11-gnu-@BASENAME@.h',
                      arguments: ['@INPUT@', '@OUTPUT@'])

gnu_h = gnu_h_gen.process(pkcs11_gnu_headers)

static_library('p11-kit-pkcs11-gnu',
               gnu_h,
               'pkcs11-gnu.c',
               include_directories: [configinc, commoninc])

# Tests ----------------------------------------------------------------

if get_option('test')
  p11_kit_tests = [
    'test-progname',
    'test-util',
    'test-conf',
    'test-uri',
    'test-pin',
    'test-init',
    'test-modules',
    'test-deprecated',
    'test-proxy',
    'test-iter',
    'test-rpc',
    'test-virtual',
    'test-managed',
    'test-log',
    'test-filter',
    'test-transport'
  ]

  if host_system != 'windows'
    p11_kit_tests += 'test-server'
  endif

  foreach name : p11_kit_tests
    t = executable(name, '@0@.c'.format(name),
                   c_args: tests_c_args + libp11_kit_testable_c_args,
                   include_directories: [configinc, commoninc],
                   dependencies: [libp11_test_dep] + libffi_deps + dlopen_deps,
                   link_with: libp11_kit_testable)
    test(name, t)
  endforeach

  p11_kit_progs = [
    'print-messages',
    'frob-setuid'
  ]

  foreach name : p11_kit_progs
    t = executable(name, '@0@.c'.format(name),
                   c_args: tests_c_args,
                   include_directories: [configinc, commoninc],
                   dependencies: [libp11_test_dep] + libffi_deps + dlopen_deps,
                   link_with: libp11_kit_testable)
  endforeach

  p11_kit_tests_env = environment()
  p11_kit_tests_env.set('abs_top_builddir', top_build_dir)
  p11_kit_tests_env.set('P11_MODULE_PATH', meson.current_build_dir())

  if host_system != 'windows'
    test('test-messages.sh',
         find_program('test-messages.sh'),
         env: p11_kit_tests_env)

    test('test-server.sh',
         find_program('test-server.sh'),
         env: p11_kit_tests_env)
  endif

  mock_sources = {
                   'mock-one': ['mock-module-ep.c'],
                   'mock-two': ['mock-module-ep2.c'],
                   'mock-three': ['mock-module-ep.c'],
                   'mock-four': ['mock-module-ep.c'],
                   'mock-five': ['mock-module-ep3.c'],
                   'mock-seven': ['mock-module-ep5.c'],
                   'mock-eight': ['mock-module-ep6.c'],
                   'mock-nine': ['mock-module-ep7.c'],
                   'mock-ten': ['mock-module-ep8.c']
                 }

  if host_system != 'windows'
    mock_sources += {'mock-six': ['mock-module-ep4.c']}
  endif

  foreach name, sources : mock_sources
    shared_module(name,
                  sources,
                  name_prefix: '',
                  link_args: p11_module_ldflags,
                  link_depends: [p11_module_symbol_map,
                                 p11_module_symbol_def],
                  vs_module_defs: p11_module_symbol_def,
                  dependencies: [libp11_test_dep])
  endforeach
endif

p11_kit_pc_variables = [
  'p11_module_configs=@0@'.format(prefix / p11_package_config_modules),
  'p11_module_path=@0@'.format(prefix / p11_module_path),
  'proxy_module=@0@/p11-kit-proxy.so'.format(prefix / libdir),
  'p11_system_config_modules=@0@'.format(prefix / p11_package_config_modules)
]

if trust_paths != ''
  p11_kit_pc_variables += [
    'p11_trust_paths=@0@'.format(trust_paths)
  ]
endif

pkg.generate(libraries: libp11_kit,
             filebase: 'p11-kit-1',
             name: 'p11-kit',
             description: 'Library and proxy module for properly loading and sharing PKCS#11 modules.',
             subdirs: 'p11-kit-1',
             variables: p11_kit_pc_variables)

pkcs11_conf_example_conf = configuration_data({
  'p11_system_config_file': prefix / p11_system_config_file,
  'p11_user_config': p11_user_config
})
pkcs11_conf_example = configure_file(input: 'pkcs11.conf.example.in',
                                     output: '@BASENAME@',
                                     configuration: pkcs11_conf_example_conf)
install_data(pkcs11_conf_example,
             install_dir: prefix / p11_system_config)