diff --git a/package.nix b/package.nix index 082627c49..1c943e046 100644 --- a/package.nix +++ b/package.nix @@ -316,6 +316,6 @@ in stdenv.mkDerivation (finalAttrs: { meta.platforms = lib.platforms.unix; passthru.perl-bindings = pkgs.callPackage ./perl { - inherit fileset stdenv; + inherit fileset stdenv buildWithMeson; }; }) diff --git a/perl/default.nix b/perl/default.nix index a1940402e..53666716e 100644 --- a/perl/default.nix +++ b/perl/default.nix @@ -3,6 +3,9 @@ , perl, perlPackages , autoconf-archive, autoreconfHook, pkg-config , nix, curl, bzip2, xz, boost, libsodium, darwin +, meson +, ninja +, buildWithMeson ? false, }: perl.pkgs.toPerlModule (stdenv.mkDerivation { @@ -10,24 +13,33 @@ perl.pkgs.toPerlModule (stdenv.mkDerivation { src = fileset.toSource { root = ../.; - fileset = fileset.unions [ + fileset = fileset.unions ([ ../.version + ./lib + ] ++ lib.optionals (!buildWithMeson) [ + # FIXME(Qyriad): What the hell is this? + # What is it used for and do we still need it? + ./MANIFEST ../m4 ../mk - ./MANIFEST ./Makefile ./Makefile.config.in ./configure.ac - ./lib ./local.mk - ]; + ] ++ lib.optionals buildWithMeson [ + ./meson.build + ]); }; - nativeBuildInputs = - [ autoconf-archive - autoreconfHook - pkg-config - ]; + nativeBuildInputs = [ + pkg-config + ] ++ lib.optionals (!buildWithMeson) [ + autoconf-archive + autoreconfHook + ] ++ lib.optionals buildWithMeson [ + meson + ninja + ]; buildInputs = [ nix @@ -42,6 +54,9 @@ perl.pkgs.toPerlModule (stdenv.mkDerivation { ++ lib.optional (stdenv.isLinux || stdenv.isDarwin) libsodium ++ lib.optional stdenv.isDarwin darwin.apple_sdk.frameworks.Security; + # Nixpkgs' Meson hook likes to set this to "plain". + mesonBuildType = "debugoptimized"; + enableParallelBuilding = true; postUnpack = "sourceRoot=$sourceRoot/perl"; diff --git a/perl/lib/Nix/meson.build b/perl/lib/Nix/meson.build new file mode 100644 index 000000000..6810622e3 --- /dev/null +++ b/perl/lib/Nix/meson.build @@ -0,0 +1,58 @@ +store_xs_cpp = custom_target( + input : 'Store.xs', + output : 'Store.cc', + command : [ + xsubpp, + '@INPUT@', + '-output', + '@OUTPUT@', + ], + build_by_default : true, +) + +soname_args = [] +if cxx.get_linker_id() in ['ld.bfd', 'ld.gold'] + soname_args = ['-Wl,-soname=Store.so'] +endif + +perl_libstore = shared_module( + 'Store', + store_xs_cpp, + # This library does NOT get the normal libprefix. it's just `Store.so`, not `libStore.so`. + name_prefix : '', + dependencies : [ + libstore, + sodium, + perl_include, + ], + link_args : [ + # Nix doesn't provide a pkg-config file for libutil. + '-lnixutil', + soname_args, + ], + install : true, + install_dir : perl_libdir / 'auto/Nix/Store', +) + +config_pm = configure_file( + input : 'Config.pm.in', + output : 'Config.pm', + configuration : { + 'PACKAGE_VERSION': meson.project_version(), + }, +) + +nix_perl_sources = files( + 'Store.pm', + 'Manifest.pm', + 'SSH.pm', + 'CopyClosure.pm', + 'Utils.pm', +) + +install_data( + nix_perl_sources, + config_pm, + install_dir : perl_libdir / 'Nix', + preserve_path : true, +) diff --git a/perl/meson.build b/perl/meson.build new file mode 100644 index 000000000..75c7c2c79 --- /dev/null +++ b/perl/meson.build @@ -0,0 +1,69 @@ +project('lix-perl', 'cpp', + version : run_command('bash', '-c', 'echo -n $(cat ../.version)$VERSION_SUFFIX', check : true).stdout().strip(), + default_options : [ + 'cpp_std=c++2a', + # TODO(Qyriad): increase the warning level + 'debug=true', + # FIXME(Qyriad): should this be -O2? The main nix build was switched to -O2 in 3c5234430 + 'optimization=3', + ], +) + +fs = import('fs') + +prefix = get_option('prefix') +libdir = get_option('libdir') +if not fs.is_absolute(libdir) + libdir = prefix / libdir +endif + +cxx = meson.get_compiler('cpp') + +# Really version 5.8.0, but Perl's version string is of the form +# "This is perl 5, version 38, subversion 2", for 5.38.2, so as far +# as Meson is concerned, the version of Perl we need is 8 or greater. +perl = find_program('perl', version : '>=8') + +# "compiler to convert Perl XS code into C code" +xsubpp = find_program('xsubpp') + +perl_version = run_command( + perl, + '-e', + 'use Config; print $Config{version};', + capture : true, + check : true, +).stdout() +perl_arch_name = run_command( + perl, + '-e', + 'use Config; print $Config{archname};', + capture : true, + check : true, +).stdout() + +perl_libdir = f'@libdir@/perl5/site_perl/@perl_version@/@perl_arch_name@' + +perl_incdir = run_command( + perl, + '-e', + 'use Config; print $Config{archlibexp};', + capture : true, + check : true, +).stdout() + '/CORE' + +perl_include = declare_dependency( + # This must have is_system : true, or #include "config.h" will get perl's config.h + # instead of Nix's. + include_directories : include_directories(perl_incdir, is_system : true), +) + +sodium = dependency('libsodium', 'sodium', required : true) + +if cxx.get_linker_id() in ['ld.bfd', 'ld.gold'] + add_project_link_arguments('-Wl,--no-copy-dt-needed-entries', language : 'cpp') +endif + +libstore = dependency('nixstore', 'nix-store', required : true) + +subdir('lib/Nix')