我使用通常的Unix工具集开发应用程序:编译器make
,和共享库。传统上,该过程类似于
./configure
,可以针对运行机器的功能量身定制源代码,make
,实际上会编译共享库,可执行文件等,make check
,它会在我们安装软件包之前运行测试,make install
,如果程序包运行正常,最后(可选)make installcheck
,以确保安装正常。
在期间make
,共享库和可执行文件以最终形式进行编译:可执行文件在最终目标位置依赖于共享库进行编译(即,它们依赖于库,/usr/local/lib
尽管它们尚不存在,但仍在构建中)树)。然后make install
,大致来说,它只是cp
用于从构建树到最终位置安装库和可执行文件。
在此make check
阶段中,我们正在运行已卸载的程序:共享库,可执行文件和辅助文件仍在构建树中。要运行测试,您必须设置一些自定义环境变量(例如,告诉您的程序辅助数据文件不在/usr/local/share
源树中,而是在源树中),以及一些系统环境变量,以告诉您的共享库加载器看起来共享库。传统Unices上的环境变量是LD_LIBRARY_PATH
OS X上的DYLD_LIBRARY_PATH
。这已经工作了几十年了。
但是现在,El Capitan打破了这一点。
$ (export FOO=foo; env) | grep foo
FOO=foo
$ (export DYLDFOO=foo; env) | grep foo
DYLDFOO=foo
$ (export DYLD_FOO=foo; env) | grep foo
$
现在,启用SIP后,no不会DYLD_*
从进程导出到其子进程。
所以我的问题是:我们如何运行未安装的程序?能够运行传统的Unix序列应遵循的程序是什么./configure && make && make check
?
请,没有诸如“ make install
先运行”之类的答案。那不是重点。我是一名开发人员,因此我经常执行“ make check”(并且通常运行程序的未安装版本)。即使将其安装到虚拟的地方也很耗时。我需要的东西有效,并且高效。禁用SIP不能为要运行我的软件包的用户解决此问题make check
。
DYLD_INSERT_LIBRARIES=$HOME/.bin/lib/Apple80211 /Applications/Utilities/AirPort\ Utility\ 5.6.app/Contents/MacOS/AirPort\ Utility\ 5.6
在10.11以下运行旧的APU(带有旧的库)(即使变量未显示在中env
)。奇怪(但可以)。