Skip to content

Commit

Permalink
Merge pull request #11034 from obsidiansystems/meson-nix
Browse files Browse the repository at this point in the history
Package libnixmain and libnixcmd with Meson
  • Loading branch information
roberth committed Jul 5, 2024
2 parents 0b901e1 + 3acf3fc commit 896eb7a
Show file tree
Hide file tree
Showing 12 changed files with 441 additions and 2 deletions.
2 changes: 2 additions & 0 deletions meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ subproject('libstore')
subproject('libfetchers')
subproject('libexpr')
subproject('libflake')
subproject('libmain')
subproject('libcmd')

# Docs
subproject('internal-api-docs')
Expand Down
4 changes: 4 additions & 0 deletions packaging/components.nix
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ in
nix-flake = callPackage ../src/libflake/package.nix { };
nix-flake-tests = callPackage ../tests/unit/libflake/package.nix { };

nix-main = callPackage ../src/libmain/package.nix { };

nix-cmd = callPackage ../src/libcmd/package.nix { };

nix-internal-api-docs = callPackage ../src/internal-api-docs/package.nix { };
nix-external-api-docs = callPackage ../src/external-api-docs/package.nix { };

Expand Down
2 changes: 2 additions & 0 deletions packaging/hydra.nix
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ let
"nix-expr-tests"
"nix-flake"
"nix-flake-tests"
"nix-main"
"nix-cmd"
];
in
{
Expand Down
1 change: 1 addition & 0 deletions src/libcmd/.version
126 changes: 126 additions & 0 deletions src/libcmd/meson.build
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
project('nix-cmd', 'cpp',
version : files('.version'),
default_options : [
'cpp_std=c++2a',
# TODO(Qyriad): increase the warning level
'warning_level=1',
'debug=true',
'optimization=2',
'errorlogs=true', # Please print logs for tests that fail
],
meson_version : '>= 1.1',
license : 'LGPL-2.1-or-later',
)

cxx = meson.get_compiler('cpp')

subdir('build-utils-meson/deps-lists')

configdata = configuration_data()

deps_private_maybe_subproject = [
]
deps_public_maybe_subproject = [
dependency('nix-util'),
dependency('nix-store'),
dependency('nix-fetchers'),
dependency('nix-expr'),
dependency('nix-flake'),
dependency('nix-main'),
]
subdir('build-utils-meson/subprojects')

nlohmann_json = dependency('nlohmann_json', version : '>= 3.9')
deps_public += nlohmann_json

lowdown = dependency('lowdown', version : '>= 0.9.0', required : get_option('markdown'))
deps_private += lowdown
configdata.set('HAVE_LOWDOWN', lowdown.found().to_int())

readline_flavor = get_option('readline-flavor')
if readline_flavor == 'editline'
editline = dependency('libeditline', 'editline', version : '>=1.14')
deps_private += editline
elif readline_flavor == 'readline'
readline = dependency('readline')
deps_private += readline
configdata.set(
'USE_READLINE',
1,
description: 'Use readline instead of editline',
)
else
error('illegal editline flavor', readline_flavor)
endif

config_h = configure_file(
configuration : configdata,
output : 'config-cmd.hh',
)

add_project_arguments(
# TODO(Qyriad): Yes this is how the autoconf+Make system did it.
# It would be nice for our headers to be idempotent instead.
'-include', 'config-util.hh',
'-include', 'config-store.hh',
# '-include', 'config-fetchers.h',
'-include', 'config-main.hh',
'-include', 'config-cmd.hh',
language : 'cpp',
)

subdir('build-utils-meson/diagnostics')

sources = files(
'built-path.cc',
'command-installable-value.cc',
'command.cc',
'common-eval-args.cc',
'editor-for.cc',
'installable-attr-path.cc',
'installable-derived-path.cc',
'installable-flake.cc',
'installable-value.cc',
'installables.cc',
'legacy.cc',
'markdown.cc',
'misc-store-flags.cc',
'network-proxy.cc',
'repl-interacter.cc',
'repl.cc',
)

include_dirs = [include_directories('.')]

headers = [config_h] + files(
'built-path.hh',
'command-installable-value.hh',
'command.hh',
'common-eval-args.hh',
'editor-for.hh',
'installable-attr-path.hh',
'installable-derived-path.hh',
'installable-flake.hh',
'installable-value.hh',
'installables.hh',
'legacy.hh',
'markdown.hh',
'misc-store-flags.hh',
'network-proxy.hh',
'repl-interacter.hh',
'repl.hh',
)

this_library = library(
'nixcmd',
sources,
dependencies : deps_public + deps_private + deps_other,
prelink : true, # For C++ static initializers
install : true,
)

install_headers(headers, subdir : 'nix', preserve_path : true)

libraries_private = []

subdir('build-utils-meson/export')
15 changes: 15 additions & 0 deletions src/libcmd/meson.options
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# vim: filetype=meson

option(
'markdown',
type: 'feature',
description: 'Enable Markdown rendering in the Nix binary (requires lowdown)',
)

option(
'readline-flavor',
type : 'combo',
choices : ['editline', 'readline'],
value : 'editline',
description : 'Which library to use for nice line editing with the Nix language REPL',
)
112 changes: 112 additions & 0 deletions src/libcmd/package.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
{ lib
, stdenv
, mkMesonDerivation
, releaseTools

, meson
, ninja
, pkg-config

, nix-util
, nix-store
, nix-fetchers
, nix-expr
, nix-flake
, nix-main
, editline
, readline
, lowdown
, nlohmann_json

# Configuration Options

, versionSuffix ? ""

# Whether to enable Markdown rendering in the Nix binary.
, enableMarkdown ? !stdenv.hostPlatform.isWindows

# Which interactive line editor library to use for Nix's repl.
#
# Currently supported choices are:
#
# - editline (default)
# - readline
, readlineFlavor ? if stdenv.hostPlatform.isWindows then "readline" else "editline"
}:

let
inherit (lib) fileset;

version = lib.fileContents ./.version + versionSuffix;
in

mkMesonDerivation (finalAttrs: {
pname = "nix-cmd";
inherit version;

workDir = ./.;
fileset = fileset.unions [
../../build-utils-meson
./build-utils-meson
../../.version
./.version
./meson.build
./meson.options
(fileset.fileFilter (file: file.hasExt "cc") ./.)
(fileset.fileFilter (file: file.hasExt "hh") ./.)
];

outputs = [ "out" "dev" ];

nativeBuildInputs = [
meson
ninja
pkg-config
];

buildInputs = [
({ inherit editline readline; }.${readlineFlavor})
] ++ lib.optional enableMarkdown lowdown;

propagatedBuildInputs = [
nix-util
nix-store
nix-fetchers
nix-expr
nix-flake
nix-main
nlohmann_json
];

preConfigure =
# "Inline" .version so it's not a symlink, and includes the suffix.
# Do the meson utils, without modification.
''
chmod u+w ./.version
echo ${version} > ../../.version
'';

mesonFlags = [
(lib.mesonEnable "markdown" enableMarkdown)
(lib.mesonOption "readline-flavor" readlineFlavor)
];

env = lib.optionalAttrs (stdenv.isLinux && !(stdenv.hostPlatform.isStatic && stdenv.system == "aarch64-linux")) {
LDFLAGS = "-fuse-ld=gold";
};

enableParallelBuilding = true;

separateDebugInfo = !stdenv.hostPlatform.isStatic;

# TODO `releaseTools.coverageAnalysis` in Nixpkgs needs to be updated
# to work with `strictDeps`.
strictDeps = true;

hardeningDisable = lib.optional stdenv.hostPlatform.isStatic "pie";

meta = {
platforms = lib.platforms.unix ++ lib.platforms.windows;
};

})
2 changes: 1 addition & 1 deletion src/libcmd/repl-interacter.cc
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ extern "C" {
#include "finally.hh"
#include "repl-interacter.hh"
#include "file-system.hh"
#include "libcmd/repl.hh"
#include "repl.hh"

namespace nix {

Expand Down
2 changes: 1 addition & 1 deletion src/libcmd/repl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
#include <cstring>
#include <climits>

#include "libcmd/repl-interacter.hh"
#include "repl-interacter.hh"
#include "repl.hh"

#include "ansicolor.hh"
Expand Down
1 change: 1 addition & 0 deletions src/libmain/.version
Loading

0 comments on commit 896eb7a

Please sign in to comment.