ພາສາອັງກິດພາສາຝຣັ່ງແອສປາໂຍນ

Ad


OnWorks favicon

metaconfig - ອອນລາຍໃນຄລາວ

ເປີດໃຊ້ metaconfig ໃນ OnWorks ຜູ້ໃຫ້ບໍລິການໂຮດຕິ້ງຟຣີຜ່ານ Ubuntu Online, Fedora Online, Windows online emulator ຫຼື MAC OS online emulator

ນີ້ແມ່ນຄໍາສັ່ງ metaconfig ທີ່ສາມາດດໍາເນີນການໄດ້ໃນ OnWorks ຜູ້ໃຫ້ບໍລິການໂຮດຕິ້ງຟຣີໂດຍໃຊ້ຫນຶ່ງໃນຫຼາຍໆບ່ອນເຮັດວຽກອອນໄລນ໌ຂອງພວກເຮົາເຊັ່ນ Ubuntu Online, Fedora Online, Windows online emulator ຫຼື MAC OS online emulator

ໂຄງການ:

NAME


metaconfig - ຕັ້ງຄ່າຕົວສ້າງສະຄຣິບ

ສະຫຼຸບສັງລວມ


metaconfig [ -dhkmostvwGMV ] [ -L dir ]

ລາຍລະອຽດ


Metaconfig ແມ່ນໂຄງການທີ່ສ້າງ Configure scripts. ຖ້າເຈົ້າບໍ່ຮູ້ວ່າ a
Configure script ແມ່ນ, ກະລຸນາຂ້າມໄປທີ່ TUTORIAL ພາກສ່ວນຂອງໜ້າຄູ່ມືນີ້. ຖ້າ​ເຈົ້າ​ຕ້ອງ​ການ
ລາຍລະອຽດເຕັມ (ຢ່າງເປັນທາງການ) ຂອງວິທີການນໍາໃຊ້ metaconfig ແລະຫນ່ວຍງານຂອງມັນ, ກະລຸນາເບິ່ງທີ່
ການອ້າງອິງ ພາກ. ຕໍ່​ໄປ​ນີ້​ແມ່ນ​ການ​ນໍາ​ສະ​ເຫນີ​ແລະ​ກະ​ສານ​ອ້າງ​ອີງ​ໄວ​ສໍາ​ລັບ​ຄວາມ​ຮູ້​
ຜູ້ໃຊ້.

Metaconfig ດໍາເນີນການຈາກຊຸດຂອງ ຫນ່ວຍ ເຊິ່ງກໍານົດທຸກສິ່ງທຸກຢ່າງທີ່ metaconfig ຮູ້ກ່ຽວກັບ
ການພົກພາ. ແຕ່ລະຫນ່ວຍແມ່ນເປັນຂອງຕົນເອງ, ແລະບໍ່ຈໍາເປັນຕ້ອງລົງທະບຽນທຸກບ່ອນ
ນອກເໜືອໄປຈາກການລວມເອົາຢູ່ໃນລະບົບ U ສາທາລະນະ ຫຼືລາຍຊື່ U ສ່ວນຕົວຂອງເຈົ້າ. ຖ້າ
ຊຸດ dist (ເຊິ່ງ metaconfig ເປັນສ່ວນຫນຶ່ງ) ຖືກຕິດຕັ້ງຢູ່ໃນ LIB, ຫຼັງຈາກນັ້ນ U
ໄດເລກະທໍລີແມ່ນ LIB/dist/mcon/U. ໃນເຄື່ອງນີ້, ໄດເລກະທໍລີ LIB ແມ່ນ /usr/share/dist. ຂອງເຈົ້າ
ໄດເລກະທໍລີ U ສ່ວນຕົວ, ຖ້າທ່ານມີຫນຶ່ງ, ແມ່ນຢູ່ໃນບັນຊີລະດັບສູງສຸດຂອງຊຸດຂອງທ່ານ.
ກ່ອນທີ່ທ່ານຈະສາມາດແລ່ນໄດ້ metaconfig ເຈົ້າຕ້ອງເຮັດຫຼາຍອັນ:

· ສ້າງໄຟລ໌ .package ໃນໄດເລກະທໍລີລະດັບສູງສຸດຂອງແພັກເກັດໂດຍການແລ່ນ packinit.
ໂຄງການນີ້ຈະຖາມທ່ານກ່ຽວກັບຊຸດຂອງທ່ານແລະຈື່ຈໍາສິ່ງທີ່ທ່ານບອກມັນດັ່ງນັ້ນ
ທຸກໂຄງການຫ່າງໄກສາມາດສະຫລາດ.

· ປຶກ​ສາ​ຫາ​ລື​ຄໍາ​ສັບ​ຕ່າງໆ (ໃນ LIB / dist / mcon​) ແລະ​ຂຽນ​ສະ​ຄຣິ​ບ​ຂອງ​ທ່ານ​ແລະ​ໂຄງ​ການ C ຂອງ​ທ່ານ
ໃນແງ່ຂອງສັນຍາລັກທີ່ metaconfig ຮູ້ວິທີການກໍານົດ. ເຈົ້າບໍ່ ຈຳ ເປັນຕ້ອງບອກ
metaconfig ສັນຍາລັກທີ່ທ່ານໃຊ້, ເນື່ອງຈາກວ່າ metaconfig ຈະຄິດເຖິງສິ່ງນັ້ນສໍາລັບທ່ານ.

· ສ້າງສະຄຣິບ .SH ທີ່ຈຳເປັນເພື່ອຂຽນ Makefiles ຫຼື shell scripts ທີ່ຈະຂຶ້ນກັບ
ກ່ຽວກັບຄ່າທີ່ກໍານົດໂດຍ Configure. ມີໂຄງການທີ່ເອີ້ນວ່າ ເຮັດໃຫ້SH ນັ້ນຈະຊ່ວຍທ່ານໄດ້
ປ່ຽນສະຄຣິບທຳມະດາເປັນແມ່ແບບ script.SH; ບາງການແກ້ໄຂຍັງຈະຕ້ອງເປັນ
ປະຕິບັດຢູ່ໃນໄຟລ໌ .SH ຜົນໄດ້ຮັບເພື່ອຍ້າຍພາກສ່ວນການຕັ້ງຄ່າຕົວແປໃນ
ສ່ວນເທິງສຸດຂອງສະຄຣິບ (ເບິ່ງຄຳເຫັນໃນແຖວທີ່ສ້າງຂຶ້ນໂດຍ ເຮັດໃຫ້SH ພາຍໃນ .SH ຂອງທ່ານ
ໄຟລ).

·ສ້າງໄຟລ໌ MANIFEST.new ໃນໄດເລກະທໍລີລະດັບສູງສຸດຂອງເຈົ້າທີ່ລາຍຊື່ໄຟລ໌ທັງຫມົດໃນ
ຊຸດຂອງເຈົ້າ. ໄຟລ໌ນີ້ຈະຍັງຄົງເປັນສ່ວນຕົວ ແລະຈະບໍ່ເປັນສ່ວນຫນຶ່ງຂອງໄຟລ໌ສຸດທ້າຍ
ການ​ແຜ່​ກະ​ຈາຍ​. (ເພື່ອຄວາມສະດວກ, ໄຟລ໌ MANIFEST ຈະຖືກນໍາໃຊ້ໂດຍ metaconfig if
ຍັງບໍ່ມີໄຟລ໌ MANIFEST.new ເທື່ອ.) ຊື່ໄຟລ໌ຄວນຈະເປັນຊ່ອງຂໍ້ມູນທໍາອິດໃນແຕ່ລະ
ສາຍ. ຫຼັງ​ຈາກ​ທີ່​ຊ່ອງ​ຫວ່າງ​ບາງ​ຢ່າງ​ທີ່​ທ່ານ​ສາ​ມາດ​ເພີ່ມ​ຄໍາ​ຄິດ​ເຫັນ​ສັ້ນ​ອະ​ທິ​ບາຍ​ໄຟລ​໌​ຂອງ​ທ່ານ​. ເທົ່ານັ້ນ
ໄຟລ໌ແຫຼ່ງຄວນຈະຖືກລະບຸໄວ້ໃນນັ້ນ. ໄຟລ​໌​ພິ​ເສດ​ patchlevel.h (ເຊິ່ງແມ່ນ
ຈັດການແລະຮັກສາໂດຍເຄື່ອງມື patching - ເບິ່ງ pat(1)) ຄວນເປັນສ່ວນຫນຶ່ງຂອງ
ໄຟລ໌ MANIFEST.new, ແຕ່ບາງເຄື່ອງມືອາດຈະຖືກລະເລີຍຢ່າງງຽບໆ. ຕາມກົດລະບຽບ,
ພຽງແຕ່ໄຟລ໌ທີ່ຮັກສາໄວ້ໂດຍ RCS ຄວນຈະຖືກລະບຸໄວ້ໃນນັ້ນ, patchlevel.h ໄຟລ໌
ຂໍ້ຍົກເວັ້ນທີ່ສໍາຄັນອັນຫນຶ່ງ.

· ທາງເລືອກອື່ນ, ທ່ານອາດຈະຕ້ອງການສ້າງໄຟລ໌ MANIFEST, ເຊິ່ງຈະເປັນສະບັບທີ່ສົ່ງອອກ
ຂອງ MANIFEST.new ຂອງເຈົ້າ. ໄຟລ໌ນັ້ນຈະຕ້ອງຖືກສ້າງເປັນສ່ວນໜຶ່ງຂອງການປ່ອຍ, ie ລະບຸໄວ້ໃນທັງສອງ
MANIFEST.new ແລະ MANIFEST ຂອງເຈົ້າເອງ. ຫນຶ່ງ​ໃນ metaconfig ຫນ່ວຍງານຮູ້ກ່ຽວກັບເລື່ອງນີ້
file ແລະຈະບັງຄັບໃຫ້ Configure ດໍາເນີນການກວດສອບການປ່ອຍ, ຮັບປະກັນໄຟລ໌ທັງຫມົດ
ລະບຸໄວ້ວ່າມີສ່ວນຫນຶ່ງຂອງການແຈກຢາຍ. ໄຟລ໌ MANIFEST ແລະ MANIFEST.new ຄວນ
ແຕກຕ່າງກັນ, ບໍ່ແມ່ນການເຊື່ອມຕໍ່.

· ຄັດລອກໄຟລ໌ .U ໃດໆກໍຕາມທີ່ທ່ານຕ້ອງການທີ່ຈະດັດແປງໃສ່ໄດເລກະທໍລີ U ສ່ວນຕົວຂອງທ່ານ. ໄຟລ໌ .U ໃດ
ໃນລາຍຊື່ U ສ່ວນຕົວຂອງເຈົ້າຈະຖືກໃຊ້ໃນຄວາມມັກຂອງ U
ໄດເລກະທໍລີ. ສໍາລັບຕົວຢ່າງ, ວິທີຫນຶ່ງທີ່ຈະບັງຄັບໃຫ້ລວມເອົາຫນ່ວຍງານໃດນຶ່ງແມ່ນການຄັດລອກ End.U
ໄຟລ໌ໄປຫາໄດເລກະທໍລີ .U ຂອງທ່ານແລະເພີ່ມຊື່ຂອງຫນ່ວຍງານທີ່ທ່ານຕ້ອງການເປັນການຂຶ້ນກັບ
ໃນຕອນທ້າຍຂອງ ?MAKE: ເສັ້ນ. ຫນ່ວຍງານທີ່ແນ່ນອນສາມາດຖືກບັງຄັບດ້ວຍວິທີນີ້ເທົ່ານັ້ນ, ຄື
ຮູບແບບ Warn_*.U ແລະ Chk_*.U. ນອກນັ້ນທ່ານຍັງສາມາດປັບແຕ່ງຄ່າເລີ່ມຕົ້ນທີ່ແນ່ນອນ
ຕັ້ງຄ່າຕົວແປໂດຍການຄັດລອກ Myinit.U ໄປໃສ່ໄດເລກະທໍລີ U ສ່ວນຕົວຂອງແພັກເກັດຂອງເຈົ້າ ແລະ
ກໍານົດຕົວແປໃນຫນ່ວຍນັ້ນ.

ໃນປັດຈຸບັນທ່ານພ້ອມທີ່ຈະດໍາເນີນການ metaconfig. ທີ່ຈະສ້າງເປັນ ກໍາຫນົດຄ່າ ໄຟລ໌, ແລະທາງເລືອກ a
config_h.SH ໄຟລ໌ (ຖ້າແຫຼ່ງຂອງທ່ານໃຊ້ສັນຍາລັກ C). ໄຟລ໌ທີ່ສ້າງຂຶ້ນຈະ
ອັດຕະໂນມັດຈະຖືກເພີ່ມໃສ່ MANIFEST.new ຂອງທ່ານຖ້າຈໍາເປັນ. ຢ່າລືມປັບປຸງຂອງທ່ານ
ໄຟລ໌ MANIFEST ຢ່າງໃດກໍຕາມ.

ເພື່ອສ້າງຫນ່ວຍງານໃຫມ່, ເຮັດດັ່ງຕໍ່ໄປນີ້:

· ສຳເນົາໜ່ວຍທີ່ຄ້າຍກັບໄຟລ໌ .U ໃໝ່. ຊື່ທີ່ທ່ານເລືອກຄວນຈະເປັນຊື່ຂອງ a
ຕົວແປທີ່ສ້າງຂຶ້ນໂດຍຫນ່ວຍງານ, ເຖິງແມ່ນວ່ານີ້ແມ່ນພຽງແຕ່ຄວາມສະດວກສະບາຍສໍາລັບທ່ານ, ບໍ່ແມ່ນ a
ຄວາມຕ້ອງການ. ມັນຄວນຈະມີ 12 ຕົວອັກສອນ ຫຼືໜ້ອຍກວ່າເພື່ອປ້ອງກັນການຕັດຊື່ໄຟລ໌.
ຕົວຈິງແລ້ວ, ມັນຄວນຈະເປັນ 10 ຫຼືຫນ້ອຍເພື່ອໃຫ້ຜູ້ທີ່ຕ້ອງການໃຊ້ RCS ສາມາດມີ
a .U,v ສຸດທ້າຍໂດຍບໍ່ມີການຟັກ. Metaconfig ໃຊ້ກໍລະນີຂອງຕົວອັກສອນທໍາອິດທີ່ຈະ
ກໍານົດວ່າຕົວແປໃດຖືກຜະລິດໂດຍຫນ່ວຍງານນີ້, ດັ່ງນັ້ນຢ່າໃຊ້ຕົວພິມໃຫຍ່ຂອງເຈົ້າ
ຊື່ຫນ່ວຍຖ້າມັນຄວນຈະຜະລິດຕົວແປຂອງແກະ.

· ແກ້ໄຂໄຟລ໌ .U ໃໝ່ເພື່ອເຮັດສິ່ງທີ່ທ່ານຕ້ອງການ. ທໍາອິດ ?MAKE: ເສັ້ນຊີ້ໃຫ້ເຫັນເຖິງ
ການເພິ່ງພາອາໄສ; ກ່ອນໜ້າຈໍ້າບັນຊີລາຍຊື່ສຸດທ້າຍ ຕົວແປທັງໝົດທີ່ໜ່ວຍນີ້ກຳນົດ, ແລະ
ຫຼັງຈາກຈໍ້າສອງເມັດສຸດທ້າຍ, ຕົວແປທັງຫມົດ (ຫຼືຫນ່ວຍອື່ນໆ) ທີ່ຫນ່ວຍນີ້ຂຶ້ນກັບ.
ມັນເປັນສິ່ງສໍາຄັນຫຼາຍທີ່ບັນຊີລາຍຊື່ເຫຼົ່ານີ້ຖືກຕ້ອງ. ຖ້າການເພິ່ງພາອາໄສເປັນທາງເລືອກ ແລະ ກ
ສາມາດນຳໃຊ້ຄ່າເລີ່ມຕົ້ນໄດ້, ທ່ານຄວນນຳໜ້າການເພິ່ງພາອາໄສດ້ວຍເຄື່ອງໝາຍ '+'. ໄດ້
ຫນ່ວຍງານທີ່ສອດຄ້ອງກັນຈະບໍ່ຖືກໂຫລດເພື່ອຄິດໄລ່ສັນຍາລັກ, ເວັ້ນເສຍແຕ່ຕ້ອງການແທ້ໆ
ໂດຍໜ່ວຍງານອື່ນ.

· ໃນ​ຂອບ​ເຂດ​ທີ່​ເປັນ​ໄປ​ໄດ້, parameterize ຫນ່ວຍ​ບໍ​ລິ​ການ​ຂອງ​ທ່ານ​ໂດຍ​ອີງ​ໃສ່​ຕົວ​ປ່ຽນ shell ໄດ້​ກໍາ​ນົດ​ໄວ້​ໃນ
?INIT: ສາຍ. ນີ້ຈະຍ້າຍຄໍານິຍາມຕົວແປໄປເຖິງຫນ່ວຍ Init.U, ບ່ອນທີ່
ພວກເຂົາສາມາດຖືກລົບລ້າງໂດຍຄໍານິຍາມໃນ Myinit.U, ເຊິ່ງລວມຢູ່ຫລັງ Init.U.

· ເພີ່ມຄໍານິຍາມຂອງສັນຍາລັກ C ທີ່ຕ້ອງການເປັນ ?H: ສາຍ. ແຖວເລີ່ມຕົ້ນດ້ວຍ
?H:?%<: ໃນໄຟລ໌ .U ຈະຖືກເພີ່ມໃສ່ໄຟລ໌ config.h ສຸດທ້າຍຖ້າ ແລະພຽງແຕ່ຖ້າ
metaconfig ຕັດສິນໃຈວ່າຫນ່ວຍນີ້ແມ່ນຈໍາເປັນ. %< ຫຍໍ້ມາຈາກຊື່ຂອງໜ່ວຍ,
ທີ່ເກີດຂື້ນເປັນຊື່ຂອງໄຟລ໌ເກີນໄປ (ບໍ່ມີ .U) ຖ້າທ່ານປະຕິບັດຕາມ
ສົນທິສັນຍາ. ສະເຫມີໃສ່ຄໍາຄິດຄໍາເຫັນໃນແຕ່ລະແຖວ ?H: ໃນກໍລະນີທີ່ມີຕົວແປຫນຶ່ງ
ການປ່ຽນແທນກ່ອນໜ້ານີ້ເລີ່ມສະແດງຄຳເຫັນໂດຍບໍ່ໄດ້ຈົບລົງ. ຫອຍໃດນຶ່ງ
ຕົວແປທີ່ເລີ່ມຕົ້ນດ້ວຍ d_ ອາດຈະເຮັດແນວນີ້, ສະນັ້ນລະວັງ. ຖ້າ​ຫາກ​ວ່າ​ທ່ານ ommit the ?%<:, ຫຼັງ​ຈາກ​ນັ້ນ
metaconfig ຈະພະຍາຍາມ intuit ສັນຍາລັກທີ່ມີຄໍານິຍາມທີ່ຕ້ອງການກ່ອນໃດກໍ່ຕາມ
ລວມຢູ່ໃນ config.h.

· ເພີ່ມຄຳນິຍາມຄຳສັບເປັນ ?S: ເສັ້ນສຳລັບຕົວແປ shell ແລະ ?C: ເສັ້ນສຳລັບ C
ຕົວແປ preprocessor. ເບິ່ງຫົວໜ່ວຍປັດຈຸບັນເປັນຕົວຢ່າງ. ມັນເປັນສິ່ງສໍາຄັນຫຼາຍທີ່ຈະ
ເລີ່ມແຕ່ລະລາຍການດ້ວຍຊື່ສັນຍາລັກທີ່ຖືກຕ້ອງທາງຊ້າຍ, ແລະສິ້ນສຸດແຕ່ລະລາຍການດ້ວຍ ?C:. ຫຼື
?S:. ສາຍ. ສູດການຄິດໄລ່ທີ່ແປລາຍການສັນຍາລັກ C preprocessor ສໍາລັບ
ຄໍາສັບໃນຄໍາເຫັນສໍາລັບ config.h ແມ່ນຂຶ້ນກັບນີ້.

·ໃຫ້ແນ່ໃຈວ່າຄໍາສັ່ງຂອງທັງຫມົດຂອງທ່ານ? ສາຍແມ່ນຖືກຕ້ອງ. ຄໍາສັ່ງທີ່ຖືກຕ້ອງແມ່ນ:

?RCS: ແລະ ?X: ໂດຍພື້ນຖານແລ້ວພຽງແຕ່ຄຳເຫັນ
?ເຮັດ: metaconfig dependencies
?Y: ຄໍາສັ່ງການຈັດວາງຫົວໜ່ວຍ
?S: ຄໍານິຍາມ shell glossary
?C: ຄໍານິຍາມ C ຄໍານິຍາມ
?H: config.h ຄໍານິຍາມ
?m: confmagic.h ຄໍານິຍາມ
?W: ຕ້ອງການສັນຍາລັກ
?V: ສັນຍາລັກທີ່ເຫັນໄດ້
?F: ໄຟລ໌ທີ່ສ້າງຂຶ້ນໂດຍໜ່ວຍນີ້
?T: ສັນຍາລັກຫອຍຊົ່ວຄາວທີ່ໃຊ້
?D: ທາງເລືອກທີ່ຂຶ້ນກັບຄ່າເລີ່ມຕົ້ນ
?O: ໃຊ້ເພື່ອໝາຍຫົວໜ່ວຍທີ່ລ້າສະໄໝ
?LINT: ຄໍາແນະນໍາໂລຫະ
?INIT: ການເລີ່ມຕົ້ນສັນຍາລັກ shell

ນີ້ແມ່ນຕົວຢ່າງເພື່ອສະແດງການຈັດລໍາດັບຂອງສາຍແລະຮູບແບບຕ່າງໆທີ່ໄດ້ຮັບອະນຸຍາດ:

?RCS: $RCS-Id$
?RCS: ຂໍ້ມູນລິຂະສິດ
?RCS: $RCS-Log$
?X:
?X: ຕົວຢ່າງທີ່ສົມມຸດຕິຖານ
?X:
?ເຮັດ:d_one ສອງ: ສາມ +ສີ່ ຫ້າ
?ເຮັດ: -pick add $@ %
?Y: Default
?S:d_one:
?S: ສັນຍາລັກ shell ທໍາອິດ, ກໍານົດເງື່ອນໄຂ ONE.
?S:.
?S:ສອງ:
?S: ສັນຍາລັກຫອຍທີສອງ, ຄ່າຂອງສອງ.
?S:.
?C:ONE:
?C: ສັນຍາລັກ C ທໍາອິດ.
?C:.
?C:ສອງ:
?C: ສັນຍາລັກ C ທີສອງ.
?C:.
?H:#$d_one ONE /**/
?H:#define TWO "$ two"
?H:#$d_one ONE_TWO "$ two"
?H:.
?M:flip: HAS_FLIP
?M:#ifndef HAS_FLIP
?M:#define flip(x) flop(x)
?M:#endif
?ມ:.
?W:%<:one_two
?v:p_one p_two:p_three
?f:file ./ftest !tmp
?T:tmp var
?D:ສອງ='undef'
?LINT:ປ່ຽນສາມ
?INIT:two_init='2'
: shell code ປະຕິບັດຫນ່ວຍງານດັ່ງຕໍ່ໄປນີ້
p_one='ຫນຶ່ງ'
p_two='ສອງ'
p_three=""

ຂ້າພະເຈົ້າຂໍບອກອີກເທື່ອໜຶ່ງວ່າ: ນິຍາມຫົວໜ່ວຍຂ້າງເທິງແມ່ນ a fake ຫນຶ່ງພຽງແຕ່ສະແດງໃຫ້ເຫັນ
ຄວາມເປັນໄປໄດ້ທີ່ແຕກຕ່າງກັນ. ຫນ່ວຍງານດັ່ງກ່າວຈະຮັບໃຊ້ຈຸດປະສົງພຽງເລັກນ້ອຍຢ່າງໃດກໍ່ຕາມ ... ບາງອັນ
ຄຸນສົມບັດຂັ້ນສູງບໍ່ໄດ້ອະທິບາຍຢູ່ທີ່ນີ້. ກະລຸນາອ້າງອີງເຖິງ ການອ້າງອິງ ພາກ​ສ່ວນ​ສໍາ​ລັບ​ການ​ເພີ່ມ​ເຕີມ​
ຂໍ້ມູນຄົບຖ້ວນ.

· ເອົາຫນ່ວຍບໍລິການເຂົ້າໄປໃນລະບົບ U ສາທາລະນະຫຼືເອກະຊົນຕາມຄວາມເຫມາະສົມ.

· ແລ່ນຄືນໃໝ່ metaconfig.

· ສົ່ງຫນ່ວຍບໍລິການຂອງທ່ານໄປ [email protected] (Raphael Manfredi) ສໍາລັບການລວມຢູ່ໃນສໍາເນົາຕົ້ນສະບັບ,
ຖ້າທ່ານຄິດວ່າມັນມີຄວາມສົນໃຈທົ່ວໄປ.

ເພື່ອເພີ່ມໂຄງການໃຫມ່ທີ່ຈະຕັ້ງຢູ່:

· ແກ້ໄຂ Loc.U, ແລະເພີ່ມຊື່ຂອງໂຄງການທັງສອງໃສ່ ?MAKE: line (ລະຫວ່າງ.
ສອງຈໍ້າສອງເມັດ) ແລະໄປຫາ loclist ຫຼື trylist (ຂຶ້ນກັບວ່າໂຄງການແມ່ນ
ບັງຄັບຫຼືບໍ່).

· ເປີດໃຊ້ metaconfig ຄືນໃໝ່.

· ສົ່ງຫນ່ວຍງານຂອງເຈົ້າມາໃຫ້ຂ້ອຍເພື່ອລວມຢູ່ໃນສໍາເນົາຕົ້ນສະບັບ, ຖ້າທ່ານຄິດວ່າມັນເປັນເລື່ອງທົ່ວໄປ
ມີຄວາມສົນໃຈ.

ບັນທຶກສໍາລັບການຂຽນໄຟລ໌ .U:

* ສະເຫມີໃຊ້ "rm -f" ເພາະວ່າມີລະບົບທີ່ rm ໂຕ້ຕອບໂດຍຄ່າເລີ່ມຕົ້ນ.

* ຢ່າໃຊ້ "set -- ... " ເພາະວ່າ '--' ບໍ່ໄດ້ເຮັດວຽກກັບທຸກໆ shell. ໃຊ້ “set x…;
ປ່ຽນ".

* ຢ່າໃຊ້ "unset ENV" ເນື່ອງຈາກ unset ບໍ່ສາມາດເຄື່ອນທີ່ຢ່າງເຕັມສ່ວນ. ເວົ້າ "ENV=''" ແທນ.

* ສະເຫມີໃຊ້ສຽງສະທ້ອນ " " (ທີ່ມີຊ່ອງຫວ່າງ) ເພາະວ່າລະບົບ Eunice.

* ພຽງ​ແຕ່​ນໍາ​ໃຊ້​ ການທົດສອບ ດ້ວຍ -r, -w, -f ຫຼື -d ເນື່ອງຈາກນັ້ນແມ່ນສະຫຼັບເຄື່ອນທີ່ເທົ່ານັ້ນ. ໃນ
ໂດຍສະເພາະ, ຫຼີກເວັ້ນການ "test -x".

* ໃຊ້ພຽງແຕ່ບັນດາໂຄງການທີ່ມາພ້ອມກັບ V7, ດັ່ງນັ້ນທ່ານຮູ້ວ່າທຸກຄົນມີພວກມັນ.

* ໃຊ້ $contains ເມື່ອທ່ານຕ້ອງການ grep ຕາມເງື່ອນໄຂ, ເພາະວ່າບໍ່ແມ່ນ greps ທັງໝົດຈະສົ່ງຄືນ a
ສະ​ຖາ​ນະ​ພາບ​ທີ່​ສົມ​ເຫດ​ສົມ​ຜົນ​. ໃຫ້ແນ່ໃຈວ່າຈະປ່ຽນເສັ້ນທາງຜົນຜະລິດໄປຫາ /dev/null, ໂດຍໃຊ້ '>/dev/null
2>&1'.

* ໃຊ້ "ຖ້າ​ຫາກ​ວ່າ​ທົດ​ສອບ​" ແທນ​ທີ່​ຈະ​ເປັນ "ຖ້າ​ຫາກ​ວ່າ [... ]​" ນັບ​ຕັ້ງ​ແຕ່​ບໍ່​ທຸກ sh ຮູ້​ການ​ກໍ່​ສ້າງ​ຫຼັງ​ຈາກ​ນັ້ນ​.

* ໃຊ້ myread script ສໍາລັບການປ້ອນຂໍ້ມູນເພື່ອໃຫ້ພວກເຂົາສາມາດເຮັດ shell escapes ແລະຄ່າເລີ່ມຕົ້ນ
ການ​ປະ​ເມີນ​ຜົນ​. ຮູບແບບທົ່ວໄປແມ່ນ

ກໍລະນີ "$grimble" ໃນ
'') dflt=452;
*) dflt="$grimble";
ວ່າ C
rp='ເຈົ້າມີຈົ່ມເທົ່າໃດ?'
. ./myread
grimble="$ans"

* ໃຊ້ສະຄິບ getfile ເມື່ອຖາມຫາຊື່ເສັ້ນທາງຂອງໄຟລ໌ເພື່ອໃຫ້ມີທາງເລືອກ
~ ການ​ຂະ​ຫຍາຍ​ຊື່​ແລະ​ການ​ກວດ​ສອບ​ສຸ​ຂະ​ພາບ​. ເບິ່ງໜ່ວຍ Getfile.U ສໍາລັບລາຍລະອຽດເຕັມ.

* ໃສ່ a

$startsh

ຢູ່ເທິງສຸດຂອງທຸກໆສະຄຣິບທີ່ສ້າງຂຶ້ນທີ່ຈະຖືກເປີດຕົວຫຼືມາຈາກ
ກໍາຫນົດຄ່າ.

* ບໍ່ເຄີຍສົມມຸດ UNIX-isms ທົ່ວໄປຄືກັບຄວາມຈິງທີ່ວ່າໄຟລ໌ວັດຖຸລົງທ້າຍດ້ວຍ a .o ແລະ
ວ່າຊື່ຫ້ອງສະຫມຸດລົງທ້າຍດ້ວຍ .aທີ່ຢູ່ ການນໍາໃຊ້ $_o ແລະ $_a ຕົວແປແທນ (ເບິ່ງ
Unix.U).

* ເມື່ອເຮັດການທົດສອບ compile-link-execute, ໃຫ້ຂຽນແບບນີ້ສະເໝີ:

$cc $ccflags $ldflags try.c -o ລອງ $libs

ເນື່ອງຈາກວ່າບາງລະບົບຕ້ອງການໃຫ້ທຸງການເຊື່ອມໂຍງຖືກລະບຸກ່ອນທີ່ຈະລວບລວມ
ເປົ້າຫມາຍ (ຍົກເວັ້ນຫ້ອງສະຫມຸດເຊື່ອມຕໍ່ trailing).

* ອອກ​ຂໍ້​ຄວາມ​ທີ່​ສໍາ​ຄັນ​ໃນ​ຕົວ​ອະ​ທິ​ບາຍ​ໄຟລ​໌ #4​, ໂດຍ​ການ​ນໍາ​ໃຊ້ '>&4' ເພື່ອ​ປ່ຽນ​ເສັ້ນ​ທາງ​ການ​ຜະ​ລິດ​.
ພຽງແຕ່ຂໍ້ຄວາມເຫຼົ່ານັ້ນຈະປາກົດໃນເວລາທີ່ -s switch ແມ່ນມອບໃຫ້ ກໍາຫນົດຄ່າ ກ່ຽວກັບ
ເສັ້ນຄໍາສັ່ງ (ຮູບແບບງຽບ).

* ພະຍາຍາມກຳນົດສະເໝີວ່າມີຄຸນສົມບັດໃດໜຶ່ງຢູ່ໃນລັກສະນະສະເພາະທີ່ສຸດຫຼືບໍ່ - ຢ່າເຮັດ
ເວົ້າວ່າ "ຖ້າ bsd" ເມື່ອທ່ານສາມາດ grep libc. ມີຫຼາຍລະບົບປະສົມອອກມີ, ແລະ
ແຕ່ລະລັກສະນະຄວນຢືນຫຼືຫຼຸດລົງດ້ວຍຕົວມັນເອງ.

* ສະເຫມີພະຍາຍາມກໍານົດວ່າຄຸນນະສົມບັດແມ່ນປະກົດຢູ່ໃນວິທີການທົ່ວໄປທີ່ສຸດ, ດັ່ງນັ້ນ
ແພກເກດອື່ນໆສາມາດນໍາໃຊ້ຫນ່ວຍງານຂອງທ່ານໄດ້.

* ເມື່ອສົງໃສ, ຕັ້ງຄ່າເລີ່ມຕົ້ນແລ້ວຖາມ. ຢ່າຄິດຫຍັງເລີຍ.

* ຖ້າທ່ານຄິດວ່າຜູ້ໃຊ້ຜິດ, ອະນຸຍາດໃຫ້ສໍາລັບຄວາມຈິງທີ່ວ່າລາວອາດຈະຖືກຕ້ອງ. ສໍາລັບ
ຕົວຢ່າງ, ລາວອາດຈະດໍາເນີນການ Configure ໃນລະບົບທີ່ແຕກຕ່າງກັນກ່ວາທີ່ລາວຈະໃຊ້
ຜະ​ລິດ​ຕະ​ພັນ​ສຸດ​ທ້າຍ​.

Metaconfig ສະຫງວນຊື່ຕໍ່ໄປນີ້ຢູ່ໃນໄດເລກະທໍລີຂອງເຈົ້າ, ແລະຖ້າທ່ານໃຊ້ຊື່ດັ່ງກ່າວມັນ
ອາດຈະຖືກ clobbered ຫຼືມີຜົນກະທົບທີ່ບໍ່ໄດ້ຄາດໄວ້ອື່ນໆ:

.MT/*
ກໍາຫນົດຄ່າ
ຕ້ອງການ
ລ້າສະໄຫມ
configure
config_h.SH
confmagic.h
U/*
MANIFEST.ໃໝ່

ນອກຈາກນັ້ນ, Configure ອາດຈະ clobber ຊື່ເຫຼົ່ານີ້ຢູ່ໃນໄດເລກະທໍລີທີ່ມັນຖືກດໍາເນີນການຢູ່ໃນ:

UU/*
config.sh
config.h

OPTIONS


ທາງເລືອກຕໍ່ໄປນີ້ແມ່ນຮັບຮູ້ໂດຍ metaconfig:

-d ເປີດໂໝດດີບັກ. ບໍ່ມີປະໂຫຍດແທ້ໆເວັ້ນເສຍແຕ່ວ່າທ່ານກໍາລັງດີບັກ metaconfig
ຕົວເອງ

-h ພິມຂໍ້ຄວາມຊ່ວຍເຫຼືອ ແລະອອກ.

-k ຮັກສາໄດເລກະທໍລີຊົ່ວຄາວ, ດັ່ງນັ້ນທ່ານສາມາດກວດເບິ່ງໄຟລ໌ທີ່ເຮັດວຽກທີ່ໃຊ້ໂດຍ
metaconfig ການ​ກໍ່​ສ້າງ​ຂອງ​ທ່ານ​ ກໍາຫນົດຄ່າ ສະຄຣິບ. ເປັນປະໂຫຍດພຽງແຕ່ໃນເວລາທີ່ debugging ໄດ້
ຫນ່ວຍງານ.

-m ສົມມຸດຄວາມຈໍາຫຼາຍແລະພື້ນທີ່ແລກປ່ຽນ. ນີ້ຈະເລັ່ງການຊອກຫາສັນຍາລັກໃນ
ແຫຼ່ງໄຟລ໌ໂດຍຈໍານວນເວລາທີ່ສໍາຄັນ, ໃນຄ່າໃຊ້ຈ່າຍຂອງຫນ່ວຍຄວາມຈໍາ
ການບໍລິໂພກ ...

-o ແຜນ​ທີ່​ສັນ​ຍາ​ລັກ​ລ້າ​ສະ​ໄຫມ​ກ່ຽວ​ກັບ​ການ​ໃຫມ່​. ໃຊ້ສະວິດນີ້ຖ້າທ່ານຍັງມີບາງອັນ
ສັນຍາລັກລ້າສະໄຫມໃນລະຫັດແຫຼ່ງຂອງທ່ານແລະບໍ່ຕ້ອງການ (ຫຼືບໍ່ສາມາດ) ເອົາອອກ
ເຂົາເຈົ້າສໍາລັບໃນປັດຈຸບັນ. ສັນຍາລັກທີ່ລ້າສະໄຫມແມ່ນຖືກລະເລີຍ, ເຖິງແມ່ນວ່າ
ຈະ​ໃຫ້​ຄໍາ​ເຕືອນ​ທ່ານ​ຈາກ​ metaconfig.

-s ເປີດໂໝດງຽບ.

-t ສັນຍາລັກຕິດຕາມຍ້ອນວ່າເຂົາເຈົ້າໄດ້ຖືກພົບເຫັນ.

-v ເປີດໂໝດ verbose.

-w ສົມມຸດວ່າໄຟລ໌ທີ່ຕ້ອງການແມ່ນອັບເດດແລ້ວ. ນີ້ຈະຂ້າມເວລາແລະຄວາມຊົງຈໍາ
ໄລຍະການຊົມໃຊ້ຂອງການສະແກນລະຫັດແຫຼ່ງ, ຊອກຫາສັນຍາລັກທີ່ຮູ້ຈັກ. ໃຊ້​ມັນ
ພຽງ​ແຕ່​ໃນ​ເວ​ລາ​ທີ່​ທ່ານ​ຮູ້​ວ່າ​ໄຟລ​໌​ແຫຼ່ງ​ຂອງ​ທ່ານ​ບໍ່​ໄດ້​ມີ​ການ​ປ່ຽນ​ແປງ​ກ່ຽວ​ກັບ​ການ​
ສະນຸກເກີຂອງ metaconfig ສັນຍາລັກທີ່ໃຊ້.

-G ນອກຈາກນີ້ຍັງສະຫນອງ GNU configure-like ດ້ານຫນ້າກັບການຜະລິດ ກໍາຫນົດຄ່າ
script, ຈະຖືກລວມເຂົ້າໃນການແຈກຢາຍເຊັ່ນດຽວກັນ. ນີ້ແມ່ນພຽງແຕ່ wrapper
ປະມານ ກໍາຫນົດຄ່າ script ຕາມທໍາມະຊາດ, ແຕ່ມັນເຮັດໃຫ້ຄົນຄຸ້ນເຄີຍກັບ
ເຄື່ອງມື GNU ທີ່ຈະບໍ່ສູນເສຍໃນເວລາທີ່ປະເຊີນກັບການແຈກຢາຍໃຫມ່.

-L dir ລົບລ້າງສະຖານທີ່ຫ້ອງສະໝຸດເລີ່ມຕົ້ນ. ໂດຍປົກກະຕິພຽງແຕ່ເປັນປະໂຫຍດສໍາລັບ metaconfig
ຜູ້ຮັກສາເພື່ອນໍາໃຊ້ຫນ່ວຍງານທີ່ກໍາລັງພັດທະນາຢູ່ໃນທ້ອງຖິ່ນແທນທີ່ຈະເປັນ
ທີ່ມີຢູ່ສາທາລະນະ. ໄດ້ dir ທີ່​ລະ​ບຸ​ໄວ້​ແມ່ນ​ຫນຶ່ງ​ທີ່​ປະ​ກອບ​ດ້ວຍ​ຫົວ​ຫນ່ວຍ​
U ລະບົບ.

-M ອະນຸຍາດໃຫ້ຜະລິດ ກ confmagic.h ໄຟລ໌ເພື່ອ remap ອັດຕະໂນມັດບາງທີ່ດີ,
ສັນຍາລັກທີ່ຮູ້ຈັກກັບບາງທາງເລືອກອື່ນ, ເຊັ່ນ: ສຳເນົາ() ຖືກ remapped
ໂປ່ງໃສ memcpy() ໃນເວລາທີ່ບໍ່ມີ. ຕົວເລືອກນີ້ເປີດຢູ່
ອັດຕະໂນມັດເມື່ອ ກ confmagic.h ໄຟລ໌ມີຢູ່ໃນໄດເລກະທໍລີລະດັບສູງສຸດ.
ພຽງແຕ່ເອົາໄຟລ໌ນັ້ນອອກຖ້າທ່ານຕ້ອງການປິດຕົວເລືອກນີ້ຢ່າງຖາວອນ.

-V ພິມໝາຍເລກລຸ້ນ ແລະອອກ.

TUTORIAL


ພາກສ່ວນ (ຍາວ) ນີ້ແມ່ນການແນະນໍາ metaconfig, ໃນທີ່ພວກເຮົາຈະຮຽນຮູ້ທັງຫມົດ
ພື້ນຖານ. ຖ້າເຈົ້າຮູ້ວິທີໃຊ້ແລ້ວ metaconfig, ທ່ານອາດຈະຂ້າມໄປອັນຕໍ່ໄປໄດ້ຢ່າງປອດໄພ
ສ່ວນ.

ພາບລວມ
ປົກກະຕິແລ້ວເມື່ອທ່ານຕ້ອງການເອົາຊຸດແຫຼ່ງບາງຢ່າງເພື່ອລວບລວມຢູ່ໃນເວທີທີ່ເຈົ້າມີ
ເພື່ອແກ້ໄຂ Makefile ຕົ້ນຕໍ (ສົມມຸດວ່າມີຫນຶ່ງ!), ເລືອກ C compiler, ໃຫ້ແນ່ໃຈວ່າທ່ານ
ມີຫ້ອງສະຫມຸດທີ່ເຫມາະສົມ, ແລະຫຼັງຈາກນັ້ນໄຟໄຫມ້ ເຮັດໃຫ້ ຄໍາສັ່ງ. ຖ້າຊຸດແມ່ນສົມເຫດສົມຜົນ
ຂຽນໄດ້ດີ, ມັນຈະລວບລວມ (ໂດຍບໍ່ມີການເຕືອນເປັນທາງເລືອກ :-). ໃນຕົວຂອງມັນເອງ, ສຸດທ້າຍ
ປະໂຫຍກແມ່ນການປະຕິບັດທີ່ແທ້ຈິງ, ເນື່ອງຈາກວ່າຄວາມຫລາກຫລາຍຂອງເວທີ UNIX ທີ່ມີຢູ່ໃນມື້ນີ້
ແລະຄວາມຫຼາກຫຼາຍຂອງລົດຊາດ, ນັ້ນຫມາຍຄວາມວ່າຜູ້ຂຽນຂອງຊຸດໄດ້ເຂົ້າໄປໃນເລິກ
ບັນຫາໃນການຄິດອອກທາງເລືອກທີ່ຖືກຕ້ອງໂດຍການທົດລອງມາດຕະຖານບາງຢ່າງ, ການຄາດເດົາແລະການ messing
ປະ​ມານ​ທີ່​ມີ​ລະ​ບົບ​ປະ​ກອບ​ມີ​ແລະ​ປະ​ເພດ​.

ຢ່າງໃດກໍຕາມ, ເຖິງວ່າຈະມີພອນສະຫວັນທັງຫມົດ, ຜູ້ຂຽນບໍ່ສາມາດຮູ້ວ່າບາງລະບົບມີ
ການເອີ້ນລະບົບທີ່ແຕກຫັກ, ຫຼືວ່າໂຄງສ້າງລະບົບບາງຢ່າງຂາດພາກສະຫນາມມາດຕະຖານອື່ນ, ຫຼື
ພຽງແຕ່ວ່າມີໄຟລ໌ທີ່ລະບຸໄວ້ຫຼືບໍ່. ແລະຂ້າພະເຈົ້າບໍ່ໄດ້ພິຈາລະນາ implicit ໄດ້
ສົມມຸດຕິຖານ, ເຊັ່ນ: ປະເພດທີ່ສົ່ງຄືນໂດຍ malloc () ຫນ້າທີ່ຫຼືການມີຂອງ
ປ່ຽນຊື່() ລະ​ບົບ​ໂທ​ຫາ​ຊື່​ຈໍາ​ນວນ​ຫນຶ່ງ​. ແຕ່ຄວາມຮູ້ນັ້ນເປັນສິ່ງຈໍາເປັນເພື່ອບັນລຸຕົວຈິງ
ການເຄື່ອນທີ່.

ບັດ​ນີ້​ເຮົາ​ບໍ່​ໄດ້​ລ່ວງ​ລະ​ເມີດ​ຕົວ​ເອງ. ການ​ນໍາ​ໃຊ້​ຂໍ້​ມູນ​ນັ້ນ​ຮຽກ​ຮ້ອງ​ໃຫ້​ມີ​ຄວາມ​ສາ​ມາດ​ຫຼາຍ​ກວ່າ​ເກົ່າ​, ແຕ່​ມັນ​ສາ​ມາດ​ເຮັດ​ໄດ້​
ເຮັດ ໃຫ້ ໂຄງ ການ Portable ຫຼາຍ ນັບ ຕັ້ງ ແຕ່ ມັນ ໄດ້ ຖືກ ລາຍ ລັກ ອັກ ສອນ ໃນ ຮູບ ແບບ ຂອງ ລະ ບົບ ເປັນ ເອ ກະ ລາດ
ແລະອີງໃສ່ພຽງແຕ່ຄວາມຈິງທີ່ວ່າສົມມຸດຕິຖານບາງຢ່າງເປັນຄວາມຈິງຫຼືຜິດໃນລະບົບສະເພາະໃດຫນຶ່ງ,
ແຕ່ລະສົມມຸດຕິຖານບໍ່ກ່ຽວຂ້ອງກັນ. ນັ້ນແມ່ນ, ພວກເຮົາບໍ່ໄດ້ເວົ້າວ່າ: ພວກເຮົາກໍາລັງຢູ່ໃນ
ລະບົບ BSD ຫຼືພວກເຮົາຢູ່ໃນລະບົບ USG. ອັນນັ້ນມັນໂງ່ເກີນໄປໃນທຸກວັນນີ້. ບໍ່, ພວກເຮົາຕ້ອງການ
ເວົ້າກັບລະຫັດແຫຼ່ງ: ລະບົບນີ້ບໍ່ມີ ປ່ຽນຊື່() ໂທລະບົບແລະ malloc ()
ສົ່ງຄືນ a (ໂມຄະ *) ມູນຄ່າ.

Metaconfig ເປັນເຄື່ອງມືທີ່ຈະຊ່ວຍໃຫ້ທ່ານເຮັດພຽງແຕ່ວ່າ, ມີຜົນປະໂຫຍດເພີ່ມເຕີມຂອງບໍ່ແມ່ນ
ຕ້ອງແກ້ໄຂ Makefile ດ້ວຍມືຖ້າທຸກຢ່າງດີ. ໂດຍການແລ່ນ metaconfig, ທ່ານສ້າງເປັນ
shell script ຊື່ ກໍາຫນົດຄ່າ. ຄວາມພະຍາຍາມຫຼາຍຢ່າງໄດ້ຖືກອຸທິດໃຫ້ກັບ script Configure
ພາຍ​ໃນ​ເພື່ອ​ຮັບ​ປະ​ກັນ​ວ່າ​ມັນ​ຈະ​ດໍາ​ເນີນ​ການ​ໃນ 99​% ຂອງ shells ທີ່​ມີ​ຢູ່​ໃນ​ການ​ນີ້​
ການ​ຂຽນ. Configure ຈະ probe ລະບົບເປົ້າຫມາຍ, ຖາມຄໍາຖາມໃນເວລາທີ່ສົງໃສແລະ
ຮວບຮວມຄໍາຕອບທັງຫມົດໃນໄຟລ໌ແກະດຽວ, ເຊິ່ງສາມາດຖືກນໍາໃຊ້ເພື່ອ
ສ້າງອັດຕະໂນມັດ Makefiles ແລະ C ປະກອບມີໄຟລ໌.

ມີພຽງແຕ່ຊຸດສັນຍາລັກທີ່ຈໍາກັດ (ແຕ່ຂ້ອນຂ້າງໃຫຍ່) ທີ່ມີຢູ່ສໍາລັບສະຄິບແກະຂອງທ່ານ
ແລະໂຄງການ C. ພວກມັນທັງໝົດຖືກບັນທຶກໄວ້ໃນເອກະສານຄຳສັບ. ສິ່ງທີ່ທ່ານຕ້ອງເຮັດແມ່ນຮຽນຮູ້
ກ່ຽວກັບພວກມັນ ແລະເລີ່ມນຳໃຊ້ພວກມັນເພື່ອແກ້ໄຂບັນຫາການເຄື່ອນທີ່ ແລະການຕັ້ງຄ່າ. ຈາກນັ້ນ,
ໂດຍການແລ່ນ metaconfig, script Configure ທີ່ເຫມາະສົມຈະຖືກສ້າງຂື້ນສໍາລັບຊຸດຂອງທ່ານ.

ສະຄຣິບ Configure ຖືກສ້າງຂຶ້ນຫຼາຍຫນ່ວຍ (ຫຼາຍກວ່າ 300), ແຕ່ລະຫນ່ວຍເປັນ
ຮັບຜິດຊອບໃນການກໍານົດຈໍານວນຂະຫນາດນ້ອຍຂອງ shell ແລະ / ຫຼືສັນຍາລັກ C. ຫນ່ວຍງານໄດ້ຖືກປະກອບ
ຮ່ວມ​ກັນ​ໃນ​ຂັ້ນ​ຕອນ​ສຸດ​ທ້າຍ​, ໃຫ້​ກຽດ​ກັບ​ເສັ້ນ​ສະ​ພາບ​ການ​ເພິ່ງ​ພາ​ອາ​ໄສ (ຫນຶ່ງ​ຫນ່ວຍ​ງານ​ອາດ​ຈະ​ຕ້ອງ​ການ​ຜົນ​ໄດ້​ຮັບ​
ຂອງຫນ່ວຍງານອື່ນໆຈໍານວນຫນຶ່ງທີ່ວາງໄວ້ກ່ອນໃນ script).

ສັນຍາລັກ
ສັນຍາລັກແມ່ນສິ່ງທີ່ສໍາຄັນທີ່ສຸດໃນ metaconfig ໂລກ. ພວກເຂົາແມ່ນນ້ອຍທີ່ສຸດ
ນິຕິບຸກຄົນທີ່ຖືກຮັບຮູ້, ປົກກະຕິແລ້ວເປັນຄໍາ, ແລະສາມາດໄດ້ຮັບຄ່າໃນຕອນທ້າຍຂອງ Configure
ການ​ປະ​ຕິ​ບັດ​. ສໍາລັບຕົວຢ່າງ, ສັນຍາລັກຂອງຕົວປະມວນຜົນ C HAS_RENAME ເປັນ metaconfig ສັນ​ຍາ​ລັກ​ວ່າ​
ແມ່ນຮັບປະກັນທີ່ຈະກໍານົດຖ້າຫາກວ່າ, ແລະພຽງແຕ່ຖ້າຫາກວ່າ, ໄດ້ ປ່ຽນຊື່() ການໂທລະບົບມີຢູ່. ເຊັ່ນດຽວກັນ,
ໄດ້ $ranlib shell variable ຈະຖືກຕັ້ງເປັນ ':' ຫຼື 'ranlib' ຂຶ້ນກັບວ່າ
ໂທຫາໄດ້ ranlib ຕ້ອງການໂຄງການເພື່ອສັ່ງໄຟລ໌ຫ້ອງສະຫມຸດ. ວິທີການນີ້ເຮັດວຽກບໍ່ແມ່ນ
ສໍາ​ຄັນ​ສໍາ​ລັບ​ປັດ​ຈຸ​ບັນ, ສິ່ງ​ທີ່​ສໍາ​ຄັນ​ແມ່ນ​ເພື່ອ​ເຂົ້າ​ໃຈ​ວ່າ​ສັນ​ຍາ​ລັກ​ເຫຼົ່າ​ນັ້ນ​ແມ່ນ​ໄດ້​ຮັບ a ຊີວິດ
(ເຊັ່ນ: ຄ່າ) ຕາມ ກໍາຫນົດຄ່າ ການປະຫານຊີວິດ.

ການນໍາໃຊ້ສັນຍາລັກແມ່ນຂ້ອນຂ້າງກົງໄປກົງມາ. ໃນໄຟລ໌ແຫຼ່ງ C, ທ່ານພຽງແຕ່ໃຊ້ສັນຍາລັກ
ຄ່າ, ເປັນຄໍາສັ່ງກ່ອນໂປເຊດເຊີ (ຕົວຢ່າງ: #ifdef HAS_RENAME) ຫຼື, ຖ້າສັນຍາລັກ
ຄ່າແມ່ນສະຕຣິງ, ໂດຍກົງຕາມທີ່ເຈົ້າຈະໃຊ້ macro ໃນ C. ແລະໃນໄຟລ໌ shell ຫຼື a
Makefile, ທ່ານອາດຈະອ້າງເຖິງສັນຍາລັກຂອງຫອຍໂດຍກົງ.

ແທ້ຈິງແລ້ວ, ຂ້ອຍເວົ້າຕົວະ, ເພາະວ່ານັ້ນບໍ່ແມ່ນຄວາມມະຫັດສະຈັນຄືກັບວັກທີ່ຜ່ານມາ
ສາມາດສຽງ. ໃນໄຟລ໌ C, ທ່ານຈໍາເປັນຕ້ອງປະກອບ Configure-produced config.h ໄຟລ໌, ແລະ
ທ່ານຕ້ອງຫໍ່ Shell script ຫຼື Makefile ຂອງທ່ານໃນໄຟລ໌ .SH ແລະທ່ານອາດຈະອ້າງເຖິງ shell
ສັນ​ຍາ​ລັກ​ພຽງ​ແຕ່​ໃນ​ພາກ​ສ່ວນ​ການ​ທົດ​ແທນ​ຕົວ​ປ່ຽນ​ແປງ​ຂອງ​ໄຟລ​໌ .SH ນັ້ນ​. ເພີ່ມເຕີມກ່ຽວກັບເລື່ອງນີ້ຕໍ່ມາ.

ແຫຼ່ງຂໍ້ມູນ ໄຟ
ສັນຍາລັກອາດຈະປາກົດຢູ່ໃນຊຸດໄຟລ໌ແຫຼ່ງທີ່ຈໍາກັດເທົ່ານັ້ນ, ເພາະວ່າ metaconfig ພຽງແຕ່ຈະ
ສະແກນເຫຼົ່ານັ້ນໃນເວລາທີ່ຊອກຫາສັນຍາລັກທີ່ຮູ້ຈັກ, ພະຍາຍາມຊອກຫາວ່າຫນ່ວຍໃດມັນຈະຕ້ອງການ.
ທ່ານອາດຈະໃຊ້ສັນຍາລັກ C ໃນໄຟລ໌ແຫຼ່ງ C, ເຊັ່ນໄຟລ໌ທີ່ມີ a .c, .h, .y or .l ການຂະຫຍາຍ, ແລະ
ສັນຍາລັກຂອງແກະແມ່ນຊອກຫາຢູ່ໃນໄຟລ໌ .SH ເທົ່ານັ້ນ.

ເພື່ອໃຫ້ໄດ້ຮັບມູນຄ່າຂອງສັນຍາລັກ, ໄຟລ໌ C ຈໍາເປັນຕ້ອງປະກອບມີພິເສດ config.h
ໄຟລ໌, ເຊິ່ງຜະລິດໂດຍ ກໍາຫນົດຄ່າ ເມື່ອມີສັນຍາລັກ C. ແລະໄຟລ໌ .SH ແມ່ນດໍາເນີນການ
ຜ່ານແກະ, ການຜະລິດໄຟລ໌ໃຫມ່. ຢ່າງໃດກໍຕາມ, ໃນສ່ວນເທິງຂອງໄຟລ໌ .SH, ໄດ້
ພິເສດ config.sh ໄຟລ໌ (ຍັງຜະລິດໂດຍການແລ່ນ ກໍາຫນົດຄ່າ) ແມ່ນແຫຼ່ງ, ແລະຕົວແປ
ມີການປ່ຽນແທນ. ຕົວຈິງແລ້ວ, config.h ແມ່ນຜະລິດໂດຍການແລ່ນ metaconfigຜະລິດ
config_h.SH ໄຟລ໌, ອີກເທື່ອຫນຶ່ງໂດຍໃຊ້ຕົວປ່ຽນແທນ. ດັ່ງນັ້ນພວກເຮົາຈະເບິ່ງວ່າ a
ໃກ້ຊິດເລັກນ້ອຍເພາະວ່ານີ້ແມ່ນຫົວໃຈຂອງທັງຫມົດ configuration ໂຄງ​ການ...

ການປ່ຽນແປງ ປ່ຽນແທນ
ມີການກໍ່ສ້າງຫອຍເອີ້ນວ່າ ທີ່ນີ້ ເອກະສານ ເຊິ່ງເຮັດໃຫ້ຄໍາສັ່ງທີ່ຈະເອົາການປ້ອນຂໍ້ມູນ
ລະບຸໄວ້ພາຍໃນສະຄຣິບເອງ. ວັດສະດຸປ້ອນນັ້ນຖືກຕີຄວາມໝາຍໂດຍແກະເປັນສອງ
ສະຕຣິງອ້າງອີງ ຫຼືສະຕຣິງທີ່ຍົກມາອັນດຽວ ຂຶ້ນກັບຮູບແບບຂອງເອກະສານຢູ່ທີ່ນີ້
ຂໍ້ ກຳ ນົດ.

ເພື່ອລະບຸເອກະສານຢູ່ທີ່ນີ້, ໂທເຄັນ '<<' ຖືກໃຊ້, ຕິດຕາມດ້ວຍຕົວລະບຸຕົວດຽວ. ຈາກ
ຫຼັງຈາກນັ້ນ, ເສັ້ນ script ທີ່ຍັງເຫຼືອປະກອບເປັນ input ສໍາລັບຄໍາສັ່ງ, ຈົນກ່ວາທີ່ນີ້
ເອກະສານຖືກພົບເຫັນຢູ່ໃນເສັ້ນດ້ວຍຕົວມັນເອງ. ການທົດແທນ Shell (ລວມທັງຕົວແປຂອງ shell
ການທົດແທນ) ແມ່ນເຮັດໄດ້ເວັ້ນເສຍແຕ່ວ່າຕົວລະບຸຈະຖືກອ້ອມຮອບດ້ວຍວົງຢືມດຽວ. ຕົວ​ຢ່າງ:

var='ທຳອິດ'
tar='ວິນາທີ'
echo "--> ທໍາອິດທີ່ນີ້ເອກະສານ:"
cat <
var='$var'
tar='$tar'
OEM
echo "--> ເອກະສານທີສອງທີ່ນີ້:"
cat <<'EOM'
ສະທ້ອນ $var
ສະທ້ອນ $tar
OEM
echo "--> ສິ້ນສຸດ."

ຈະຜະລິດ, ເມື່ອແລ່ນຜ່ານແກະ:

--> ທໍາອິດທີ່ນີ້ເອກະສານ:
var='ທຳອິດ'
tar='ວິນາທີ'
--> ເອກະສານທີສອງຢູ່ທີ່ນີ້:
ສະທ້ອນ $var
ສະທ້ອນ $tar
--> ສິ້ນສຸດ.

ເອກະສານທໍາອິດຢູ່ທີ່ນີ້ມີເນື້ອໃນຂອງມັນຕີຄວາມໃນຂະນະທີ່ເອກະສານທີສອງແມ່ນຜົນຜະລິດຕາມທີ່ເປັນຢູ່.
ທັງສອງມີປະໂຫຍດໃນ .SH script, ດັ່ງທີ່ພວກເຮົາກໍາລັງຈະເຫັນ.

ການນໍາໃຊ້ .SH Scripts
A .SH script ປົກກະຕິແລ້ວແມ່ນຜະລິດໂດຍການແລ່ນ the ເຮັດໃຫ້SH script ໄຟລ໌ທີ່ມີຢູ່ແລ້ວ,
ການປ່ຽນແປງ ເອກະສານ into a file.SH. ໃຫ້​ເຮົາ​ໃຊ້​ຕົວ​ຢ່າງ​ດຽວ. ນີ້ແມ່ນ script ນ້ອຍ
(ໃຫ້ໂທຫາມັນ ຂະໜາດ) ທີ່ພິມຂໍ້ຄວາມດຽວ, ຂະຫນາດຂອງ int ປະ​ເພດ​ຂໍ້​ມູນ​ໃນ C.
ແຕ່ຫນ້າເສຍດາຍ, ມັນມີມູນຄ່າ hardwired ໃນມັນ, ດັ່ງນັ້ນ:

#!/ ຖັງ / sh
intsize='4'
echo "ໃນເຄື່ອງນີ້, ປະເພດ int ແມ່ນ $intsize bytes"

ໃຫ້ແລ່ນ ເຮັດໃຫ້SH ໃສ່ມັນໂດຍການພິມ 'ເຮັດໃຫ້SH ຂະໜາດ'. ພວກເຮົາໄດ້ຮັບອັນດຽວ intsize.SH file ທີ່
ເບິ່ງຄືແນວນີ້:

ກໍລະນີ $CONFIG ໃນ
'')
ຖ້າທົດສອບ -f config.sh; ຈາກນັ້ນ TOP=.;
elif ການທົດສອບ -f ../config.sh ; ແລ້ວ TOP=..;
elif ການທົດສອບ -f ../../config.sh ; ແລ້ວ TOP=../ ..;
elif ການທົດສອບ -f ../../../config.sh ; ແລ້ວ TOP=../../..;
elif ການທົດສອບ -f ../../../../config.sh ; ແລ້ວ TOP=../../../..;
ອື່ນ
echo "ບໍ່ສາມາດຊອກຫາ config.sh."; ທາງອອກ 1
fi
. $TOP/config.sh
;;
ວ່າ C
: ນີ້ບັງຄັບໄຟລ໌ SH ເພື່ອສ້າງເປົ້າຫມາຍໃນໄດເລກະທໍລີດຽວກັນກັບໄຟລ໌ SH.
: ນີ້ແມ່ນເພື່ອໃຫ້ການເພິ່ງພາອາໄສສະເຫມີຮູ້ບ່ອນທີ່ຈະຊອກຫາ SH derivatives.
ກໍລະນີ "$ 0" ໃນ
*/*) cd `expr X$0 : 'X\.*\)/'` ;;
ວ່າ C
echo "ສະກັດ intsize (ມີການປ່ຽນແທນຕົວແປ)"
: ພາກສ່ວນນີ້ຂອງໄຟລ໌ຈະມີການປ່ຽນຕົວແປທີ່ເຮັດໄດ້ໃນມັນ.
: ຍ້າຍອັນໃດກໍໄດ້ທີ່ຕ້ອງການ config subs ຈາກ !NO!SUBS! ພາກສ່ວນ !GROK!ນີ້!.
: ປົກປ້ອງສັນຍານເງິນໂດລາ ແລະ backticks ທີ່ທ່ານບໍ່ຕ້ອງການຕີຄວາມໝາຍ
: ໂດຍການວາງ backslash ຢູ່ທາງຫນ້າ. ເຈົ້າສາມາດລຶບຄຳເຫັນເຫຼົ່ານີ້ໄດ້.
$spitshell >intsize <
$startsh
!ດີ!ນີ້!

: ໃນໂດລາຕໍ່ໄປນີ້ແລະ backticks ບໍ່ຈໍາເປັນຕ້ອງ backslash ພິເສດ.
$spitshell >>intsize <<'!NO!SUBS!'
intsize='4'
echo "ໃນເຄື່ອງນີ້, ປະເພດ int ແມ່ນ $intsize bytes"
!ບໍ່!ສະໝັກ!
chmod 755 intsize
$euicefix intsize

ສ່ວນທໍາອິດຂອງ script ນີ້ (ໃນ ກໍລະນີ ຖະແຫຼງການ) ກໍາລັງພະຍາຍາມຊອກຫາສະຖານທີ່ config.sh
ໄຟລ໌, ໃນຄໍາສັ່ງທີ່ຈະແຫຼ່ງມັນ. ໄດ້ $CONFIG ຕົວແປແມ່ນ false ໂດຍຄ່າເລີ່ມຕົ້ນ, ໂດຍ true ເມື່ອ
config.sh ໄດ້​ມາ​ແລ້ວ (ຊຶ່ງ​ຈະ​ເປັນ​ກໍ​ລະ​ນີ​ຖ້າ​ຫາກ​ວ່າ​ໄຟລ​໌​ນີ້​ໄດ້​ຖືກ​ປະ​ຕິ​ບັດ​ຈາກ​
ພາຍໃນ ກໍາຫນົດຄ່າ ຕົວຂອງມັນເອງ, ແຕ່ບໍ່ໃຫ້ confuse ບັນຫາທີ່ນີ້).

ເມື່ອໃດ config.sh ໄຟລ໌ແມ່ນແຫຼ່ງ, ສັນຍາລັກ shell ທັງຫມົດທີ່ກໍານົດໂດຍ ກໍາຫນົດຄ່າ ມີ
ຕັ້ງ. ພວກເຮົາຮູ້ວ່າສາມາດບັນລຸຄໍາຖະແຫຼງການກໍລະນີທີສອງ, ໃຊ້ເພື່ອປ່ຽນບັນຊີປະຈຸບັນຄວນຈະເປັນ
ເສັ້ນທາງຖືກໃຊ້ເພື່ອເຂົ້າຫາໂຄງການນີ້ (ຕົວຢ່າງຖ້າພວກເຮົາເວົ້າວ່າ 'sh ../scripts/intsize.SH', ພວກເຮົາ
ທໍາອິດຈະແລ່ນ 'cd ../scripts' ກ່ອນ​ທີ່​ຈະ​ສືບ​ຕໍ່​)​. ຖ້າເຈົ້າບໍ່ເຂົ້າໃຈເລື່ອງນີ້, ຢ່າເຮັດ
ກັງວົນກ່ຽວກັບມັນ.

ມານີ້ສິ່ງທີ່ໜ້າສົນໃຈ. script ນີ້ໃຊ້ $spitshell ຕົວແປ, ແລະມັນບໍ່ແມ່ນ
ບາງສິ່ງບາງຢ່າງທີ່ພວກເຮົາຮູ້ກ່ຽວກັບ ... ຍັງ. ຖ້າ​ຫາກ​ທ່ານ​ເບິ່ງ​ໂດຍ​ຜ່ານ​ໄຟລ​໌​ຄໍາ​ສັບ​, ທ່ານ​ຈະ​ເຫັນ​ວ່າ​
ນີ້ແມ່ນຕົວແປທີ່ຮູ້ຈັກໂດຍ metaconfig. ຖ້າທ່ານເຮັດໃຫ້ໄຟລ໌ນີ້ເປັນສ່ວນຫນຶ່ງຂອງການແຈກຢາຍຂອງທ່ານ
(ໂດຍການລວມເອົາມັນຢູ່ໃນໄຟລ໌ MANIFEST.new, ພວກເຮົາຈະກັບໄປທີ່ນັ້ນໃນພາຍຫຼັງ) ແລະດໍາເນີນການ
metaconfig, ຫຼັງຈາກນັ້ນ ກໍາຫນົດຄ່າ script ຈະກໍານົດຄ່າທີ່ເຫມາະສົມສໍາລັບຕົວແປນີ້
ແລະມັນຈະຖືກຕັ້ງຢູ່ໃນ config.sh. ຄືກັນສໍາລັບ $startsh ແລະຄວາມລຶກລັບ $euicefix at
ຈົບ. ໃນລະບົບທີ່ສົມເຫດສົມຜົນ, ພາກສ່ວນທີ່ກ່ຽວຂ້ອງຂອງ config.sh ຈະ​ເບິ່ງ​ຄື​ນີ້​:

spitshell='ແມວ'
startsh='#!/ ຖັງ / sh'
euicefix=':'

ອ້າວ! ພວກເຮົາກໍາລັງໄປຮອດ. ໃນປັດຈຸບັນມັນເບິ່ງຄືວ່າຄຸ້ນເຄີຍ. ພວກເຮົາກໍາລັງປະເຊີນກັບຄົນດຽວ cat ຄໍາສັ່ງຂອງໃຜ
ການປ້ອນຂໍ້ມູນມາຈາກເອກະສານທີ່ປ່ຽນແປງໄດ້-interpolated ຢູ່ທີ່ນີ້ ແລະຜົນຜະລິດຂອງມັນຖືກໂອນໄປຫາ
ຂະໜາດ. ມູນຄ່າຈະເປັນຂອງ $startsh, ie '#!/ ຖັງ / sh'. ດີມາເຖິງຕອນນັ້ນ.

ຫຼັງຈາກນັ້ນ, ພວກເຮົາໄປເຖິງການຂະຫຍາຍເອກະສານທີ່ສອງທີ່ນີ້, ເພື່ອໃຫ້ໄດ້ຮັບສ່ວນທີ່ເຫຼືອຂອງ script ໄດ້. ນີ້
ທີ່​ໃຊ້​ເວ​ລາ​, ສັນ​ຍາ​ລັກ​ເອ​ກະ​ສານ​ທີ່​ນີ້​ແມ່ນ​ອ້ອມ​ຮອບ​ໄປ​ດ້ວຍ​ວົງ​ຢືມ​ດຽວ​ດັ່ງ​ນັ້ນ​ເນື້ອ​ໃນ​ຈະ​ເປັນ​
ເພີ່ມເຕີມ verbatim ກັບ ຂະໜາດ ໄຟລ໌. ດັ່ງນັ້ນ, ໂດຍການແລ່ນ 'sh intsize.SH', ພວກເຮົາໄດ້ຮັບ
ຜົນ​ຜະ​ລິດ​ດັ່ງ​ຕໍ່​ໄປ​ນີ້​:

ການສະກັດເອົາຂະໜາດ (ດ້ວຍການປ່ຽນແທນຕົວແປ)

ແລະໂດຍການເບິ່ງໄຟລ໌ intsize ທີ່ຜະລິດ, ພວກເຮົາເບິ່ງ:

#!/ ຖັງ / sh
intsize='4'
echo "ໃນເຄື່ອງນີ້, ປະເພດ int ແມ່ນ $intsize bytes"

ຊຶ່ງເປັນສິ່ງທີ່ພວກເຮົາມີຢູ່ໃນຕອນຕົ້ນ. ມາ​ຮອດ​ປະ​ຈຸ​ບັນ, ມັນ​ເປັນ​ຂັ້ນ​ຕອນ​ທີ່​ບໍ່​ມີ​ການ​ດໍາ​ເນີນ​ງານ ...
ແຕ່, ວິເສດ! ມັນເກີດຂຶ້ນດັ່ງນັ້ນ (ບັງເອີນອັນບໍລິສຸດ, ເຊື່ອຂ້ອຍ!), ວ່າ metaconfig ຮູ້ຈັກ
ກ່ຽວ​ກັບ $intsize ສັນຍາລັກຫອຍ. ໂດຍການຍ້າຍການເລີ່ມຕົ້ນຂອງ intsize ໄປຫາຕົວແປ-
interpolated ພື້ນທີ່ຂອງ .SH script ແລະເລີ່ມຕົ້ນມັນດ້ວຍ ກໍາຫນົດຄ່າ- ມູນ​ຄ່າ​ການ​ຄິດ​ໄລ່​,
ແລະການຖອນຄໍາເຫັນທີ່ບໍ່ມີປະໂຫຍດໃນປັດຈຸບັນທີ່ເພີ່ມໂດຍ ເຮັດໃຫ້SH, ພວກເຮົາໄດ້ຮັບ:

ກໍລະນີ $CONFIG ໃນ
'')
ຖ້າທົດສອບ -f config.sh; ຈາກນັ້ນ TOP=.;
elif ການທົດສອບ -f ../config.sh ; ແລ້ວ TOP=..;
elif ການທົດສອບ -f ../../config.sh ; ແລ້ວ TOP=../ ..;
elif ການທົດສອບ -f ../../../config.sh ; ແລ້ວ TOP=../../..;
elif ການທົດສອບ -f ../../../../config.sh ; ແລ້ວ TOP=../../../..;
ອື່ນ
echo "ບໍ່ສາມາດຊອກຫາ config.sh."; ທາງອອກ 1
fi
. $TOP/config.sh
;;
ວ່າ C
ກໍລະນີ "$ 0" ໃນ
*/*) cd `expr X$0 : 'X\.*\)/'` ;;
ວ່າ C
echo "ສະກັດ intsize (ມີການປ່ຽນແທນຕົວແປ)"
$spitshell >intsize <
$startsh
intsize='$intsize'
!ດີ!ນີ້!

$spitshell >>intsize <<'!NO!SUBS!'
echo "ໃນເຄື່ອງນີ້, ປະເພດ int ແມ່ນ $intsize bytes"
!ບໍ່!ສະໝັກ!
chmod 755 intsize
$euicefix intsize

ແນ່ນອນ, ການໃຊ້ script ນີ້ຜ່ານ shell ອີກເທື່ອຫນຶ່ງຈະອອກ script ດຽວກັນ. ແຕ່ຖ້າ
ພວກເຮົາແລ່ນ ກໍາຫນົດຄ່າ ໃນເຄື່ອງທີ່ int ຖືກ​ເກັບ​ຮັກ​ສາ​ໄວ້​ເປັນ​ປະ​ລິ​ມານ 64 bits​, config.sh ຈະ
ທີ່ກໍານົດໄວ້ ຂະໜາດ ເຖິງ 8 ແລະ ຂະໜາດ script ຈະຮັບຜິດຊອບຄ່າທີ່ຖືກຕ້ອງແລະພິມ:

ໃນເຄື່ອງນີ້, ປະເພດ int ແມ່ນ 8 bytes

ເຊິ່ງຖືກຕ້ອງ. ຊົມເຊີຍ! ພວກ​ເຮົາ​ພຽງ​ແຕ່​ໄດ້​ກໍາ​ນົດ​ຄ່າ​ສະ​ຄຣິບ Shell !!

ການຜະລິດ config.h
ດຽວນີ້ພວກເຮົາສາມາດເບິ່ງທາງໄດ້ config.h ແມ່ນຜະລິດອອກຈາກ config_h.SH. ພວກເຮົາຮູ້ວ່າ
ການເຮັດວຽກ ກໍາຫນົດຄ່າ ຜະລິດກ config.sh script (ເຮັດແນວໃດແທ້ນີ້ແມ່ນເຮັດບໍ່ໄດ້ຢ່າງເຂັ້ມງວດ
ທີ່ກ່ຽວຂ້ອງຢູ່ທີ່ນີ້, ແຕ່ສໍາລັບ curious, ມັນເປັນການທົດແທນເອກະສານອື່ນພາຍໃນ
ກໍາຫນົດຄ່າ ຕົວຂອງມັນເອງ). ໄດ້ config_h.SH ຕົວຂອງມັນເອງຖືກສ້າງຂຶ້ນໂດຍ metaconfig ໃນ​ເວ​ລາ​ດຽວ​ກັນ
ກໍາຫນົດຄ່າ ແມ່ນ, ສະຫນອງໃຫ້ທ່ານໃຊ້ຢ່າງຫນ້ອຍຫນຶ່ງສັນຍາລັກ C ພາຍໃນແຫຼ່ງຂອງທ່ານ.

ຂໍໃຫ້ເບິ່ງແບບສຸ່ມ config_h.SH ໄຟລ໌ເພື່ອເບິ່ງສິ່ງທີ່ເກີດຂຶ້ນແທ້ໆ:

ກໍລະນີ $CONFIG ໃນ
'')
ຖ້າທົດສອບ -f config.sh; ຈາກນັ້ນ TOP=.;
elif ການທົດສອບ -f ../config.sh ; ແລ້ວ TOP=..;
elif ການທົດສອບ -f ../../config.sh ; ແລ້ວ TOP=../ ..;
elif ການທົດສອບ -f ../../../config.sh ; ແລ້ວ TOP=../../..;
elif ການທົດສອບ -f ../../../../config.sh ; ແລ້ວ TOP=../../../..;
ອື່ນ
echo "ບໍ່ສາມາດຊອກຫາ config.sh."; ທາງອອກ 1
fi
. $TOP/config.sh
;;
ວ່າ C
ກໍລະນີ "$ 0" ໃນ
*/*) cd `expr X$0 : 'X\.*\)/'` ;;
ວ່າ C
echo "ສະກັດ config.h (ມີການປ່ຽນແທນຕົວແປ)"
sed < config.h -e 's!^#undef!/define!' -e's!^#un-def!#undef!'
/*
* ໄຟລ໌ນີ້ຖືກຜະລິດໂດຍການແລ່ນ script config_h.SH, ເຊິ່ງ
* ໄດ້ຮັບຄ່າຂອງມັນຈາກ config.sh, ເຊິ່ງໂດຍທົ່ວໄປແມ່ນຜະລິດໂດຍ
* ແລ່ນ Configure.
*
* ຮູ້​ສຶກ​ວ່າ​ຟຣີ​ທີ່​ຈະ​ປັບ​ປຸງ​ແກ້​ໄຂ​ໃດໆ​ຂອງ​ນີ້​ຕາມ​ຄວາມ​ຕ້ອງ​ການ​ເກີດ​ຂຶ້ນ​. ຫມາຍເຫດ, ຢ່າງໃດກໍຕາມ,
* ທີ່ແລ່ນ config.h.SH ອີກເທື່ອຫນຶ່ງຈະລົບລ້າງການປ່ຽນແປງໃດໆທີ່ທ່ານໄດ້ເຮັດ.
* ສໍາລັບການປ່ຽນແປງທີ່ຖາວອນກວ່າ ແກ້ໄຂ config.sh ແລະ rerun config.h.SH.
*/

/* ເວລາການຕັ້ງຄ່າ: $cf_time
* ຕັ້ງຄ່າໂດຍ: $cf_by
* ລະບົບເປົ້າໝາຍ: $myuname
*/

#ifndef _config_h_
#define _config_h_

/* ສຳເນົາ:
* ສັນ​ຍາ​ລັກ​ນີ້​ແມ່ນ​ມີ​ແຜນ​ທີ່ memcpy ຖ້າ​ຫາກ​ວ່າ bcopy() routine ບໍ່​ແມ່ນ
* ມີ​ໃຫ້​ສໍາ​ເນົາ​ສາຍ​.
*/
/* HAS_BCOPY:
* ສັນ​ຍາ​ລັກ​ນີ້​ໄດ້​ຖືກ​ກໍາ​ນົດ​ຖ້າ​ຫາກ​ວ່າ bcopy() routine ມີ​ໃຫ້
* ສໍາ​ເນົາ​ຕັນ​ຂອງ​ຄວາມ​ຊົງ​ຈໍາ​. ທ່ານບໍ່ຄວນໃຊ້ສັນຍາລັກນີ້ພາຍໃຕ້
* ສະຖານະການປົກກະຕິແລະໃຊ້ bcopy() ໂດຍກົງແທນ, ເຊິ່ງ
* ຈະ​ໄດ້​ຮັບ​ການ​ສ້າງ​ແຜນ​ທີ່ memcpy() ຖ້າ​ຫາກ​ວ່າ bcopy ບໍ່​ມີ​.
*/
#$d_bcopy HAS_BCOPY /**/
#ifndef HAS_BCOPY
#ifdef bcopy
#un-def bcopy
#ສຸດທ້າຍ
#define bcopy(s,d,l) memcpy((d),(s),(l)) /* mapped to memcpy */
#ສຸດທ້າຍ

/* HAS_DUP2:
* ສັນ​ຍາ​ລັກ​ນີ້​, ຖ້າ​ຫາກ​ວ່າ​ກໍາ​ນົດ​, ສະ​ແດງ​ໃຫ້​ເຫັນ​ວ່າ dup2 routine ແມ່ນ​
* ມີໃຫ້ຊໍ້າກັນກັບຕົວອະທິບາຍໄຟລ໌.
*/
#$d_dup2 HAS_DUP2 /**/

/* I_STRING:
* ສັນ​ຍາ​ລັກ​ນີ້​, ຖ້າ​ຫາກ​ວ່າ​ກໍາ​ນົດ​, ສະ​ແດງ​ໃຫ້​ເຫັນ​ກັບ​ໂຄງ​ການ C ທີ່​ມັນ​ຄວນ​ຈະ​
* ປະ​ກອບ​ມີ​ (ລະບົບ USG) ແທນ (ລະບົບ BSD).
*/
#$i_string I_STRING /**/

#ສຸດທ້າຍ
!ດີ!ນີ້!

ຢູ່ເທິງສຸດຂອງໄຟລ໌, ພວກເຮົາຮັບຮູ້ມາດຕະຖານການກໍ່ສ້າງ .SH ທີ່ພວກເຮົາມີຢູ່ແລ້ວ
ໄດ້ສຶກສາຢ່າງລະອຽດ. ຕໍ່ໄປແມ່ນການສະກັດເອົາໄຟລ໌ຕົວມັນເອງ, ຜ່ານເອກະສານທີ່ນີ້
ການປ່ຽນແທນຕົວແປ. ຢ່າງໃດກໍຕາມ, ໃນທີ່ນີ້ພວກເຮົາບໍ່ໄດ້ໃຊ້ທົ່ງພຽງ cat ເປົ້າ ໝາຍ ມີ sed ແທນທີ່ຈະ, ນັບຕັ້ງແຕ່
ພວກ​ເຮົາ​ຈໍາ​ເປັນ​ຕ້ອງ​ໄດ້​ແກ້​ໄຂ​ບາງ​ຢ່າງ​ເພີ່ມ​ເຕີມ​ກ່ຽວ​ກັບ​ການ​ບິນ​. ພວກເຮົາຈະເບິ່ງວ່າເປັນຫຍັງຕໍ່ມາ, ສະນັ້ນໃຫ້ພວກເຮົາລືມ
ກ່ຽວກັບມັນໃນປັດຈຸບັນ.

ໃນປັດຈຸບັນພວກເຮົາສາມາດບັນລຸຄໍາຄິດເຫັນນໍາ, ແລະໄຟລ໌ໄດ້ຖືກ tagged ກັບເວລາການຕັ້ງຄ່າ, ໄດ້
ລະບົບເປົ້າໝາຍ, ແລະອື່ນໆ... (ຕົວແປເຫຼົ່ານັ້ນມາຈາກແຫຼ່ງທີ່ມາ config.sh ໄຟລ໌ໄດ້
ສ້າງຕັ້ງຂຶ້ນໂດຍ ກໍາຫນົດຄ່າ). ສ່ວນຫົວຄຳເຫັນນັ້ນແມ່ນຕິດຕາມດ້ວຍການປົກປ້ອງ '#ifndef' ເພື່ອປ້ອງກັນ
ຕໍ່ກັບການລວມເອົາຫຼາຍໄຟລ໌ນີ້. ແລ້ວຫົວໃຈຂອງໄຟລ໌ມາ...

ມັນຊ່ວຍໃຫ້ຮູ້ວ່າ $d_* ແລະ $i_* ຕົວແປຖືກຕັ້ງເປັນ 'ກໍານົດ'ຫຼື 'undef'ໂດຍ
ກໍາຫນົດຄ່າ, ຂຶ້ນກັບວ່າຟັງຊັນຫຼືໄຟລ໌ລວມຢູ່ໃນລະບົບຫຼື
ບໍ່. ນັ້ນ ໝາຍ ຄວາມວ່າ:

#$d_bcopy HAS_BCOPY /**/

ສາຍຈະຖືກຂະຫຍາຍເປັນ:

#ກຳນົດ HAS_BCOPY /**/

ຖ້າຕົວແປ $d_bcopy ຖືກຕັ້ງເປັນ 'define' ຫຼື:

#undef HAS_BCOPY /**/

ຖ້າ $d_bcopy ຖືກຕັ້ງເປັນ 'undef', ເພາະວ່າຄຸນສົມບັດບໍ່ໄດ້ຢູ່ທີ່ນັ້ນ. ຢ່າງໃດກໍຕາມ, ມັນບໍ່ແມ່ນ
ສິ່ງທີ່ຂຽນຢູ່ໃນ config.h ໄຟລ໌ເນື່ອງຈາກວ່າ sed ການກັ່ນຕອງທີ່ພວກເຮົາໄດ້ເຫັນແລ້ວ,
ເຊິ່ງຈະປ່ຽນຮູບແບບທີສອງເປັນ:

/*#define HAS_BCOPY /**/

ນັ້ນແມ່ນແບບຟອມທີ່ມີປະໂຫຍດສໍາລັບການດັດແກ້ຕໍ່ມາ config.h ເນື່ອງຈາກວ່າທ່ານພຽງແຕ່ຕ້ອງການທີ່ຈະເອົາອອກ
ນຳໜ້າ '/*' ຖ້າເຈົ້າຕ້ອງການລົບລ້າງ ກໍາຫນົດຄ່າທາງ​ເລືອກ​ຂອງ​. ເຊັ່ນດຽວກັນ, ທ່ານອາດຈະເພີ່ມອັນດຽວ
'/*' ໃນຕອນຕົ້ນຂອງເສັ້ນ '#define' ເພື່ອຫຼີກເວັ້ນການນິຍາມຂອງສັນຍາລັກສະເພາະ.
ນີ້ແມ່ນເຫດຜົນທີ່ວ່າແຕ່ລະຄໍານິຍາມຂອງສັນຍາລັກແມ່ນຖືກປົກປ້ອງໂດຍ '/**/', ເພື່ອປິດຕົວນໍາ
ຄຳເຫັນເປີດໂດຍ '/*' (ຄຳຄິດເຫັນບໍ່ໄດ້ຕິດຢູ່ໃນ C).

ດຽວນີ້ການປ່ຽນ '#undef' ເປັນ '/*#define' ແມ່ນດີ, ແຕ່ຖ້າພວກເຮົາຕ້ອງການຂຽນຕົວຈິງ.
'#undef', ພວກເຮົາຕິດຢູ່ ... ເວັ້ນເສຍແຕ່ວ່າພວກເຮົາຂຽນມັນເປັນ '#un-def' ແລະປ່ອຍໃຫ້ sed ແກ້ໄຂມັນເປັນ '#undef'
ໃນຂະນະທີ່ການຜະລິດ config.h, ຊຶ່ງເປັນສິ່ງທີ່ເຮັດຕົວຈິງຢູ່ທີ່ນີ້.

ປະເພດຂອງເຫດຜົນດຽວກັນໃຊ້ກັບສອງແຖວນັ້ນ:

#$d_dup2 HAS_DUP2 /**/
#$i_string I_STRING /**/

ແລະສົມມຸດຕິຖານ config.sh ນິຍາມ:

d_dup2='ກຳນົດ'
i_string='undef'

ພວກ​ເຮົາ​ຈະ​ໄດ້​ຮັບ​ການ​ຜະ​ລິດ​ໄດ້​ config.h:

#ກຳນົດ HAS_DUP2 /**/
/*#define I_STRING /**/

ສະອາດຄືນ້ຳໄຫຼບໍ? ດີ!

ໃນປັດຈຸບັນມັນຄວນຈະເຫັນໄດ້ຊັດເຈນວ່າໂດຍການລວມເອົາ config.h ໃນໄຟລ໌ແຫຼ່ງ C ຂອງທ່ານທັງຫມົດ, ທ່ານໄດ້ຮັບ
ຮູ້ຫຍັງ ກໍາຫນົດຄ່າ ໄດ້ຄາດເດົາກ່ຽວກັບລະບົບຂອງທ່ານ. ໃນຄວາມເປັນຈິງ, ໂດຍໃຊ້ສັນຍາລັກເຫຼົ່ານັ້ນ, ເຈົ້າແມ່ນ
ການຂຽນລະຫັດ C ທີ່ຖືກຕັ້ງຄ່າ, ນັບຕັ້ງແຕ່ metaconfig ຈະຮູ້ວ່າທ່ານຕ້ອງການສັນຍາລັກເຫຼົ່ານັ້ນແລະຈະ
ສ້າງທີ່ເຫມາະສົມ config_h.SH ໄຟລ໌ເຊັ່ນດຽວກັນກັບລະຫັດທີ່ຈໍາເປັນທັງຫມົດໃນ ກໍາຫນົດຄ່າ to
ຄິດ​ໄລ່​ຄ່າ​ທີ່​ເຫມາະ​ສົມ​ສໍາ​ລັບ​ພວກ​ເຂົາ (ໂດຍ​ການ​ກໍາ​ນົດ​ຄ່າ​ທີ່​ກ່ຽວ​ຂ້ອງ​ກັບ​ຕົວ​ແປ shell).

ເຮັດວຽກ Metaconfig
ໃຫ້ຂອງສຸມໃສ່ການ metaconfig ໂຄງ​ການ​ສໍາ​ລັບ​ການ​ໃນ​ຂະ​ນະ​ທີ່​ຈະ​ເຂົ້າ​ໃຈ​ວິ​ທີ​ການ​ນໍາ​ໃຊ້​ຫົວ​ຫນ່ວຍ​ຂອງ​ຕົນ​ແລະ​
ລະຫັດແຫຼ່ງຂອງທ່ານເພື່ອຜະລິດໄຟລ໌ການຕັ້ງຄ່າທີ່ຈໍາເປັນທັງຫມົດ. ຖ້າເຈົ້າຕັ້ງໃຈຂຽນໃໝ່
ຫນ່ວຍງານ, ທ່ານຄວນມີຄວາມເຂົ້າໃຈດີກ່ຽວກັບໂຄງການທັງຫມົດ.

ຖ້າບໍ່ມີໄຟລ໌ MANIFEST.new, metaconfig ຈະພະຍາຍາມໃຊ້ໄຟລ໌ MANIFEST ແທນ,
ເພື່ອຄວາມສະດວກ. ຢູ່ທຸກບ່ອນທີ່ພວກເຮົາກ່າວເຖິງ MANIFEST.new, ມັນສາມາດເຂົ້າໃຈໄດ້ວ່າ MANIFEST
ສະຫນອງໃຫ້ບໍ່ມີໄຟລ໌ MANIFEST.new ທີ່ພົບເຫັນຢູ່ໃນຮາກຂອງຊຸດຂອງທ່ານ.

ສົມມຸດວ່າໄຟລ໌ MANIFEST.new ຂອງທ່ານຖືກຕັ້ງຢ່າງຖືກຕ້ອງ ແລະລາຍຊື່ໄຟລ໌ຕົ້ນສະບັບທັງໝົດທີ່ທ່ານຕ້ອງການ
configure, ແລະທີ່ທ່ານໄດ້ດໍາເນີນການ ຊອງ ໃນໄດເລກະທໍລີແຫຼ່ງຮາກຂອງເຈົ້າເພື່ອສ້າງ a
. ກະເປົາ ໄຟລ໌, ທ່ານອາດຈະດໍາເນີນການ metaconfig ແລະ​ທ່ານ​ຈະ​ໄດ້​ຮັບ​ດັ່ງ​ຕໍ່​ໄປ​ນີ້​:

$ metaconfig
ກຳລັງຊອກຫາຫົວໜ່ວຍ...
ສະກັດລາຍຊື່ຜູ້ເພິ່ງພາອາໄສ 312 ໜ່ວຍ...
ກຳລັງສະກັດຊື່ໄຟລ໌ (*.[chyl] ແລະ *.SH) ຈາກ MANIFEST.new...
ການສ້າງໄຟລ໌ທີ່ຕ້ອງການ...
ກຳລັງສະແກນໄຟລ໌ .[chyl] ສຳລັບສັນຍາລັກ...
ກຳລັງສະແກນໄຟລ໌ .SH ສຳລັບສັນຍາລັກ...
ກຳລັງຄິດໄລ່ເສັ້ນສະແດງການເພິ່ງພາອາໄສທີ່ດີທີ່ສຸດ...
ການສ້າງໄຟລ໌ສ່ວນຕົວ...
ກຳລັງກຳນົດຫົວໜ່ວຍທີ່ສາມາດໂຫຼດໄດ້...
ກຳລັງອັບເດດສ້າງໄຟລ໌...
ການ​ກໍາ​ນົດ​ຄໍາ​ສັ່ງ​ທີ່​ຖືກ​ຕ້ອງ​ສໍາ​ລັບ​ຫນ່ວຍ​ງານ ...
ກຳລັງສ້າງການຕັ້ງຄ່າ...
ເຮັດ.

ໄລຍະທໍາອິດຊອກຫາໄຟລ໌ຫນ່ວຍງານທັງຫມົດ (ລົງທ້າຍດ້ວຍ .U) ໃນບັນຊີສາທາລະນະ
ທໍາອິດ, ຫຼັງຈາກນັ້ນຢູ່ໃນເອກະຊົນຂອງເຈົ້າ. ຖ້າທ່ານຄັດລອກໄຟລ໌ສາທາລະນະຢູ່ໃນໄດເລກະທໍລີ U ສ່ວນຕົວຂອງທ່ານ
(ie ໄດເລກະທໍລີທີ່ມີຊື່ U ໃນລະດັບສູງສຸດຂອງຊຸດຂອງທ່ານ), ມັນຈະ override ສາທາລະນະ
ສະບັບ. ເມື່ອມັນມີບັນຊີລາຍຊື່ຂອງຫນ່ວຍງານທັງຫມົດທີ່ມີຢູ່, ມັນແຍກພວກມັນແລະສະກັດເອົາທັງຫມົດ
the ?MAKE: ເສັ້ນທີ່ຈະຮູ້ກ່ຽວກັບການເພິ່ງພາອາໄສ ແລະສັນຍາລັກຂອງຫອຍທີ່ຮູ້ຈັກ. ມັນຍັງ
ເນັ້ນໃສ່ເສັ້ນ ?H: ເພື່ອຮຽນຮູ້ກ່ຽວກັບສັນຍາລັກ C ແລະສັນຍາລັກຂອງຫອຍໃດທີ່ຈະຕ້ອງມີ
ຄິດໄລ່ເພື່ອໃຫ້ໄດ້ຄ່າທີ່ເຫມາະສົມສໍາລັບສັນຍາລັກ C ນັ້ນ (ດັ່ງນັ້ນພວກເຮົາມີລະດັບການຂຶ້ນກັບອີກ
ທີ່ນີ້).

ຕໍ່ໄປ, ຊື່ໄຟລ໌ທີ່ຖືກຕ້ອງຖືກສະກັດອອກຈາກໄຟລ໌ MANIFEST.new ແລະ a ຕ້ອງການ file ແມ່ນ
ສ້າງຂຶ້ນ: ໄຟລ໌ນັ້ນຈະລາຍຊື່ສັນຍາລັກ C ແລະສັນຍາລັກຂອງຫອຍທັງໝົດທີ່ຈໍາເປັນສໍາລັບຊຸດນັ້ນ. ພວກເຮົາ
ທໍາອິດສະແກນໄຟລ໌ປະເພດ C ສໍາລັບສັນຍາລັກ C, ຫຼັງຈາກນັ້ນເຜີຍແຜ່ການຂື້ນກັບພວກມັນ
ສັນຍາລັກຂອງຫອຍທີ່ກ່ຽວຂ້ອງ (ລວບລວມມາຈາກ ?H: ເສັ້ນ). ຕໍ່ໄປ .SH ໄຟລ໌ໄດ້ຖືກສະແກນແລະສຸດທ້າຍ
ສັນຍາລັກຂອງຫອຍທັງຫມົດແມ່ນເປັນທີ່ຮູ້ຈັກ.

Makefile ຊົ່ວຄາວຖືກສ້າງຂຶ້ນແລະ metaconfig ພະຍາຍາມ ເຮັດໃຫ້ ສັນຍາລັກຫອຍທັງຫມົດເພື່ອເບິ່ງ
ຄຳສັ່ງອັນໃດ (ຢູ່ໃນລາຍການທີສອງ ? MAKE: ແຖວ) ຖືກປະຕິບັດ, ແລະດັ່ງນັ້ນ ໜ່ວຍໃດແມ່ນ
ຕ້ອງການແທ້ໆ. ຫນ່ວຍທາງເລືອກທີ່ບໍ່ຈໍາເປັນຖືກໂຍກຍ້າຍອອກແລະ Makefile ທີສອງແມ່ນ
ສ້າງຂຶ້ນ. ເວລານີ້, ພວກເຮົາຮູ້ກ່ຽວກັບຫນ່ວຍງານທັງຫມົດແລະຄໍາສັ່ງຂອງເຂົາເຈົ້າ, ທາງເລືອກ
ຫນ່ວຍງານໄດ້ຖືກໂຍກຍ້າຍອອກແລະຄ່າເລີ່ມຕົ້ນຖືກຄິດໄລ່ສໍາລັບສັນຍາລັກຂອງແກະຂອງພວກເຂົາ. ໄດ້
ກໍາຫນົດຄ່າ script ສາມາດສ້າງຫຼັງຈາກນັ້ນ, ພ້ອມກັບ config_h.SH. ພວກເຮົາສຳເລັດແລ້ວ.

ອະນຸສັນຍາ
ສົນທິສັນຍາທີ່ເຫມາະສົມຕ້ອງໄດ້ຮັບການປະຕິບັດຕາມເພື່ອເຮັດໃຫ້ຂະບວນການທັງຫມົດມີສຽງ. ມີກໍລະນີ
ສົນທິສັນຍາສຳລັບຫົວໜ່ວຍ ແລະສົນທິສັນຍາການຕັ້ງຊື່ແບບປ່ຽນແປງໄດ້.

ຫົວໜ່ວຍທັງໝົດຄວນມີຕົວອັກສອນຕົວພິມນ້ອຍຕົວພິມນ້ອຍ, ເວັ້ນເສຍແຕ່ເປັນຫົວໜ່ວຍພິເສດ. ໂດຍ
ພິເສດ, ພວກເຮົາຫມາຍຄວາມວ່າພວກເຂົາບໍ່ໄດ້ກໍານົດຕົວແປ shell ໃຫມ່ທີ່ສາມາດນໍາໃຊ້ໄດ້
ຜູ້​ໃຊ້​ໃນ​ໄຟລ​໌ .SH ຂອງ​ຕົນ​, ແຕ່​ແທນ​ທີ່​ຈະ​ເປັນ​ຫນ່ວຍ​ງານ​ຜະ​ລິດ​ສະ​ຄິບ​ຫຼື​ຕົວ​ແປ​ຂອງ​ແກະ​ທີ່​ຈະ​
ຖືກນໍາໃຊ້ພາຍໃນໂດຍ ກໍາຫນົດຄ່າ ສະຄຣິບ. ຕົວຢ່າງທົ່ວໄປແມ່ນ Init.U ໄຟລ໌ຊຶ່ງເປັນ
ການເລີ່ມຕົ້ນຕົວແປຕົ້ນຕໍ, ຫຼື Myread.U ເຊິ່ງຜະລິດ ອ່ານຂອງຂ້ອຍ script ໃຊ້ເກືອບ
ຢູ່ທົ່ວທຸກແຫ່ງໃນ ກໍາຫນົດຄ່າ ເມື່ອຄໍາຖາມຖືກຖາມກັບຜູ້ໃຊ້.

ຫົວໜ່ວຍທີ່ບໍ່ແມ່ນພິເສດຫຼັງຈາກນັ້ນແບ່ງອອກເປັນສອງກຸ່ມທີ່ແຕກຕ່າງກັນ: ຫົວໜ່ວຍກໍານົດຕົວແປ
ກ່ຽວຂ້ອງກັບສັນຍາລັກ C ແລະຫນ່ວຍງານກໍານົດຕົວແປຂອງແກະຂອງຕົນເອງ. ກຸ່ມທໍາອິດ
ຖືກແບ່ງອອກຕື່ມອີກໃນຕົວແປທີ່ກ່ຽວຂ້ອງກັບການລວມໄຟລ໌ (ຊື່ຂອງພວກເຂົາເລີ່ມຕົ້ນດ້ວຍ i_) ແລະ
ຕົວແປທີ່ກ່ຽວຂ້ອງກັບຄໍານິຍາມອື່ນໆ (ຊື່ເລີ່ມຕົ້ນດ້ວຍ d_). ກຸ່ມທີສອງມີ
ຊື່ຢືນສໍາລັບຕົວມັນເອງ, ສໍາລັບຕົວຢ່າງ cc.U ກໍານົດ $cc ຕົວແປ shell ທີ່ມີຄ່າ
C compiler ທີ່ຈະໃຊ້.

ຫນ່ວຍງານພິເສດບາງຄັ້ງສະຫງວນຕົວເອງບາງຕົວແປທີ່ກໍານົດໄວ້ລ່ວງຫນ້າແລະສົ່ງ "ຜົນໄດ້ຮັບ"
ໃນຕົວແປທີ່ຮູ້ຈັກອື່ນໆ. ສໍາລັບຕົວຢ່າງ, ໄດ້ ອ່ານຂອງຂ້ອຍ script ທີ່ຜະລິດໂດຍ Myread.U
ຄາດຫວັງວ່າການກະຕຸ້ນເຕືອນໃນ $rp, ຄໍາຕອບເລີ່ມຕົ້ນໃນ $dflt ແລະວາງຄໍາຕອບຂອງຜູ້ໃຊ້ $ans.
ນີ້ບໍ່ໄດ້ບັນທຶກໄວ້ໃນຫນ້າຄູ່ມືນີ້: ທ່ານຕ້ອງໄປແລະເບິ່ງຫນ່ວຍງານຂອງມັນເອງ
ເຂົ້າໃຈວ່າຕົວແປໃດຖືກນໍາໃຊ້ແລະວິທີການນໍາໃຊ້ຫນ່ວຍງານ.

ການນໍາໃຊ້ ໄດ້ ຄໍາແປສັບ
ໄຟລ​໌​ຄໍາ​ສັບ​ແມ່ນ​ຜະ​ລິດ​ຕະ​ພັນ​ອັດ​ຕະ​ໂນ​ມັດ​ໂດຍ​ ແສງສີ script, ເຊິ່ງສະກັດເອົາ
ຂໍ້ມູນຈາກ ?S:, ?C: ແລະ ?MAKE: ເສັ້ນ ແລະປ່ຽນຮູບແບບເປັນຕົວອັກສອນ
ຄໍາ​ສັບ​ທີ່​ຈັດ​ລຽງ​ລໍາ​ດັບ​. ມັນເປັນສິ່ງ ສຳ ຄັນທີ່ຈະອ່ານ ຄຳ ສັບເພື່ອຮູ້ກ່ຽວກັບສັນຍາລັກທີ່ເຈົ້າເປັນ
ອະນຸຍາດໃຫ້ນໍາໃຊ້. ຢ່າງໃດກໍຕາມ, ຄໍາສັບຄໍາສັບຈະບໍ່ບອກທ່ານວິທີການນໍາໃຊ້ພວກມັນ. ປົກກະຕິແລ້ວ, ນັ້ນແມ່ນ
ແລ້ວ​ແຕ່​ເຈົ້າ.

ມື້ຫນຶ່ງ, ເຈົ້າອາດຈະຂຽນຫົວຫນ່ວຍຂອງຕົນເອງແລະເຈົ້າຈະຮູ້ພຽງພໍ metaconfig
ເພື່ອ​ເຮັດ​ແນວ​ນັ້ນ​ຢ່າງ​ວ່ອງ​ໄວ​ແລະ​ປະ​ສິດ​ທິ​ຜົນ​. ແນວໃດກໍ່ຕາມ, ຢ່າລືມໃສ່ເອກະສານວຽກຂອງເຈົ້າໃຫ້ຖືກຕ້ອງ
ເສັ້ນ ?S: ແລະ ?C: ຫຼື ຄົນອື່ນໆຈະບໍ່ສາມາດນຳໃຊ້ມັນຄືນໃໝ່ໄດ້. ຈືຂໍ້ມູນການກ່ຽວກັບການ
ເວລາທີ່ທ່ານມີພຽງຄຳສັບ ແລະໜ້າຄູ່ມືນີ້ເພື່ອເລີ່ມຕົ້ນ.

ສະຫຼຸບ
ໃນປັດຈຸບັນທີ່ທ່ານຮູ້ຈັກ metaconfig ພື້ນຖານ, ທ່ານຄວນອ່ານ ລາຍລະອຽດ ພາກສ່ວນ, ຫຼັງຈາກນັ້ນ
ຂ້າມໄປຫາ ການອ້າງອິງ ພາກເພື່ອຮຽນຮູ້ກ່ຽວກັບລາຍລະອຽດ gory ທັງຫມົດເຊັ່ນ: ອະນຸຍາດ
syntax ສໍາລັບເສັ້ນຄວບຄຸມຫນ່ວຍງານ (ສາຍເລີ່ມຕົ້ນດ້ວຍ '?') ຫຼືຄໍາສັ່ງ MAKE ທີ່ແຕກຕ່າງກັນ
ທ່ານໄດ້ຮັບອະນຸຍາດໃຫ້ນໍາໃຊ້.

ການອ້າງອິງ


ພາກສ່ວນນີ້ເອກະສານພາຍໃນຂອງ metaconfig, ໂດຍພື້ນຖານແລ້ວ syntax ຫນ່ວຍ, ພິເສດ
ຫນ່ວຍງານທີ່ທ່ານຄວນຮູ້ກ່ຽວກັບແລະໄຟລ໌ຄໍາແນະນໍາ.

ໂດຍ​ທົ່ວ​ໄປ ຫນ່ວຍບໍລິການ syntax
ຫນ່ວຍບໍລິການ metaconfig ແບ່ງອອກເປັນສອງສ່ວນທີ່ແຕກຕ່າງກັນ. ພາກສ່ວນຫົວ (ແຖວເລີ່ມຕົ້ນ
ດ້ວຍ '?') ແລະພາກສ່ວນ shell (ລະຫັດທີ່ຈະລວມຢູ່ໃນ ກໍາຫນົດຄ່າ script). ມັນ​ແມ່ນ
ສາມາດເພີ່ມ '?X:' ຄຳເຫັນຢູ່ບ່ອນໃດກໍໄດ້ພາຍໃນໜ່ວຍ, ແຕ່ອີກອັນໜຶ່ງ '?' ສາຍ (ຍັງ
ເອີ້ນວ່າ ການຄວບຄຸມ ສາຍ) ມີ​ນະ​ໂຍ​ບາຍ​ການ​ສັ່ງ​ທີ່​ເຄັ່ງ​ຄັດ​.

ຖ້າເສັ້ນຄວບຄຸມຍາວເກີນໄປ, ມັນເປັນໄປໄດ້ທີ່ຈະໃຊ້ການສືບຕໍ່ໂດຍການຫລົບຫນີສຸດທ້າຍ
new-line ທີ່ມີ backslash ແລະສືບຕໍ່ໃນແຖວຕໍ່ໄປ (ເຊິ່ງຫຼັງຈາກນັ້ນຄວນຈະຖືກຫຍໍ້ຫນ້າ
ໂດຍຍະຫວ່າງ ຫຼືແຖບ).

ຕໍ່ໄປນີ້ແມ່ນຄໍາອະທິບາຍຢ່າງເປັນທາງການຂອງແຕ່ລະສາຍການຄວບຄຸມ. ເວັ້ນເສຍແຕ່ໄດ້ລະບຸໄວ້
ຖ້າບໍ່ດັ່ງນັ້ນ, ຄໍາສັ່ງຂອງການນໍາສະເຫນີນີ້ແມ່ນຄໍາສັ່ງທີ່ຈະນໍາໃຊ້ພາຍໃນຫນ່ວຍງານ.

?RCS: ຟຣີ ຂໍ້ຄວາມ
ເພື່ອໃຊ້ສໍາລັບຄໍາເຫັນ RCS, ຢູ່ເທິງສຸດຂອງຫນ່ວຍງານ.

?X: ໃດ ຂໍ້ຄວາມ
ຄໍາ​ເຫັນ​ຈຸດ​ປະ​ສົງ​ທົ່ວ​ໄປ​. ອາດຈະປາກົດຢູ່ບ່ອນໃດກໍໄດ້ໃນຫນ່ວຍງານ ແຕ່ຕ້ອງຖືກປະໄວ້ຢ່າງສົມເຫດສົມຜົນ.
ສຳລັບຄຳເຫັນຂອງ RCS, ກະລຸນາໃຊ້ແບບຟອມຄຳເຫັນ ?RCS.

?ເຮັດ:ສັນຍາລັກ ບັນຊີລາຍຊື່: ການເພິ່ງພາອາໄສ ບັນຊີລາຍຊື່ [+ທາງເລືອກ]
ນີ້ແມ່ນເສັ້ນການເພິ່ງພາອາໄສອັນທໍາອິດ. ທໍາອິດ ສັນຍາລັກ ບັນຊີລາຍຊື່ ຄວນບອກສັນຍາລັກທັງຫມົດ
ສ້າງໂດຍຫນ່ວຍງານນີ້ (ເຊັ່ນວ່າມູນຄ່າຂອງມັນໄດ້ຖືກຄິດໄລ່ໂດຍສ່ວນແກະຂອງຫນ່ວຍງານ).
ສັນຍາລັກຄວນຖືກແຍກອອກຈາກພື້ນທີ່. ຖ້າສັນຍາລັກທີ່ກໍານົດແມ່ນສໍາລັບການນໍາໃຊ້ພາຍໃນເທົ່ານັ້ນແລະ
ບໍ່ຄວນປາກົດຢູ່ໃນທີ່ສ້າງຂຶ້ນ config.sh ໄຟລ໌, ຫຼັງຈາກນັ້ນມັນຄວນຈະຖືກນໍາຫນ້າດ້ວຍ a
'+' (ບໍ່ຕ້ອງສັບສົນກັບຕົວອ້າງອີງທາງເລືອກທີ່ກຳນົດໄວ້ຕໍ່ໄປນີ້). ທີ່​ສອງ
ສ່ວນຫນຶ່ງຂອງບັນຊີລາຍຊື່ (ຫຼັງຈາກກາງ ':') ແມ່ນການຂຶ້ນກັບຫນ່ວຍງານ. ມັນຄວນຈະລາຍຊື່ທັງຫມົດ
ຫນ່ວຍງານພິເສດທີ່ຈໍາເປັນ, ເຊັ່ນດຽວກັນກັບສັນຍາລັກທັງຫມົດທີ່ໃຊ້ໂດຍແກະ
ການຈັດຕັ້ງປະຕິບັດ. ຖ້າສັນຍາລັກຖືກ nedded ແຕ່ຄ່າການຕັ້ງຄ່າຂອງມັນບໍ່ສໍາຄັນ, ມັນ
ສາມາດຖືກນໍາຫນ້າດ້ວຍ '+', ໃນກໍລະນີນີ້ມັນຖືກເອີ້ນວ່າການຂຶ້ນກັບເງື່ອນໄຂ: ຂອງມັນ
ຫນ່ວຍງານທີ່ສອດຄ້ອງກັນຈະຖືກໂຫລດຖ້າ, ແລະພຽງແຕ່ຖ້າ, ສັນຍາລັກນັ້ນແມ່ນຖ້າບໍ່ດັ່ງນັ້ນແທ້ໆ
ຕ້ອງການ; ຖ້າບໍ່ດັ່ງນັ້ນຄ່າເລີ່ມຕົ້ນຈະຖືກໃຊ້.

?ເຮັດ:ແຖບ ຄໍາສັ່ງ
ສາມາດມີເສັ້ນຄໍາສັ່ງຫນຶ່ງຫຼືຫຼາຍປະຕິບັດຕາມເສັ້ນການຂຶ້ນກັບເບື້ອງຕົ້ນ. ເຫຼົ່ານັ້ນ
ຄໍາສັ່ງຈະຖືກປະຕິບັດເມື່ອຫນ່ວຍງານຕ້ອງການໂຫລດພວກມັນໃສ່ ກໍາຫນົດຄ່າ, ທະເລສາບ
ວັກກ່ຽວກັບການເຮັດໃຫ້ຄໍາສັ່ງສໍາລັບຂໍ້ມູນເພີ່ມເຕີມ. ໃຫ້ສັງເກດວ່າຊັ້ນນໍາ ແຖບ
ລັກສະນະແມ່ນຕ້ອງການກ່ອນທີ່ຈະ ຄໍາສັ່ງ.

?Y:ຮູບແບບ
ປະກາດຄຳແນະນຳການຈັດວາງສຳລັບໜ່ວຍນີ້. ຄຳສັ່ງນັ້ນອາດເປັນສາຍໜຶ່ງ
top, Default or ທາງລຸ່ມ (ກໍລະນີບໍ່ສໍາຄັນ, ແບບທີ່ແນະນໍາແມ່ນການສະກົດຄໍາ
ຕົວພິມໃຫຍ່). ຖ້າຖືກລະເວັ້ນ, Default ແມ່ນສົມມຸດ.

ຄໍາສັ່ງນີ້ແມ່ນຕ້ອງການພຽງແຕ່ຖ້າທ່ານຕ້ອງການບັງຄັບຫນ່ວຍງານຢູ່ເທິງສຸດຫຼືດ້ານລຸ່ມ
ຂອງ​ການ​ຜະ​ລິດ​ໄດ້​ ກໍາຫນົດຄ່າ script, ຍ້ອນວ່າການຂຶ້ນກັບຫນ່ວຍງານອະນຸຍາດໃຫ້ມັນ. ສຳຄັນ
ຄໍາຖາມດັ່ງກ່າວອາດຈະຖືກບັງຄັບໃນຕອນເລີ່ມຕົ້ນ. ພາຍໃນຫ້ອງຮຽນຮູບແບບດຽວກັນ, ຫນ່ວຍງານ
ຖືກຈັດຮຽງຕາມຕົວອັກສອນທີ່ມີສອງກໍລະນີພິເສດສໍາລັບຫນ່ວຍ d_* ແລະ i_*, ບັງຄັບ
ຕາມລໍາດັບຢູ່ເທິງສຸດແລະລຸ່ມຂອງຫ້ອງຮຽນຂອງພວກເຂົາ (ແຕ່ສິ່ງເຫຼົ່ານີ້ຄວນຈະເປັນຂອງ
ຫ້ອງຮຽນເລີ່ມຕົ້ນ).

ມັນເຈົ້າບັງຄັບໃຫ້ຢູ່ເທິງສຸດຂອງຫນ່ວຍງານທີ່ມີຄວາມເພິ່ງພາອາໄສຕ້ອງການຫນ່ວຍງານອື່ນໆທັງຫມົດ
ກ່ອນຫນ້າມັນ, ທ່ານບັນລຸບໍ່ມີຫຍັງທີ່ຫນ້າສົນໃຈ. ເພາະສະນັ້ນ, ຄໍາສັ່ງນັ້ນຄວນຢ່າງແທ້ຈິງ
ຖືກນໍາໃຊ້ເພື່ອເພີ່ມຄວາມສໍາຄັນຂອງບາງຫນ່ວຍງານແບບໂຕ້ຕອບທີ່ບໍ່ຂຶ້ນກັບຈໍານວນຫຼາຍ
ສັນ​ຍາ​ລັກ​ທີ່​ຜູ້​ໃຊ້​ສັງ​ເກດ​ເຫັນ​ອື່ນໆ, ເຊັ່ນ​: ຄໍາ​ຖາມ​ທີ່​ກ່ຽວ​ຂ້ອງ​ກັບ​ເສັ້ນ​ທາງ.

?S:symbol_name [(ລ້າສະໄຫມ ສັນຍາລັກ ບັນຊີລາຍຊື່)]:
ແນະນຳສັນຍາລັກແກະ. ແຖວທຳອິດນີ້ຕັ້ງຊື່ສັນຍາລັກ, ເລືອກຕາມດ້ວຍ a
ລາຍຊື່ທີ່ປິດຢູ່ລະຫວ່າງວົງເລັບ ແລະໃຫ້ທຽບເທົ່າທີ່ລ້າສະໄຫມ. ລ້າສະໄຫມເຫຼົ່ານັ້ນ
ສັນຍາລັກຈະຖືກ remapped ເປັນໃຫມ່ symbol_name ຖ້າຫາກວ່າ -o ທາງ​ເລືອກ​ແມ່ນ​ໄດ້​ຮັບ​ການ​ໃຫ້​
metaconfig.

?S:ໃດ ຂໍ້​ຄວາມ, ສໍາລັບການ ຄໍາແປສັບ
ໂດຍພື້ນຖານແລ້ວຄໍາຄິດຄໍາເຫັນທີ່ອະທິບາຍສັນຍາລັກຂອງແກະ, ເຊິ່ງຈະຖືກສະກັດໂດຍ ແສງສີ
ເຂົ້າໄປໃນເອກະສານຄໍາສັບ.

?S:. ປິດຄຳເຫັນສັນຍາລັກຂອງຫອຍ.

?C:symbol_name [~ alias][(ລ້າສະໄຫມ ສັນຍາລັກ ບັນຊີລາຍຊື່)]:
ແນະນຳສັນຍາລັກ C ໃໝ່. ໄດ້ alias ຊື່ແມ່ນຊື່ພາຍໃຕ້ສັນຍາລັກ C
ໄດ້​ຮັບ​ການ​ຄວບ​ຄຸມ​, ເຊັ່ນ​: ຖ້າ​ຫາກ​ວ່າ​ alias ສັນຍາລັກແມ່ນຕ້ອງການ, ຫຼັງຈາກນັ້ນສັນຍາລັກ C ຈະຖືກຂຽນ
ໃນ config_h.SH ໄຟລ໌. ໂດຍປົກກະຕິແລ້ວ, ນາມແຝງແມ່ນພຽງແຕ່ '%<' (ຫຍໍ້ມາຈາກຊື່ຂອງໜ່ວຍ)
ແລະຍັງມີ ?W: line mapping a C symbol to the alias. ຍັງພາກສ່ວນທີ່ກ່ຽວຂ້ອງ
ຂອງ ?H: ສາຍຖືກປົກປ້ອງຢ່າງຈະແຈ້ງໂດຍເງື່ອນໄຂ '?%<'. ເບິ່ງສັນຍາລັກ
ຫຍໍ້ໜ້ານາມແຝງສຳລັບລາຍລະອຽດເພີ່ມເຕີມ. ເສັ້ນທີ່ຍັງເຫຼືອແມ່ນທາງເລືອກ
ລ້າສະໄຫມ ສັນຍາລັກ ບັນຊີລາຍຊື່, ເຊິ່ງສະແດງລາຍການທຽບເທົ່າເກົ່າສໍາລັບອັນໃຫມ່ symbol_name.

?C:ໃດ ຂໍ້​ຄວາມ, ສໍາລັບການ ຄໍາແປສັບ ແລະ config_h.SH
ໂດຍພື້ນຖານແລ້ວຄໍາເຫັນທີ່ອະທິບາຍສັນຍາລັກ C, ເຊິ່ງຈະຖືກສະກັດໂດຍ ແສງສີ
ເຂົ້າໄປໃນເອກະສານຄໍາສັບແລະໂດຍ metaconfig ເຂົ້າໄປໃນ config_h.SH file ຖ້າສັນຍາລັກແມ່ນ
ຕ້ອງ​ການ (ຫຼື​ຖ້າ​ຫາກ​ວ່າ alias ຂອງ​ຕົນ​ແມ່ນ​ຕ້ອງ​ການ​ໃນ​ເວ​ລາ​ທີ່​ການ aliasing ສັນ​ຍາ​ລັກ​ໄດ້​ຖືກ​ນໍາ​ໃຊ້​)​.

?C:. ປິດຄຳເຫັນສັນຍາລັກ C.

?H:?ສັນຍາລັກ:config_h.SH stuff
ນີ້ແມ່ນຄໍາຮ້ອງຂໍການລວມເຂົ້າໂດຍທົ່ວໄປ config_h.SH. ເສັ້ນແມ່ນຂຽນພຽງແຕ່ເມື່ອ
ເຝົ້າ ສັນຍາລັກ ແມ່ນຕ້ອງການແທ້ໆ. ຮູບແບບທົ່ວໄປນີ້ແມ່ນຈໍາເປັນເມື່ອສັນຍາລັກ C
ນາມແຝງຖືກໃຊ້. ຖ້າບໍ່ດັ່ງນັ້ນ, ຖ້າທ່ານໃຊ້ຮູບແບບ "ມາດຕະຖານ" ອື່ນ, the
guarding ແມ່ນເຮັດໄດ້ໂດຍອັດຕະໂນມັດໂດຍ metaconfig ຕົວເອງ

?H:#$d_var VAR "$var"
ກໍານົດເງື່ອນໄຂຕາມເງື່ອນໄຂ VAR ສັນຍາລັກ C ເຂົ້າໄປໃນ $var ເມື່ອຖືກຕັ້ງເປັນ 'ກໍານົດ'. ໝາຍເຖິງ ກ
'?VAR:' ຮັກສາເງື່ອນໄຂ, ແລະ metaconfig ເຊື່ອມຕໍ່ອັດຕະໂນມັດ VAR ກັບສອງແກະຂອງມັນ
ການຂື້ນກັບຕົວແປ (ເຊັ່ນທັງສອງ $d_var ແລະ $var ຈະຖືກທຸງເປັນ ຕ້ອງການຢາກ if VAR is
ໃຊ້ໃນແຫຼ່ງ C).

?H:#define VAR [ທາງເລືອກ ຂໍ້ຄວາມ]
ສະເຫມີກໍານົດ VAR ສັນຍາລັກ C ກັບບາງຄ່າ. ຫມາຍເຖິງ '?VAR:' ຮັກສາເງື່ອນໄຂ.
ການຂື້ນກັບແກະອັດຕະໂນມັດແມ່ນເຮັດກັບຫນ່ວຍງານຂອງມັນເອງ.

?H:#define VAR(x,y,z) $var
ກຳນົດຄ່າມະຫາພາກສະເໝີ VAR ເປັນມູນຄ່າຂອງ $var ຕົວແປ. ມັນຂຶ້ນກັບ
ຫນ່ວຍບໍລິການເພື່ອຮັບປະກັນ $var ຖືຄຸນຄ່າທີ່ສົມເຫດສົມຜົນ. ການ​ຂຶ້ນ​ກັບ​ອັດ​ຕະ​ໂນ​ມັດ​ລະ​ຫວ່າງ C
ມະຫາພາກ VAR ແລະຕົວແປຂອງຫອຍໄດ້ຖືກສ້າງຕັ້ງຂຶ້ນ, ແລະເສັ້ນທັງຫມົດແມ່ນ guarded ໂດຍ an
implicit '?VAR:'.

?H:#$d_var VAR
ກໍານົດເງື່ອນໄຂ VAR if $d_var ຖືກຕັ້ງເປັນ 'ກໍານົດ'. ຫມາຍເຖິງ '?VAR:' ເຝົ້າ
ສະພາບ. ການຂຶ້ນກັບ Shell ອັດຕະໂນມັດແມ່ນສ້າງໄປສູ່ $d_war.

?H:#define VAR "$var"
ກຳນົດຄ່າທີ່ກຳນົດຄ່າໃຫ້ກັບ VAR ສັນຍາລັກ C. ຫມາຍເຖິງ '?VAR:' ເງື່ອນ​ໄຂ​ການ​ຄຸ້ມ​ຄອງ​.
ການຂຶ້ນກັບ shell ອັດຕະໂນມັດແມ່ນຖືກສ້າງຂຶ້ນເພື່ອເຊື່ອມຕໍ່ VAR ແລະ $var.

?H:. ປິດ config_h.SH ຄໍາ​ຮ້ອງ​ສະ​ຫມັກ​ລວມ​.

?M:C ສັນຍາລັກ: C dependencies
ແນະນໍາຄໍານິຍາມ magic ກ່ຽວກັບສັນຍາລັກ C, ສໍາລັບ confmagic.h, ແລະກໍານົດ
ສັນຍາລັກ guarding ສໍາລັບສ່ວນທີ່ເຫຼືອ ?M: ຄໍານິຍາມ. ເສັ້ນນີ້ຫມາຍເຖິງຢ່າງງຽບໆ
'?W:%<:C ສັນຍາລັກ', ie ຫນ່ວຍງານຈະຖືກໂຫລດເຂົ້າໄປໃນ Configure ຖ້າສັນຍາລັກ C ປາກົດ
ພາຍໃນແຫຼ່ງ C, ບໍ່ວ່າຈະເປັນ magic ຖືກນໍາໃຊ້ຫຼືບໍ່. C dependencies ຖືກເປີດໃຊ້ງານ
ໃນເວລາທີ່ magic ຖືກນໍາໃຊ້, ເພື່ອບັງຄັບໃຫ້ຄໍານິຍາມຂອງເຂົາເຈົ້າຢູ່ໃນ config_h.SH. ເຖິງຢ່າງໃດກໍ່ຕາມ, ຖ້າ
magic ແມ່ນ ບໍ່ ໃຊ້ແຕ່ສັນຍາລັກ C ປາກົດຢູ່ໃນແຫຼ່ງທີ່ບໍ່ມີ C ທີ່ຈໍາເປັນ
ການເພິ່ງພາອາໄສ, ທ່ານຈະຖືກເຕືອນທຸກຄັ້ງທີ່ໄຟລ໌ Wanted ຖືກສ້າງຂຶ້ນ, ເພາະວ່າມັນອາດຈະເປັນ
ບັນຫາການພົກພາ (ແລະເພາະວ່າຫນ່ວຍບໍລິການຖືກໂຫລດໂດຍບໍ່ມີເງື່ອນໄຂ
ຕັ້ງຄ່າທຸກຄັ້ງທີ່ສັນຍາລັກ C ຖືກໃຊ້, ໂດຍບໍ່ຄໍານຶງເຖິງອັນອື່ນ ?C: ສາຍຈາກ
ຫນ່ວຍ).

?M:cpp defs
ກຳນົດການສ້າງແຜນທີ່ magic cpp ທີ່ຈະນຳສະເໜີໃນ confmagic.h ທຸກຄັ້ງທີ່ໜ້າເປັນຫ່ວງ
ສັນຍາລັກຖືກນໍາໃຊ້. ມີ implicit '?ຊິມ' ເຝົ້າ​ຢູ່​ທີ່​ ຊິມ ແມ່ນ​ຊື່​ສັນ​ຍາ​ລັກ​
ກໍາ​ນົດ​ໂດຍ​ການ​ນໍາ​ພາ ?M​: ເສັ້ນ​.

?ມ:. ປິດ confmagic.h ຄໍາ​ຮ້ອງ​ສະ​ຫມັກ​ລວມ​.

?W:ຫອຍ ສັນຍາລັກ ບັນຊີລາຍຊື່:C ສັນຍາລັກ ບັນຊີລາຍຊື່
ຜູກ​ພັນ​ຈຸດ​ຫມາຍ​ປາຍ​ທາງ​ຂອງ​ສັນ​ຍາ​ລັກ​ຫອຍ​ທີ່​ມີ​ສັນ​ຍາ​ລັກ C: ຖ້າ​ຫາກ​ວ່າ​ໃດໆ​ຂອງ C
ສັນ​ຍາ​ລັກ​ທີ່​ລະ​ບຸ​ໄວ້​ແມ່ນ​ຕ້ອງ​ການ​, ຫຼັງ​ຈາກ​ນັ້ນ​ສັນ​ຍາ​ລັກ​ແກະ​ທັງ​ຫມົດ​ແມ່ນ​ຫມາຍ​ເປັນ​ຕ້ອງ​ການ​. ເປັນປະໂຫຍດ
ບັງຄັບການລວມເອົາຫນ່ວຍງານ (ບັນຊີລາຍຊື່ສັນຍາລັກຂອງແກະຖືກຕັ້ງເປັນ '%<') ເມື່ອມີບາງ C
ສັນຍາລັກຖືກກວດພົບ. ບັນຊີລາຍຊື່ສັນຍາລັກຂອງຫອຍອາດຈະຖືກປະໄວ້ຫວ່າງເປົ່າ, ເພື່ອປະໂຫຍດຈາກດ້ານຂ້າງ
ຜົນ​ກະ​ທົບ​ຂອງ​ສະ​ຖານ​ທີ່​ສັນ​ຍາ​ລັກ C ພາຍ​ໃນ builtin pre-processor (ສັນ​ຍາ​ລັກ​ເປັນ ກໍານົດໄວ້
ສໍາລັບຕົວປະມວນຜົນກ່ອນນັ້ນຖ້າຢູ່ໃນແຫຼ່ງ). ເພື່ອຊອກຫາຮູບແບບທີ່ມີຊ່ອງຫວ່າງ
ໃນພວກມັນ, ທ່ານຈໍາເປັນຕ້ອງອ້າງເຖິງສັນຍາລັກ C ພາຍໃນວົງຢືມງ່າຍໆ, ຄືກັບ 'struct
ເຂດ​ເວ​ລາ'.

?V:ອ່ານ​ຢ່າງ​ດຽວ ສັນຍາລັກ:ອ່ານ - ຂຽນ ສັນຍາລັກ
ນີ້​ແມ່ນ ໂລຫະ hint ແລະຄວນຈະຖືກນໍາໃຊ້ພຽງແຕ່ໃນຫນ່ວຍງານພິເສດທີ່ສົ່ງອອກເປືອກບາງ
ຕົວແປ. ຕົວແປກ່ອນກາງ ':' ຖືກສົ່ງອອກແບບອ່ານເທົ່ານັ້ນ (ປ່ຽນພວກມັນ
ຈະອອກຄໍາເຕືອນ), ໃນຂະນະທີ່ສັນຍາລັກອື່ນໆອາດຈະຖືກອ່ານແລະປ່ຽນແປງຢ່າງເສລີ.

?F:ໄຟ ສ້າງ
ເສັ້ນນີ້ຮັບໃຊ້ສອງຈຸດປະສົງ: ມັນແມ່ນ ໂລຫະ hint, ແລະຍັງ placeholder ສໍາລັບ
ໃນອະນາຄົດ jmake ໃຊ້. ມັນຕ້ອງບອກສາມປະເພດຂອງໄຟລ໌: ໄຟລ໌ຊົ່ວຄາວທີ່ມີ
ສ້າງສໍາລັບການທົດສອບ, UU ສ່ວນຕົວທີ່ສ້າງຂຶ້ນໃນໄດເລກະທໍລີ UU ສໍາລັບຕໍ່ມາ
perusal, ແລະສາທາລະນະທີ່ປະໄວ້ຢູ່ໃນລະບົບຮາກຂອງຊຸດ. ຊົ່ວຄາວ
ໄຟລ໌ຈະຕ້ອງຢູ່ໃນລາຍການ '!' ກ່ອນໜ້າ. ລັກສະນະ (ຫມາຍຄວາມວ່າ "ບໍ່! ພວກມັນບໍ່ໄດ້ຖືກໃຊ້ຄືນໃຫມ່
ຕໍ່ມາ!
./file, ບໍ່ພຽງແຕ່ ເອກະສານ), ແລະສາທາລະນະຄວນຈະມີຊື່ເປັນ.

?T:ຫອຍ ຊົ່ວຄາວ
ອີກປະການຫນຶ່ງ ໂລຫະ ຄຳໃບ້. ແຖວນີ້ສະແດງຕົວແປທັງໝົດທີ່ໃຊ້ເປັນຕົວແປຊົ່ວຄາວ
ພາຍໃນພາກສ່ວນ shell ຂອງຫນ່ວຍງານນີ້.

?D:ສັນຍາລັກ='ມູນຄ່າ'
ຄ່າເລີ່ມຕົ້ນສໍາລັບສັນຍາລັກທີ່ໃຊ້ເປັນເງື່ອນໄຂຕາມເງື່ອນໄຂ. ຖ້າບໍ່ມີ ?D: ເສັ້ນແມ່ນ
ພົບເຫັນ, ຫຼັງຈາກນັ້ນຄ່າ null ຖືກນໍາໃຊ້ແທນ. ໄດ້ ໂລຫະ ໂຄງການຈະເຕືອນທ່ານຖ້າຫາກວ່າ a
ສັນ​ຍາ​ລັກ​ໄດ້​ຖືກ​ນໍາ​ໃຊ້​ຢ່າງ​ຫນ້ອຍ​ຫນຶ່ງ​ຄັ້ງ​ເປັນ​ການ​ອີງ​ຕາມ​ເງື່ອນ​ໄຂ​ແລະ​ບໍ່​ມີ​ທີ່​ເຫມາະ​ສົມ​
?D: ການເລີ່ມຕົ້ນ. ມັນເປັນການປະຕິບັດທີ່ດີທີ່ຈະເພີ່ມສາຍເຫຼົ່ານັ້ນເຖິງແມ່ນວ່າສໍາລັບ null
ການເລີ່ມຕົ້ນນັບຕັ້ງແຕ່ມັນເນັ້ນຫນັກເຖິງລັກສະນະທາງເລືອກທີ່ເປັນໄປໄດ້ຂອງສັນຍາລັກ.

?O:ໃດ ຂໍ້ຄວາມ ທ່ານ ຕ້ອງການ
ຄໍາສັ່ງນີ້ຊີ້ໃຫ້ເຫັນວ່າຫນ່ວຍງານນີ້ແມ່ນລ້າສະໄຫມທັງຫມົດ. ເມື່ອ​ໃດ​ກໍ​ຕາມ​ການ​ນໍາ​ໃຊ້​ຂອງ​ໃດໆ​
ສັນຍາລັກຂອງມັນແມ່ນເຮັດ (ຫຼືການນໍາໃຊ້ທາງອ້ອມໂດຍຜ່ານ dependencies), ຂໍ້ຄວາມແມ່ນ output ສຸດ
ຫນ້າຈໍ (ໃນ stderr). ທ່ານສາມາດໃສ່ແຮ່ຫນຶ່ງເສັ້ນເພີ່ມເຕີມ, ໃນກໍລະນີນີ້ແຕ່ລະສາຍຈະ
ພິມ, ຕາມລໍາດັບ.

?LINT:ໂລຫະ ຄໍາແນະນໍາ
ເບິ່ງ ໂລຫະ ຫນ້າຄູ່ມືສໍາລັບການອະທິບາຍຄໍາແນະນໍາທີ່ແຕກຕ່າງກັນທີ່ສາມາດເປັນ
ໃຊ້ແລ້ວ.

?ໃນ​ມັນ:ການເລີ່ມຕົ້ນ ລະຫັດ
ລະຫັດເບື້ອງຕົ້ນທີ່ລະບຸໄວ້ໂດຍແຖວນີ້ຈະຖືກໂຫລດຢູ່ເທິງສຸດຂອງ
ກໍາຫນົດຄ່າ script ໃຫ້ຫນ່ວຍງານແມ່ນຈໍາເປັນ.

C ສັນຍາລັກ ນາມແຝງ
ບາງຄັ້ງມັນເປັນໄປບໍ່ໄດ້ທີ່ຈະອີງໃສ່ metaconfigການເລືອກເລີ່ມຕົ້ນຂອງຕົນເອງສໍາລັບ config_h.SH
ຄໍາ​ເຫັນ​ແລະ​ຄໍາ​ນິ​ຍາມ​ສັນ​ຍາ​ລັກ C​. ນັ້ນແມ່ນບ່ອນທີ່ aliasing ເຂົ້າມາຫຼິ້ນ. ເນື່ອງຈາກວ່າມັນແທນທີ່ຈະ
ຍາກທີ່ຈະອະທິບາຍ, ພວກເຮົາຈະສຶກສາຕົວຢ່າງເພື່ອເຂົ້າໃຈກົນໄກພື້ນຖານ.

ຫນ່ວຍບໍລິການ d_const.U ພະຍາຍາມກໍານົດວ່າ C compiler ຂອງທ່ານຮູ້ຈັກຫຼືບໍ່ const
ຄໍາສໍາຄັນ. ຖ້າມັນບໍ່ພວກເຮົາຕ້ອງການ remap ຄໍາສໍາຄັນນັ້ນເປັນ string null, ໃນຄໍາສັ່ງທີ່ຈະປ່ອຍໃຫ້
ລວບລວມໂຄງການ. ຍິ່ງໄປກວ່ານັ້ນ, ພວກເຮົາຕ້ອງການທີ່ຈະກະຕຸ້ນອັດຕະໂນມັດການທົດສອບໃນເວລາທີ່ const ຄໍາ
ຖືກນໍາໃຊ້.

ນີ້ແມ່ນພາກສ່ວນທີ່ກ່ຽວຂ້ອງຂອງຫົວໜ່ວຍ d_const.U:

?ເຮັດ:d_const: cat cc ccflags Setvar
?ເຮັດ: -pick add $@ %
?S:d_const:
?S: ຕົວແປນີ້ກໍານົດເງື່ອນໄຂຂອງສັນຍາລັກ HASCONST, ເຊິ່ງ
?S: ຊີ້ບອກໃຫ້ໂປແກມ C ທີ່ compiler C ນີ້ຮູ້ກ່ຽວກັບ
?S: ປະເພດ const.
?S:.
?C:HASCONST ~ %<:
?C: ສັນ​ຍາ​ລັກ​ນີ້, ຖ້າ​ຫາກ​ວ່າ​ກໍາ​ນົດ, ສະ​ແດງ​ໃຫ້​ເຫັນ​ວ່າ C compiler ນີ້​ຮູ້​ກ່ຽວ​ກັບ
?C: ປະເພດ const. ບໍ່ຈໍາເປັນຕ້ອງທົດສອບຕົວຈິງສໍາລັບສັນຍາລັກນັ້ນ
?C: ພາຍໃນໂຄງການຂອງທ່ານ. ການນໍາໃຊ້ພຽງແຕ່ຄໍາສໍາຄັນ "const" ຈະ
?C: ກະຕຸ້ນການທົດສອບທີ່ຈໍາເປັນ.
?C:.
?H:?%<:#$d_const HASCONST /**/
?H:?%<:#ifndef HASCONST
?H:?%<:#define const
?H:?%<:#endif
?H:.
?W:%<:const
?LINT:ຕັ້ງ d_const
?LINT:const ທີ່ຮູ້ຈັກ
: ກວດເບິ່ງຄໍາສໍາຄັນ const
ສຽງສະທ້ອນ ""
echo 'ການກວດສອບເພື່ອເບິ່ງວ່າ C compiler ຂອງທ່ານຮູ້ກ່ຽວກັບ "const"...' >&4
/bin/cat >const.c <<'EOCP'
ຕົ້ນຕໍ ()
{
const char *foo;
}
EOCP
ຖ້າ $cc -c $ccflags const.c >/dev/null 2>&1 ; ແລ້ວ
val="$define"
ສຽງສະທ້ອນ "ແມ່ນແລ້ວ, ມັນເຮັດ."
ອື່ນ
val="$undef"
ສຽງສະທ້ອນ "ບໍ່, ມັນບໍ່ໄດ້."
fi
ຕັ້ງ d_const
eval $setvar

ທໍາອິດພວກເຮົາສັງເກດເຫັນການນໍາໃຊ້ຂອງ ?W: ເສັ້ນ, ເຊິ່ງໂດຍພື້ນຖານແລ້ວເວົ້າວ່າ: "ຫນ່ວຍນີ້ແມ່ນຕ້ອງການໃນເວລາທີ່
const ຄໍາສໍາຄັນຖືກນໍາໃຊ້ໃນໄຟລ໌ C. ". ເພື່ອ remap ຕາມເງື່ອນໄຂ const ເປັນ null
ສາຍເຂົ້າ config.h, ຂ້າພະເຈົ້າໄດ້ເລືອກທີ່ຈະກໍານົດເງື່ອນໄຂ HACONST ຜ່ານ $d_const.

ຢ່າງໃດກໍຕາມ, ນີ້ເຮັດໃຫ້ເກີດບັນຫາ, ເພາະວ່າ HACONST ສັນຍາລັກຈະບໍ່ຖືກນໍາໃຊ້ໃນ
ແຫຼ່ງຂໍ້ມູນ, ພຽງແຕ່ const token ແມ່ນ. ແລະ ?H: ການກໍານົດເສັ້ນ HACONST ແມ່ນ implicitely
ປົກປ້ອງໂດຍ '?HASCONST'. ດັ່ງນັ້ນ, ພວກເຮົາຕ້ອງເພີ່ມຂໍ້ຈໍາກັດ '?%<' ຢ່າງຊັດເຈນເພື່ອບອກ
metaconfig ວ່າສາຍເຫຼົ່ານັ້ນຄວນຈະຖືກລວມເຂົ້າໃນ config_h.SH ທຸກຄັ້ງທີ່ສັນຍາລັກ '%<'
ຕ້ອງການ (%< ຫມາຍເຖິງຊື່ຂອງຫນ່ວຍງານ, ທີ່ນີ້ d_const).

ນັ້ນແມ່ນເກືອບສົມບູນແບບ, ເພາະວ່າເສັ້ນ ?W: ຕ້ອງການ d_const ທຸກໆຄັ້ງ const ຖືກນໍາໃຊ້, ຫຼັງຈາກນັ້ນ
ເສັ້ນ ?H: ຈະຖືກລວມເຂົ້າໃນ config_h.SH ໄຟລ໌. ຢ່າງໃດກໍຕາມ, ຄວາມຄິດເຫັນນໍາ (?C:
ສາຍ) ຕິດກັບ HACONST ຕົວຂອງມັນເອງຍັງ guarded ຜ່ານ HACONST, ie ມັນມີ implicit
ຂໍ້ຈຳກັດ '?HASCONST'. ເພາະສະນັ້ນຄວາມຕ້ອງການສໍາລັບການ ນາມແຝງ ໄດ້ HACONST ສັນຍາລັກເປັນ '%<'.

ສ່ວນທີ່ຍັງເຫຼືອຂອງຫນ່ວຍ (ສ່ວນແກະ) ແມ່ນກົງໄປກົງມາແທ້ໆ. ມັນງ່າຍດາຍ
ພະຍາຍາມລວບລວມຕົວຢ່າງໂຄງການ C ໂດຍໃຊ້ const ຄໍາສໍາຄັນ. ຖ້າມັນສາມາດເຮັດໄດ້, ຫຼັງຈາກນັ້ນມັນຈະ
ກໍານົດ $d_const ຜ່ານ $setvar fonction (ກໍານົດໂດຍ Setvar.U ຫນ່ວຍ). ເບິ່ງວັກ
ກ່ຽວກັບຫນ່ວຍງານພິເສດສໍາລັບລາຍລະອຽດເພີ່ມເຕີມ.

ເຮັດໃຫ້ ຄໍາສັ່ງ
ໃນ ?MAKE: ເສັ້ນຄໍາສັ່ງ, ທ່ານອາດຈະຂຽນຄໍາສັ່ງ shell ທີ່ຈະປະຕິບັດເປັນ - ແມ່ນຫຼື a
ພິເສດ - ເລືອກ ຄໍາສັ່ງທີ່ຖືກກັກຂັງໂດຍ metaconfig ແລະວິເຄາະເພື່ອເບິ່ງສິ່ງທີ່ຄວນຈະເປັນ
ສຳເລັດແລ້ວ. ຊັ້ນນໍາ '-' ແມ່ນພຽງແຕ່ມີເພື່ອປ້ອງກັນ ເຮັດໃຫ້ ຈາກການລົ້ມເຫລວເມື່ອຄໍາສັ່ງກັບຄືນມາ
ສະຖານະທີ່ບໍ່ແມ່ນສູນ -- ມັນບໍ່ຈໍາເປັນແທ້ໆນັບຕັ້ງແຕ່ພວກເຮົາໃຊ້ 'ເຮັດໃຫ້ -n' ເພື່ອ​ແກ້​ໄຂ​
ການເພິ່ງພາອາໄສ, ແຕ່ຂ້າພະເຈົ້າແນະນໍາໃຫ້ທ່ານຮັກສາມັນໃນກໍລະນີທີ່ມັນກາຍເປັນຂໍ້ບັງຄັບໃນສະບັບໃນອະນາຄົດ.
syntax ຂອງ ເລືອກເອົາ ຄໍາ​ສັ່ງ​ແມ່ນ​:

- ເລືອກ cmd $@ target_file

ບ່ອນທີ່ $@ ແມ່ນ macro ມາດຕະຖານພາຍໃນ Makefiles ຢືນສໍາລັບເປົ້າຫມາຍໃນປະຈຸບັນ (ຊື່
ຂອງຫນ່ວຍງານທີ່ກໍາລັງກໍ່ສ້າງ, ດ້ວຍການຂະຫຍາຍ .U ສຸດທ້າຍຖືກຖອດອອກ). ໄດ້ cmd ສ່ວນຫນຶ່ງແມ່ນ
ຈິງ metaconfig ຄໍາສັ່ງທີ່ຈະດໍາເນີນການ, ແລະ target_file ແມ່ນຕົວກໍານົດການອື່ນ, ເຊິ່ງ
ການຕີລາຄາແມ່ນຂຶ້ນກັບ cmd ຕົວຂອງມັນເອງ. ມັນ​ຍັງ​ມີ​ການ​ຂະ​ຫຍາຍ .U ສຸດ​ທ້າຍ​ຂອງ​ຕົນ​ຖອດ​ອອກ​ແລະ​
ໂດຍປົກກະຕິຫມາຍເຖິງໄຟລ໌ຫນ່ວຍ, ເວັ້ນເສຍແຕ່ວ່າມັນເລີ່ມຕົ້ນດ້ວຍ './' ໃນກໍລະນີທີ່ມັນອ້າງອີງຫນຶ່ງ
ຂອງ metaconfig ຄວບຄຸມໄຟລ໌ໃນ '.MT ລະບົບ.

ຄໍາສັ່ງທີ່ມີຢູ່ແມ່ນ:

ເພີ່ມ ຕື່ມ ການ target_file to ກໍາຫນົດຄ່າ.

add.Config_sh
ຕື່ມຂໍ້ມູນໃສ່ໃນສ່ວນຂອງ ກໍາຫນົດຄ່າ ການຜະລິດ config.sh ໄຟລ໌. ໃຊ້ເທົ່ານັ້ນ
ຕົວແປແມ່ນເພີ່ມ, ເງື່ອນໄຂ (ຈາກການຂຶ້ນກັບເງື່ອນໄຂ) ແມ່ນ
ຂ້າມ.

add.Null ເພີ່ມພາກສ່ວນທີ່ເລີ່ມຕົ້ນຕົວແປຂອງ shell ທັງໝົດທີ່ໃຊ້ກັບສະຕຣິງຫວ່າງເປົ່າ.

c_h_weed ຜະລິດ config_h.SH ໄຟລ໌. ພຽງແຕ່ເສັ້ນທີ່ຈໍາເປັນແມ່ນພິມອອກ.

cm_h_weed ຜະລິດ confmagic.h ໄຟລ໌. ພຽງແຕ່ເສັ້ນທີ່ຈໍາເປັນແມ່ນພິມອອກ. ນີ້
ຄໍາສັ່ງຖືກເປີດໃຊ້ພຽງແຕ່ເມື່ອ -M ສະຫຼັບແມ່ນໃຫ້, ຫຼືເມື່ອ a confmagic.h ເອກະສານ
ມີຢູ່ແລ້ວ.

close.Config_sh
ເພີ່ມສັນຍາລັກ 'EOT' ສຸດທ້າຍໃນເສັ້ນດ້ວຍຕົວມັນເອງເພື່ອສິ້ນສຸດເອກະສານຢູ່ທີ່ນີ້
ການ​ກໍ່​ສ້າງ​ການ​ຜະ​ລິດ​ config.sh ຍື່ນ.

prepend Prepends ເນື້ອໃນຂອງເປົ້າຫມາຍດັ່ງກ່າວ target_file ຖ້າໄຟລ໌ນັ້ນບໍ່ຫວ່າງ.

weed ເພີ່ມຫນ່ວຍບໍລິການ ກໍາຫນົດຄ່າ ຄ້າຍຄື ເພີ່ມ ຄໍາສັ່ງ, ແຕ່ເຮັດບາງການທົດສອບເພີ່ມເຕີມ
ເອົາ '?ສັນຍາລັກ' ແລະ '%ສັນຍາລັກ' ສາຍ​ຈາກ​ target_file ຖ້າ​ຫາກ​ວ່າ​ສັນ​ຍາ​ລັກ​
ບໍ່ຕ້ອງການຫຼືຕ້ອງການຕາມເງື່ອນໄຂ. ແບບຟອມ '%' ແມ່ນໃຊ້ພາຍໃນໂດຍ
metaconfig ໃນຂະນະທີ່ການຜະລິດໄຟລ໌ .U ຂອງຕົນເອງຢູ່ໃນ '.MT' ໄດເລກະທໍລີ.

ເຊັດດຽວກັນກັບ ເພີ່ມ ແທ້ໆ, ແຕ່ປະຕິບັດການທົດແທນມະຫາພາກເພີ່ມເຕີມ. ໄດ້
ມະຫາພາກທີ່ມີຢູ່ແມ່ນໄດ້ອະທິບາຍໄວ້ໃນ Hardwired ມາໂຄຣ ວັກ.

ໃນຖານະເປັນບົດບັນທຶກຂ້າງ, metaconfig ສ້າງກ -cond ຄໍາສັ່ງພາຍໃນເພື່ອຈັດການກັບເງື່ອນໄຂ
ການເພິ່ງພາອາໄສ. ທ່ານ​ບໍ່​ຄວນ​ໃຊ້​ມັນ​ດ້ວຍ​ຕົວ​ທ່ານ​ເອງ​, ແຕ່​ວ່າ​ທ່ານ​ຈະ​ເຫັນ​ມັນ​ຖ້າ​ຫາກ​ວ່າ scanning ໄດ້​
ຜະລິດ makefile ໃນ .MT ລະບົບ.

Hardwired ມາໂຄຣ
ມະຫາພາກຕໍ່ໄປນີ້ຖືກຮັບຮູ້ໂດຍ ເຊັດ ຄໍາສັ່ງແລະທົດແທນກ່ອນທີ່ຈະລວມເຂົ້າໃນ
ກໍາຫນົດຄ່າ:

ຈໍານວນການແກ້ໄຂພື້ນຖານຂອງຊຸດ, ໄດ້ມາຈາກ . ກະເປົາ.

ວັນທີປັດຈຸບັນ.


ທີ່​ຢູ່​ອີ​ເມລ​ຂອງ​ຜູ້​ບໍາ​ລຸງ​ຮັກ​ສາ​ຊຸດ​ນີ້​, ໄດ້​ມາ​ຈາກ​ຂອງ​ທ່ານ​
. ກະເປົາ.


ຊື່ຂອງຊຸດ, ດັ່ງທີ່ໄດ້ມາຈາກຂອງທ່ານ . ກະເປົາ ຍື່ນ.


ລະດັບ patch ຂອງ metaconfig ໂຄງ​ການ (ເຊົາ​ສະ​ຫນັບ​ສະ​ຫນູນ​ ).


ລະດັບການດັດແກ້ SVN ຂອງ metaconfig ໂຄງການ.

ຈໍານວນສະບັບຂອງ metaconfig ໂຄງການ.

ມະຫາພາກເຫຼົ່ານັ້ນສ່ວນຫຼາຍແມ່ນໃຊ້ເພື່ອກໍານົດ metaconfig ຮຸ່ນທີ່ສ້າງ a
ໂດຍສະເພາະ ກໍາຫນົດຄ່າ script ແລະສໍາລັບຊຸດທີ່ມັນເຮັດໄດ້. ທີ່ຢູ່ e-mail ຂອງ
ຜູ້ຮັກສາແມ່ນ hardwired ໃນຄໍາແນະນໍາຊັ້ນນໍາທີ່ ກໍາຫນົດຄ່າ ພິມເມື່ອເລີ່ມຕົ້ນ.

ທີ່ຜ່ານມາ metaconfig ສະບັບເຂົ້າໃຈ syntax ທົ່ວໄປຫຼາຍຂອງແບບຟອມ:

<$variable>

ເຊິ່ງຖືກແທນທີ່ໃນເວລາ Configure-generation ໂດຍຄ່າຂອງ ຕົວແປ ເອົາມາຈາກຂອງເຈົ້າ
. ກະເປົາ ໄຟລ໌. ໃນທີ່ສຸດ, ຮູບແບບ macro ທີ່ໃຊ້ສາຍແບບເກົ່າຈະຫາຍໄປ, ແລະ <$baserev>
ຈະທົດແທນ ໃນທຸກຫນ່ວຍງານທີ່ສະຫນອງ.

ພິເສດ ຫນ່ວຍ
ຫນ່ວຍງານພິເສດຕໍ່ໄປນີ້ຖືກໃຊ້ເພື່ອແຍກລະຫັດແລະໃຫ້ລະດັບທີ່ສູງຂຶ້ນ
ຫນ້າທີ່. ພວກເຂົາເຈົ້າອາດຈະຜະລິດ Shell script ທີ່ສາມາດເປັນແຫຼ່ງຫຼື shell
ຕົວແປທີ່ສາມາດເປັນ ການປະເມີນ'ed. ການຖ່າຍທອດພາລາມິເຕີແມ່ນເຮັດຜ່ານຕົວແປທີ່ຮູ້ດີ, ບໍ່ວ່າຈະ
ຊື່ ຫຼື ບໍ່ເປີດເຜີຍຊື່ ເຊັ່ນ $1, $2, ແລະອື່ນໆ... (ເຊິ່ງສາມາດຕັ້ງໄດ້ງ່າຍຜ່ານ shell ທີ່ກໍານົດໄວ້
ຜູ້ປະກອບການ). ເມື່ອ​ໃດ​ ກໍາຫນົດຄ່າ ປະຕິບັດ, ມັນສ້າງແລະເຂົ້າໄປໃນ a UU ໄດເລກະທໍລີ, ດັ່ງນັ້ນທຸກໆ
script ທີ່ຜະລິດຢູ່ໃນນັ້ນແລະບໍ່ແຊກແຊງໄຟລ໌ຈາກຊຸດຂອງທ່ານ.

ນີ້ແມ່ນຫົວ ໜ່ວຍ sepcial ທີ່ທ່ານຄວນຮູ້ກ່ຽວກັບ, ແລະວິທີການນໍາໃຊ້ພວກມັນ.

Cppsym.U
ຫນ່ວຍງານນີ້ຜະລິດ Shell script ເອີ້ນວ່າ Cppsym, ຊຶ່ງສາມາດຖືກນໍາໃຊ້ເພື່ອກໍານົດ
ບໍ່ວ່າຈະເປັນສັນຍາລັກໃດໆໃນບັນຊີລາຍຊື່ຖືກກໍານົດໂດຍ C preprocessor ຫຼື C compiler ທີ່ທ່ານມີ
ລະບຸ. ມັນສາມາດກໍານົດສະຖານະພາບຂອງສັນຍາລັກໃດກໍ່ຕາມ, ເຖິງແມ່ນວ່າສັນຍາລັກຢູ່ໃນ
(ລາຍການຄຸນລັກສະນະ) ຖືກກໍານົດໄດ້ງ່າຍກວ່າ.

Csym.U
ອັນນີ້ກຳນົດຕົວແປ $csym shell, ໃຊ້ພາຍໃນໂດຍ ກໍາຫນົດຄ່າ ເພື່ອກວດເບິ່ງວ່າ a
ສັນຍາລັກ C ໄດ້ຖືກກໍານົດຫຼືບໍ່. ການ​ນໍາ​ໃຊ້​ປົກ​ກະ​ຕິ​ແມ່ນ​:

ກໍານົດຜົນໄດ້ຮັບສັນຍາລັກ [-fva] [ກ່ອນຫນ້າ]
eval $csym

ທີ່ຈະກໍານົດ ຜົນ variable ກັບ 'true' ຖ້າຟັງຊັນ [-f], variable [-v] ຫຼື
array [-a] ຖືກກໍານົດ, 'false' ຖ້າບໍ່ດັ່ງນັ້ນ. ຖ້າຄ່າທີ່ຜ່ານມາແມ່ນໃຫ້ແລະ -r
ສະຫຼັບໄດ້ຖືກສະຫນອງໃຫ້ ກໍາຫນົດຄ່າ (ເບິ່ງ ກໍາຫນົດຄ່າ ທາງເລືອກໃນການ ວັກ), ຫຼັງຈາກນັ້ນ
ມູນຄ່າແມ່ນຖືກນໍາໃຊ້ຄືນໃຫມ່ໂດຍບໍ່ມີການສອບຖາມ.

ວິທີການຄິດໄລ່ນີ້ແມ່ນຂຶ້ນກັບຄໍາຕອບທີ່ຜູ້ໃຊ້ໃຫ້ຄໍາຖາມ
ກໍາຫນົດຄ່າ ຈະຖາມກ່ຽວກັບວ່າມັນຄວນຈະດໍາເນີນການ nm ການສະກັດເອົາຫຼືບໍ່. ຖ້າ
ການສະກັດເອົາໄດ້ຖືກປະຕິບັດ, ຫນ່ວຍງານພຽງແຕ່ເບິ່ງຜ່ານບັນຊີລາຍຊື່ສັນຍາລັກ, ຖ້າບໍ່ດັ່ງນັ້ນ
ມັນປະຕິບັດການທົດສອບການເຊື່ອມຕໍ່ລວບລວມ, ເວັ້ນເສຍແຕ່ -r ໄດ້​ຮັບ​ການ​ນໍາ​ໃຊ້​ຄືນ​ໃຫມ່​ການ​ຄິດ​ໄລ່​ທີ່​ຜ່ານ​ມາ​
ຄຸນຄ່າ, ຕາມທໍາມະຊາດ ...

End.U
ໂດຍການຄັດລອກຫນ່ວຍນີ້ເຂົ້າໄປໃນສ່ວນຕົວຂອງເຈົ້າ U ໄດເລກະທໍລີ ແລະການຂຶ້ນກັບການຕໍ່ເຕີມກ່ຽວກັບ
?ເຮັດ: ເສັ້ນ, ທ່ານສາມາດບັງຄັບໃຫ້ຫນ່ວຍງານໃດນຶ່ງຖືກບັນຈຸເຂົ້າໃນ ກໍາຫນົດຄ່າ ເຖິງແມ່ນວ່າມັນບໍ່ແມ່ນ
ຖ້າບໍ່ດັ່ງນັ້ນຕ້ອງການ. ບາງຫນ່ວຍພຽງແຕ່ອາດຈະຖືກບັງຄັບໃຫ້ເຂົ້າໄປໃນ ກໍາຫນົດຄ່າ ທາງ​ນັ້ນ.

Filexp.U
ຫນ່ວຍງານນີ້ຜະລິດ Shell script filexp ເຊິ່ງຈະຂະຫຍາຍຊື່ໄຟລ໌ເລີ່ມຕົ້ນດ້ວຍ
tildes. ການ​ນໍາ​ໃຊ້​ປົກ​ກະ​ຕິ​ແມ່ນ​:

exp_name=`./filexp $name`

ເພື່ອກໍານົດຊື່ໄຟລ໌ທີ່ຂະຫຍາຍຢູ່ໃນ exp_name.

Findhdr.U
ຫນ່ວຍນີ້ຜະລິດ a findhdr script ທີ່ຖືກນໍາໃຊ້ເພື່ອຊອກຫາໄຟລ໌ header ໃນ
$usrinc ຫຼືສະຖານທີ່ stranger ອື່ນໆໂດຍໃຊ້ຄວາມສາມາດ cpp. script ໄດ້ຖືກມອບໃຫ້
ລວມເອົາຊື່ພື້ນຖານຂອງໄຟລ໌ເຊັ່ນ 'stdio.h' ຫຼື 'sys/file.h' ແລະມັນກັບຄືນເສັ້ນທາງເຕັມຂອງ
ໄຟລ໌ inlcude ແລະສະຖານະສູນຖ້າພົບ, ຫຼືສະຕຣິງຫວ່າງເປົ່າແລະສະຖານະທີ່ບໍ່ແມ່ນສູນ
ຖ້າໄຟລ໌ບໍ່ສາມາດຕັ້ງຢູ່.

Getfile.U
ຫນ່ວຍງານນີ້ຜະລິດລະຫັດ shell ເລັກນ້ອຍທີ່ຕ້ອງໄດ້ຮັບການແຫຼ່ງເພື່ອໃຫ້ໄດ້ໄຟລ໌
ຊື່​ແລະ​ເຮັດ​ໃຫ້​ການ​ກວດ​ສອບ​ສຸ​ຂະ​ພາບ​ບາງ​. ທາງເລືອກ, ການຂະຫຍາຍ ~ ຊື່ແມ່ນດໍາເນີນການ.

ເພື່ອໃຊ້ເຄື່ອງນີ້, $rp ແລະ $dflt ຕ້ອງຖືຄໍາຖາມແລະຄໍາຕອບເລີ່ມຕົ້ນ, ເຊິ່ງ
ຈະຖືກສົ່ງຜ່ານເປັນ ອ່ານຂອງຂ້ອຍ script (ເບິ່ງທີ່ຈະມາເຖິງ Myread.U) The $fn
ຕົວແປຄວບຄຸມການດໍາເນີນການແລະຜົນໄດ້ຮັບແມ່ນກັບຄືນສູ່ $ans.

ເພື່ອຊອກຫາໄຟລ໌ຫຼືໄດເລກະທໍລີ, ໃສ່ 'f' ຫຼື 'd' ເຂົ້າໃນ f~/. ຖ້າ '~' ປາກົດ, ຫຼັງຈາກນັ້ນ ~ ຊື່
ອະນຸຍາດໃຫ້ທົດແທນ. ຖ້າ '/' ປາກົດ, ພຽງແຕ່ຊື່ເສັ້ນທາງຢ່າງແທ້ຈິງຖືກຍອມຮັບແລະ
~ ການ​ປ່ຽນ​ຊື່​ແມ່ນ​ໄດ້​ຮັບ​ການ​ຂະ​ຫຍາຍ​ສະ​ເຫມີ​ກ່ອນ​ທີ່​ຈະ​ກັບ​ຄືນ​ມາ​. ຖ້າ '+' ຖືກລະບຸ,
ການກວດສອບການມີຢູ່ແມ່ນຂ້າມໄປ. ຖ້າ 'n' ປາກົດຢູ່ພາຍໃນ $fn, ຫຼັງຈາກນັ້ນຜູ້ໃຊ້ໄດ້ຖືກອະນຸຍາດໃຫ້
ຕອບ 'ບໍ່'.

ໂດຍປົກກະຕິແລ້ວ, ເວັ້ນເສຍແຕ່ວ່າທ່ານຮ້ອງຂໍໃຫ້ມີການເຄື່ອນຍ້າຍ, ~ ການປ່ຽນຊື່ເກີດຂຶ້ນເມື່ອຮ້ອງຂໍ.
ຢ່າງໃດກໍຕາມ, ມີບາງຄັ້ງທີ່ທ່ານຕ້ອງການທີ່ຈະ bypass portability ແລະບັງຄັບ
ການທົດແທນ. ເຈົ້າອາດຈະໃຊ້ຕົວອັກສອນ 'e' (ຂະຫຍາຍ) ເພື່ອເຮັດແນວນັ້ນ.

ຖ້າໃຊ້ປະເພດ 'l' (locate) ພິເສດ, ຫຼັງຈາກນັ້ນ $fn ຕົວແປຕ້ອງລົງທ້າຍດ້ວຍ ':',
ຕິດຕາມດ້ວຍຊື່ພື້ນຖານຂອງໄຟລ໌. ຖ້າຄໍາຕອບແມ່ນໄດເລກະທໍລີ, ຊື່ພື້ນຖານຂອງໄຟລ໌ຈະເປັນ
ເພີ່ມເຕີມກ່ອນທີ່ຈະທົດສອບການມີຢູ່ຂອງໄຟລ໌. ນີ້ແມ່ນເປັນປະໂຫຍດໃນຄໍາຖາມທີ່ມີຮູບແບບສະຖານທີ່
ເຊັ່ນນີ້:

dflt='~ຂ່າວ/lib'
: ບໍ່ຈໍາເປັນຕ້ອງລະບຸ 'd' ຫຼື 'f' ເມື່ອ 'l' ຖືກໃຊ້
fn='l~:active'
rp='ໄຟລ໌ທີ່ໃຊ້ວຽກຢູ່ໃສ?'
. ./getfile
active="$ans"

ນອກຈາກນັ້ນ, ຕົວອັກສອນ 'p' (path) ອາດຈະຖືກນໍາໃຊ້ຮ່ວມກັບ 'l' ເພື່ອບອກ
ເອົາໄຟລ ວ່າຄໍາຕອບທີ່ບໍ່ມີ '/' ໃນມັນຄວນຈະໄດ້ຮັບການຍອມຮັບ, ສົມມຸດວ່າມັນຈະ
ຢູ່ໃນເສັ້ນທາງຂອງທຸກຄົນໃນເວລາທີ່ມູນຄ່ານີ້ຈະມີຄວາມຈໍາເປັນ.

ຍັງເປັນປະໂຫຍດແມ່ນຄວາມເປັນໄປໄດ້ທີ່ຈະລະບຸບັນຊີລາຍຊື່ຂອງຄໍາຕອບທີ່ຄວນຈະໄດ້ຮັບການຍອມຮັບ
verbatim, bypassing ການກວດສອບທັງຫມົດ. ລາຍຊື່ນີ້ຕ້ອງຢູ່ໃນວົງເລັບ ແລະລາຍການ
ຕ້ອງແຍກເຄື່ອງໝາຍຈຸດ, ບໍ່ມີຊ່ອງຫວ່າງ. ຢ່າລືມອ້າງເຖິງ
ສະຕຣິງທີ່ເປັນຜົນມາຈາກວົງເລັບມີຄວາມໝາຍຕໍ່ກັບແກະ. ຕົວ​ຢ່າງ:

dflt='/bin/install'
fn='/fe~(ຕິດຕັ້ງ,./install)'
rp='ໃຊ້ໂປຣແກຣມຕິດຕັ້ງອັນໃດ?'
. ./getfile
ຕິດຕັ້ງ = "$ans"

ຈະໃຫ້ຜູ້ໃຊ້ພຽງແຕ່ລະບຸເສັ້ນທາງທີ່ມີຄຸນວຸດທິຢ່າງເຕັມທີ່ໂດຍອ້າງອີງໃສ່ໄຟລ໌ທີ່ມີຢູ່,
ແຕ່ຍັງຄົງອະນຸຍາດໃຫ້ຄໍາຕອບພິເສດ "ຕິດຕັ້ງ" ແລະ "./install" ເທົ່າທີ່ເປັນ (ສົມມຸດວ່າ
ແນ່ນອນວ່າບາງສິ່ງບາງຢ່າງຈະຈັດການກັບພວກເຂົາໂດຍສະເພາະໃນພາຍຫລັງໃນລະບົບຕ່ອງໂສ້ນັບຕັ້ງແຕ່ພວກເຂົາເຮັດ
ບໍ່ສອດຄ່ອງກັບກອບທີ່ຄາດໄວ້ໂດຍທົ່ວໄປ).

ຖ້າຄໍາຕອບຂອງຄໍາຖາມແມ່ນ 'ບໍ່ມີ', ຫຼັງຈາກນັ້ນການກວດສອບການມີຢູ່ແມ່ນຂ້າມໄປແລະ
ສະຕຣິງຫວ່າງເປົ່າຖືກສົ່ງຄືນ. ໃຫ້ສັງເກດວ່ານັບຕັ້ງແຕ່ ເອົາໄຟລ ໂທ ອ່ານຂອງຂ້ອຍ ພາຍໃນ, ທັງຫມົດ
ຄຸນ​ນະ​ສົມ​ບັດ​ທີ່​ມີ​ຢູ່​ກັບ​ ອ່ານຂອງຂ້ອຍ ສະຫມັກທີ່ນີ້ເພື່ອ.

ຖ້າຕ້ອງການມູນຄ່າຂະຫຍາຍຢ່າງສົມບູນ (ຕົວຢ່າງໃນ Makefile), ທ່ານອາດຈະໃຊ້
ໄດ້ $ansexp ຕົວແປທີ່ສະເຫມີຖືກຕັ້ງຄ່າຢ່າງຖືກຕ້ອງໂດຍ ເອົາໄຟລ ເປັນ​ການ​ຂະ​ຫຍາຍ​ຕົວ​
ສະບັບຂອງ $ans. ແນ່ນອນ, ມັນຈະບໍ່ຂະຫຍາຍ ~ ຊື່ຖ້າທ່ານບໍ່ອະນຸຍາດໃຫ້ມັນຢູ່ໃນ
ສະຖານທີ່ທໍາອິດໃນ $fn ຕົວແປ.

Inhdr.U
ຫນ່ວຍງານນີ້ຜະລິດ $inhdr shell variable, ໃຊ້ພາຍໃນໂດຍ ກໍາຫນົດຄ່າ ການກວດສອບ
ບໍ່ວ່າຈະເປັນຊຸດຂອງຫົວຂໍ້ມີຢູ່ຫຼືບໍ່. ການ​ນໍາ​ໃຊ້​ປົກ​ກະ​ຕິ​ແມ່ນ​:

ກໍານົດ header i_header [ header2 i_header2 ... ]
eval $inhdr

ນີ້ຈະພິມຂໍ້ຄວາມ, ໂດຍກ່າວວ່າ header ໄດ້ພົບເຫັນຫຼືບໍ່ແລະກໍານົດ
i_header ປ່ຽນແປງຕາມຄວາມເຫມາະສົມ. ຖ້າຫຼາຍກວ່າຫນຶ່ງຫົວຖືກລະບຸແລະທໍາອິດ
ບໍ່ພົບ header, ພວກເຮົາພະຍາຍາມອັນຕໍ່ໄປ, ຈົນກ່ວາບັນຊີລາຍຊື່ຫວ່າງເປົ່າຫຼືຫນຶ່ງຈະພົບເຫັນ.

Inlibc.U
ຫນ່ວຍງານນີ້ຜະລິດ $inlibc shell variable, ໃຊ້ພາຍໃນໂດຍ ກໍາຫນົດຄ່າ ການກວດສອບ
ບໍ່ວ່າຈະເປັນຟັງຊັນ C ທີ່ຖືກກໍານົດໄວ້ຫຼືບໍ່. ການ​ນໍາ​ໃຊ້​ປົກ​ກະ​ຕິ​ແມ່ນ​:

ຕັ້ງຟັງຊັນ d_func
eval $inlibc

ມັນຈະພິມຂໍ້ຄວາມ, ໂດຍກ່າວວ່າຟັງຊັນໄດ້ພົບເຫັນຫຼືບໍ່ແລະກໍານົດ
$d_func ຕາມນັ້ນ. ພາຍໃນ, ມັນໄດ້ນໍາໃຊ້ $csym ປົກກະຕິ.

Loc.U
ຫນ່ວຍງານທີ່ສໍາຄັນນີ້ຜະລິດ Shell script loc ເຊິ່ງສາມາດໃຊ້ເພື່ອຊອກຫາບ່ອນໃດ
ໃນບັນຊີລາຍຊື່ຂອງໄດເລກະທໍລີ, ໄຟລ໌ທີ່ໃຫ້ຢູ່. ການໂຕ້ຖຽງທໍາອິດລະບຸໄຟລ໌ໄປຫາ
ຕັ້ງຢູ່, ການໂຕ້ຖຽງທີສອງແມ່ນສິ່ງທີ່ຈະຖືກສົ່ງຄືນຖ້າການຄົ້ນຫາລົ້ມເຫລວ, ແລະ
reamining arguments ແມ່ນບັນຊີລາຍຊື່ຂອງໄດເລກະທໍລີທີ່ໄຟລ໌ຈະຖືກຄົ້ນຫາ. ສໍາລັບ
ຕົວຢ່າງ:

dflt=`./loc sendmail.cf X / usr / lib /var/lib/sendmail / lib`

ຈະຕັ້ງ $dflt to X ຖ້າບໍ່ມີ sendmail.cf ໄຟລ໌ໄດ້ຖືກພົບເຫັນພາຍໃຕ້ລາຍຊື່,
ຫຼືບາງສິ່ງບາງຢ່າງເຊັ່ນ: /usr/lib/sendmail.cf ໃນບາງລະບົບ. ເບິ່ງນຳ Getfile.U.

MailAuthor.U
ຫນ່ວຍນີ້ຈໍາເປັນຕ້ອງຖືກລວມຢູ່ໃນເສັ້ນ ?MAKE: ຂອງ End.U ສ່ວນຕົວຂອງເຈົ້າເອງເພື່ອສ້າງ
ມັນເຂົ້າໄປໃນ ກໍາຫນົດຄ່າ. ມັນສະເຫນີໃຫ້ຜູ້ໃຊ້ລົງທະບຽນຕົນເອງກັບຜູ້ຂຽນ, ທາງເລືອກ
ໄດ້ຮັບການແຈ້ງເຕືອນເມື່ອມີ patches ໃໝ່ມາຮອດ ຫຼືໄດ້ຮັບພວກມັນໂດຍອັດຕະໂນມັດເມື່ອອອກ.
ທ່ານຈໍາເປັນຕ້ອງຕິດຕັ້ງ ຈົດໝາຍ ເພື່ອເຮັດສິ່ງນີ້ (ຢ່າງຫນ້ອຍ 3.0).

MailList.U
ຫນ່ວຍນີ້ຈໍາເປັນຕ້ອງຖືກລວມຢູ່ໃນເສັ້ນ ?MAKE: ຂອງ End.U ສ່ວນຕົວຂອງເຈົ້າເອງເພື່ອສ້າງ
ມັນເຂົ້າໄປໃນ ກໍາຫນົດຄ່າ. ມັນສະເຫນີໃຫ້ຜູ້ໃຊ້ສາມາດຈອງຫຼືຍົກເລີກການຈອງບັນຊີລາຍຊື່ທາງໄປສະນີ
ບ່ອນທີ່ການສົນທະນາທີ່ກ່ຽວຂ້ອງກັບຊຸດກໍາລັງດໍາເນີນຢູ່. ທ່ານຈໍາເປັນຕ້ອງດໍາເນີນການ packinit
ແລະຕອບຄໍາຖາມທີ່ກ່ຽວຂ້ອງກັບບັນຊີລາຍການທາງໄປສະນີເພື່ອກໍານົດຕົວແປທີ່ເຫມາະສົມໃນຂອງທ່ານ
. ກະເປົາ ກ່ອນທີ່ຫນ່ວຍງານນີ້ອາດຈະດໍາເນີນການ.

Myinit.U
ສຳເນົາໜ່ວຍນີ້ໄປໃສ່ສ່ວນຕົວຂອງເຈົ້າ U ໄດເລກະທໍລີເພື່ອເພີ່ມຄ່າເລີ່ມຕົ້ນຂອງທ່ານເອງໃຫ້ກັບບາງອັນ
ຕົວແປພາຍໃນ. ໜ່ວຍນີ້ຖືກບັນຈຸເຂົ້າໃນ ກໍາຫນົດຄ່າ ຫຼັງຈາກທັງຫມົດຄ່າເລີ່ມຕົ້ນ
ການເລີ່ມຕົ້ນໄດ້ຖືກເຮັດແລ້ວ.

Myread.U
ຫນ່ວຍງານນີ້ຜະລິດ ອ່ານຂອງຂ້ອຍ shell script ທີ່ຈະຕ້ອງມີແຫຼ່ງເພື່ອເຮັດ a
ອ່ານ. ມັນອະນຸຍາດໃຫ້ shell escapes, ການກໍາຫນົດຄ່າເລີ່ມຕົ້ນແລະການປະເມີນພາລາມິເຕີ, ເປັນ
ເອກະສານຢູ່ໃນຫນ່ວຍ Instruct.U. ມັນຍັງອະນຸຍາດໃຫ້ການຕັ້ງຄ່າແບບເຄື່ອນໄຫວຂອງ -d ທາງເລືອກ,
ເຊິ່ງຈະຖືກນໍາໃຊ້ສໍາລັບການທີ່ຍັງເຫຼືອຂອງການປະຕິບັດສະຄິບ.

ເພື່ອໃຊ້ເຄື່ອງນີ້, $rp ຕ້ອງຖືຄໍາຖາມແລະ $dflt ຄວນມີຄ່າເລີ່ມຕົ້ນ
ຄໍາຕອບ. ຄໍາຖາມຈະຖືກພິມໂດຍ script ຕົວຂອງມັນເອງ, ແລະຜົນໄດ້ຮັບແມ່ນກັບຄືນມາ
ໃນ $ans ຕົວແປ.

ນີ້ແມ່ນການໃຊ້ງານປົກກະຕິ:

dflt='y'
rp='ຄຳຖາມ?'
. ./myread
value="$ans"

ເບິ່ງຫນ່ວຍງານຕົວມັນເອງສໍາລັບຂໍ້ມູນເພີ່ມເຕີມ.

Oldconfig.U
ໜ່ວຍນີ້ຕ້ອງເປັນສ່ວນໜຶ່ງຂອງການເພິ່ງພາອາໄສຂອງເຈົ້າບໍ?ເຮັດ: ເສັ້ນເມື່ອບາງໜ່ວຍຂອງເຈົ້າພະຍາຍາມ
ເພື່ອໃຊ້ຄືນຄ່າສັນຍາລັກເກົ່າ. ຫນ່ວຍງານນີ້ແມ່ນຮັບຜິດຊອບໃນການໄດ້ຮັບຄໍາຕອບເກົ່າ
ຈາກ config.sh ຫຼືໃຫ້ຄໍາແນະນໍາທີ່ເປັນປະໂຫຍດໃນເວລາທີ່ແລ່ນຢູ່ໃນເວທີທີ່ໃຫ້ສໍາລັບ
ຄັ້ງ​ທໍາ​ອິດ. ເບິ່ງ ກໍາຫນົດຄ່າ ຄໍາແນະນໍາ ວັກສໍາລັບຂໍ້ມູນເພີ່ມເຕີມກ່ຽວກັບຄໍາແນະນໍາ.

ຄຳນຳໜ້າ.U
ຈຸດ​ປະ​ສົງ​ຂອງ​ຫນ່ວຍ​ບໍ​ລິ​ການ​ນີ້​ແມ່ນ​ເພື່ອ​ກວດ​ສອບ​ການ​ປ່ຽນ​ແປງ​ໃນ​ລະ​ບົບ​ຄໍາ​ນໍາ​ຫນ້າ​ການ​ຕິດ​ຕັ້ງ​ເພື່ອ​
recompute ອັດຕະໂນມັດທີ່ເຫມາະສົມຄ່າເລີ່ມຕົ້ນຈາກຄໍາຕອບທີ່ຜ່ານມາ. ມັນຂຶ້ນກັບ
ມູນຄ່າຂອງ $oldprefix ຕົວແປທີ່ຖືໄດເລກະທໍລີ prefix ກ່ອນຫນ້າເມື່ອມັນ
ມີການປ່ຽນແປງ, ແລະຫວ່າງເປົ່າ. ຕົວຢ່າງ, ຖ້າຄໍານໍາຫນ້າຖືກປ່ຽນຈາກ / ເລືອກ to
/ usr / ທ້ອງຖິ່ນ, ຫຼັງຈາກນັ້ນໄດເລກະທໍລີການຕິດຕັ້ງຖານສອງກ່ອນຫນ້າຈະຖືກປ່ຽນຈາກ
/opt/bin to / usr / local / bin, ຫຼືຈະຍັງຄົງບໍ່ປ່ຽນແປງຖ້າຫາກວ່າມັນແມ່ນ, ເວົ້າວ່າ, / ຖັງ.

ທ່ານຈໍາເປັນຕ້ອງໂທຫາ ທີ່ກໍານົດໄວ້ ກ່ອນທີ່ຈະອອກ ການປະເມີນ on $prefixit, ເຊັ່ນ​ວ່າ:

ຕັ້ງ dflt var [dir]
eval $prefixit

ເຊິ່ງຈະກໍານົດ $dflt to $var or $prefix/dir ຂຶ້ນກັບວ່າຄໍານໍາຫນ້າຍັງຄົງຢູ່
ຄືກັນຫຼືບໍ່. ຖ້າ dir ແມ່ນສາຍ none, ຄ່າຊ່ອງດຽວໃນ $dflt ຖືກ​ເກັບ​ຮັກ​ສາ​ໄວ້​ເປັນ -
ແມ່ນ, ເຖິງແມ່ນວ່າໃນເວລາທີ່ຄໍານໍາຫນ້າມີການປ່ຽນແປງ. ຖ້າ dir ຖືກລະເວັ້ນ, ຈາກນັ້ນ $dflt ຖືກຕັ້ງເປັນຫວ່າງເປົ່າ
string ຖ້າຄໍານໍາຫນ້າມີການປ່ຽນແປງ, to $var ຖ້າບໍ່ດັ່ງນັ້ນ.

ຄຳນຳໜ້າ.U
ຈຸດປະສົງຂອງຫນ່ວຍງານ thit ແມ່ນຄ້າຍຄືກັນກັບຂອງ Prefixit.U, ie ມັນຊ່ວຍແກ້ໄຂ.
ສະຕຣິງເລີ່ມຕົ້ນເພື່ອຮອງຮັບການປ່ຽນແປງຄໍານໍາຫນ້າ. ຢ່າງໃດກໍຕາມ, shell ມີການປ່ຽນແປງ $prefixup,
ໃນ​ເວ​ລາ​ທີ່​ການ​ປະ​ເມີນ​ຜົນ​, ພຽງ​ແຕ່​ຈະ​ຟື້ນ​ຟູ ~ ການ​ຂະ​ຫຍາຍ​ຊື່​, ຄວນ​ນໍາ​ໃຊ້​ຄໍາ​ນໍາ​ຫນ້າ​ເຊັ່ນ​ການ​ຫນີ​
ກົນ​ໄກ. ໃຊ້ມັນເປັນ:

ຕັ້ງ dflt
eval $prefixup

ກ່ອນທີ່ຈະກະຕຸ້ນເຕືອນຜ່ານ ເອົາໄຟລ ຕົວ​ຢ່າງ. ຖ້າຄໍານໍາຫນ້າບໍ່ໄດ້ໃຊ້ ~ ຊື່
ການຂະຫຍາຍຕົວ, ຫຼັງຈາກນັ້ນຂ້າງເທິງຈະເປັນ no-op ກ່ຽວກັບ y ປ່ຽນແປງໄດ້, ຕາມທໍາມະຊາດ.

Typedef.U
ຫນ່ວຍງານນີ້ຜະລິດ $typedef shell variable, ໃຊ້ພາຍໃນໂດຍ ກໍາຫນົດຄ່າ ການກວດສອບ
ບໍ່ວ່າຈະມີ typedef ຫຼືບໍ່. ການ​ນໍາ​ໃຊ້​ປົກ​ກະ​ຕິ​ແມ່ນ​:

ຕັ້ງ typedef val_t default [ປະກອບມີ]
eval $typedef

ນີ້ຈະກໍານົດຕົວແປ val_t ກັບມູນຄ່າຂອງ Default ຖ້າ typedef ບໍ່ພົບ
ໃນບັນດາລາຍການປະກອບມີໄຟລ໌, ຫຼືເພື່ອ ພິມປະເພດ ຖ້າພົບເຫັນ. ຖ້າບໍ່ປະກອບມີໄຟລ໌
ລະບຸໄວ້, ຫນ່ວຍບໍລິການເບິ່ງຢູ່ໃນ ເທົ່ານັ້ນ. ຖ້າ​ຫາກ​ວ່າ​ທ່ານ​ລະ​ບຸ​ບາງ​ຢ່າງ​ປະ​ກອບ​ມີ​, ພຽງ​ແຕ່​
ເຫຼົ່ານັ້ນແມ່ນເບິ່ງຢູ່.

Unix.U
ຈຸດປະສົງຂອງຫນ່ວຍງານນີ້ແມ່ນເພື່ອກໍານົດບາງ UNIX-isms ທົ່ວໄປທີ່ສຸດໂດຍຜ່ານຕົວແປ
ເຊິ່ງສາມາດຖືກປ່ຽນແປງຈາກເສັ້ນຄໍາສັ່ງຫຼືຜ່ານໄຟລ໌ຄໍາແນະນໍາທີ່ເຫມາະສົມ. ໂດຍ​ສະ​ເພາະ,
$_exe, $_o ແລະ $_a ຖືກກໍານົດ. ຫນ່ວຍງານທັງຫມົດຄວນອ້າງເຖິງ $_o ແລະບໍ່ໃຫ້ .o ໂດຍກົງ.
ໄດ້ '.' ແມ່ນສ່ວນຫນຶ່ງຂອງຕົວແປເຫຼົ່ານີ້.

Setvar.U
ຫນ່ວຍງານນີ້ຜະລິດຕົວແປ, ເຊິ່ງຖືກນໍາໃຊ້ພາຍໃນໂດຍ ກໍາຫນົດຄ່າ ກໍານົດເປັນ
ກໍານົດຄ່າ /undef ກັບສັນຍາລັກທີ່ໃຫ້, emitting ເຕືອນໃນເວລາທີ່ມັນມີການປ່ຽນແປງຢ່າງກະທັນຫັນ
ຈາກຄ່າທີ່ຜ່ານມາ. ຕົວ​ຢ່າງ:

val="$define"
ຕັ້ງ d_variable
eval $setvar

ຖ້າກ່ອນຫນ້ານີ້ $d_variable ຄ່າບໍ່ແມ່ນ null ແລະ $val ແມ່ນແຕກຕ່າງກັນ, "whoa"
ອອກ​ຄໍາ​ເຕືອນ​.

ວ້າວ
ຫນ່ວຍງານນີ້ຜະລິດ whoa script, ເຊິ່ງ emits ການເຕືອນໄພໃນເວລາທີ່ ມູນຄ່າ ໃນຕົວແປ
ຊື່ຂອງໃຜ $var ບໍ່ຄືກັບຄ່າເກົ່າເກົ່າຂອງມັນທີ່ຖືຢູ່ໃນ $ ແມ່ນ. ຕາມ
ກັບມາ, $td ແລະ $tu ຖືມູນຄ່າທີ່ເຫມາະສົມກັບ ກໍານົດ or undef ຕົວແປ. ເບິ່ງ
ຕົວຢ່າງໃນ Inlibc.U.

ບຶງທາດຫຼວງ ໂປເຊດເຊີກ່ອນ
ແຕ່ລະຫນ່ວຍທີ່ຈະລວມຢູ່ໃນ ກໍາຫນົດຄ່າ ແມ່ນແລ່ນຜ່ານຕົວປະມວນຜົນກ່ອນສ້າງ. ກ່ອນ
ຖະແຫຼງການຂອງໂປເຊດເຊີຖືກນໍາສະເຫນີໂດຍຕົວອັກສອນ '@' ('#' ແມ່ນຄໍາຄິດຄໍາເຫັນຂອງແກະ
ລັກສະນະ). ມັນເຮັດຫນ້າທີ່ພຽງແຕ່ເປັນ C pre-processor ເຮັດແຕ່ອະນຸຍາດໃຫ້ສໍາລັບ shell ແລະ perl
ໜີ. ນີ້ແມ່ນຫນ້າທີ່ທີ່ມີຢູ່:

@ຖ້າ ການສະແດງອອກ
If ການສະແດງອອກ ເປັນຄວາມຈິງ, ສືບຕໍ່ການໂຫຼດລະຫັດຈົນກ່ວາ @end, @elsif ຫຼື @else.

@elsif ການສະແດງອອກ
ທາງເລືອກ. ຖ້າ ການສະແດງອອກ ເປັນຄວາມຈິງ, ສືບຕໍ່ການໂຫຼດລະຫັດຈົນກ່ວາ @end,
ອື່ນ @elsif ຫຼື @else.

@else ລະຫັດເລີ່ມຕົ້ນທີ່ຈະໂຫລດຖ້າຫາກວ່າ @if ການສະແດງອອກ ບໍ່ຖືກຕ້ອງ ແລະບໍ່ມີອັນໃດອັນໃດ
ທາງເລືອກ @elsif ກົງກັນ. ໂຫຼດຈົນກ່ວາ @end.

@end ປິດຄຳຖະແຫຼງການໂຫຼດຕາມເງື່ອນໄຂທີ່ເປີດໂດຍ @if.

@ກໍານົດ ສັນຍາລັກ
ບອກຕົວປະມວນຜົນກ່ອນນັ້ນ ສັນຍາລັກ ໄດ້​ຖືກ​ກໍາ​ນົດ​ຈາກ​ນີ້​ໄປ​.

ເງື່ອນໄຂ ການສະແດງອອກ ສາມາດປະກອບມີຊື່ສັນຍາລັກ (ມູນຄ່າແມ່ນຄວາມຈິງຖ້າສັນຍາລັກຕ້ອງການຫຼື
ກໍານົດໂດຍຜ່ານ @ກໍານົດ ຫຼື shell/perl ຫນີ. ປະລໍາມະນູເຫຼົ່ານັ້ນສາມາດຖືກລວມເຂົ້າກັນໂດຍໃຊ້
ຕົວປະຕິບັດການ boolean ແບບດັ້ງເດີມ '!' ສໍາລັບການປະຕິເສດ, '&&' ສໍາລັບເຫດຜົນແລະ, ແລະ '||' ສໍາລັບເຫດຜົນ
ຫຼື.

ຂໍ້​ຄວາມ​ທີ່​ປິດ​ຢູ່​ໃນ​ວົງ​ເລັບ​ດຽວ​ແມ່ນ​ການ​ທົດ​ສອບ​ແກະ​, ໃນ​ຂະ​ນະ​ທີ່​ຂໍ້​ຄວາມ​ລະ​ຫວ່າງ​ຫ້າມ​ລໍ້​ສອງ​ແມ່ນ​
ການທົດສອບ perl. ຄື​ສໍາ​ນວນ​:

{ ຫອຍ ຂໍ້ຄວາມ }
{{ perl ຂໍ້ຄວາມ }}

ແປເປັນ:

if ຫອຍ ຂໍ້ຄວາມ >/dev/null 2>&1; ຈາກນັ້ນອອກ 0; else ອອກຈາກ 1; ຟີ
ຖ້າ (perl ຂໍ້ຄວາມ) {ອອກ 0;} else {ອອກ 1;}

ແລະສະຖານະການອອກແມ່ນໃຊ້ໃນແບບມາດຕະຖານເພື່ອໃຫ້ໄດ້ຄ່າ boolean, ie 0 ແມ່ນ true ແລະ
ທຸກສິ່ງທຸກຢ່າງອື່ນແມ່ນບໍ່ຖືກຕ້ອງ. ໃຫ້ສັງເກດວ່າພຽງແຕ່ເງື່ອນໄຂທີ່ງ່າຍດາຍສາມາດສະແດງອອກໃນ perl, ຈົນກ່ວາ
ບາງລະຫັດຊັບຊ້ອນສາມາດໂຫລດໄດ້ພາຍໃນ metaconfig ແລະ​ປະ​ຕິ​ບັດ​.

ໂປເຊດເຊີທີ່ຕິດຕັ້ງໄວ້ກ່ອນສາມາດຖືກນໍາໃຊ້ເພື່ອປັບບາງຫນ່ວຍງານຢ່າງລະອຽດ (ເບິ່ງ d_gethname.U ສໍາ​ລັບ
ຕົວຢ່າງທີ່ສັບສົນ) ອີງຕາມສັນຍາລັກທີ່ໃຊ້ຕົວຈິງໂດຍໂຄງການຫຼືໄຟລ໌
ມີຢູ່ໃນການແຈກຢາຍ. ສໍາລັບຕົວຢ່າງ, ໄດ້ Oldconfig.U ໃຊ້ການທົດສອບເຊັ່ນ:

@if {test -d../hints}

ແລະ ກໍາຫນົດຄ່າ ຈະ​ມີ​ລະ​ຫັດ​ທີ່​ອີງ​ຕາມ​ຄໍາ​ແນະ​ນໍາ​ພຽງ​ແຕ່​ຖ້າ​ຫາກ​ວ່າ​ມີ a ຄໍາແນະນໍາ ໄດເລກະທໍລີໃນ
ໄດເລກະທໍລີລະດັບສູງສຸດຂອງແພັກເກັດ. ໃຫ້ສັງເກດວ່າການທົດສອບແມ່ນແລ່ນມາຈາກພາຍໃນ '.MT' ລະ​ບົບ​,
ເພາະສະນັ້ນ, ຕ້ອງການ '../' ໃນການທົດສອບ.

ໂປເຊດເຊີເບື້ອງຕົ້ນຍັງສາມາດຖືກນໍາໃຊ້ເພື່ອຫຼີກເວັ້ນການໃສ່ລະຫັດທີ່ບໍ່ມີປະໂຫຍດໃນເວລາທີ່ສັນຍາລັກບໍ່ແມ່ນ
ກໍານົດ. ຫນ່ວຍງານທີ່ກໍານົດຫຼາຍກວ່າຫນຶ່ງສັນຍາລັກສາມາດຖືກປົກປ້ອງດ້ວຍວິທີນັ້ນ (ນັບຕັ້ງແຕ່ຫນ່ວຍງານແມ່ນ
ໂຫຼດທັງໝົດ) ໂດຍການລວບລວມລະຫັດທີ່ຂຶ້ນກັບສັນຍາລັກພາຍໃນຄູ່ @if/@end. ສໍາລັບ
ຕົວຢ່າງ:

@if I_TIME || I_SYS_TIME || I_SYS_TIME_KERNEL
need_time_h='ຈິງ'
@ອື່ນໆ
need_time_h='false'
@ຈົບ

ຈະທົດສອບວ່າລະຫັດແຫຼ່ງເຮັດໃຫ້ການນໍາໃຊ້ຫນຶ່ງໃນສາມສັນຍາລັກທີ່ຄວບຄຸມ
ໄດ້ ເວລາ or sys/time.h ລວມແລະກໍານົດສັນຍາລັກ shell ຕາມຄວາມເຫມາະສົມ. ທີ່ໃຫ້
ກໍາຫນົດຄ່າ ຄວາມຄິດເຫັນກ່ຽວກັບສິ່ງທີ່ແຫຼ່ງຂໍ້ມູນຕ້ອງການແລະຫຼີກເວັ້ນຂໍ້ເສຍຂອງການມີການແກ້ໄຂ
ຫນ່ວຍ frozen.

ຜ່ານເສັ້ນ '?W:', ທ່ານສາມາດໄດ້ຮັບການປະສົມປະສານທີ່ຫນ້າສົນໃຈ. ສໍາລັບຕົວຢ່າງ, ໄດ້ i_time.U ຫນ່ວຍບໍລິການ
ຕ້ອງການຮູ້ວ່າແຫຼ່ງ C ເຮັດໃຫ້ການນໍາໃຊ້ໃດໆຂອງ ໂຄງສ້າງ ເຂດ​ເວ​ລາ ປະເພດ. ດັ່ງນັ້ນ,
ເສັ້ນ:

?W::ເຂດເວລາ

ຖືກນໍາໃຊ້ສໍາລັບຜົນກະທົບຂ້າງຄຽງຂອງການກໍານົດສັນຍາລັກ ເຂດ​ເວ​ລາ ສໍາລັບຕົວປະມວນຜົນກ່ອນ. ໄດ້
ລະຫັດຫົວໜ່ວຍສາມາດເວົ້າວ່າ:

@if ເຂດເວລາ
ສໍາລັບ s_timezone ໃນ '-DS_TIMEZONE'''; ເຮັດ
@ອື່ນໆ
s_timezone=''
@ຈົບ

... ລະຫັດໂດຍໃຊ້ s_timezone ...

@if ເຂດເວລາ
ເຮັດ
@ຈົບ

ແລະມີ loop ພິເສດທີ່ພະຍາຍາມສອງຄ່າຕິດຕໍ່ກັນສໍາລັບ s_timezone ຕົວແປ, ແຕ່ວ່າພຽງແຕ່
ຖ້າຈໍາເປັນ.

ລ້າສະໄຫມ ສັນຍາລັກ
ສັນຍາລັກທີ່ລ້າສະໄຫມຖືກຮັກສາໄວ້ເພື່ອຜ່ອນຄາຍການປ່ຽນແປງກັບອາຍຸ metaconfig ໜ່ວຍ. ເວັ້ນເສຍແຕ່
ໄດ້ -o switch ແມ່ນຜ່ານໄປ metaconfig ເຂົາເຈົ້າຈະຖືກລະເລີຍ. ຢ່າງໃດກໍຕາມ, ເປັນ ລ້າສະໄຫມ file ຈະ
ຖືກສ້າງຂື້ນ, ບອກທ່ານວ່າໄຟລ໌ໃດທີ່ກໍາລັງໃຊ້ສັນຍາລັກລ້າສະໄຫມເຫຼົ່ານັ້ນແລະແມ່ນຫຍັງ
ແມ່ນສັນຍາລັກໃຫມ່ທີ່ຈະນໍາໃຊ້.

ຕະຫຼອດຊີວິດຂອງສັນຍາລັກລ້າສະໄຫມແມ່ນຫນຶ່ງການແກ້ໄຂຢ່າງເຕັມທີ່, ie ເຂົາເຈົ້າຈະໄດ້ຮັບການໂຍກຍ້າຍອອກໃນເວລາທີ່
ການປັບປຸງພື້ນຖານຕໍ່ໄປແມ່ນອອກ (ການຍົກລະດັບ patch ບໍ່ນັບແນ່ນອນ). ເພາະສະນັ້ນ, ມັນແມ່ນ
ສະຫລາດທີ່ຈະແປແຫຼ່ງຂອງທ່ານແລະເລີ່ມຕົ້ນການນໍາໃຊ້ສັນຍາລັກໃຫມ່ໄວເທົ່າທີ່ເປັນໄປໄດ້.

ກໍາຫນົດຄ່າ ຄໍາແນະນໍາ
ມັນອາດຈະເກີດຂຶ້ນວ່າເຫດຜົນການຕັ້ງຄ່າພາຍໃນເຮັດໃຫ້ທາງເລືອກທີ່ຜິດພາດ. ສໍາລັບ
ຕົວຢ່າງ, ໃນບາງເວທີ, the vfork() ການໂທລະບົບແມ່ນປະຈຸບັນແຕ່ແຕກຫັກ, ສະນັ້ນມັນຄວນຈະ
ບໍ່ໄດ້ຖືກນໍາໃຊ້. ມັນເປັນໄປບໍ່ໄດ້ທີ່ຈະລວມເອົາຄວາມຮູ້ນັ້ນຢູ່ໃນຫນ່ວຍງານຂອງຕົນເອງ, ເພາະວ່າ
ນັ້ນອາດຈະເປັນບັນຫາຊົ່ວຄາວທີ່ຜູ້ຂາຍຈະແກ້ໄຂໃນທີ່ສຸດ, ຫຼືບາງສິ່ງບາງຢ່າງທີ່
ໄດ້ຖືກນໍາສະເຫນີໂດຍການຍົກລະດັບ OS ໃຫມ່.

ຢ່າງໃດກໍ່ຕາມ, ສໍາລັບບັນຫານ້ອຍໆທັງໝົດເຫຼົ່ານັ້ນ ທີ່ເປັນລະບົບສະເພາະເກີນໄປ, metaconfig
ສະຫນອງການສະຫນັບສະຫນູນໄຟລ໌ຄໍາແນະນໍາ. ເພື່ອໃຊ້ມັນ, ທ່ານຈໍາເປັນຕ້ອງສ້າງ a ຄໍາແນະນໍາ ໄດເລກະທໍລີໃນ
ໄດເລກະທໍລີລະດັບສູງສຸດຂອງແພັກເກັດ, ແລະມີມັນໃນເວລາທີ່ທ່ານດໍາເນີນການ metaconfig. ທີ່ຈະໂຫລດ
ພາກສ່ວນທີ່ກ່ຽວຂ້ອງກັບຄໍາແນະນໍາຈາກ Oldconfig.U.

ຈາກ​ນັ້ນ​, ທ່ານ​ອາດ​ຈະ​ກໍາ​ນົດ​ໄວ້​ລ່ວງ​ຫນ້າ​ຂອງ​ຕົວ​ແປ​ຂອງ shell ບາງ​ ກໍາຫນົດຄ່າ ໃຊ້ໃນ OS ສະເພາະ
ໄຟລ໌ .sh. ມີລະຫັດຢູ່ໃນ Oldconfig.U ທີ່ພະຍາຍາມເດົາວ່າໄຟລ໌ຄໍາແນະນໍາໃດຕ້ອງການໂດຍ
ການ​ຄິດ​ໄລ່​ຊື່​ມາດ​ຕະ​ຖານ​ໂດຍ​ອີງ​ໃສ່​ຊື່ OS ຂອງ​ລະ​ບົບ​, ຊື່ kernel​, ການ​ປ່ອຍ​
ຈໍານວນ, ແລະອື່ນໆ ... ເນື່ອງຈາກຂໍ້ມູນນີ້ອາດຈະມີການປ່ຽນແປງຢ່າງໄວວາ, ຂ້າພະເຈົ້າບໍ່ໄດ້ບັນທຶກມັນ
ທີ່ນີ້. ທ່ານ​ຈໍາ​ເປັນ​ຕ້ອງ reverse engineer ລະ​ຫັດ​ຈາກ Oldconfig.U.

ເມື່ອທ່ານປ່ອຍຊຸດຂອງທ່ານຄັ້ງທໍາອິດ, ລາຍຊື່ໄຟລ໌ຄໍາແນະນໍາຂອງທ່ານຄວນຈະຫວ່າງເປົ່າ. ຖ້າ
ຜູ້ໃຊ້ຊຸດຂອງທ່ານຈົ່ມວ່າພວກເຂົາມີບັນຫາກັບ ກໍາຫນົດຄ່າ ຄ່າເລີ່ມຕົ້ນໃນ a
ລະບົບໂດຍສະເພາະ, ທ່ານຕ້ອງເບິ່ງວ່ານີ້ແມ່ນບັນຫາສະເພາະເວທີຫຼື a
ທົ່ວໄປ. ໃນກໍລະນີທີ່ຜ່ານມາ, ມັນເປັນເວລາທີ່ຈະແນະນໍາໄຟລ໌ຄໍາແນະນໍາໃຫມ່, ໃນຂະນະທີ່ຢູ່ໃນ
ສຸດທ້າຍ, ຫນ່ວຍງານທີ່ສອດຄ້ອງກັນຄວນໄດ້ຮັບການປັບປຸງ.

ສໍາລັບຕົວຢ່າງ, ລະບົບ SGI ແມ່ນເປັນທີ່ຮູ້ຈັກທີ່ຈະແຕກຫັກ vfork() ການໂທລະບົບ, ໃນເວລານີ້
ການ​ຂຽນ. ແລະຊື່ໄຟລ໌ hint ທີ່ສອດຄ້ອງກັນແມ່ນ sgi.sh. ດັ່ງ​ນັ້ນ​ທັງ​ຫມົດ​ທີ່​ທ່ານ​ຕ້ອງ​ການ​ຈະ​ເຮັດ​ແມ່ນ​ການ​ສ້າງ​
a hints/sgi.sh ໄຟລ໌ທີ່ທ່ານຂຽນ:

d_vfork="$define"

ເຊິ່ງຈະ remap ສະເຫມີ vfork on fork (ເບິ່ງ d_vfork.U). ໃນເວລາທີ່ແລ່ນຢູ່ໃນລະບົບ SGI ສໍາລັບ
ຄັ້ງ​ທໍາ​ອິດ, ກໍາຫນົດຄ່າ ຈະກວດພົບວ່າມີ hints/sgi.sh ໄຟລ໌, ແລະວ່າພວກເຮົາຢູ່ໃນ
ເຄື່ອງ IRIX (ຊື່ kernel ມັກຈະ / irix), ດັ່ງນັ້ນມັນຈະສະເຫນີ sgi ເປັນຫນຶ່ງ
ຄໍາແນະນໍາທີ່ເປັນໄປໄດ້. ຖ້າຜູ້ໃຊ້ຍອມຮັບມັນ, ແລະນັບຕັ້ງແຕ່ $d_vfork ມູນ​ຄ່າ​ແມ່ນ​ການ​ແກ້​ໄຂ​ໂດຍ​ຜ່ານ​ການ​
$setvar ໂທ, ກ ວ້າວ! ຈະຖືກປ່ອຍອອກມາເພື່ອເຕືອນວ່າພວກເຮົາກໍາລັງຈະ override ມູນຄ່າ
ຄິດໄລ່ໂດຍ ກໍາຫນົດຄ່າ.

ໃຫ້ສັງເກດວ່າທ່ານບໍ່ຈໍາເປັນຕ້ອງສະຫນອງ ທັງຫມົດ ຄໍາແນະນໍາທີ່ຮູ້ຈັກໂດຍ Oldconfig.U. ຖ້າໄຟລ໌ຄໍາແນະນໍາແມ່ນ
ຂາດ, ມັນຈະບໍ່ຖືກສະເຫນີເປັນທາງເລືອກທີ່ເປັນໄປໄດ້. ການທົດສອບ heuristic ແລ່ນເພື່ອຄິດໄລ່
ຜູ້ສະ ໝັກ ແນະ ນຳ ທີ່ເປັນໄປໄດ້ແມ່ນຂີ້ຕົວະ. ຖ້າທ່ານມີຄ່າໃຫມ່ຫຼືການທົດສອບທີ່ແຕກຕ່າງກັນ, ກະລຸນາ
ສົ່ງພວກເຂົາໄປຫາຂ້ອຍ ...

ຂ້າມ ທາງເລືອກ
ຖ້າເຈົ້າສ້າງ ກ config.over ໄຟລ໌ຢູ່ໃນໄດເລກະທໍລີລະດັບສູງສຸດ, ກໍາຫນົດຄ່າ ຈະຖາມເຈົ້າວ່າເຈົ້າ
ຕ້ອງການໂຫຼດມັນເພື່ອ override ຄ່າເລີ່ມຕົ້ນ. ນີ້ ແມ່ນ ເຮັດ ໄດ້ ກ່ອນ ການ ສ້າງ ຂອງ
config.sh ໄຟລ໌, ສະນັ້ນມັນເຮັດໃຫ້ທ່ານມີໂອກາດທີ່ຈະແກ້ໄຂຄ່າທີ່ເກັບໄວ້ໃນນັ້ນ.

ນີ້ແມ່ນແຕກຕ່າງຈາກວິທີການຄໍາແນະນໍາທີ່ມັນເປັນໄຟລ໌ທ້ອງຖິ່ນ, ທີ່ຜູ້ໃຊ້ແມ່ນ
ບໍ່ເສຍຄ່າເພື່ອສ້າງສໍາລັບການນໍາໃຊ້ຂອງຕົນເອງ. ທ່ານບໍ່ຄວນສະຫນອງໄຟລ໌ດັ່ງກ່າວຕົວທ່ານເອງ, ແຕ່ໃຫ້
ຜູ້ໃຊ້ຮູ້ກ່ຽວກັບຄວາມເປັນໄປໄດ້ນີ້.

ກໍາຫນົດຄ່າ ທາງເລືອກໃນການ
ໄດ້ ກໍາຫນົດຄ່າ script ອາດຈະຖືກເອີ້ນດ້ວຍຕົວເລືອກບາງຢ່າງທີ່ລະບຸໄວ້ໃນເສັ້ນຄໍາສັ່ງ, to
ປັບປ່ຽນພຶດຕິກຳຂອງມັນເລັກນ້ອຍ. ນີ້ແມ່ນທາງເລືອກທີ່ອະນຸຍາດ:

-d ໃຊ້ຄ່າເລີ່ມຕົ້ນສຳລັບຄຳຕອບທັງໝົດ.

-e ໄປສຸດໂດຍບໍ່ມີການຄໍາຖາມທີ່ຜ່ານມາການຜະລິດຂອງ config.sh.

-f ເອກະສານ ໃຊ້ໄຟລ໌ທີ່ລະບຸໄວ້ເປັນການຕັ້ງຄ່າເລີ່ມຕົ້ນ. ຖ້າສະວິດນີ້ບໍ່ໄດ້ໃຊ້,
ການຕັ້ງຄ່າແມ່ນເອົາມາຈາກ config.sh, ເມື່ອປະຈຸບັນ.

-h ພິມຂໍ້ຄວາມຊ່ວຍເຫຼືອ ແລະອອກ.

-r ໃຊ້ຄືນຄ່າສັນຍາລັກ C ຖ້າເປັນໄປໄດ້. ນີ້ຈະຂ້າມຄ່າໃຊ້ຈ່າຍ nm ສັນຍາລັກ
ການສະກັດເອົາ. ຖ້າໃຊ້ຄັ້ງທໍາອິດ (ບໍ່ມີໄຟລ໌ການຕັ້ງຄ່າກ່ອນຫນ້ານີ້),
ກໍາຫນົດຄ່າ ຈະພະຍາຍາມລວບລວມແລະເຊື່ອມຕໍ່ໂຄງການຂະຫນາດນ້ອຍເພື່ອໃຫ້ຮູ້ກ່ຽວກັບ
ການປະກົດຕົວຂອງສັນຍາລັກ, ຫຼືການຂາດຂອງມັນ.

-s ໂໝດງຽບ. ມີແຕ່ສະຕຣິງທີ່ພິມໃນຕົວອະທິບາຍໄຟລ໌ #4 ເທົ່ານັ້ນທີ່ຈະເຫັນຢູ່ໃນ
ຫນ້າຈໍ (ນັ້ນແມ່ນຂໍ້ຄວາມທີ່ສໍາຄັນ). ມັນເປັນໄປບໍ່ໄດ້ທີ່ຈະປິດຢ່າງສົມບູນ
ຜົນຜະລິດໃດໆ, ແຕ່ທ່ານອາດຈະໃຊ້ 'ກໍາຫນົດຄ່າ -ders > / dev / null 2> & 1' ເພື່ອ​ໃຫ້​ມີ​ຢ່າງ​ເຕັມ​ທີ່​
batch run ໂດຍບໍ່ມີການ output ແລະບໍ່ຈໍາເປັນຕ້ອງມີການໂຕ້ຕອບຜູ້ໃຊ້.

-D symbol=value
ກຳນົດລ່ວງໜ້າ ສັນຍາລັກ ເພື່ອຮັບຜິດຊອບທີ່ກໍານົດໄວ້ ມູນຄ່າ. ມັນເປັນໄປໄດ້ທີ່ຈະໃຊ້ '-D
ສັນຍາລັກ' ເຊິ່ງຈະໃຊ້ຄ່າເລີ່ມຕົ້ນຂອງ 'define'.

-E ຢຸດໃນຕອນທ້າຍຂອງຄໍາຖາມການຕັ້ງຄ່າ, ຫຼັງຈາກການຜະລິດ a
config.sh. ນີ້ຈະບໍ່ປະຕິບັດໃດໆ 'ເຮັດໃຫ້ ຂຶ້ນກັບ' ຫຼືການສະກັດໄຟລ໌ .SH.

-K ຜູ້ໃຊ້ທີ່ມີຄວາມຮູ້. ເມື່ອທ່ານໃຊ້ຕົວເລືອກນີ້, ທ່ານຮູ້ວ່າທ່ານກໍາລັງເຮັດຫຍັງແລະ
ເພາະສະນັ້ນຈຶ່ງໄດ້ config.sh ໄຟລ໌ຈະຖືກຈັດການສະເໝີຄືກັບວ່າມັນຖືກຕັ້ງໄວ້
ຖືກນໍາໃຊ້ຄືນໃຫມ່, ເຖິງແມ່ນວ່າມັນອາດຈະຖືກສ້າງຂື້ນໃນລະບົບມະນຸດຕ່າງດາວ. ມັນຍັງ
ປ້ອງກັນການເອົາລູກອອກເມື່ອ ກໍາຫນົດຄ່າ ກວດພົບຕົວສັງລວມ C ທີ່ບໍ່ສາມາດໃຊ້ໄດ້ ຫຼືຊຸດທີ່ຜິດພາດ
ຂອງທຸງ C. ທາງລັດເພີ່ມເຕີມອາດຈະຖືກເປີດໃຊ້ໂດຍຕົວເລືອກນີ້ເຊັ່ນດຽວກັນໃນ
ອະນາຄົດ. ທາງເລືອກນີ້ແມ່ນບັນທຶກໄວ້ໃນ ກໍາຫນົດຄ່າ ຂໍ້​ຄວາມ​ການ​ນໍາ​ໃຊ້​, ເພື່ອ​ເຕືອນ​ພວກ​ເຮົາ​
ກ່ຽວກັບການມີຢູ່ຂອງມັນ, ແຕ່ຄໍາອະທິບາຍທີ່ໃຫ້ໄວ້ແມ່ນຫວັງວ່າຈະເປັນລະຫັດລັບພຽງພໍ.
:-)

-O ອະນຸຍາດຄ່າທີ່ລະບຸຜ່ານ a -D or -U ເພື່ອລົບລ້າງການຕັ້ງຄ່າຈາກການໂຫຼດໃດໆ
ໄຟລ໌ການຕັ້ງຄ່າ. ນີ້ບໍ່ແມ່ນພຶດຕິກຳເລີ່ມຕົ້ນເນື່ອງຈາກການ overriding ຈະ
ບໍ່ໄດ້ຖືກຂະຫຍາຍພັນໄປຫາຕົວແປທີ່ມາຈາກສິ່ງທີ່ທ່ານກໍາລັງປ່ຽນແປງໃນປັດຈຸບັນ.
ຕາມທໍາມະຊາດ, ໂດຍບໍ່ມີການ -O, ການຕັ້ງຄ່າແມ່ນເຮັດໄດ້ພຽງແຕ່ເມື່ອບໍ່ມີໄຟລ໌ການຕັ້ງຄ່າ
loaded, ເຊິ່ງປອດໄພເນື່ອງຈາກຕົວແປທີ່ມາຈາກບໍ່ໄດ້ຄິດໄລ່ເທື່ອ ...

-S ປະຕິບັດການປ່ຽນແທນຕົວແປໃນໄຟລ໌ .SH ທັງໝົດ. ທ່ານສາມາດສົມທົບມັນກັບ
-f ສະຫຼັບເພື່ອເຜີຍແຜ່ການຕັ້ງຄ່າໃດກໍໄດ້ທີ່ທ່ານຕ້ອງການ.

-U ສັນ​ຍາ​ລັກ =
ຊຸດກ່ອນ ສັນຍາລັກ ຮັບຜິດຊອບຄ່າຫວ່າງເປົ່າ. ມັນເປັນໄປໄດ້ທີ່ຈະໃຊ້ '-U ສັນຍາລັກ'
ເຊິ່ງຈະກໍານົດ ສັນຍາລັກ ກັບ 'undef'.

-V ພິມ​ຈໍາ​ນວນ​ສະ​ບັບ​ຂອງ​ metaconfig ທີ່ສ້າງນີ້ ກໍາຫນົດຄ່າ script
ແລະອອກຈາກການ.

ເຮັດວຽກ ສະພາບແວດລ້ອມ
ເມື່ອເລີ່ມຕົ້ນ, ກໍາຫນົດຄ່າ ສ້າງທ້ອງຖິ່ນ UU ໄດເລກະທໍລີແລະແລ່ນຈາກບ່ອນນັ້ນ. ໄດເລກະທໍລີ
ຖືກເອົາອອກເມື່ອ Configure ສິ້ນສຸດລົງ, ແຕ່ນີ້ຫມາຍຄວາມວ່າທ່ານຕ້ອງແລ່ນສະຄິບຈາກບ່ອນໃດນຶ່ງ
ທ່ານສາມາດຂຽນ, ie ບໍ່ແມ່ນມາຈາກລະບົບໄຟລ໌ທີ່ອ່ານເທົ່ານັ້ນ.

ທ່ານສາມາດແລ່ນໄດ້ ກໍາຫນົດຄ່າ ຢ່າງໃດກໍຕາມ, ຫ່າງໄກສອກຫຼີກ, ເຊັ່ນດຽວກັບ:

../package/Configure

ເພື່ອກໍານົດແຫຼ່ງທີ່ບໍ່ມີຢູ່ໃນທ້ອງຖິ່ນ. ໄຟລ໌ທັງຫມົດທີ່ສ້າງຂຶ້ນຈະຖືກໃສ່ໃນ
ໄດເລກະທໍລີທີ່ທ່ານກໍາລັງແລ່ນສະຄິບຈາກ. magic ນີ້ແມ່ນເຮັດໄດ້ຂໍຂອບໃຈກັບ src.U
ຫນ່ວຍ​ບໍ​ລິ​ການ​, ເຊິ່ງ​ແມ່ນ​ການ​ຕັ້ງ​ຄ່າ​ $src ແລະ $rsrc ຕົວແປເພື່ອຊີ້ໄປຫາແຫຼ່ງແພັກເກັດ. ນັ້ນ
ເສັ້ນທາງແມ່ນເຕັມຫຼືພີ່ນ້ອງ, ຂຶ້ນກັບວ່າ ກໍາຫນົດຄ່າ ໄດ້ invoked ຜ່ານ ເຕັມ ຫຼື
ເສັ້ນທາງພີ່ນ້ອງ.

ຈາກພາຍໃນ UU subdirectory, ທ່ານສາມາດນໍາໃຊ້ $rsrc ເພື່ອເຂົ້າເຖິງໄຟລ໌ຕົ້ນສະບັບ (ຫນ່ວຍງານ
ໂດຍອ້າງອີງໃສ່ໄຟລ໌ແຫຼ່ງເຊື່ອມຕໍ່ hints ສະເຫມີຈະຕ້ອງໃຊ້ກົນໄກນີ້ແລະບໍ່ສົມມຸດວ່າ
ໄຟລ໌ມີຢູ່ໃນໄດເລກະທໍລີຫຼັກ). Makefiles ທັງໝົດຄວນໃຊ້ຕົວແປ $src
ເປັນຕົວຊີ້ໄປຫາແຫຼ່ງຂໍ້ມູນຈາກດ້ານເທິງຂອງໄດເລກະທໍລີກໍ່ສ້າງ (ບ່ອນທີ່ ກໍາຫນົດຄ່າ ແລ່ນ),
ໂດຍກົງ ຫຼືຜ່ານການຕັ້ງຄ່າ VPATH.

ໃນເວລາແລ່ນ ກໍາຫນົດຄ່າ ຫ່າງໄກສອກຫຼີກ, ໄຟລ໌ .SH ຖືກສະກັດຢູ່ໃນໄດເລກະທໍລີສ້າງ, ບໍ່ແມ່ນ
ຢູ່ໃນຕົ້ນໄມ້ແຫຼ່ງ. ຢ່າງໃດກໍຕາມ, ມັນຮຽກຮ້ອງໃຫ້ມີບາງປະເພດຂອງ a ເຮັດໃຫ້ ສະຫນັບສະຫນູນເພື່ອໃຫ້ສາມາດລວບລວມ
ສິ່ງທີ່ຢູ່ໃນໄດເລກະທໍລີກໍ່ສ້າງໃນຂະນະທີ່ແຫຼ່ງແມ່ນຢູ່ບ່ອນອື່ນ.

ການນໍາໃຊ້ Magic ນິຍາມໃໝ່
ໂດຍ​ການ​ນໍາ​ໃຊ້​ຂອງ​ -M ສະຫຼັບ, ບາງ remappings magic ອາດຈະເກີດຂຶ້ນພາຍໃນ a confmagic.h
ໄຟລ໌. ໄຟລ​໌​ທີ່​ຈໍາ​ເປັນ​ຕ້ອງ​ໄດ້​ຮັບ​ການ​ລວມ​ຫຼັງ​ຈາກ​ config.h, ແນ່ນອນ, ແຕ່ຍັງຫຼັງຈາກທັງຫມົດ
ທີ່ຈໍາເປັນອື່ນໆປະກອບມີໄຟລ໌. ຄື:

#ລວມທັງ "config.h"
...
... ອື່ນໆ ລວມ ...
...
#ລວມທັງ "confmagic.h"

ໂດຍປົກກະຕິແລ້ວ, confmagic.h ຈະພະຍາຍາມ remap bcopy() on memcpy() ຖ້າບໍ່ມີ bcopy() is
ມີຢູ່ໃນທ້ອງຖິ່ນ, ຫຼືຫັນປ່ຽນ vfork ເຂົ້າໄປໃນ fork ໃນ​ເວ​ລາ​ທີ່​ຈໍາ​ເປັນ​, ສະ​ນັ້ນ​ເຮັດ​ໃຫ້​ມັນ​ບໍ່​ມີ​ປະ​ໂຫຍດ​
bother ກ່ຽວກັບ HAS_VFORK ສັນຍາລັກ.

magic ການ​ຕັ້ງ​ຄ່າ​ນີ້​ແມ່ນ​ບັນ​ທຶກ​ໄວ້​ໃນ​ໄຟລ​໌​ຄໍາ​ສັບ​.

ຫນ່ວຍບໍລິການ ແມ່ແບບ
ມີຊຸດຂອງແມ່ແບບຫນ່ວຍງານຢູ່ໃນ metaconfig ໄດເລກະທໍລີແຫຼ່ງ, ເຊິ່ງມີຈຸດປະສົງເພື່ອ
ຖືກນໍາໃຊ້ໂດຍໂຄງການ (ຍັງບໍ່ໄດ້ຂຽນ) ເພື່ອຜະລິດຫົວຫນ່ວຍໃຫມ່ຢ່າງໄວວາສໍາລັບປະເພດຕ່າງໆ
ສະຖານະການ. ບໍ່ມີເອກະສານສໍາລັບໂຄງການທີ່ຍັງບໍ່ໄດ້ສໍາເລັດນີ້, ແຕ່ຂ້າພະເຈົ້າຄິດວ່າຂ້າພະເຈົ້າຈະກ່າວເຖິງມັນ
ໃນ​ຫນ້າ​ຄູ່​ມື​ໃນ​ກໍ​ລະ​ນີ​ທີ່​ທ່ານ​ຕ້ອງ​ການ​ທີ່​ຈະ​ເຮັດ​ມັນ​ຕົວ​ທ່ານ​ເອງ​ແລະ​ຫຼັງ​ຈາກ​ນັ້ນ​ປະ​ກອບ​ສ່ວນ​ມັນ ...

AUTHORS


Larry Wall[email protected]> ສໍາລັບລຸ້ນ 2.0.
Harlan Stenn[email protected]> ສໍາລັບການຂະຫຍາຍຫນ່ວຍງານທີ່ສໍາຄັນ.
Raphael Manfredi[email protected]>.
ຜູ້ປະກອບສ່ວນອື່ນໆຈໍານວນຫຼາຍສໍາລັບການ metaconfig ໜ່ວຍ. ເບິ່ງໄຟລ໌ສິນເຊື່ອສໍາລັບບັນຊີລາຍຊື່.

ໃຊ້ metaconfig ອອນໄລນ໌ໂດຍໃຊ້ບໍລິການ onworks.net


ເຊີບເວີ ແລະສະຖານີເຮັດວຽກຟຣີ

ດາວໂຫຼດແອັບ Windows ແລະ Linux

Linux ຄຳ ສັ່ງ

Ad