From 4dd76e5e16c1fc1b7599c8edd802a52740e4d3ec Mon Sep 17 00:00:00 2001 From: Ludovic Rousseau Date: Wed, 1 May 2024 20:37:30 +0200 Subject: [PATCH] Initial meson build files --- meson.build | 196 ++++++++++++++++++++++++++++++++++++++++++++++ meson.options | 39 +++++++++ meson_options.txt | 1 + 3 files changed, 236 insertions(+) create mode 100644 meson.build create mode 100644 meson.options create mode 120000 meson_options.txt diff --git a/meson.build b/meson.build new file mode 100644 index 00000000..092adb6e --- /dev/null +++ b/meson.build @@ -0,0 +1,196 @@ +# for ninja: +# meson setup builddir +# cd builddir ; meson compile + +# regenerate configuration (run from builddir/) +# meson setup --reconfigure --wipe + +project('ccid', 'c', + version : '1.5.6') + +# for config.h +conf_data = configuration_data({ + 'VERSION' : '"' + meson.project_version() + '"', + 'ENABLE_ZLP' : get_option('zlp'), + 'NO_LOG' : get_option('embedded'), + 'USE_OS_LOG' : get_option('os_log'), + 'USE_COMPOSITE_AS_MULTISLOT' : get_option('composite-as-multislot'), + }) + +# tests for functions +compiler = meson.get_compiler('c') +if compiler.has_function('strlcpy') + conf_data.set('HAVE_STRLCPY', true) +endif +if compiler.has_function('strlcat') + conf_data.set('HAVE_STRLCAT', true) +endif +if compiler.has_function('secure_getenv') + conf_data.set('HAVE_SECURE_GETENV', true) +endif + +# variables +bundle_id = 'ifd-ccid.bundle' +extra_bundle_id = get_option('extra_bundle_id') +if extra_bundle_id != '' + bundle_id = 'ifd-ccid-' + extra_bundle_id + '.bundle' +else +endif +dyn_lib_ext = '.so' + +pcsc_dep = dependency('libpcsclite') +pcsc_cflags = pcsc_dep.partial_dependency(compile_args : true) +libusb_dep = dependency('libusb-1.0') +zlib_dep = dependency('zlib') + +r = run_command('uname', check: true) +pcsc_arch = r.stdout().strip() +if pcsc_arch == 'Darwin' + pcsc_arch = 'MacOS' + dyn_lib_ext = '.dylib' + libusb_dep = dependency('libusb-1.0', static : true) +endif + +# flex generator +gen_flex = generator(find_program('flex'), + output : '@BASENAME@.c', + arguments : ['-o', '@OUTPUT@', '--prefix=@BASENAME@', '@INPUT@']) + +conf_data.set_quoted('PCSCLITE_HP_DROPDIR', pcsc_dep.get_variable('usbdropdir')) +conf_data.set_quoted('BUNDLE', bundle_id) + +# libccid +libccid_src = [ + 'src/ccid.c', + 'src/ccid_usb.c', + 'src/commands.c', + 'src/ifdhandler.c', + 'src/simclist.c', + 'src/strlcpy.c', + 'src/sys_unix.c', + 'src/utils.c', + 'src/openct/buffer.c', + 'src/openct/checksum.c', + 'src/openct/proto-t1.c', + 'src/towitoko/atr.c', + 'src/towitoko/pps.c', + ] +gen_src = gen_flex.process('src/tokenparser.l') +libccid_src += gen_src +if not get_option('pcsclite') + libccid_src += 'src/debug.c' +endif + +library('ccid', + libccid_src, + c_args : ['-DSIMCLIST_NO_DUMPRESTORE'], + override_options : ['b_lundef=false'], + include_directories : ['src'], + dependencies : [libusb_dep, pcsc_cflags], + install : true, + install_dir : join_paths(pcsc_dep.get_variable('usbdropdir'), bundle_id, 'Contents', pcsc_arch)) + +if get_option('serial') +# libccidtwin +libccidtwin_src = [ + 'src/ccid.c', + 'src/ccid_serial.c', + 'src/commands.c', + 'src/ifdhandler.c', + 'src/simclist.c', + 'src/strlcpy.c', + 'src/sys_unix.c', + 'src/utils.c', + 'src/openct/buffer.c', + 'src/openct/checksum.c', + 'src/openct/proto-t1.c', + 'src/towitoko/atr.c', + 'src/towitoko/pps.c', + gen_src, + ] +if not get_option('pcsclite') + libccidtwin_src += 'src/debug.c' +endif + +libccidtwin_dir = join_paths(pcsc_dep.get_variable('usbdropdir'), 'serial') +library('ccidtwin', + libccidtwin_src, + c_args : ['-DSIMCLIST_NO_DUMPRESTORE', '-DTWIN_SERIAL'], + override_options : ['b_lundef=false'], + include_directories : ['src'], + dependencies : [pcsc_cflags], + install : true, + install_dir : libccidtwin_dir) + +# reader.conf +conf_data.set('TARGET', join_paths(libccidtwin_dir, 'libccidtwin' + dyn_lib_ext)) +configure_file(output : 'libccidtwin', + input : 'src/reader.conf.in', + install_dir : join_paths(get_option('sysconfdir'), 'reader.conf.d'), + configuration : conf_data) +endif + +# parse +parse_src = [ + 'src/parse.c', + 'src/debug.c', + 'src/ccid_usb.c', + 'src/sys_unix.c', + 'src/simclist.c', + ] +parse_src += gen_src + +executable('parse', + parse_src, + include_directories : ['src'], + dependencies : [libusb_dep, pcsc_cflags, zlib_dep], + ) + +# scardcontrol +scardcontrol_src = [ + 'examples/scardcontrol.c', + 'examples/PCSCv2part10.c', + ] +executable('scardcontrol', + scardcontrol_src, + dependencies : [pcsc_dep], + ) + +# contrib Kobil_mIDentity_switch +executable('Kobil_mIDentity_switch', + 'contrib/Kobil_mIDentity_switch/Kobil_mIDentity_switch.c', + dependencies : [libusb_dep], + ) + +# contrib RSA_SecurID_getpasswd +executable('RSA_SecurID_getpasswd', + 'contrib/RSA_SecurID/RSA_SecurID_getpasswd.c', + dependencies : [pcsc_dep], + ) + +# Info.plist +command = [ + find_program('src/create_Info_plist.pl'), + files('readers/supported_readers.txt'), + '@INPUT@', + '--version=' + meson.project_version(), + '--target=libccid' + dyn_lib_ext + ] +if not get_option('class') + command += '--no-class' +endif +if extra_bundle_id != '' + command += '--extra_bundle_id=.' + extra_bundle_id +endif +custom_target('Info.plist', + output : 'Info.plist', + input : 'src/Info.plist.src', + build_by_default : true, + capture : true, + command : command, + install : true, + install_dir : join_paths(pcsc_dep.get_variable('usbdropdir'), bundle_id, 'Contents')) + +# generate config.h +configure_file(output : 'config.h', + configuration : conf_data) diff --git a/meson.options b/meson.options new file mode 100644 index 00000000..98ec7afe --- /dev/null +++ b/meson.options @@ -0,0 +1,39 @@ +option('extra_bundle_id', + type : 'string', + value : '', + description : 'appended to the name of the bundle directory') + +option('class', + type : 'boolean', + value : 'true', + description : 'enable the CCIDCLASSDRIVER in Info.plist') + +option('composite-as-multislot', + type : 'boolean', + value : 'false', + description : 'composite device are seen as multi-slots') + +option('embedded', + type : 'boolean', + value : 'false', + description : 'for embedded systems [limit RAM and CPU resources by disabling features (log)]') + +option('os_log', + type : 'boolean', + value : 'false', + description : 'use os_log(3) instead of printf() for debug (Sierra 10.12 and up)]') + +option('pcsclite', + type : 'boolean', + value : 'true', + description : 'use pcsc-lite debug support') + +option('serial', + type : 'boolean', + value : 'false', + description : 'enable the driver for the serial CCID readers') + +option('zlp', + type : 'boolean', + value : 'false', + description : 'enable the Zero Length Packet patch for some Gemalto readers') diff --git a/meson_options.txt b/meson_options.txt new file mode 120000 index 00000000..7b28df27 --- /dev/null +++ b/meson_options.txt @@ -0,0 +1 @@ +meson.options \ No newline at end of file