aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorRobert Hensing <robert@roberthensing.nl>2023-06-14 22:57:42 +0200
committerRobert Hensing <robert@roberthensing.nl>2023-06-15 14:32:00 +0200
commitd2696cdd1ee404ef6c6bd532cb90007dd8ee3e9f (patch)
tree9d41b0dd140aec39c627c653dd90828e6de52829 /tests
parent9c6ede85fc3cd822b5c6b56045ff231a61fcd55f (diff)
Fix build hook error for libstore library users
A library shouldn't require changes to the caller's argument handling, especially if it doesn't have to, and indeed we don't have to. This changes the lookup order to prioritize the hardcoded path to nix if it exists. The static executable still finds itself through /proc and the like.
Diffstat (limited to 'tests')
-rw-r--r--tests/local.mk2
-rw-r--r--tests/test-libstoreconsumer.sh6
-rw-r--r--tests/test-libstoreconsumer/README.md6
-rw-r--r--tests/test-libstoreconsumer/local.mk12
-rw-r--r--tests/test-libstoreconsumer/main.cc45
5 files changed, 71 insertions, 0 deletions
diff --git a/tests/local.mk b/tests/local.mk
index 9e340e2e2..a37365efe 100644
--- a/tests/local.mk
+++ b/tests/local.mk
@@ -134,6 +134,7 @@ nix_tests = \
flakes/show.sh \
impure-derivations.sh \
path-from-hash-part.sh \
+ test-libstoreconsumer.sh \
toString-path.sh
ifeq ($(HAVE_LIBCPUID), 1)
@@ -152,6 +153,7 @@ test-deps += \
tests/common/vars-and-functions.sh \
tests/config.nix \
tests/ca/config.nix \
+ tests/test-libstoreconsumer/test-libstoreconsumer \
tests/dyn-drv/config.nix
ifeq ($(BUILD_SHARED_LIBS), 1)
diff --git a/tests/test-libstoreconsumer.sh b/tests/test-libstoreconsumer.sh
new file mode 100644
index 000000000..8a77cf5a1
--- /dev/null
+++ b/tests/test-libstoreconsumer.sh
@@ -0,0 +1,6 @@
+source common.sh
+
+drv="$(nix-instantiate simple.nix)"
+cat "$drv"
+out="$(./test-libstoreconsumer/test-libstoreconsumer "$drv")"
+cat "$out/hello" | grep -F "Hello World!"
diff --git a/tests/test-libstoreconsumer/README.md b/tests/test-libstoreconsumer/README.md
new file mode 100644
index 000000000..ded69850f
--- /dev/null
+++ b/tests/test-libstoreconsumer/README.md
@@ -0,0 +1,6 @@
+
+A very simple C++ consumer of the libstore library.
+
+ - Keep it simple. Library consumers expect something simple.
+ - No build hook, or any other reinvocations.
+ - No more global state than necessary.
diff --git a/tests/test-libstoreconsumer/local.mk b/tests/test-libstoreconsumer/local.mk
new file mode 100644
index 000000000..cd2d0c7f8
--- /dev/null
+++ b/tests/test-libstoreconsumer/local.mk
@@ -0,0 +1,12 @@
+programs += test-libstoreconsumer
+
+test-libstoreconsumer_DIR := $(d)
+
+test-libstoreconsumer_SOURCES := \
+ $(wildcard $(d)/*.cc) \
+
+test-libstoreconsumer_CXXFLAGS += -I src/libutil -I src/libstore
+
+test-libstoreconsumer_LIBS = libstore libutil
+
+test-libstoreconsumer_LDFLAGS = -pthread $(SODIUM_LIBS) $(EDITLINE_LIBS) $(BOOST_LDFLAGS) $(LOWDOWN_LIBS)
diff --git a/tests/test-libstoreconsumer/main.cc b/tests/test-libstoreconsumer/main.cc
new file mode 100644
index 000000000..31b6d8ef1
--- /dev/null
+++ b/tests/test-libstoreconsumer/main.cc
@@ -0,0 +1,45 @@
+#include "globals.hh"
+#include "store-api.hh"
+#include "build-result.hh"
+#include <iostream>
+
+using namespace nix;
+
+int main (int argc, char **argv)
+{
+ try {
+ if (argc != 2) {
+ std::cerr << "Usage: " << argv[0] << " store/path/to/something.drv\n";
+ return 1;
+ }
+
+ std::string drvPath = argv[1];
+
+ initLibStore();
+
+ auto store = nix::openStore();
+
+ // build the derivation
+
+ std::vector<DerivedPath> paths {
+ DerivedPath::Built {
+ .drvPath = store->parseStorePath(drvPath),
+ .outputs = OutputsSpec::Names{"out"}
+ }
+ };
+
+ const auto results = store->buildPathsWithResults(paths, bmNormal, store);
+
+ for (const auto & result : results) {
+ for (const auto & [outputName, realisation] : result.builtOutputs) {
+ std::cout << store->printStorePath(realisation.outPath) << "\n";
+ }
+ }
+
+ return 0;
+
+ } catch (const std::exception & e) {
+ std::cerr << "Error: " << e.what() << "\n";
+ return 1;
+ }
+}