El Capitan, mach einen Scheck, DYLD_LIBRARY_PATH

9

Ich entwickle Anwendungen mit dem üblichen Unix-Toolset: einem Compiler makeund gemeinsam genutzten Bibliotheken. Das Verfahren ist dann traditionell so etwas wie

  • ./configure, das die Quellen für die Funktionen der Maschine anpasst, auf der es ausgeführt wird,
  • make, die tatsächlich die gemeinsam genutzten Bibliotheken, ausführbaren Dateien usw. kompiliert,
  • make check, der die Tests ausführt, bevor wir das Paket installieren,
  • make install, wenn sich das Paket richtig verhält und schließlich optional
  • make installcheck, um sicherzustellen, dass die Installation funktioniert.

Währenddessen makewerden die gemeinsam genutzten Bibliotheken und ausführbaren Dateien in ihrer endgültigen Form kompiliert: Die ausführbaren Dateien werden in Abhängigkeit von den gemeinsam genutzten Bibliotheken in ihrem endgültigen Ziel kompiliert (dh sie hängen von Bibliotheken ab, /usr/local/libobwohl sie noch nicht vorhanden sind, befinden sie sich noch im Build Baum). Dann make installwird ungefähr nur verwendet cp, um Bibliotheken und ausführbare Dateien vom Build-Baum bis zur endgültigen Stelle zu installieren.

Während der make checkPhase wird das Programm deinstalliert: Die freigegebenen Bibliotheken, ausführbaren Dateien und Zusatzdateien befinden sich noch im Build-Baum. Um die Tests auszuführen, müssen Sie einige benutzerdefinierte Umgebungsvariablen einrichten (z. B. um Ihrem Programm mitzuteilen, dass sich Ihre Zusatzdatendateien nicht im Quellbaum befinden /usr/local/share), und einige Systemumgebungsvariablen, damit Ihr Share Lib Loader nachsehen soll für die gemeinsam genutzten Bibliotheken. Die Umgebungsvariablen auf traditionelle Unix - Varianten ist LD_LIBRARY_PATH, auf OS X ist DYLD_LIBRARY_PATH. Dies hat seit (Dutzenden von) Jahren funktioniert.

Aber jetzt hat El Capitan das gebrochen.

$ (export FOO=foo; env) | grep foo
FOO=foo
$ (export DYLDFOO=foo; env) | grep foo
DYLDFOO=foo
$ (export DYLD_FOO=foo; env) | grep foo
$

Wenn jetzt SIP aktiviert ist, wird no DYLD_*von einem Prozess in seine untergeordneten Prozesse exportiert.

Meine Frage lautet also: Wie können wir Programme ausführen, die nicht installiert sind? Wie muss vorgegangen werden, um die traditionelle Unix-Sequenz ausführen zu können ./configure && make && make check?

Bitte keine Antwort wie " make installzuerst ausführen ". Das ist nicht der Punkt. Ich bin ein Entwickler, und das Ausführen von "make check" (und allgemeiner das Ausführen einer nicht installierten Version eines Programms) ist etwas, das ich sehr häufig mache. Selbst die Installation an einem Dummy-Ort ist zeitaufwändig. Ich brauche etwas Effektives und Effizientes. Durch Deaktivieren von SIP wird das Problem für Benutzer meiner Pakete, die ausgeführt werden möchten, nicht behoben make check.

akim
quelle
Ich kann immer noch DYLD_INSERT_LIBRARIES=$HOME/.bin/lib/Apple80211 /Applications/Utilities/AirPort\ Utility\ 5.6.app/Contents/MacOS/AirPort\ Utility\ 5.6die alte APU (mit der alten Bibliothek) unter 10.11 ausführen (obwohl die Variable nicht in angezeigt wird env). Seltsam (aber es funktioniert).
Nohillside

Antworten:

6

Es scheint, als würde DYLD_ * nur für "geschützte" Binärdateien entfernt (ich bin mir nicht sicher, was das genau bedeutet, aber anscheinend alles in / bin und / usr / bin für den Anfang). Wenn Sie jedoch / usr / bin / env kopieren an einen anderen Ort kann es sein DYLD_ * Zeug behalten:

$ cp /usr/bin/env ~/Desktop; (DYLD_FOO=bar ~/Desktop/env)|grep DY
dyld: warning, unknown environment variable: DYLD_FOO
DYLD_FOO=bar

Ich denke, make führt Befehle immer über / bin / sh aus, sodass Sie keine „gefährlichen“ Variablen im Makefile festlegen können und diese die Befehle beeinflussen können. Vielleicht können Sie den Test jedoch in ein Shell-Skript verschieben und die Umgebungsvariablen innerhalb von festlegen Skript, und rufen Sie dann das Skript von make auf. Dies hilft Ihnen natürlich nicht weiter, wenn die Tests wiederum auf Shell-Skripten beruhen (oder wenn es sich bei den getesteten Dingen um Shell-Skripte handelt!), Da sie dann / bin / sh aufrufen und die Variablen wieder verlieren. .

Ture Pålsson
quelle
Vielen Dank! Jetzt kann ich cp /bin/shdiese Shell anstelle der echten verwenden. Symlinks funktionieren nicht und Hardlinks sind "Operationen nicht erlaubt", also muss ich wohl damit leben cp.
Akim