aboutsummaryrefslogtreecommitdiff
path: root/pkgs/test
diff options
context:
space:
mode:
authorTuomas Tynkkynen <tuomas@tuxera.com>2018-08-01 12:58:07 +0300
committerTuomas Tynkkynen <tuomas.tynkkynen@iki.fi>2018-08-01 19:02:21 +0300
commite94fcbcd01a7adc532d1081d3232e143efa422fe (patch)
tree25baae2d6c139f06eca4d77876b5a06be03f3102 /pkgs/test
parent954489df24a983b9d87add8bd65f55ceb4868fad (diff)
pkgs/tests: Add test for LD_LIBRARY_PATH
The latest binutils upgrade silently broke this until it was fixed by https://github.com/NixOS/nixpkgs/pull/43531. So add a test.
Diffstat (limited to 'pkgs/test')
-rw-r--r--pkgs/test/default.nix2
-rw-r--r--pkgs/test/ld-library-path/default.nix88
2 files changed, 90 insertions, 0 deletions
diff --git a/pkgs/test/default.nix b/pkgs/test/default.nix
index d2e8e1c7314b..774077949b25 100644
--- a/pkgs/test/default.nix
+++ b/pkgs/test/default.nix
@@ -22,6 +22,8 @@ with pkgs;
cc-multilib-gcc = callPackage ./cc-wrapper/multilib.nix { stdenv = gccMultiStdenv; };
cc-multilib-clang = callPackage ./cc-wrapper/multilib.nix { stdenv = clangMultiStdenv; };
+ ld-library-path = callPackage ./ld-library-path {};
+
macOSSierraShared = callPackage ./macos-sierra-shared {};
cross = callPackage ./cross {};
diff --git a/pkgs/test/ld-library-path/default.nix b/pkgs/test/ld-library-path/default.nix
new file mode 100644
index 000000000000..bda3f0be84a6
--- /dev/null
+++ b/pkgs/test/ld-library-path/default.nix
@@ -0,0 +1,88 @@
+{ stdenv }:
+
+# This tests that libraries listed in LD_LIBRARY_PATH take precedence over those listed in RPATH.
+
+let
+ # A simple test library: libgreeting.so which exports a single function getGreeting() returning the good old hello greeting.
+ libgreeting = stdenv.mkDerivation {
+ name = "libgreeting";
+
+ code = ''
+ const char* getGreeting() { return "Hello, world!"; }
+ '';
+
+ unpackPhase = ''
+ echo "$code" > libgreeting.c
+ '';
+
+ installPhase = ''
+ mkdir -p $out/lib
+ $CC -c -fpic libgreeting.c
+ $CC -shared libgreeting.o -o $out/lib/libgreeting.so
+ '';
+ };
+
+ # A variant of libgreeting.so that returns a different message.
+ libgoodbye = libgreeting.overrideAttrs (_: {
+ name = "libgoodbye";
+ code = ''
+ const char* getGreeting() { return "Goodbye, world!"; }
+ '';
+ });
+
+ # A simple consumer of libgreeting.so that just prints the greeting to stdout.
+ testProgram = stdenv.mkDerivation {
+ name = "greeting-test";
+
+ buildInputs = [ libgreeting ];
+
+ code = ''
+ #include <stdio.h>
+
+ extern const char* getGreeting(void);
+
+ int main() {
+ puts(getGreeting());
+ }
+ '';
+
+ unpackPhase = ''
+ echo "$code" > greeting-test.c
+ '';
+
+ installPhase = ''
+ mkdir -p $out/bin
+ $CC -c greeting-test.c
+ $CC greeting-test.o -lgreeting -o $out/bin/greeting-test
+
+ # Now test the installed binaries right after compiling them. In particular,
+ # don't do this in installCheckPhase because fixupPhase has been run by then!
+ (
+ export PATH=$out/bin
+ set -x
+
+ # Verify that our unmodified binary works as expected.
+ [ "$(greeting-test)" = "Hello, world!" ]
+
+ # And finally, test that a library in LD_LIBRARY_PATH takes precedence over the linked-in library.
+ [ "$(LD_LIBRARY_PATH=${libgoodbye}/lib greeting-test)" = "Goodbye, world!" ]
+ )
+ '';
+
+ };
+in stdenv.mkDerivation {
+ name = "test-LD_LIBRARY_PATH";
+ nativeBuildInputs = [ testProgram ];
+
+ buildCommand = ''
+ # And for good measure, repeat the tests again from a separate derivation,
+ # as fixupPhase done by the stdenv can (and has!) affect the result.
+
+ [ "$(greeting-test)" = "Hello, world!" ]
+ [ "$(LD_LIBRARY_PATH=${libgoodbye}/lib greeting-test)" = "Goodbye, world!" ]
+
+ touch $out
+ '';
+
+ meta.platforms = stdenv.lib.platforms.linux;
+}