diff --git a/flake.nix b/flake.nix index e3ed58a3..6484a571 100644 --- a/flake.nix +++ b/flake.nix @@ -36,13 +36,25 @@ ./completions ./patchelf.1 ./patchelf.spec.in - ./src - ./tests + (lib.fileset.difference ./src ( + lib.fileset.unions [ + ./src/Makefile.am + ./src/meson.build + ] + )) + (lib.fileset.difference ./tests ( + lib.fileset.unions [ + ./tests/Makefile.am + #./tests/meson.build + ] + )) ./version ]; autotoolsSrcFiles = [ ./Makefile.am + ./src/Makefile.am + ./tests/Makefile.am ./configure.ac ./m4 ]; @@ -51,6 +63,12 @@ ./CMakeLists.txt ]; + mesonSrcFiles = [ + ./meson.build + ./meson.options + ./src/meson.build + ]; + autotoolsSrc = lib.fileset.toSource { root = ./.; fileset = lib.fileset.unions (baseSrcFiles ++ autotoolsSrcFiles); @@ -89,7 +107,7 @@ inherit version; src = lib.fileset.toSource { root = ./.; - fileset = lib.fileset.unions (baseSrcFiles ++ autotoolsSrcFiles ++ cmakeSrcFiles); + fileset = lib.fileset.unions (baseSrcFiles ++ autotoolsSrcFiles ++ cmakeSrcFiles ++ mesonSrcFiles); }; versionSuffix = ""; # obsolete preAutoconf = "echo ${version} > version"; @@ -133,6 +151,8 @@ build-cmake = forAllSystems (system: self.packages.${system}.patchelf-cmake); + build-meson = forAllSystems (system: self.packages.${system}.patchelf-meson); + # x86_64-linux seems to be only working clangStdenv at the moment build-sanitized-clang = lib.genAttrs [ "x86_64-linux" ] ( system: @@ -151,6 +171,7 @@ self.hydraJobs.build.x86_64-linux self.hydraJobs.build.i686-linux self.hydraJobs.build-cmake.x86_64-linux + self.hydraJobs.build-meson.x86_64-linux # FIXME: add aarch64 emulation to our github action... #self.hydraJobs.build.aarch64-linux self.hydraJobs.build-sanitized.x86_64-linux @@ -190,6 +211,7 @@ }; nativeBuildInputs = (old.nativeBuildInputs or [ ]) ++ [ #pkgs.buildPackages.cmake + #pkgs.buildPackages.meson #pkgs.buildPackages.ninja modular.pre-commit.settings.package (pkgs.buildPackages.writeScriptBin "pre-commit-hooks-install" modular.pre-commit.settings.installationScript) @@ -245,6 +267,14 @@ }; }; + patchelf-meson = pkgs.callPackage ./package-meson.nix { + inherit version; + src = lib.fileset.toSource { + root = ./.; + fileset = lib.fileset.unions (baseSrcFiles ++ mesonSrcFiles); + }; + }; + # This is a good test to see if packages can be cross-compiled. It also # tests if our testsuite uses target-prefixed executable names. patchelf-musl-cross = patchelfFor pkgs.pkgsCross.musl64; diff --git a/maintainers/flake-module.nix b/maintainers/flake-module.nix index 4b9b4023..26eff46c 100644 --- a/maintainers/flake-module.nix +++ b/maintainers/flake-module.nix @@ -40,6 +40,29 @@ cmake-format = { enable = true; }; + meson-format = + let + meson = pkgs.meson.overrideAttrs { + doCheck = false; + doInstallCheck = false; + patches = [ + (pkgs.fetchpatch { + url = "https://github.com/mesonbuild/meson/commit/38d29b4dd19698d5cad7b599add2a69b243fd88a.patch"; + hash = "sha256-PgPBvGtCISKn1qQQhzBW5XfknUe91i5XGGBcaUK4yeE="; + }) + ]; + }; + in + { + enable = true; + files = "(meson.build|meson.options)$"; + entry = "${pkgs.writeScript "format-meson" '' + #!${pkgs.runtimeShell} + for file in "$@"; do + ${lib.getExe meson} format -ic ${../meson.format} "$file" + done + ''}"; + }; nixfmt-rfc-style = { enable = true; }; diff --git a/meson.build b/meson.build new file mode 100644 index 00000000..82d5bb6f --- /dev/null +++ b/meson.build @@ -0,0 +1,36 @@ +project( + 'patchelf', + 'cpp', + 'c', + version : files('version'), + default_options : { + 'cpp_std' : 'c++17', + 'warning_level' : '2', + }, + meson_version : '>=1.2', +) + +subdir('src') +#subdir('tests') # TODO + +install_man('patchelf.1') + +#specfile = configure_file( +# output : 'patchelf.spec', +# configuration : {'PACKAGE_VERSION' : meson.project_version()}, +#) + +# Commented things out should only be for `meson dist`. Need to +# reimplement for that. +install_data( + 'README.md', + #'COPYING', + #specfile, + #'version', + install_dir : get_option('datadir') / 'doc' / 'patchelf', +) + +install_data( + 'completions/zsh/_patchelf', + install_dir : get_option('datadir') / 'zsh' / 'site-functions', +) diff --git a/meson.format b/meson.format new file mode 100644 index 00000000..4876dd96 --- /dev/null +++ b/meson.format @@ -0,0 +1,7 @@ +indent_by = ' ' +space_array = true +kwargs_force_multiline = false +wide_colon = true +group_arg_value = true +indent_before_comments = ' ' +use_editor_config = true diff --git a/meson.options b/meson.options new file mode 100644 index 00000000..21ae69e7 --- /dev/null +++ b/meson.options @@ -0,0 +1,7 @@ +option( + 'page_size', + type : 'combo', + value : 'auto', + choices : [ 'auto', '4096', '65536', '16384', '8192' ], + description : 'Default page size, or "auto" to detect at runtime', +) diff --git a/package-meson.nix b/package-meson.nix new file mode 100644 index 00000000..8e7c4656 --- /dev/null +++ b/package-meson.nix @@ -0,0 +1,17 @@ +{ + stdenv, + meson, + ninja, + version, + src, +}: + +stdenv.mkDerivation { + pname = "patchelf"; + inherit version src; + nativeBuildInputs = [ + meson + ninja + ]; + doCheck = true; +} diff --git a/src/meson.build b/src/meson.build new file mode 100644 index 00000000..c6204efc --- /dev/null +++ b/src/meson.build @@ -0,0 +1,18 @@ +# Configure DEFAULT_PAGESIZE via config.h +confdata = configuration_data() +page_size = get_option('page_size') +if page_size != 'auto' + confdata.set_quoted('DEFAULT_PAGESIZE', page_size) +else + # For "auto", leave it undefined so runtime detection happens +endif + +config_h = configure_file(output : 'config.h', configuration : confdata) + +executable( + 'patchelf', + [ 'patchelf.cc', 'patchelf.h', config_h ], + include_directories : include_directories('.'), + cpp_args : [ '-include', meson.current_build_dir() / 'config.h' ], + install : true, +)