Skip to content

Commit

Permalink
Merge pull request #11014 from obsidiansystems/plugins-libmain
Browse files Browse the repository at this point in the history
Move plugins infra to `libnixmain`
  • Loading branch information
roberth committed Jul 17, 2024
2 parents 463256b + 0feeab7 commit b230c01
Show file tree
Hide file tree
Showing 20 changed files with 365 additions and 131 deletions.
1 change: 1 addition & 0 deletions meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ subproject('external-api-docs')
subproject('libutil-c')
subproject('libstore-c')
subproject('libexpr-c')
subproject('libmain-c')

# Language Bindings
subproject('perl')
Expand Down
1 change: 1 addition & 0 deletions packaging/components.nix
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ in
nix-flake-tests = callPackage ../tests/unit/libflake/package.nix { };

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

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

Expand Down
1 change: 1 addition & 0 deletions packaging/hydra.nix
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ let
"nix-flake"
"nix-flake-tests"
"nix-main"
"nix-main-c"
"nix-cmd"
"nix-ng"
];
Expand Down
1 change: 1 addition & 0 deletions src/build-remote/build-remote.cc
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

#include "machines.hh"
#include "shared.hh"
#include "plugin.hh"
#include "pathlocks.hh"
#include "globals.hh"
#include "serialise.hh"
Expand Down
1 change: 1 addition & 0 deletions src/libmain-c/.version
1 change: 1 addition & 0 deletions src/libmain-c/build-utils-meson
84 changes: 84 additions & 0 deletions src/libmain-c/meson.build
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
project('nix-main-c', '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 = [
dependency('nix-util'),
dependency('nix-store'),
dependency('nix-main'),
]
deps_public_maybe_subproject = [
dependency('nix-util-c'),
dependency('nix-store-c'),
]
subdir('build-utils-meson/subprojects')

# TODO rename, because it will conflict with downstream projects
configdata.set_quoted('PACKAGE_VERSION', meson.project_version())

config_h = configure_file(
configuration : configdata,
output : 'config-main.h',
)

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.

# From C++ libraries, only for internals
'-include', 'config-util.hh',
'-include', 'config-store.hh',
'-include', 'config-main.hh',

# From C libraries, for our public, installed headers too
'-include', 'config-util.h',
'-include', 'config-store.h',
'-include', 'config-main.h',
language : 'cpp',
)

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

sources = files(
'nix_api_main.cc',
)

include_dirs = [include_directories('.')]

headers = [config_h] + files(
'nix_api_main.h',
)

subdir('build-utils-meson/export-all-symbols')

this_library = library(
'nixmainc',
sources,
dependencies : deps_public + deps_private + deps_other,
include_directories : include_dirs,
link_args: linker_export_flags,
prelink : true, # For C++ static initializers
install : true,
)

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

libraries_private = []

subdir('build-utils-meson/export')
16 changes: 16 additions & 0 deletions src/libmain-c/nix_api_main.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#include "nix_api_store.h"
#include "nix_api_store_internal.h"
#include "nix_api_util.h"
#include "nix_api_util_internal.h"

#include "plugin.hh"

nix_err nix_init_plugins(nix_c_context * context)
{
if (context)
context->last_err_code = NIX_OK;
try {
nix::initPlugins();
}
NIXC_CATCH_ERRS
}
40 changes: 40 additions & 0 deletions src/libmain-c/nix_api_main.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#ifndef NIX_API_MAIN_H
#define NIX_API_MAIN_H
/**
* @defgroup libmain libmain
* @brief C bindings for nix libmain
*
* libmain has misc utilities for CLI commands
* @{
*/
/** @file
* @brief Main entry for the libmain C bindings
*/

#include "nix_api_util.h"
#include <stdbool.h>

#ifdef __cplusplus
extern "C" {
#endif
// cffi start

/**
* @brief Loads the plugins specified in Nix's plugin-files setting.
*
* Call this once, after calling your desired init functions and setting
* relevant settings.
*
* @param[out] context Optional, stores error information
* @return NIX_OK if the initialization was successful, an error code otherwise.
*/
nix_err nix_init_plugins(nix_c_context * context);

// cffi end
#ifdef __cplusplus
}
#endif
/**
* @}
*/
#endif // NIX_API_MAIN_H
83 changes: 83 additions & 0 deletions src/libmain-c/package.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
{ lib
, stdenv
, mkMesonDerivation
, releaseTools

, meson
, ninja
, pkg-config

, nix-util-c
, nix-store
, nix-store-c
, nix-main

# Configuration Options

, version
}:

let
inherit (lib) fileset;
in

mkMesonDerivation (finalAttrs: {
pname = "nix-main-c";
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") ./.)
(fileset.fileFilter (file: file.hasExt "h") ./.)
];

outputs = [ "out" "dev" ];

nativeBuildInputs = [
meson
ninja
pkg-config
];

propagatedBuildInputs = [
nix-util-c
nix-store
nix-store-c
nix-main
];

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 = [
];

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

enableParallelBuilding = true;

separateDebugInfo = !stdenv.hostPlatform.isStatic;

strictDeps = true;

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

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

})
1 change: 1 addition & 0 deletions src/libmain/common-args.cc
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include "logging.hh"
#include "loggers.hh"
#include "util.hh"
#include "plugin.hh"

namespace nix {

Expand Down
2 changes: 2 additions & 0 deletions src/libmain/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ subdir('build-utils-meson/diagnostics')
sources = files(
'common-args.cc',
'loggers.cc',
'plugin.cc',
'progress-bar.cc',
'shared.cc',
)
Expand All @@ -79,6 +80,7 @@ include_dirs = [include_directories('.')]
headers = [config_h] + files(
'common-args.hh',
'loggers.hh',
'plugin.hh',
'progress-bar.hh',
'shared.hh',
)
Expand Down
Loading

0 comments on commit b230c01

Please sign in to comment.