diff --git a/flake.nix b/flake.nix index e4a513a7a..c2e938360 100644 --- a/flake.nix +++ b/flake.nix @@ -361,6 +361,7 @@ "nix-store-tests" = { }; "nix-fetchers" = { }; + "nix-fetchers-c" = { }; "nix-fetchers-tests" = { }; "nix-expr" = { }; diff --git a/meson.build b/meson.build index 49adf9832..621946608 100644 --- a/meson.build +++ b/meson.build @@ -33,6 +33,7 @@ endif # External C wrapper libraries subproject('libutil-c') subproject('libstore-c') +subproject('libfetchers-c') subproject('libexpr-c') subproject('libflake-c') subproject('libmain-c') diff --git a/packaging/components.nix b/packaging/components.nix index ea5d97399..6351ac712 100644 --- a/packaging/components.nix +++ b/packaging/components.nix @@ -333,6 +333,7 @@ in nix-store-tests = callPackage ../src/libstore-tests/package.nix { }; nix-fetchers = callPackage ../src/libfetchers/package.nix { }; + nix-fetchers-c = callPackage ../src/libfetchers-c/package.nix { }; nix-fetchers-tests = callPackage ../src/libfetchers-tests/package.nix { }; nix-expr = callPackage ../src/libexpr/package.nix { }; diff --git a/packaging/everything.nix b/packaging/everything.nix index 1835eefb6..5bf57f95a 100644 --- a/packaging/everything.nix +++ b/packaging/everything.nix @@ -15,6 +15,7 @@ nix-store-tests, nix-fetchers, + nix-fetchers-c, nix-fetchers-tests, nix-expr, @@ -54,6 +55,7 @@ let nix-store nix-store-c nix-fetchers + nix-fetchers-c nix-expr nix-expr-c nix-flake @@ -230,6 +232,7 @@ stdenv.mkDerivation (finalAttrs: { "nix-expr" "nix-expr-c" "nix-fetchers" + "nix-fetchers-c" "nix-flake" "nix-flake-c" "nix-main" diff --git a/packaging/hydra.nix b/packaging/hydra.nix index 74e245f26..ee4cabe62 100644 --- a/packaging/hydra.nix +++ b/packaging/hydra.nix @@ -48,6 +48,7 @@ let "nix-store-test-support" "nix-store-tests" "nix-fetchers" + "nix-fetchers-c" "nix-fetchers-tests" "nix-expr" "nix-expr-c" diff --git a/src/libfetchers-c/.version b/src/libfetchers-c/.version new file mode 120000 index 000000000..b7badcd0c --- /dev/null +++ b/src/libfetchers-c/.version @@ -0,0 +1 @@ +../../.version \ No newline at end of file diff --git a/src/libfetchers-c/meson.build b/src/libfetchers-c/meson.build new file mode 100644 index 000000000..e34997f09 --- /dev/null +++ b/src/libfetchers-c/meson.build @@ -0,0 +1,65 @@ +project('nix-fetchers-c', 'cpp', + version : files('.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 + ], + meson_version : '>= 1.1', + license : 'LGPL-2.1-or-later', +) + +cxx = meson.get_compiler('cpp') + +subdir('nix-meson-build-support/deps-lists') + +deps_private_maybe_subproject = [ + dependency('nix-util'), + dependency('nix-store'), + dependency('nix-fetchers'), +] +deps_public_maybe_subproject = [ + dependency('nix-util-c'), + dependency('nix-store-c'), +] +subdir('nix-meson-build-support/subprojects') + +add_project_arguments( + language : 'cpp', +) + +subdir('nix-meson-build-support/common') + +sources = files( + 'nix_api_fetchers.cc', +) + +include_dirs = [include_directories('.')] + +headers = files( + 'nix_api_fetchers.h', + 'nix_api_fetchers_internal.hh', +) + +# TODO move this header to libexpr, maybe don't use it in tests? +headers += files('nix_api_fetchers.h') + +subdir('nix-meson-build-support/export-all-symbols') +subdir('nix-meson-build-support/windows-version') + +this_library = library( + 'nixfetchersc', + 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, preserve_path : true) + +libraries_private = [] + +subdir('nix-meson-build-support/export') diff --git a/src/libfetchers-c/nix-meson-build-support b/src/libfetchers-c/nix-meson-build-support new file mode 120000 index 000000000..0b140f56b --- /dev/null +++ b/src/libfetchers-c/nix-meson-build-support @@ -0,0 +1 @@ +../../nix-meson-build-support \ No newline at end of file diff --git a/src/libfetchers-c/nix_api_fetchers.cc b/src/libfetchers-c/nix_api_fetchers.cc new file mode 100644 index 000000000..4e8037a5e --- /dev/null +++ b/src/libfetchers-c/nix_api_fetchers.cc @@ -0,0 +1,19 @@ +#include "nix_api_fetchers.h" +#include "nix_api_fetchers_internal.hh" +#include "nix_api_util_internal.h" + +nix_fetchers_settings * nix_fetchers_settings_new(nix_c_context * context) +{ + try { + auto fetchersSettings = nix::make_ref(nix::fetchers::Settings{}); + return new nix_fetchers_settings{ + .settings = fetchersSettings, + }; + } + NIXC_CATCH_ERRS_NULL +} + +void nix_fetchers_settings_free(nix_fetchers_settings * settings) +{ + delete settings; +} diff --git a/src/libfetchers-c/nix_api_fetchers.h b/src/libfetchers-c/nix_api_fetchers.h new file mode 100644 index 000000000..19da112a6 --- /dev/null +++ b/src/libfetchers-c/nix_api_fetchers.h @@ -0,0 +1,32 @@ +#ifndef NIX_API_FETCHERS_H +#define NIX_API_FETCHERS_H +/** @defgroup libfetchers libfetchers + * @brief Bindings to the Nix fetchers library + * @{ + */ +/** @file + * @brief Main entry for the libfetchers C bindings + */ + +#include "nix_api_util.h" + +#ifdef __cplusplus +extern "C" { +#endif +// cffi start + +// Type definitions +/** + * @brief Shared settings object + */ +typedef struct nix_fetchers_settings nix_fetchers_settings; + +nix_fetchers_settings * nix_fetchers_settings_new(nix_c_context * context); + +void nix_fetchers_settings_free(nix_fetchers_settings * settings); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // NIX_API_FETCHERS_H \ No newline at end of file diff --git a/src/libfetchers-c/nix_api_fetchers_internal.hh b/src/libfetchers-c/nix_api_fetchers_internal.hh new file mode 100644 index 000000000..b0dea5754 --- /dev/null +++ b/src/libfetchers-c/nix_api_fetchers_internal.hh @@ -0,0 +1,12 @@ +#pragma once +#include "nix/fetchers/fetch-settings.hh" +#include "nix/util/ref.hh" + +/** + * A shared reference to `nix::fetchers::Settings` + * @see nix::fetchers::Settings + */ +struct nix_fetchers_settings +{ + nix::ref settings; +}; diff --git a/src/libfetchers-c/package.nix b/src/libfetchers-c/package.nix new file mode 100644 index 000000000..9a601d704 --- /dev/null +++ b/src/libfetchers-c/package.nix @@ -0,0 +1,50 @@ +{ + lib, + mkMesonLibrary, + + nix-store-c, + nix-expr-c, + nix-util-c, + nix-fetchers, + + # Configuration Options + + version, +}: + +let + inherit (lib) fileset; +in + +mkMesonLibrary (finalAttrs: { + pname = "nix-fetchers-c"; + inherit version; + + workDir = ./.; + fileset = fileset.unions [ + ../../nix-meson-build-support + ./nix-meson-build-support + ../../.version + ./.version + ./meson.build + # ./meson.options + (fileset.fileFilter (file: file.hasExt "cc") ./.) + (fileset.fileFilter (file: file.hasExt "hh") ./.) + (fileset.fileFilter (file: file.hasExt "h") ./.) + ]; + + propagatedBuildInputs = [ + nix-util-c + nix-expr-c + nix-store-c + nix-fetchers + ]; + + mesonFlags = [ + ]; + + meta = { + platforms = lib.platforms.unix ++ lib.platforms.windows; + }; + +}) diff --git a/src/libfetchers-tests/meson.build b/src/libfetchers-tests/meson.build index 12b748e65..33bc7f30e 100644 --- a/src/libfetchers-tests/meson.build +++ b/src/libfetchers-tests/meson.build @@ -17,6 +17,7 @@ subdir('nix-meson-build-support/deps-lists') deps_private_maybe_subproject = [ dependency('nix-store-test-support'), dependency('nix-fetchers'), + dependency('nix-fetchers-c'), ] deps_public_maybe_subproject = [ ] @@ -39,6 +40,7 @@ subdir('nix-meson-build-support/common') sources = files( 'access-tokens.cc', 'git-utils.cc', + 'nix_api_fetchers.cc', 'public-key.cc', ) diff --git a/src/libfetchers-tests/nix_api_fetchers.cc b/src/libfetchers-tests/nix_api_fetchers.cc new file mode 100644 index 000000000..8f3e6e3c5 --- /dev/null +++ b/src/libfetchers-tests/nix_api_fetchers.cc @@ -0,0 +1,18 @@ +#include "gmock/gmock.h" +#include + +#include "nix_api_fetchers.h" +#include "nix/store/tests/nix_api_store.hh" + +namespace nixC { + +TEST_F(nix_api_store_test, nix_api_fetchers_new_free) +{ + nix_fetchers_settings * settings = nix_fetchers_settings_new(ctx); + assert_ctx_ok(); + ASSERT_NE(nullptr, settings); + + nix_fetchers_settings_free(settings); +} + +} // namespace nixC diff --git a/src/libfetchers-tests/package.nix b/src/libfetchers-tests/package.nix index 6e3581183..48c1a07d8 100644 --- a/src/libfetchers-tests/package.nix +++ b/src/libfetchers-tests/package.nix @@ -5,6 +5,7 @@ mkMesonExecutable, nix-fetchers, + nix-fetchers-c, nix-store-test-support, libgit2, @@ -40,6 +41,7 @@ mkMesonExecutable (finalAttrs: { buildInputs = [ nix-fetchers + nix-fetchers-c nix-store-test-support rapidcheck gtest diff --git a/src/libflake-c/meson.build b/src/libflake-c/meson.build index 435035b86..5a81618c8 100644 --- a/src/libflake-c/meson.build +++ b/src/libflake-c/meson.build @@ -17,12 +17,14 @@ subdir('nix-meson-build-support/deps-lists') deps_private_maybe_subproject = [ dependency('nix-util'), dependency('nix-store'), + dependency('nix-fetchers'), dependency('nix-expr'), dependency('nix-flake'), ] deps_public_maybe_subproject = [ dependency('nix-util-c'), dependency('nix-store-c'), + dependency('nix-fetchers-c'), dependency('nix-expr-c'), ] subdir('nix-meson-build-support/subprojects') diff --git a/src/libflake-c/package.nix b/src/libflake-c/package.nix index 114950852..8c6883d9c 100644 --- a/src/libflake-c/package.nix +++ b/src/libflake-c/package.nix @@ -4,6 +4,7 @@ nix-store-c, nix-expr-c, + nix-fetchers-c, nix-flake, # Configuration Options @@ -35,6 +36,7 @@ mkMesonLibrary (finalAttrs: { propagatedBuildInputs = [ nix-expr-c nix-store-c + nix-fetchers-c nix-flake ];