El Capitan, ให้ตรวจสอบ, DYLD_LIBRARY_PATH


9

ฉันพัฒนาแอปพลิเคชันโดยใช้ชุดเครื่องมือ Unix ปกติ: คอมไพเลอร์makeและไลบรารีที่แบ่งใช้ ขั้นตอนตามธรรมเนียมแล้วสิ่งที่ชอบ

  • ./configureซึ่งปรับแต่งแหล่งที่มาสำหรับคุณสมบัติของเครื่องที่ทำงานอยู่
  • makeซึ่งจริงๆแล้วเป็นการรวบรวม libs, executables และอื่น ๆ
  • make checkซึ่งจะทำการทดสอบก่อนที่เราจะติดตั้งแพ็คเกจ
  • make installถ้าแพ็คเกจทำงานได้อย่างเหมาะสมและในที่สุดก็มีทางเลือก
  • make installcheckเพื่อให้แน่ใจว่าการติดตั้งใช้งานได้

ในระหว่างmakelibs ที่ใช้ร่วมกันและ executables จะถูกรวบรวมในรูปแบบสุดท้ายของพวกเขา executables จะถูกรวบรวมด้วยการพึ่งพา libs ที่ใช้ร่วมกันในปลายทางสุดท้ายของพวกเขา (เช่นพวกเขาขึ้นอยู่กับห้องสมุดใน/usr/local/libแม้ว่าพวกเขาจะไม่ได้มีพวกเขายังคงอยู่ในการสร้าง ต้นไม้). จากนั้นmake installคือประมาณเพียงแค่ใช้cpเพื่อติดตั้ง libs และ executables จากโครงสร้างต้นไม้ไปยังสถานที่สุดท้าย

ในระหว่างmake checkเฟสเรากำลังเรียกใช้โปรแกรมที่ถอนการติดตั้ง: libs ที่ใช้ร่วมกันไฟล์ปฏิบัติการและไฟล์เสริมยังคงอยู่ในโครงสร้างการสร้าง ในการรันการทดสอบคุณต้องตั้งค่าตัวแปรสภาพแวดล้อมที่กำหนดเองไม่กี่ตัว (ตัวอย่างเช่นเพื่อบอกโปรแกรมของคุณว่าไฟล์ข้อมูลเสริมของคุณไม่ได้อยู่ใน/usr/local/shareแต่ในต้นไม้ต้นกำเนิด) และตัวแปรสภาพแวดล้อมของระบบบางตัว สำหรับ libs ที่ใช้ร่วมกัน ตัวแปรสภาพแวดล้อมแบบดั้งเดิมบน 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 จะไม่มีการDYLD_*ส่งออกจากกระบวนการไปยังลูก

ดังนั้นคำถามของฉันคือเราจะรันโปรแกรมที่ไม่ได้ติดตั้งได้อย่างไร ขั้นตอนในการปฏิบัติตามเพื่อให้สามารถรันลำดับ Unix แบบดั้งเดิม./configure && make && make checkคืออะไร

กรุณาไม่มีคำตอบเช่น "run make installfirst" นั่นไม่ใช่ประเด็น. ฉันเป็นนักพัฒนาซอฟต์แวร์และการเรียกใช้ "ตรวจสอบ" (และโดยทั่วไปแล้วเรียกใช้โปรแกรมรุ่นที่ไม่ได้ติดตั้ง) เป็นสิ่งที่ฉันทำบ่อยครั้งมาก แม้แต่การติดตั้งไปยังสถานที่จำลองก็ใช้เวลานาน ฉันต้องการบางสิ่งที่มีประสิทธิภาพและมีประสิทธิภาพ และปิดการใช้งาน SIP make checkจะไม่แก้ไขปัญหาสำหรับผู้ใช้ของแพคเกจของฉันที่ต้องการเรียกใช้


ฉันยังสามารถใช้DYLD_INSERT_LIBRARIES=$HOME/.bin/lib/Apple80211 /Applications/Utilities/AirPort\ Utility\ 5.6.app/Contents/MacOS/AirPort\ Utility\ 5.6เพื่อเรียกใช้ APU เก่า (กับไลบรารี่เก่า) ภายใต้ 10.11 (แม้ว่าตัวแปรจะไม่แสดงขึ้นมาenv) แปลก (แต่ใช้งานได้)
nohillside

คำตอบ:


6

ดูเหมือนว่า DYLD_ * จะถูกแยกออกสำหรับไบนารีที่ "ได้รับการป้องกัน" (ฉันไม่แน่ใจว่ามันแปลว่าอะไร แต่เห็นได้ชัดว่ามีอะไรใน / bin และ / usr / bin สำหรับ starters) อย่างไรก็ตามหากคุณคัดลอก / usr / bin / env ไปที่อื่นมันจะเก็บของ DYLD_ * ไว้:

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

ฉันคิดว่าคำสั่งให้รันคำสั่งผ่าน / bin / sh เสมอดังนั้นคุณจึงไม่สามารถตั้งค่าตัวแปร "อันตราย" ใน makefile และให้พวกเขาส่งผลกระทบต่อคำสั่ง แต่บางทีคุณอาจย้ายการทดสอบไปยังเชลล์สคริปต์ตั้งค่าตัวแปรสภาพแวดล้อมภายใน สคริปต์จากนั้นเรียกใช้สคริปต์จาก make แม้ว่าจะเห็นได้ชัดว่าสิ่งนี้จะไม่ช่วยคุณหากการทดสอบกลับขึ้นอยู่กับเชลล์สคริป (หรือถ้าสิ่งที่ทดสอบเป็นเชลล์สคริป!) เพราะพวกเขาจะเรียกใช้ / bin / sh และสูญเสียตัวแปรอีกครั้ง .. .


ขอบคุณมาก! ตอนนี้ฉันทำได้cp /bin/shและใช้เชลล์นั้นแทนที่จะเป็นของจริง symlinks จะไม่ทำและการเชื่อมโยงอย่างหนัก "การดำเนินงานไม่ได้รับอนุญาต" cpดังนั้นผมคิดว่าผมต้องอยู่กับ
คิม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.