aboutsummaryrefslogtreecommitdiff
path: root/perl
diff options
context:
space:
mode:
authorQyriad <qyriad@qyriad.me>2024-04-01 14:06:44 -0600
committerQyriad <qyriad@qyriad.me>2024-04-02 11:22:42 -0600
commit4f5e532b8bf6196c19e1ca37c450c3635882269a (patch)
tree25def138acef1cc44a074ca855fc251ba102a37d /perl
parentd2aca15f31f39ab1548ae8410932293504d0eb36 (diff)
meson: implement perl bindings
Change-Id: Ie1bfb0aa784e6136a82d518a652d0ae60c4b047a
Diffstat (limited to 'perl')
-rw-r--r--perl/default.nix33
-rw-r--r--perl/lib/Nix/meson.build58
-rw-r--r--perl/meson.build69
3 files changed, 151 insertions, 9 deletions
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')