Tôi phát triển các ứng dụng bằng cách sử dụng bộ công cụ Unix thông thường: trình biên dịch make
và thư viện dùng chung. Các thủ tục sau đó theo truyền thống là một cái gì đó như
./configure
, mà điều chỉnh các nguồn cho các tính năng của máy mà nó đang chạy,make
, trong đó thực sự biên dịch các lib được chia sẻ, thực thi, v.v.make check
, chạy thử nghiệm trước khi chúng tôi cài đặt gói,make install
, nếu gói hoạt động đúng, và cuối cùng, tùy chọn,make installcheck
, để đảm bảo cài đặt hoạt động.
Trong khi đó make
, các lib và các tệp thực thi được chia sẻ được biên dịch ở dạng cuối cùng của chúng: các tệp thực thi được biên dịch với sự phụ thuộc vào các lib được chia sẻ ở đích cuối cùng của chúng (nghĩa là chúng phụ thuộc vào các thư viện /usr/local/lib
mặc dù chúng chưa ở đó, chúng vẫn còn trong bản dựng cây). Sau đó make install
, đại khái, chỉ cần sử dụng cp
để cài đặt lib và thực thi từ cây xây dựng đến vị trí cuối cùng.
Trong make check
giai đoạn này, chúng tôi đang chạy chương trình gỡ cài đặt: các tệp lib, tệp thực thi và tệp phụ trợ được chia sẻ vẫn còn trong cây xây dựng. Để chạy thử nghiệm, bạn phải thiết lập một vài biến môi trường tùy chỉnh (ví dụ để thông báo cho chương trình của bạn rằng các tệp dữ liệu phụ trợ của bạn không nằm /usr/local/share
trong cây nguồn) và một số biến môi trường hệ thống, để báo cho trình tải chia sẻ lib của bạn xem cho các libs chia sẻ. Các biến môi trường trên unices truyền thống là LD_LIBRARY_PATH
, trên OS X nó là DYLD_LIBRARY_PATH
. Điều này đã làm việc trong (hàng chục) năm.
Nhưng bây giờ, El Capitan đã phá vỡ điều này.
$ (export FOO=foo; env) | grep foo
FOO=foo
$ (export DYLDFOO=foo; env) | grep foo
DYLDFOO=foo
$ (export DYLD_FOO=foo; env) | grep foo
$
bây giờ, khi SIP được kích hoạt, không DYLD_*
được xuất từ một quy trình cho con của nó.
Vì vậy, câu hỏi của tôi là: Làm thế nào chúng ta có thể chạy các chương trình không được cài đặt? Quy trình cần tuân thủ để có thể chạy chuỗi Unix truyền thống là ./configure && make && make check
gì?
Hãy , không có câu trả lời như "chạy make install
đầu tiên". Đó không phải là vấn đề. Tôi là một nhà phát triển và chạy "make check" (và nói chung là chạy phiên bản chưa cài đặt của chương trình) là điều tôi thường xuyên làm. Ngay cả việc cài đặt đến một nơi giả cũng tốn thời gian. Tôi cần một cái gì đó hiệu quả, và hiệu quả. Và việc vô hiệu hóa SIP sẽ không khắc phục được sự cố cho người dùng các gói của tôi muốn chạy make check
.
DYLD_INSERT_LIBRARIES=$HOME/.bin/lib/Apple80211 /Applications/Utilities/AirPort\ Utility\ 5.6.app/Contents/MacOS/AirPort\ Utility\ 5.6
để chạy APU cũ (với thư viện cũ) dưới 10.11 (mặc dù biến không hiển thị trongenv
). Lạ (nhưng nó hoạt động).