1install_headers('deprecated.h',
2                'iter.h',
3                'p11-kit.h',
4                'pin.h',
5                'remote.h',
6                'uri.h',
7                subdir: 'p11-kit-1/p11-kit')
8
9libp11_kit_internal_sources = [
10  'conf.c',
11  'log.c',
12  'filter.c',
13  'rpc-transport.c',
14  'rpc-message.c',
15  'rpc-client.c'
16]
17
18libp11_kit_internal_sources += custom_target('generate virtual-fixed-generated.h',
19                                             output: 'virtual-fixed-generated.h',
20                                             command: [
21                                               meson.current_source_dir() / 'gen-virtual-fixed.sh',
22                                               '@OUTPUT@', '64'
23                                             ])
24libp11_kit_internal_sources += 'virtual.c'
25
26libp11_kit_internal_c_args = [
27  '-DP11_SYSTEM_CONFIG_FILE="@0@"'.format(prefix / p11_system_config_file),
28  '-DP11_SYSTEM_CONFIG_MODULES="@0@"'.format(prefix / p11_system_config_modules),
29  '-DP11_PACKAGE_CONFIG_MODULES="@0@"'.format(prefix / p11_package_config_modules),
30  '-DP11_USER_CONFIG_FILE="@0@"'.format(p11_user_config_file),
31  '-DP11_USER_CONFIG_MODULES="@0@"'.format(p11_user_config_modules),
32  '-DP11_MODULE_PATH="@0@"'.format(prefix / p11_module_path)
33]
34
35libp11_kit_internal = static_library('p11-kit-internal',
36                                     libp11_kit_internal_sources,
37                                     dependencies: [libp11_library_dep] + libffi_deps,
38                                     c_args: libp11_kit_internal_c_args,
39                                     implicit_include_directories: false,
40                                     gnu_symbol_visibility: 'hidden')
41
42libp11_kit_sources = [
43  'iter.c',
44  'messages.c',
45  'modules.c',
46  'pin.c',
47  'proxy.c',
48  'proxy-init.c',
49  'rpc-server.c',
50  'uri.c',
51  'util.c'
52]
53
54libp11_kit_symbol_map = meson.current_source_dir() / 'libp11-kit.map'
55libp11_kit_ldflags = cc.get_supported_link_arguments([
56  '-Wl,--version-script,' + libp11_kit_symbol_map
57])
58libp11_kit_symbol_def = meson.current_source_dir() / 'libp11-kit-@0@.dll.def'.format(soversion)
59
60libp11_kit = shared_library('p11-kit',
61                            libp11_kit_sources,
62                            install: true,
63                            version: library_version,
64                            soversion: soversion,
65                            dependencies: libffi_deps + dlopen_deps,
66                            include_directories: [configinc, commoninc],
67                            implicit_include_directories: false,
68                            c_args: libp11_kit_internal_c_args,
69                            link_args: libp11_kit_ldflags,
70                            link_depends: [libp11_kit_symbol_map,
71                                           libp11_kit_symbol_def],
72                            link_with: libp11_kit_internal,
73                            vs_module_defs: libp11_kit_symbol_def)
74
75libp11_kit_dep = declare_dependency(link_with: libp11_kit,
76                                    include_directories: [configinc, commoninc])
77
78meson.add_install_script(
79  'meson_post_install.sh',
80  libdir,
81  datadir / 'p11-kit' / 'modules'
82)
83
84p11_module_symbol_map = meson.current_source_dir() / 'p11-module.map'
85p11_module_ldflags = cc.get_supported_link_arguments([
86  '-Wl,--version-script,' + p11_module_symbol_map
87])
88p11_module_symbol_def = meson.current_source_dir() / 'p11-module.def'
89
90if host_system != 'windows'
91  shared_module('p11-kit-client',
92                'client.c', 'client-init.c',
93                name_prefix: '',
94                include_directories: [configinc, commoninc],
95                dependencies: dlopen_deps,
96                link_args: p11_module_ldflags,
97                link_depends: [p11_module_symbol_map,
98                               p11_module_symbol_def],
99                link_with: [libp11_kit_internal],
100                vs_module_defs: p11_module_symbol_def,
101                install: true,
102                install_dir: p11_module_path)
103endif
104
105if get_option('test')
106  fixtures_dir = meson.current_source_dir() / 'fixtures'
107
108  if host_system == 'windows'
109    libp11_kit_testable_c_args = [
110      '-DP11_SYSTEM_CONFIG_FILE="@0@"'.format(fixtures_dir / 'system-pkcs11.conf'),
111      '-DP11_SYSTEM_CONFIG_MODULES="@0@"'.format(fixtures_dir / 'system-modules' / 'win32'),
112      '-DP11_PACKAGE_CONFIG_MODULES="@0@"'.format(fixtures_dir / 'package-modules' / 'win32'),
113      '-DP11_USER_CONFIG_FILE="@0@"'.format(fixtures_dir / 'user-pkcs11.conf'),
114      '-DP11_USER_CONFIG_MODULES="@0@"'.format(fixtures_dir / 'user-modules' / 'win32')
115    ]
116  else
117    libp11_kit_testable_c_args = [
118      '-DP11_SYSTEM_CONFIG_FILE="@0@"'.format(fixtures_dir / 'system-pkcs11.conf'),
119      '-DP11_SYSTEM_CONFIG_MODULES="@0@"'.format(fixtures_dir / 'system-modules'),
120      '-DP11_PACKAGE_CONFIG_MODULES="@0@"'.format(fixtures_dir / 'package-modules'),
121      '-DP11_USER_CONFIG_FILE="@0@"'.format(fixtures_dir / 'user-pkcs11.conf'),
122      '-DP11_USER_CONFIG_MODULES="@0@"'.format(fixtures_dir / 'user-modules')
123    ]
124  endif
125
126  libp11_kit_testable_c_args += '-DP11_MODULE_PATH="@0@"'.format(meson.current_build_dir())
127
128  libp11_kit_testable = static_library('p11-kit-testable',
129                                       libp11_kit_internal_sources,
130                                       libp11_kit_sources,
131                                       c_args: libp11_kit_testable_c_args,
132                                       implicit_include_directories: false,
133                                       dependencies: [libp11_library_dep] + libffi_deps + dlopen_deps)
134endif
135
136p11_kit_sources = [
137  'lists.c',
138  'p11-kit.c'
139]
140
141executable('p11-kit',
142           p11_kit_sources,
143           c_args: common_c_args,
144           dependencies: [libp11_tool_dep] + libffi_deps + dlopen_deps,
145           link_with: libp11_kit,
146           install: true)
147
148executable('p11-kit-remote',
149           'remote.c',
150           c_args: common_c_args,
151           dependencies: [libp11_tool_dep] + libffi_deps + dlopen_deps,
152           link_with: libp11_kit,
153           install: true,
154           install_dir: prefix / privatedir)
155
156if get_option('test')
157  executable('p11-kit-remote-testable',
158             'remote.c',
159             c_args: common_c_args,
160             dependencies: [libp11_tool_dep] + libffi_deps + dlopen_deps,
161             link_with: libp11_kit_testable)
162endif
163
164executable('p11-kit-server',
165           'server.c',
166           c_args: common_c_args + [
167             '-DP11_KIT_REMOTE="p11-kit-remote"'
168           ],
169           dependencies: [libp11_tool_dep] + libsystemd_deps + libffi_deps + dlopen_deps,
170           implicit_include_directories: false,
171           link_with: libp11_kit,
172           install: true,
173           install_dir: prefix / privatedir)
174
175if get_option('test')
176  executable('p11-kit-server-testable',
177             'server.c',
178             c_args: common_c_args + [
179               '-DP11_KIT_REMOTE="p11-kit-remote-testable"'
180             ],
181             implicit_include_directories: false,
182             dependencies: [libp11_tool_dep] + libsystemd_deps + libffi_deps + dlopen_deps,
183             link_with: libp11_kit_testable)
184endif
185
186if with_systemd
187  p11_kit_server_service_conf = configuration_data({
188    'bindir': prefix / bindir
189  })
190  p11_kit_server_service = configure_file(input: 'p11-kit-server.service.in',
191                                          output: '@BASENAME@',
192                                          configuration: p11_kit_server_service_conf)
193  install_data([p11_kit_server_service, 'p11-kit-server.socket'],
194               install_dir: systemduserunitdir)
195endif
196
197# Check if compilation succeeds with CRYPTOKI_GNU=1
198
199pkcs11_gnu_headers = [
200  'iter.h',
201  'pin.h',
202  'uri.h'
203]
204
205gnu_h_gen = generator(find_program('gen-pkcs11-gnu.sh'),
206                      output: 'pkcs11-gnu-@BASENAME@.h',
207                      arguments: ['@INPUT@', '@OUTPUT@'])
208
209gnu_h = gnu_h_gen.process(pkcs11_gnu_headers)
210
211static_library('p11-kit-pkcs11-gnu',
212               gnu_h,
213               'pkcs11-gnu.c',
214               include_directories: [configinc, commoninc])
215
216# Tests ----------------------------------------------------------------
217
218if get_option('test')
219  p11_kit_tests = [
220    'test-progname',
221    'test-util',
222    'test-conf',
223    'test-uri',
224    'test-pin',
225    'test-init',
226    'test-modules',
227    'test-deprecated',
228    'test-proxy',
229    'test-iter',
230    'test-rpc',
231    'test-virtual',
232    'test-managed',
233    'test-log',
234    'test-filter',
235    'test-transport'
236  ]
237
238  if host_system != 'windows'
239    p11_kit_tests += 'test-server'
240  endif
241
242  foreach name : p11_kit_tests
243    t = executable(name, '@0@.c'.format(name),
244                   c_args: tests_c_args + libp11_kit_testable_c_args,
245                   include_directories: [configinc, commoninc],
246                   dependencies: [libp11_test_dep] + libffi_deps + dlopen_deps,
247                   link_with: libp11_kit_testable)
248    test(name, t)
249  endforeach
250
251  p11_kit_progs = [
252    'print-messages',
253    'frob-setuid'
254  ]
255
256  foreach name : p11_kit_progs
257    t = executable(name, '@0@.c'.format(name),
258                   c_args: tests_c_args,
259                   include_directories: [configinc, commoninc],
260                   dependencies: [libp11_test_dep] + libffi_deps + dlopen_deps,
261                   link_with: libp11_kit_testable)
262  endforeach
263
264  p11_kit_tests_env = environment()
265  p11_kit_tests_env.set('abs_top_builddir', top_build_dir)
266  p11_kit_tests_env.set('P11_MODULE_PATH', meson.current_build_dir())
267
268  if host_system != 'windows'
269    test('test-messages.sh',
270         find_program('test-messages.sh'),
271         env: p11_kit_tests_env)
272
273    test('test-server.sh',
274         find_program('test-server.sh'),
275         env: p11_kit_tests_env)
276  endif
277
278  mock_sources = {
279                   'mock-one': ['mock-module-ep.c'],
280                   'mock-two': ['mock-module-ep2.c'],
281                   'mock-three': ['mock-module-ep.c'],
282                   'mock-four': ['mock-module-ep.c'],
283                   'mock-five': ['mock-module-ep3.c'],
284                   'mock-seven': ['mock-module-ep5.c'],
285                   'mock-eight': ['mock-module-ep6.c'],
286                   'mock-nine': ['mock-module-ep7.c'],
287                   'mock-ten': ['mock-module-ep8.c']
288                 }
289
290  if host_system != 'windows'
291    mock_sources += {'mock-six': ['mock-module-ep4.c']}
292  endif
293
294  foreach name, sources : mock_sources
295    shared_module(name,
296                  sources,
297                  name_prefix: '',
298                  link_args: p11_module_ldflags,
299                  link_depends: [p11_module_symbol_map,
300                                 p11_module_symbol_def],
301                  vs_module_defs: p11_module_symbol_def,
302                  dependencies: [libp11_test_dep])
303  endforeach
304endif
305
306p11_kit_pc_variables = [
307  'p11_module_configs=@0@'.format(prefix / p11_package_config_modules),
308  'p11_module_path=@0@'.format(prefix / p11_module_path),
309  'proxy_module=@0@/p11-kit-proxy.so'.format(prefix / libdir),
310  'p11_system_config_modules=@0@'.format(prefix / p11_package_config_modules)
311]
312
313if trust_paths != ''
314  p11_kit_pc_variables += [
315    'p11_trust_paths=@0@'.format(trust_paths)
316  ]
317endif
318
319pkg.generate(libraries: libp11_kit,
320             filebase: 'p11-kit-1',
321             name: 'p11-kit',
322             description: 'Library and proxy module for properly loading and sharing PKCS#11 modules.',
323             subdirs: 'p11-kit-1',
324             variables: p11_kit_pc_variables)
325
326pkcs11_conf_example_conf = configuration_data({
327  'p11_system_config_file': prefix / p11_system_config_file,
328  'p11_user_config': p11_user_config
329})
330pkcs11_conf_example = configure_file(input: 'pkcs11.conf.example.in',
331                                     output: '@BASENAME@',
332                                     configuration: pkcs11_conf_example_conf)
333install_data(pkcs11_conf_example,
334             install_dir: prefix / p11_system_config)
335