Skip to content

Commit

Permalink
feat(libutil-c): add zig build
Browse files Browse the repository at this point in the history
  • Loading branch information
RossComputerGuy committed Feb 21, 2025
1 parent 6d37393 commit ae2b3b1
Show file tree
Hide file tree
Showing 5 changed files with 119 additions and 68 deletions.
88 changes: 88 additions & 0 deletions src/libutil-c/build.zig
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
const std = @import("std");

fn readFile(b: *std.Build, path: []const u8) []const u8 {
var file = b.build_root.handle.openFile(path, .{}) catch |err| std.debug.panic("Failed to open {s}: {}", .{ path, err });
defer file.close();

const meta = file.metadata() catch |err| std.debug.panic("Failed to get metadata for {s}: {}", .{ path, err });

return file.readToEndAlloc(b.allocator, meta.size()) catch @panic("OOM");
}

pub fn build(b: *std.Build) void {
const optimize = b.standardOptimizeOption(.{});
const target = b.standardTargetOptions(.{});
const linkage = b.option(std.builtin.LinkMode, "linkage", "The link mode of binaries");
const fsys_libutil = b.systemIntegrationOption("nix-util", .{});

const config = b.addConfigHeader(.{
.include_path = "config-util.h",
}, .{
.PACKAGE_VERSION_NIX = std.mem.trimRight(u8, readFile(b, ".version"), "\n"),
.PACKAGE_VERSION_ZIX = std.mem.trimRight(u8, readFile(b, ".zix-version"), "\n"),
});

const libutilc = std.Build.Step.Compile.create(b, .{
.name = "nixutilc",
.kind = .lib,
.linkage = linkage,
.root_module = b.createModule(.{
.target = target,
.optimize = optimize,
.link_libc = true,
.link_libcpp = true,
}),
});

libutilc.addConfigHeader(config);

libutilc.addIncludePath(b.path("."));

libutilc.addCSourceFiles(.{
.files = &.{
"nix_api_util.cc",
},
.flags = &.{
"--std=c++2a",
},
});

libutilc.installHeader(config.getOutput(), "nix/config-util.h");

if (fsys_libutil) {
libutilc.linkSystemLibrary("nix-util");
} else {
const libutil = b.dependency("nix-util", .{
.target = target,
.optimize = optimize,
.linkage = linkage orelse .static,
});

libutilc.linkLibrary(libutil.artifact("nixutil"));
}

inline for (&.{
"nix_api_util.h",
"nix_api_util_internal.h",
}) |hdr| {
libutilc.installHeader(b.path(hdr), "nix/" ++ hdr);
}

b.installArtifact(libutilc);

b.getInstallStep().dependOn(&b.addInstallFileWithDir(b.addWriteFile("nix-util-c.pc", b.fmt(
\\prefix={s}
\\libdir={s}
\\includedir={s}
\\
\\Name: Nix
\\Description: Nix Package Manager
\\Version: 0.1.0
\\Cflags: -I${{includedir}}/nix -std=c++2a
\\Libs: -L${{libdir}} -lnixutil -lnixutilc
, .{
b.getInstallPath(.prefix, ""),
b.getInstallPath(.lib, ""),
b.getInstallPath(.header, ""),
})).getDirectory().path(b, "nix-util-c.pc"), .lib, "pkgconfig/nix-util-c.pc").step);
}
10 changes: 10 additions & 0 deletions src/libutil-c/build.zig.zon
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
.{
.name = "nix-util-c",
.version = "0.1.0",
.paths = .{"."},
.dependencies = .{
.@"nix-util" = .{
.path = "../libutil",
},
},
}
78 changes: 13 additions & 65 deletions src/libutil-c/meson.build
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
project('nix-util-c', 'cpp',
project('nix-util-c',
version : files('.zix-version'),
default_options : [
'cpp_std=c++2a',
# TODO(Qyriad): increase the warning level
'warning_level=1',
'errorlogs=true', # Please print logs for tests that fail
Expand All @@ -10,72 +9,21 @@ project('nix-util-c', 'cpp',
license : 'LGPL-2.1-or-later',
)

fs = import('fs')

cxx = meson.get_compiler('cpp')
subdir('nix-meson-build-support/zig')

subdir('nix-meson-build-support/deps-lists')

configdata = configuration_data()

deps_private_maybe_subproject = [
dependency('nix-util'),
]
deps_public_maybe_subproject = [
]
subdir('nix-meson-build-support/subprojects')

# TODO rename, because it will conflict with downstream projects
configdata.set_quoted('PACKAGE_VERSION_ZIX', meson.project_version())
configdata.set_quoted('PACKAGE_VERSION_NIX', fs.read('.version').strip().split('\n')[0])

config_h = configure_file(
configuration : configdata,
output : 'config-util.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',

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

subdir('nix-meson-build-support/common')

sources = files(
'nix_api_util.cc',
)

include_dirs = [include_directories('.')]

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

# TODO don't install this once tests don't use it.
headers += files('nix_api_util_internal.h')

subdir('nix-meson-build-support/export-all-symbols')
subdir('nix-meson-build-support/windows-version')

this_library = library(
'nixutilc',
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,
zig_target = custom_target('zig build',
output: ['zig-out'],
command: [zig, 'build', zig_build_args, '--prefix', meson.current_build_dir() / 'zig-out', '--build-file', meson.project_source_root() / 'build.zig'],
)

install_headers(headers, subdir : 'nix', preserve_path : true)
include_dirs = ['zig-out' / 'include' / 'nix']

libraries_private = []
install_subdir(meson.current_build_dir() / 'zig-out' / 'lib', install_dir: get_option('libdir'), strip_directory: true)
install_subdir(meson.current_build_dir() / 'zig-out' / 'include', install_dir: get_option('includedir'), strip_directory: true)

subdir('nix-meson-build-support/export')
meson.override_dependency('nix-util-c', declare_dependency(
include_directories: include_dirs,
link_args: ['-L' + meson.current_build_dir() / 'zig-out' / 'lib', '-lnixutilc'],
sources: [zig_target],
))
1 change: 1 addition & 0 deletions src/libutil-c/nix_api_util.cc
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include "nix_api_util.h"
#include "config-global.hh"
#include "config-util.h"
#include "error.hh"
#include "nix_api_util_internal.h"
#include "util.hh"
Expand Down
10 changes: 7 additions & 3 deletions src/libutil-c/package.nix
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
lib,
mkMesonLibrary,
mkZigLibrary,

nix-util,

Expand All @@ -14,12 +14,13 @@ let
inherit (lib) fileset;
in

mkMesonLibrary (finalAttrs: {
mkZigLibrary (finalAttrs: {
pname = "zix-util-c";
inherit version nixVersion;

workDir = ./.;
fileset = fileset.unions [
../libutil
../../nix-meson-build-support
./nix-meson-build-support
../../.version
Expand All @@ -31,13 +32,16 @@ mkMesonLibrary (finalAttrs: {
(fileset.fileFilter (file: file.hasExt "cc") ./.)
(fileset.fileFilter (file: file.hasExt "hh") ./.)
(fileset.fileFilter (file: file.hasExt "h") ./.)
(fileset.fileFilter (file: file.hasExt "zig") ./.)
(fileset.fileFilter (file: file.hasExt "zon") ./.)
];

propagatedBuildInputs = [
nix-util
];

mesonFlags = [
zigBuildFlags = [
"-fsys=nix-util"
];

meta = {
Expand Down

0 comments on commit ae2b3b1

Please sign in to comment.