Automake - ทำอย่างไรให้ต้นไม้ต้นกำเนิดสะอาด?


10

ฉันมีโครงการที่ใช้ GNU autotools เพื่อสร้างตัวเอง ฉันกำลังพยายามแก้ไขเพื่อให้ autotools สร้างไฟล์ควบคุมที่ไม่ใช่เวอร์ชันทั้งหมดในไดเรกทอรีแยกต่างหากเพื่อที่ฉันจะสามารถรักษาต้นไม้ต้นกำเนิดให้สะอาดสำหรับไฟล์ชั่วคราว ใครมีความคิดวิธีการทำเช่นนี้?


6
เพียงแค่สร้าง out-of-tree: stackoverflow.com/questions/1311231/ …มันยังคงมีสารตกค้างบางอย่างน่าเสียดาย ลองใช้ CMake ซักวัน
Vitor Py

3
วันนั้นมาถึงฉันใช้เวลาน้อยกว่าหนึ่งชั่วโมงในการเปลี่ยนจาก autconf ที่น่าเกลียดเป็น cmake ซึ่งดูเหมือนจะสะอาดกว่ามาก
vorad

1
CMake นั้นสะอาดกว่า autoconf: อันที่จริงการสร้างจากต้นไม้เป็นวิธีที่ใช้กันทั่วไปในการสร้าง CMake ทางเลือกที่ดี :)
Vitor Py

ปกติจะมี Makefile ที่ด้านบนสุดของแผนผังต้นกำเนิดที่ควบคุมกระบวนการสร้างด้วย cmake อย่างไร Say makeจะเรียกใช้mkdir -p build && cd build && cmake .. &&และอื่น ๆ (เป้าหมายที่ต่างกันอาจจะเหมือนทำการทดสอบฯลฯ )
vorad

ผิดปกติ CMake ควรสร้าง makefiles ไม่ใช่วิธีอื่น! มองหาหนังสือที่เรียกว่า Mastering CMake หรือกระบวนการสร้าง VTK หรือ KDE สำหรับตัวอย่างคำศัพท์จริง ข้อได้เปรียบที่ดีของ CMake กำลังอยู่เหนือการผลิต: มันยังสามารถสร้างซอฟต์แวร์ของคุณโดยใช้ Visual Studio vcproj, nmake Makefiles, XCode เป็นต้น KDE ใช้เชลล์สคริปต์ ('kdebuild') เพื่อเริ่มกระบวนการสร้าง - บางทีคุณอาจต้องการที่จะใช้ ดูมัน
Vitor Py

คำตอบ:


2

แพ็คเกจ autotools นั้นมีเส้นทางและรหัสที่เข้ารหัสยากมากมายอยู่ในนั้นด้วยเหตุผลที่ดี เลือกที่ดีที่สุดของคุณคือการสรุปผลการส่งออกและแท็กพวกเขาเป็นไม่สนใจในการควบคุมการแก้ไขของคุณเช่นใน.cvsignore, .hgignoreหรือเป็นsvn:ignoreattibute RCS บางตัวช่วยให้คุณสามารถระบุสัญลักษณ์แทนซ้ำได้


4
ไม่มีเหตุผลที่ดีที่จะมีเส้นทางญาติที่มีการเข้ารหัสอย่างหนักอื่น ๆ แล้วนี่คือรูปแบบการเขียนโปรแกรม unix ในปี 1970
Lothar

2

วิธีแก้ไข: สร้างบิลด์ที่ไม่มีแหล่งที่มา

  • ตามที่แนะนำในความคิดเห็นคุณสามารถสร้างบิลต์นอกแหล่งที่มา
  • หลักการคือสร้างไดเรกทอรีใหม่ "สร้างแผนภูมิ" เรียกใช้สคริปต์กำหนดค่าจากไดเรกทอรีนั้น (ด้วยเส้นทางสัมพัทธ์หรือพา ธ สัมบูรณ์)

ตัวอย่างด้วยการตรวจสอบอัตโนมัติ

ตัวอย่างเช่นสิ่งนี้จะดึงข้อมูลและสร้าง GNU สวัสดีและตรวจสอบว่าต้นไม้ต้นกำเนิดไม่มีการเปลี่ยนแปลงเล็กน้อย

การเตรียมต้นไม้ต้นทาง

ส่วนนี้ดึงข้อมูลและเตรียมไดเรกทอรี

{
wget -S http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
tar zxvf hello-2.10.tar.gz
mv hello-2.10 hello-2.10-pristine
tar zxvf hello-2.10.tar.gz
diff -urq hello-2.10 hello-2.10-pristine && echo "Before build, directories are identical."
cd hello-2.10
}

ส่วนทั่วไป: ใช้ซ้ำในโครงการของคุณ

ส่วนนี้สามารถใช้กับโครงการอื่น ๆ ที่ใช้ autoconf เพียง cd ลงในโครงการของคุณก่อนที่จะทำงาน ระวัง: สิ่งนี้จะวิ่งrmถ้าเล่นกับสายพันธุ์ระวังคุณจะต้องรับผิดชอบในทุกกรณี

export MYPREFIX="${PWD}.installtree"
(
set -eu # abort on error
ls configure # make sure it aborts if not in correct directory
export SRCTREE="${PWD}"
export BUILDTREE="${PWD}.buildtree"
rm -rf "$BUILDTREE" "$MYPREFIX"
mkdir "$BUILDTREE" "$MYPREFIX"
cd "$BUILDTREE"
"${SRCTREE}"/configure --prefix="${MYPREFIX?}"
time make -k || time make
time make install
)

ตรวจสอบส่วนหนึ่ง

สิ่งนี้จะตรวจสอบว่าบิลด์นั้นมีแหล่งกำเนิดที่สมบูรณ์

{
ls "$MYPREFIX"/bin/hello && echo "Okay, build generated the target."
cd "$MYPREFIX"/..
diff -urq hello-2.10 hello-2.10-pristine && echo "No change at all. Perfect out-of-source build success."
}

นี่มันเอาท์พุทนี้:

/tmp/hello-2.10.installtree/bin/hello
Okay, build generated the target.
No change at all. Perfect out-of-source build success.

โบนัส: การติดตั้งที่ไม่ใช่ราก

--prefix="${MYPREFIX?}"ส่วนดังกล่าวข้างต้นเป็นตัวเลือก อนุญาตให้ทำการ "ติดตั้ง" ที่อยู่ในบัญชีของคุณ หากคุณต้องการ "sudo ทำการติดตั้ง" แบบดั้งเดิมไปยังตำแหน่งทั่วทั้งระบบคุณสามารถลบ--prefix="${MYPREFIX?}"ได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.