ນີ້ແມ່ນຄໍາສັ່ງ makepp_rules ທີ່ສາມາດດໍາເນີນການໄດ້ໃນ OnWorks ຜູ້ໃຫ້ບໍລິການໂຮດຕິ້ງຟຣີໂດຍໃຊ້ຫນຶ່ງໃນຫຼາຍໆບ່ອນເຮັດວຽກອອນໄລນ໌ຂອງພວກເຮົາເຊັ່ນ Ubuntu Online, Fedora Online, Windows online emulator ຫຼື MAC OS online emulator
ໂຄງການ:
NAME
makepp_rules -- ວິທີບອກ makepp ສ້າງບາງສິ່ງບາງຢ່າງ
ລາຍລະອຽດ
?: &,
-,
@, B: :build_cache,
:build_check, D: :ສົ່ງ, E: :env, I: "ignore_error",
: ລວມທັງ, L: :ໂອກາດສຸດທ້າຍ, M: ຜູ້ຜະລິດ, N: "ໂນໂກ້", P: :parser,
"perl", S: :ລາຍເຊັນ
ກົດລະບຽບແມ່ນສິ່ງທີ່ບອກ makepp ວິທີການສ້າງໄຟລ໌ຫຼືປະເພດໄຟລ໌. Makepp ສະຫນັບສະຫນູນ
syntax ກົດລະບຽບດຽວກັນກັບການປະຕິບັດອື່ນໆຂອງ make, ບວກກັບບາງສ່ວນເພີ່ມເຕີມຂອງຕົນເອງ.
ກົດລະບຽບມີຮູບແບບທົ່ວໄປ
target_expression : dependency_expression [ : arguments ທາງເລືອກ]
ຫຸ້ນ
ລາຍຊື່ເປົ້າໝາຍອາດບໍ່ມີຕົວແປອັດຕະໂນມັດ (ຍົກເວັ້ນ "$(foreach)"). ໄດ້
ບັນຊີລາຍຊື່ການເພິ່ງພາອາໄສອາດຈະມີພຽງແຕ່ຕົວແປອັດຕະໂນມັດທີ່ອ້າງອີງໃສ່ເປົ້າຫມາຍ (ເຊັ່ນ,
"$(output)", "$(outputs)", ຫຼືຄໍາສັບຄ້າຍຄືກັນ). ຄຳສັ່ງອາດມີອັດຕະໂນມັດໃດໆ
ຕົວແປ
ຖ້າ makepp ຕັດສິນໃຈວ່າກົດລະບຽບຕ້ອງໄດ້ຮັບການປະຕິບັດ, ແຕ່ລະເສັ້ນຂອງກົດລະບຽບຈະຖືກປະຕິບັດ
ຕາມລໍາດັບ, ແລະຖ້າອັນໃດສົ່ງຄືນສະຖານະທີ່ບໍ່ແມ່ນສູນ, ສ່ວນທີ່ເຫລືອຈະບໍ່ຖືກປະຕິບັດ (ແລະ.
makepp ເອົາລູກອອກດ້ວຍຄວາມຜິດພາດເວັ້ນເສຍແຕ່ວ່າທ່ານໄດ້ລະບຸທາງເລືອກ "-k" ໃນແຖວຄໍາສັ່ງ.)
ແຕ່ລະການກະ ທຳ ຄວນເປັນເສັ້ນດຽວເທົ່ານັ້ນ. ຖ້າການກະ ທຳ ຍາວເກີນໄປທີ່ຈະຂຽນໄດ້ງ່າຍໃນ a
ເສັ້ນດຽວ, ທ່ານສາມາດແບ່ງອອກເປັນຫຼາຍເສັ້ນແລະໃສ່ backslash ເພື່ອຊີ້ບອກວ່າ
ຫຼາຍສາຍຄວນຖືກລວມເຂົ້າເປັນອັນດຽວ.
ເພື່ອແຍກແຍະການກະ ທຳ ຈາກກົດລະບຽບຕໍ່ໄປ, ການປະຕິບັດຄວນຈະຖືກຫຍໍ້ ໜ້າ ຫຼາຍຂຶ້ນ
ກ່ວາເສັ້ນທີ່ມີເປົ້າຫມາຍແລະການເພິ່ງພາອາໄສ. ບໍ່ເຫມືອນກັບການປະຕິບັດອື່ນໆຂອງ
make, makepp ບໍ່ສົນໃຈຫຼາຍປານໃດທີ່ທ່ານຫຍໍ້ຫນ້າມັນຫຼືວ່າທ່ານໃຊ້ຕົວອັກສອນແຖບ
ແທນທີ່ຈະເປັນຊ່ອງຫວ່າງ. ເພື່ອຮັກສາຄວາມເຂົ້າກັນໄດ້ກັບການຜະລິດແບບດັ້ງເດີມ, ກົດລະບຽບ
makepp ໃຊ້ເພື່ອຕັດສິນໃຈເວລາທີ່ການກະ ທຳ ສິ້ນສຸດລົງແລະກົດຕໍ່ໄປເລີ່ມຕົ້ນແມ່ນສັບສົນບາງຢ່າງ:
· ເສັ້ນປະຕິບັດທຳອິດຕ້ອງຖືກຫຍໍ້ໜ້າຫຼາຍກວ່າເສັ້ນທີ່ມີເປົ້າໝາຍ.
· ຖ້າແຖວຖືກຫຍໍ້ໜ້າດ້ວຍຕົວອັກສອນແຖບໜຶ່ງ ຫຼື 8 ຍະຫວ່າງ ຫຼືຫຼາຍກວ່ານັ້ນ, ມັນຈະຖືກພິຈາລະນາ
ເສັ້ນປະຕິບັດ.
· ແຖວຫວ່າງເປົ່າ ຫຼື ແຖວຄຳເຫັນທີ່ມີຕົວອັກສອນ "#" ຢູ່ຂອບຂວາຈະສິ້ນສຸດ
ກົດລະບຽບ, ເວັ້ນເສຍແຕ່ແຖວຕໍ່ໄປທີ່ບໍ່ແມ່ນເປົ່າຫວ່າງ indented ຫຼາຍກ່ວາ 8 ຊ່ອງ (ຫຼືຫຼາຍກວ່າຫນຶ່ງ
ແຖບ).
· ຖ້າເສັ້ນຖືກຫຍໍ້ໜ້າຫຼາຍ ຫຼືຫຼາຍກວ່າເສັ້ນປະຕິບັດທຳອິດ, ມັນກໍ່ແມ່ນ
ພິຈາລະນາສາຍການປະຕິບັດເພີ່ມເຕີມ.
ມີບາງລາຍການປະຕິບັດພິເສດ:
& ສັນຍາລັກນີ້ຈະຖືກປະຕິບັດຕາມດ້ວຍຊື່ຄໍາສັ່ງແລະຈໍານວນຂອງການໂຕ້ຖຽງໃດຫນຶ່ງ. ແກະ
syntax ແມ່ນບໍ່ເຂົ້າໃຈຢ່າງສົມບູນຢູ່ທີ່ນີ້, ພຽງແຕ່ຄໍາເວົ້າດຽວແລະຄູ່ແລະ backslashed
ຕົວອັກສອນພາຍໃນ, ເຊັ່ນດຽວກັນກັບ makepp. ຊື່ຄໍາສັ່ງອາດຈະນໍາໄປສູ່ຫນ້າທີ່
"c_ຊື່" ຈະຖືກເອີ້ນດ້ວຍສາຍທີ່ຍັງເຫຼືອເປັນ arguments. ຖ້າຫາກວ່າຫນ້າທີ່ດັ່ງກ່າວສາມາດ
ບໍ່ພົບ, ນີ້ແມ່ນຄືກັນກັບການໂທຫາ "ແລ່ນ" ຈາກ "perl".
ນີ້ອະນຸຍາດໃຫ້ໂທຫາຢ່າງມີປະສິດທິພາບໃນຕົວ, makefile-provided ຫຼືຄໍາສັ່ງພາຍນອກ.
ຄໍານໍາຫນ້າ "&" ໄດ້ຖືກເລືອກເພາະວ່າມັນເປັນຫນ້າທີ່ invoker ໃນ Perl, ແລະເນື່ອງຈາກວ່າ
ໃນຕອນເລີ່ມຕົ້ນມັນຜິດກົດຫມາຍໃນ Shell.
$(ROOT)/include/%.h: %.h
&ln $(input) $(output)
ໂນໂຄ
@ ໂດຍປົກກະຕິ, ແຕ່ລະຄໍາສັ່ງຂອງ shell ຈະຖືກພິມອອກຍ້ອນວ່າມັນຖືກປະຕິບັດ. ຢ່າງໃດກໍຕາມ, ຖ້າຄໍາທໍາອິດ
ຂອງການປະຕິບັດແມ່ນ "noecho" (ຫຼືຖ້າມັນເລີ່ມຕົ້ນດ້ວຍຕົວອັກສອນ "@"), ຫຼັງຈາກນັ້ນຄໍາສັ່ງ
ບໍ່ໄດ້ພິມ. ຍົກຕົວຢ່າງ,
%.o: %.cxx
noecho $(LIBTOOL) --mode=compile $(CC) -c $(input)
ນີ້ຫມາຍຄວາມວ່າເມື່ອຄໍາສັ່ງ libtool ຖືກປະຕິບັດ, ມັນບໍ່ໄດ້ຖືກພິມອອກ. (Libtool
ຕົວຂອງມັນເອງປົກກະຕິແລ້ວພິມຄໍາສັ່ງດັດແກ້ທີ່ມັນປະຕິບັດ, ສະນັ້ນມັນຊໍ້າຊ້ອນກັບ
ພິມມັນສອງຄັ້ງ.)
ignore_error
- ໂດຍປົກກະຕິ, ຖ້າຄໍາສັ່ງ shell ສົ່ງຄືນສະຖານະທີ່ບໍ່ແມ່ນສູນ, ຫຼັງຈາກນັ້ນ makepp ຍົກເລີກເພາະວ່າ
ຄໍາສັ່ງລົ້ມເຫລວ. ຢ່າງໃດກໍຕາມ, ບາງໂຄງການທີ່ບໍ່ຖືກຕ້ອງຕັ້ງສະຖານະການອອກ, ຫຼື
ອາດມີຂໍ້ຜິດພາດທີ່ບໍ່ເປັນອັນຕະລາຍ ແລະບໍ່ຄວນເອົາລູກອອກທັງໝົດ
ການລວບລວມ. ທ່ານສາມາດເຮັດໃຫ້ makepp ບໍ່ສົນໃຈສະຖານະການກັບຄືນໂດຍການລະບຸ
"ignore_error" ເປັນຄໍາທໍາອິດຂອງເສັ້ນຄໍາສັ່ງ (ຫຼື "-" ເປັນຕົວອັກສອນທໍາອິດ).
ຍົກຕົວຢ່າງ,
$(ການແຜ່ກະຈາຍສຽງ):
ignore_error rm -r my_program-$(VERSION) # ກໍາຈັດຂີ້ເຫຍື້ອທີ່ຜ່ານມາ.
&mkdir my_program-$(VERSION)
&cp $(FILES) my_program-$(VERSION)
tar cf my_program-$(VERSION).tar my_program-$(VERSION)
ຄໍາສັ່ງນີ້ເຮັດໃຫ້ໄດເລກະທໍລີ, ສໍາເນົາຊໍ່ຂອງໄຟລ໌ເຂົ້າໄປໃນມັນ, ແລະຫຼັງຈາກນັ້ນວາງ
ທຸກສິ່ງທຸກຢ່າງເຂົ້າໄປໃນໄຟລ໌ tar ສໍາລັບການແຈກຢາຍ. ມັນເປັນຄວາມຄິດທີ່ດີທີ່ຈະເຮັດຄວາມສະອາດອອກ
ເນື້ອໃນທີ່ຜ່ານມາຂອງໄດເລກະທໍລີ, ຖ້າມີສິ່ງໃດແດ່ກ່ອນຫນ້ານີ້, ແລະນັ້ນແມ່ນ
ສິ່ງທີ່ເສັ້ນທໍາອິດເຮັດ. "rm" ອາດຈະລົ້ມເຫລວ, ແຕ່ສະຖານະການກັບຄືນຂອງມັນຖືກລະເລີຍ.
perl
ຜູ້ຜະລິດ
ນີ້ເປັນສິ່ງຈໍາເປັນຄືກັນກັບຄໍາຖະແຫຼງການ perl, ແຕ່ມັນຖືກປະຕິບັດໃນແຕ່ລະເວລາທີ່
ແລ່ນກົດລະບຽບ, ບໍ່ແມ່ນໃນເວລາອ່ານ makefile. ຕົວແປທໍາອິດແມ່ນ Perl ທໍາມະດາ
ລະຫັດ, ໃນຂະນະທີ່ຕົວແປທີສອງທໍາອິດຜ່ານຄໍາຖະແຫຼງໂດຍຜ່ານຕົວແປແບບ Make-style
ການຂະຫຍາຍຕົວ.
ສໍາລັບສອງຄວາມເປັນໄປໄດ້ຂອງການວາງສາຍແຂນຂອງຮ່າງກາຍ, ເບິ່ງຄໍາອະທິບາຍຢູ່ທີ່
"perl_perlcode" ໃນ makepp_statements. ໃຫ້ສັງເກດວ່າຕົວແປທີສາມໄດ້ອະທິບາຍຢູ່ທີ່ນັ້ນ
ບໍ່ມີຄວາມຮູ້ສຶກຢູ່ທີ່ນີ້, ເພາະວ່າເສັ້ນການປະຕິບັດທັງຫມົດຕ້ອງຖືກຫຍໍ້ຫນ້າ. ທ່ານຕ້ອງສັນຍານ
ຄວາມລົ້ມເຫຼວໃນຄໍາຖະແຫຼງ Perl, ໂດຍເອີ້ນວ່າ "ຕາຍ".
ຕາມກົດລະບຽບ, ຖະແຫຼງການ Perl ປະຈຸບັນຖືກປະເມີນຢູ່ໃນຂະບວນການຍ່ອຍທົ່ວໄປ, ຍົກເວັ້ນ
Windows. ນັ້ນຫມາຍຄວາມວ່າພວກເຂົາມີພຽງແຕ່ການອ່ານການເຂົ້າເຖິງຕົວແປ makefile ໃດໆ. ມັນຍັງເປັນ
ຂະບວນການທີ່ປະຕິບັດການກະທໍາທີ່ບໍ່ແມ່ນ Perl. ສະນັ້ນການໂທຫາ exec ຫຼື exit ຈະສັບສົນ
ແຕ່ງໜ້າ. ແຕ່ນີ້ອາດຈະມີການປ່ຽນແປງໃນອະນາຄົດ. ສໍາລັບວິທີການທີ່ມີປະສິດທິພາບໃນການໂທຫາ Perl
scripts, ເບິ່ງລາຍການທີ່ຜ່ານມາ "&" ຫຼື "ແລ່ນ".
$(ສະບັບພາສາ phony):
noecho perl {{ # $(ເປົ້າໝາຍ) & $(VERSION) ຈາກ Perl:
ພິມ "ນີ້ແມ່ນ ".f_target()." $VERSION\n";
}}
echo ທ່ານສາມາດປະສົມນີ້ກັບຄໍາສັ່ງ Shell
-makeperl { ພິມ "ນີ້ແມ່ນ $(ເປົ້າໝາຍ) $(VERSION)\n" }
ມີຫຼາຍປະເພດທີ່ແຕກຕ່າງກັນຂອງກົດລະບຽບ, ແຕ່ລະຄົນມີຈຸດປະສົງທີ່ແຕກຕ່າງກັນ.
ໂດຍສະເພາະ ກົດລະບຽບ
target1 target2: dependency1 dependency2...
ການປະຕິບັດທີ່ຈະປະຕິບັດ
syntax ນີ້ກໍານົດວ່າເພື່ອເຮັດໃຫ້ບໍ່ວ່າຈະ ເປົ້າ ໝາຍ ທີ 1 or ເປົ້າ ໝາຍ ທີ 2, ໄຟລ໌ທັງຫມົດ
ເພິ່ງພາອາໄສ1, ເພິ່ງພາອາໄສ2, ແລະອື່ນໆ, ຕ້ອງໄດ້ຮັບການເຮັດແລ້ວ. ຫຼັງຈາກນັ້ນ, ການປະຕິບັດທີ່ໄດ້ມອບໃຫ້
ປະຕິບັດໂດຍຫອຍເພື່ອເຮັດໃຫ້ເປົ້າຫມາຍດັ່ງກ່າວ.
ກົດລະບຽບທໍາອິດທີ່ຊັດເຈນໃນໄຟລ໌ແມ່ນເປົ້າຫມາຍເລີ່ມຕົ້ນ, ແລະຖືກສ້າງຂື້ນຖ້າທ່ານບໍ່ລະບຸ
ເປົ້າຫມາຍໃດຫນຶ່ງໃນບັນຊີຄໍາສັ່ງ.
ບໍ່ເຫມືອນກັບໂຄງການສ້າງແບບດັ້ງເດີມ, makepp ມັກຈະສົມມຸດວ່າການຮຽກຮ້ອງອັນຫນຶ່ງຂອງການປະຕິບັດ
ເຮັດໃຫ້ເປົ້າຫມາຍທັງຫມົດ (ເວັ້ນເສຍແຕ່ວ່າບໍ່ມີການເພິ່ງພາອາໄສ). ສໍາລັບຕົວຢ່າງ, ຫນຶ່ງ invocation
ຂອງ yacc ສ້າງໄຟລ໌ຜົນຜະລິດທັງສອງສໍາລັບກົດລະບຽບນີ້:
y.tab.c y.tab.h : parser.y
$(YACC) -d parser.y
ໃຫ້ສັງເກດວ່າການປະຕິບັດອື່ນໆຂອງ make ບໍ່ມີແນວຄວາມຄິດຂອງຄໍາສັ່ງດຽວ
ການຜະລິດໄຟລ໌ຜົນຜະລິດຫຼາຍ, ແລະດັ່ງນັ້ນໃນເວລາທີ່ທ່ານກໍານົດເປົ້າຫມາຍຫຼາຍທີ່ເຂົາເຈົ້າຈະ
ປະຕິບັດກົດລະບຽບຫນຶ່ງຄັ້ງຕໍ່ເປົ້າຫມາຍ. Makepp ຈະກັບຄືນສູ່ພຶດຕິກໍານີ້ຖ້າມັນເບິ່ງຄືວ່າ
ນີ້ແມ່ນ makefile ແບບເກົ່າ. ໂດຍສະເພາະ, ມັນຈະປະຕິບັດກົດລະບຽບຫນຶ່ງຄັ້ງຕໍ່ເປົ້າຫມາຍ,
ແທນທີ່ຈະເປັນພຽງຄັ້ງດຽວ, ຖ້າທັງໝົດຕໍ່ໄປນີ້ແມ່ນຄວາມຈິງ:
· ການປະຕິບັດກົດລະບຽບກ່າວເຖິງຕົວແປອັດຕະໂນມັດ $@. (ຄໍາສັບຄ້າຍຄື "$(output)" ຫຼື
"$(ເປົ້າໝາຍ)" ບໍ່ໃຫ້ເກີດພຶດຕິກຳນີ້.)
· ການປະຕິບັດກົດລະບຽບບໍ່ໄດ້ກ່າວເຖິງຕົວແປອັດຕະໂນມັດ "$(outputs)" (ຫຼືຄໍາສັບຄ້າຍຄືຂອງມັນ
"$(ເປົ້າໝາຍ)").
· ນີ້ບໍ່ແມ່ນກົດລະບຽບຮູບແບບ, ແລະບໍ່ມີ foreach clause.
ຍົກຕົວຢ່າງ,
ການຕິດຕັ້ງການທົດສອບທັງຫມົດ:
ສໍາລັບ subdir ໃນ $(SUBDIRS); ເຮັດ cd $$subdir && $(MAKE) $@; cd..; ສຳເລັດແລ້ວ
ເປັນ idiom ທົ່ວໄປໃນ makefiles, ແລະ makepp ສະຫນັບສະຫນູນມັນ. (ໃຫ້ສັງເກດວ່າທ່ານບໍ່ຄວນໃຊ້
recursive make ໃນ makefiles ໃຫມ່ໃດໆທີ່ທ່ານຂຽນ - ໃຊ້ "load_makefile" ຄໍາຖະແຫຼງການ, ຫຼື
ການໂຫຼດ makefile implicit ແທນ.)
ຖ້າຫາກວ່າທ່ານຕ້ອງການທີ່ຈະມີກົດລະບຽບດຽວກັນປະຕິບັດຫນຶ່ງຄັ້ງສໍາລັບແຕ່ລະເປົ້າຫມາຍ (ຕົວຢ່າງ, ເນື່ອງຈາກວ່າເປົ້າຫມາຍ
ມີຄໍາສັ່ງທີ່ຄ້າຍຄືກັນ), ມັນມັກໃຊ້ກົດລະບຽບຮູບແບບ (ເບິ່ງຂ້າງລຸ່ມນີ້) ຫຼື a
ຂໍ້ “foreach”. ຕົວຢ່າງ, ຖ້າມີໂຄງການສ້າງແບບດັ້ງເດີມ, ເຈົ້າຈະຂຽນ:
ກຂຄງ:
do_something to build $@ > $@
ໃນ makepp, ທ່ານອາດຈະຕ້ອງການຂຽນມັນແບບນີ້:
$(foreach): : foreach abcd
do_something ເພື່ອສ້າງ $(output) > $(output)
ໂຟນີ ເປົ້າຫມາຍ
A phony ເປົ້າຫມາຍ ແມ່ນເປົ້າຫມາຍທີ່ຈະບໍ່ເຄີຍມີຢູ່ໃນລະບົບໄຟລ໌; ມັນພຽງແຕ່ເປັນ
ວິທີການຮັບ makepp ເພື່ອສ້າງບາງເປົ້າຫມາຍແລະອາດຈະປະຕິບັດບາງຄໍາສັ່ງເພີ່ມເຕີມ.
ເປົ້າຫມາຍ phony ປົກກະຕິແມ່ນ "ທັງຫມົດ", ເຊິ່ງປົກກະຕິແລ້ວແມ່ນໃຊ້ເພື່ອເຮັດໃຫ້ທຸກສິ່ງທຸກຢ່າງທີ່ເປັນໄປໄດ້
ການກໍ່ສ້າງທີ່ຈະກໍ່ສ້າງ, ດັ່ງນີ້:
ທັງໝົດ: prog1 prog2 subdir/prog3 subdir2/libmine.a
@&echo "ສຳເລັດແລ້ວ!"
ຖ້າທ່ານພິມ "makepp all", ຫຼືຖ້າທ່ານໃສ່ທັງຫມົດເປັນເປົ້າຫມາຍທີ່ຊັດເຈນທໍາອິດໃນ makefile ຂອງທ່ານ
(ເຊິ່ງເປັນແບບປົກກະຕິ) ແລະພຽງແຕ່ພິມ "makepp", ຫຼັງຈາກນັ້ນມັນຈະເຮັດໃຫ້ເກີດຄວາມຂຶ້ນກັບທັງຫມົດ
ສ້າງ, ຫຼັງຈາກນັ້ນມັນຈະພິມ "ເຮັດແລ້ວທັງຫມົດ!". ໃນຈຸດນີ້, makepp ຈະຊອກຫາໄຟລ໌ ./ທັງໝົດ
ແລະຈະຄົ້ນພົບວ່າມັນບໍ່ມີຢູ່. ມັນຈະຈົ່ມດັງໆ.
ເພື່ອຮັກສາ makepp ຈາກການຄາດຫວັງໄຟລ໌ ./ທັງໝົດ ການອອກ, ທ່ານຈໍາເປັນຕ້ອງບອກວ່າມັນເປັນ
ເປົ້າຫມາຍ phony. ພຽງແຕ່ໃສ່ເສັ້ນເຊັ່ນຕໍ່ໄປນີ້ໃນ makefile ຂອງທ່ານ (ມັນບໍ່ມີຄວາມແຕກຕ່າງ
ບ່ອນທີ່):
.PHONY: ທັງຫມົດ
ທາງເລືອກທີ່ທຽບເທົ່າທີ່ບາງຄັ້ງສະດວກກວ່າແມ່ນການໃຊ້ "$(phony)"
ຫນ້າທີ່ເຊັ່ນນີ້:
$(phony all): prog1 prog2 subdir/prog3 subdir2/libmine.a
ເປົ້າຫມາຍ phony ໃນ makefile ຫນຶ່ງສາມາດຫມາຍເຖິງເປົ້າຫມາຍ phony ໃນ makefile ອື່ນ. ນີ້ແມ່ນ
ມັກຈະເຮັດດ້ວຍເປົ້າຫມາຍ "ສະອາດ", ເຊັ່ນນີ້:
# makefile ລະດັບສູງສຸດ:
# ກົດລະບຽບແລະສິ່ງຫຼາຍຢ່າງຢູ່ທີ່ນີ້
#....
$(phony clean): subdir1/clean subdir2/clean
&rm -fm my_program
ຫຼັງຈາກນັ້ນ, ໃນໄດເລກະທໍລີຍ່ອຍ, makefiles ອາດຈະອ່ານເຊັ່ນນີ້:
# Makefile ໃນໄດເລກະທໍລີຍ່ອຍ
#...
$(ລ້າງຜິດພາດ):
&rm -fm $(wildcard *.o *.a)
ແຕ່ໃນປັດຈຸບັນທ່ານຈະໃຊ້ຄໍາສັ່ງ "makeppclean", ແທນທີ່ຈະເປັນເປົ້າຫມາຍທີ່ສະອາດ.
ຕົວແທນ
ມັນປອດໄພທີ່ຈະລະບຸ wildcards ໃນບັນຊີລາຍຊື່ການເພິ່ງພາອາໄສ. ຕົວແທນທີ່ກົງກັນບໍ່ພຽງແຕ່ໄຟລ໌ເທົ່ານັ້ນ
ທີ່ມີຢູ່, ແຕ່ໄຟລ໌ທີ່ສາມາດສ້າງໄດ້ຕາມກົດລະບຽບໃນ makefile. ຍົກຕົວຢ່າງ,
ເພື່ອສ້າງຫ້ອງສະຫມຸດຈາກໄຟລ໌ .o ທັງຫມົດໃນໄດເລກະທໍລີ, ທ່ານສາມາດຂຽນນີ້:
libmine.a: *.o
&rm -f $(ຜົນຜະລິດ)
ar cr $(output) $(inputs)
ນີ້ຈະເຮັດວຽກເຖິງແມ່ນວ່າບໍ່ມີໄຟລ໌ ".o" ຖືກສ້າງຂຶ້ນເທື່ອ, ເພາະວ່າ makepp's
wildcards ກົງກັບໄຟລ໌ທີ່ຍັງບໍ່ທັນມີຢູ່ແຕ່ສາມາດສ້າງໄດ້. ນີ້ເຖິງແມ່ນວ່າຈະເອົາຂຶ້ນ
ໄຟລ໌ທີ່ກົດລະບຽບຖືກຄົ້ນພົບໃນພາຍຫຼັງ (ໃນ makefile ດຽວກັນ, ຫຼືອັນທີ່ຍັງບໍ່ໄດ້ອ່ານ). ໃນນີ້
ຈຸດສຸດທ້າຍມັນແຕກຕ່າງຈາກຫນ້າທີ່ "wildcard", ເຊິ່ງຈໍາກັດກັບກົດລະບຽບທີ່ຮູ້ຈັກ,
ເນື່ອງຈາກວ່າມັນຕ້ອງກັບຄືນຜົນໄດ້ຮັບຂອງມັນເມື່ອມັນຖືກຂະຫຍາຍ.
Makepp ສະຫນັບສະຫນູນທັງຫມົດ shell wildcards ປົກກະຕິ ("*", "?", ແລະ "[]"). ມັນຍັງມີ a
wildcard "**" ເຊິ່ງກົງກັບຈໍານວນຂອງໄດເລກະທໍລີທີ່ແຊກແຊງໃດໆ. (ຄວາມຄິດນີ້ຖືກລັກ
ຈາກ zsh.) ຕົວຢ່າງ, "**/*.c" ກົງກັບທັງໝົດ .c ໄຟລ໌ໃນຕົ້ນໄມ້ແຫຼ່ງທັງຫມົດ.
"objects/**/*.o" ກົງກັບທັງໝົດ .o ໄຟລ໌ທີ່ບັນຈຸຢູ່ບ່ອນໃດກໍໄດ້ຢູ່ໃນໄດເລກະທໍລີຍ່ອຍ ວັດຖຸ
ຫຼື ໄດເລກະທໍລີຍ່ອຍ ຫຼື ໄດເລກະທໍລີຍ່ອຍຂອງມັນ. ສັນຍາລັກ "**" ຈະບໍ່ເປັນ
ປະຕິບັດຕາມການເຊື່ອມຕໍ່ອ່ອນໆໄປຫາໄດເລກະທໍລີໃນລະດັບໃດກໍ່ຕາມ. ມັນຍັງຈະບໍ່ສົ່ງຄືນເປົ້າໝາຍທີ່ຫຼອກລວງ.
ຕົວແທນຂອງ Makepp ຈະບໍ່ສົນໃຈໄຟລ໌ ຫຼືໄດເລກະທໍລີທີ່ມີຢູ່ ແຕ່ບໍ່ສາມາດອ່ານໄດ້. ຫຼັງຈາກ
ທັງຫມົດ, ໄຟລ໌ດັ່ງກ່າວບໍ່ສາມາດຖືກນໍາໃຊ້ໃນຂະບວນການກໍ່ສ້າງຢ່າງໃດກໍ່ຕາມ. ການວາງໄຟລ໌ທີ່ບໍ່ສາມາດອ່ານໄດ້ໃນ a
ໄດເລກະທໍລີແມ່ນເປັນປະໂຫຍດຕົ້ນຕໍເພື່ອຍັບຍັ້ງການນໍາເຂົ້າອັດຕະໂນມັດຂອງໄຟລ໌ທີ່ໃຫ້ມາຈາກ a
repository
ການຢືນຢັນໃນເບື້ອງຕົ້ນແມ່ນວ່ານີ້ແມ່ນປອດໄພ. ນີ້ແມ່ນຢູ່ໃນເຫດຜົນທີ່ວ່າມັນເຮັດວຽກບໍ່ວ່າຈະເປັນ
ໄຟລ໌ມີຢູ່ແລ້ວ, ຫຼືຕ້ອງການສ້າງກ່ອນ. ຢ່າງໃດກໍຕາມ, ມັນບໍ່ປອດໄພໃນຄວາມຮູ້ສຶກ
ວ່າມັນຈະຍັງກົງກັບໄຟລ໌ທີ່ສ້າງຂຶ້ນໂດຍ makepp, ແຕ່ບໍ່ມີກົດລະບຽບອີກຕໍ່ໄປ (ຕົວຢ່າງ
ທ່ານເອົາອອກ .c ໄຟລ໌, ແຕ່ .o ໄຟລ໌ຍັງມີຢູ່.) ເພື່ອປ້ອງກັນອັນນີ້, ໃຫ້ໃຊ້
ທາງເລືອກ "--rm-stale".
ຮູບແບບ ກົດລະບຽບ
ກົດລະບຽບຮູບແບບແມ່ນກົດລະບຽບທີ່ຖືກນໍາໃຊ້ໂດຍອີງໃສ່ຮູບແບບຂໍ້ຄວາມບາງຢ່າງ. ນີ້ຖືກນໍາໃຊ້ເພື່ອ
ໃຊ້ກົດລະບຽບດຽວກັນກັບໄຟລ໌ທັງຫມົດ. syntax ແມ່ນຄືກັນກັບ GNU make's
ກົດລະບຽບຮູບແບບ:
%.o: %.c
$(CC) -c $(input) -o $(output)
ນີ້ບອກວ່າໄຟລ໌ໃດໆໃນໄດເລກະທໍລີປະຈຸບັນທີ່ກົງກັບ "*.c" ສາມາດຖືກປ່ຽນເປັນ
ໄຟລ໌ .o ທີ່ສອດຄ້ອງກັນໂດຍໃຊ້ຄໍາສັ່ງທີ່ໃຫ້.
ກະລຸນາຮັບຊາບວ່າການຂຶ້ນກັບຮູບແບບຫຼາຍອັນອາດຈະຖືກສະໜອງໃຫ້. ຕົວຢ່າງ, ຖ້າເຈົ້າ xyz.o ເອກະສານ
ຂຶ້ນກັບທີ່ສອດຄ້ອງກັນ xyz.cpp ໄຟລ໌, ແລະຍັງຢູ່ໃນໄຟລ໌ທີ່ເອີ້ນວ່າ moc_xyz.cflags ທີ່
ປະກອບມີທາງເລືອກໃນການລວບລວມຂໍ້ມູນ, ນີ້ສາມາດສະແດງອອກດ້ວຍ:
%.o: %.cpp %.cflags
$(CXX) `cat $(stem).cflags` -c $(inputs) -o $(output)
ທ່ານອາດຈະມີເປົ້າໝາຍຮູບແບບຫຼາຍອັນ. ຍົກຕົວຢ່າງ,
%.tab.h %.tab.c : %.y
yacc -d $(ປ້ອນຂໍ້ມູນ)
&mv y.tab.h $(stem).tab.h
&mv y.tab.c $(stem).tab.c
ໂດຍປົກກະຕິ, ກົດລະບຽບຮູບແບບພຽງແຕ່ຊອກຫາໄຟລ໌ຢູ່ໃນໄດເລກະທໍລີປະຈຸບັນ. ທ່ານສາມາດບັງຄັບ
ໃຫ້ເຂົາເຈົ້າຄົ້ນຫາຢູ່ໃນໄດເລກະທໍລີປະຈຸບັນແລະໄດເລກະທໍລີທັງຫມົດທີ່ຢູ່ລຸ່ມມັນໂດຍການຕັ້ງຄ່າ
makepp_percent_subdir := 1
ກ່ອນກົດລະບຽບຮູບແບບທໍາອິດໃນ makefile ຂອງທ່ານຫຼືຢູ່ໃນເສັ້ນຄໍາສັ່ງສໍາລັບຕົວຢ່າງ.
ມີຄວາມແຕກຕ່າງກັນຢ່າງຊັດເຈນລະຫວ່າງ "%" ແລະຕົວແທນ "*", ເຖິງແມ່ນວ່າທັງສອງຈະກົງກັນ
string: ສັນຍາລັກແທນທີ່ສົ່ງຄືນບັນຊີລາຍຊື່ຂອງໄຟລ໌ທີ່ຖືກນໍາໃຊ້ຢ່າງສົມບູນໃນຈຸດນັ້ນ. ດັ່ງນັ້ນ
ນີ້ແມ່ນຂຶ້ນກັບທັງຫມົດ .o ໄຟລ໌ສາມາດສ້າງໄດ້ທີ່ນີ້:
prog: *.o
$(LD) $(LDFLAGS) $(inputs) -o $(output)
ອັນນີ້ບໍ່ສາມາດເຮັດໄດ້ໂດຍການປ່ຽນ "*" ດ້ວຍ "%", ເພາະວ່າອັນສຸດທ້າຍແມ່ນສຳລັບເທື່ອລະອັນ.
ການຈັບຄູ່ຂອງວັດສະດຸປ້ອນກັບຜົນຜະລິດ, ຜະລິດພາຍໃນຫນຶ່ງກົດລະບຽບສໍາລັບແຕ່ລະລໍາທີ່ຈັບຄູ່.
static ຮູບແບບ ກົດລະບຽບ
ກົດລະບຽບຮູບແບບຄົງທີ່ແມ່ນກົດລະບຽບຮູບແບບທີ່ຖືກນໍາໃຊ້ກັບຊຸດໄຟລ໌ທີ່ຈໍາກັດເທົ່ານັ້ນ:
$(SPECIAL_MODULES).o : %.o : %.cpp
$(CXX) -c $(input) -o $(output)
ນີ້ບອກວ່າກົດລະບຽບຮູບແບບໃຊ້ກັບໄຟລ໌ໃນ "$(SPECIAL_MODULES).o".
ນີ້ແມ່ນສ່ວນໃຫຍ່ແມ່ນສໍາລັບການເຂົ້າກັນໄດ້ກັບ GNU ເຮັດໃຫ້; ກົດລະບຽບຂອງ foreach (ເບິ່ງຂ້າງລຸ່ມນີ້) ແມ່ນເພີ່ມເຕີມ
ວິທີການທີ່ມີປະສິດທິພາບໃນການເຮັດສິ່ງດຽວກັນ.
ຄາດລ່ວງ ໜ້າ ກົດລະບຽບ
syntax ຮູບແບບຂ້າງເທິງແມ່ນມີອໍານາດພຽງພໍທີ່ຈະສະຫນັບສະຫນູນການກໍ່ສ້າງເກືອບທັງຫມົດ, ແຕ່
ບາງຄັ້ງມັນຈໍາເປັນຕ້ອງເຮັດບາງສິ່ງບາງຢ່າງທີ່ສັບສົນຫຼາຍ. Makepp ສະຫນອງເພີ່ມເຕີມ
syntax ທີ່ມີປະສິດທິພາບ: ປະໂຫຍກ ":foreach" ສໍາລັບກົດລະບຽບ.
target_expression : dependency_expression : foreach file-list
ຫຸ້ນ
ປະເພດທີ່ງ່າຍດາຍທີ່ສຸດຂອງກົດລະບຽບ foreach ແມ່ນພຽງແຕ່ກົດລະບຽບຮູບແບບທີ່ຄໍາຮ້ອງສະຫມັກໄດ້ຖືກຈໍາກັດ
ໄປຫາລາຍການສະເພາະຂອງໄຟລ໌. ຕົວຢ່າງ, ສົມມຸດວ່າທ່ານມີກົດລະບຽບຮູບແບບທີ່ບອກ
makepp ວິທີການລວບລວມທັງຫມົດ .c ໄຟລ໌. ຢ່າງໃດກໍຕາມ, ທ່ານມີບັນຊີລາຍຊື່ຂອງ .c ໄຟລ໌ທີ່ທ່ານ
ຕ້ອງການເຮັດບາງສິ່ງບາງຢ່າງທີ່ແຕກຕ່າງກັນ. ເຈົ້າສາມາດເຮັດບາງສິ່ງບາງຢ່າງເຊັ່ນນີ້:
#ນີ້ຄືກົດເກນທີ່ໃຊ້ໄດ້ກັບທຸກຢ່າງ:
%.o : %.c
$(CC) $(CFLAGS) -c $(input) -o $(output)
%.o : %.c : foreach $(SPECIAL_MODULES)
$(CC) $(SPECIAL_CFLAGS) -c $(input) -o $(output)
ການນໍາໃຊ້ທີ່ມີອໍານາດຫຼາຍຂອງກົດລະບຽບ foreach ໃຊ້ປະໂຫຍດຈາກຄວາມຈິງທີ່ວ່າຕົວແປ
"$(foreach)" ຖືກຕັ້ງຢູ່ໃນແຕ່ລະໄຟລ໌ທີ່ກົງກັບລາຍການໄຟລ໌ແລະເປົ້າຫມາຍແລະ
ການສະແດງຜົນການເພິ່ງພາອາໄສຖືກປະເມີນ. ລາຍຊື່ໄຟລ໌ອາດມີຕົວແທນ, ແລະສິ່ງເຫຼົ່ານີ້
ກົງກັບໄຟລ໌ທີ່ຍັງບໍ່ທັນມີເທື່ອ ແຕ່ສາມາດສ້າງໄດ້ (ເບິ່ງ "Wildcards" ໃນ
makepp_rules).
ນີ້ແມ່ນ syntax unwieldy ແຕ່ມັນມີຄວາມຍືດຫຍຸ່ນທີ່ສຸດ, ເພາະວ່າຕົວແປ "$(foreach)"
ອາດຈະປາກົດໃນທາງໃດກໍ່ຕາມໃນການສະແດງ. ກ່ອນອື່ນ ໝົດ, ໃຫ້ສັງເກດວ່າກົດລະບຽບຮູບແບບແມ່ນໃນຄວາມເປັນຈິງ a
ກໍລະນີພິເສດຂອງກົດລະບຽບ foreach; ກົດລະບຽບຮູບແບບ
%.o : %.c
$(CC) $(CFLAGS) -c $(input) -o $(output)
ເທົ່າກັບ:
$(patsubst %.c, %.o, $(foreach)): $(foreach): foreach *.c
$(CC) $(CFLAGS) -c $(input) -o $(output)
(ໃນຄວາມເປັນຈິງ, ມັນໄດ້ຖືກປ່ຽນເປັນປະມານທີ່ຢູ່ພາຍໃນ.)
ເປັນຕົວຢ່າງຂອງວິທີທີ່ເຈົ້າຈະໃຊ້ປະໂຫຍກ ":foreach" ບ່ອນທີ່ກົດລະບຽບຮູບແບບບໍ່ແມ່ນ
ພຽງພໍ, ສົມມຸດວ່າທ່ານມີບາງອັນ .c ໄຟລ໌ທີ່ສ້າງຂຶ້ນໂດຍໃຊ້ຕົວປະມວນຜົນບາງຊະນິດ
ເຊິ່ງໃຊ້ເວລາເປັນໄຟລ໌ປ້ອນຂໍ້ມູນດ້ວຍ a .k ການຂະຫຍາຍ. ທ່ານຕ້ອງການລວບລວມຂໍ້ມູນເຫຼົ່ານັ້ນ .c ໄຟລ໌ທີ່ມີ a
ທາງເລືອກການລວບລວມທີ່ແຕກຕ່າງກັນຫຼາຍກ່ວາປົກກະຕິ .c ໄຟລ໌ທີ່ເປັນແຫຼ່ງທໍາມະດາ
ໄຟລ໌. ເຈົ້າສາມາດເຮັດບາງສິ່ງບາງຢ່າງເຊັ່ນນີ້:
# ກົດລະບຽບສຳລັບໄຟລ໌ .c ທຳມະດາ:
%.o : %.c
$(CC) $(CFLAGS) -c $(input) -o $(output)
# ກົດລະບຽບການສ້າງໄຟລ໌ .c ຈາກໄຟລ໌ .k:
%.c : %.k
$(preprocessor) $(input) > $(output)
# ກົດລະບຽບການສ້າງພິເສດສໍາລັບໄຟລ໌ .c ທີ່ສ້າງຂຶ້ນຈາກໄຟລ໌ .k:
$(foreach:%.k=%.o): $(foreach:%.c=%.k): foreach *.k
$(CC) $(SPECIAL_CFLAGS) -c $(input) -o $(output)
(ນີ້ໃຊ້ syntax ອ້າງອີງການທົດແທນທີ່ຫຍໍ້ເລັກນ້ອຍກວ່າການໂທຫາ
"patsubst" ຢ່າງຊັດເຈນ.)
ໃຫ້ສັງເກດວ່າຖ້າທ່ານຕ້ອງການເຮັດທຸກຢ່າງແມ່ນເພື່ອປ່ຽນຄ່າຂອງຕົວແປ ("CFLAGS" ໃນນີ້
ກໍລະນີ) ບາງຄັ້ງມັນເປັນການສະດວກຫຼາຍໃນການນໍາໃຊ້ຕົວແປເປົ້າຫມາຍສະເພາະ.
Legacy បច្ច័យ ກົດລະບຽບ
ສໍາລັບຄວາມເຂົ້າກັນໄດ້ໃນດ້ານຫລັງ, makepp ສະຫນັບສະຫນູນກົດລະບຽບການຕໍ່ທ້າຍແບບເກົ່າ.
.suffix1.suffix2:
ຫຸ້ນ
ເທົ່າກັບ
%.suffix2: %.suffix1
ຫຸ້ນ
ແຕ່ຫຼາຍຍາກທີ່ຈະຈື່. (ຄຳຕໍ່ທ້າຍອັນໃດມາກ່ອນ?) ໂດຍປົກກະຕິ, ກົດລະບຽບຈະປາກົດຂຶ້ນ
ໃນ makefile ມໍລະດົກເຊັ່ນນີ້:
.co:
$(CC) $(CFLAGS) -c $*.c -o $*.o
ເຊິ່ງແມ່ນແທ້ທຽບເທົ່າກັບ
%.o : %.c
$(CC) $(CFLAGS) -c $(input) -o $(output)
ການຂັດຂືນ ກົດລະບຽບ
ເມື່ອມີຫຼາຍກວ່າຫນຶ່ງວິທີທີ່ຈະເຮັດໃຫ້ໄຟລ໌, makepp ໃຊ້ຂັ້ນຕອນງ່າຍໆເພື່ອ
ກໍານົດກົດລະບຽບທີ່ຈະນໍາໃຊ້.
· ມັນເປັນຄວາມຜິດພາດທີ່ຈະມີກົດລະບຽບທີ່ຊັດເຈນທີ່ຂັດແຍ້ງກັນໃນການສ້າງໄຟລ໌.
· ກົດລະບຽບຮູບແບບ ແລະກົດລະບຽບຂອງ foreach ທີ່ມີ wildcards ບໍ່ເຄີຍ override ກົດລະບຽບທີ່ຈະແຈ້ງ. ດັ່ງນັ້ນ
ກົດລະບຽບທີ່ຊັດເຈນສາມາດຖືກນໍາໃຊ້ເພື່ອກໍານົດຂໍ້ຍົກເວັ້ນສໍາລັບກົດລະບຽບຮູບແບບ. (ໃຫ້ສັງເກດວ່າງ່າຍໆ
ການໃຊ້ປະໂຫຍກ ":foreach" ບໍ່ໄດ້ເຮັດໃຫ້ບາງສິ່ງບາງຢ່າງເປັນກົດລະບຽບຮູບແບບ. ມັນຕ້ອງມີ a
wildcard (ເຊັ່ນ "*" ຫຼື "?") ເປັນສ່ວນຫນຶ່ງຂອງຊື່ໄຟລ໌ໃນປະໂຫຍກ ":foreach". ຖ້າມັນເປັນ
ພຽງແຕ່ບັນຊີລາຍຊື່ທີ່ຊັດເຈນຂອງໄຟລ໌, ມັນຖືກປະຕິບັດເປັນກົດລະບຽບທີ່ຊັດເຈນສໍາລັບແຕ່ລະຄົນ
ໄຟລ໌.)
·ເມື່ອກົດລະບຽບຮູບແບບທີ່ຂັດແຍ້ງມາຈາກ makefiles ທີ່ແຕກຕ່າງກັນ, ກົດລະບຽບຈາກ "ໃກ້ກວ່າ"
makefiles override ກົດລະບຽບຈາກ makefiles "ໄກກວ່າ". "ໃກ້" ຫມາຍຄວາມວ່າ makefile
ຕັ້ງຢູ່ໃກ້ກັບເປົ້າຫມາຍໃນລໍາດັບຊັ້ນຂອງໄດເລກະທໍລີ (ie, ຊື່ໄຟລ໌ຂອງ
ເປົ້າຫມາຍທີ່ກ່ຽວຂ້ອງກັບໄດເລກະທໍລີທີ່ makefile ຖືກດໍາເນີນການແມ່ນສັ້ນກວ່າ). ຖ້ານີ້
ບໍ່ໄດ້ຈໍາແນກ makefiles, ຫຼັງຈາກນັ້ນກົດລະບຽບຈາກ makefile ທີ່ຖືກໂຫລດ
ລ່າສຸດໄດ້ຖືກນໍາໃຊ້.
ນີ້ຫມາຍຄວາມວ່າທ່ານສາມາດກໍານົດກົດລະບຽບຮູບແບບທີ່ນໍາໃຊ້ກັບໄຟລ໌ທັງຫມົດໃນຂອງທ່ານ
ຕົ້ນໄມ້ໄດເລກະທໍລີທັງຫມົດໃນພຽງແຕ່ makefile ລະດັບເທິງ, ແຕ່ຫຼັງຈາກນັ້ນທ່ານສາມາດ override ມັນໃນ
makefile ລະດັບຕ່ໍາ. ຕົວຢ່າງ, makefile ລະດັບສູງສຸດຂອງທ່ານສາມາດປະກອບມີ:
%.o : %.c : foreach **/*.c
$(CC) $(CFLAGS) -c $(input) -o $(output)
ແລະທ່ານສາມາດມີ makefile ໃນຫນຶ່ງຂອງ subdirectories ທີ່ເວົ້າວ່າ:
%.o : %.c
$(CC) $(SPECIAL_CFLAGS) -c $(input) -o $(output)
· ກົດລະບຽບຮູບແບບທີ່ມີລະບົບຕ່ອງໂສ້ການອະນຸມານສັ້ນກວ່າແມ່ນມັກຫຼາຍກວ່າຮູບແບບອື່ນໆ
ກົດລະບຽບ. ຕົວຢ່າງ, ຖ້າທ່ານມີກົດລະບຽບຕໍ່ໄປນີ້ (ອີງໃສ່ຕົວຢ່າງຈາກ
Linux kernel):
%.s: %.c
$(CC) -s $(input) -o $(output)
%.o: %.s
$(AS) $(input) -o $(output)
%.o: %.c
$(CC) -c $(input) -o $(output)
ຖ້າພວກເຮົາຕ້ອງການສ້າງ "xyz.o", ພວກເຮົາສາມາດສ້າງໄຟລ໌ ".s" ລະດັບປານກາງແລະຫຼັງຈາກນັ້ນ
ແລ່ນຜ່ານຕົວປະກອບໂດຍໃຊ້ສອງກົດ ທຳ ອິດ, ຫຼືພວກເຮົາສາມາດໄປຫາ a
ໄຟລ໌ ".o" ໂດຍໃຊ້ກົດລະບຽບສຸດທ້າຍ. ກົດລະບຽບສຸດທ້າຍແມ່ນມັກເພາະວ່າມີຫນ້ອຍ
ຂັ້ນ ຕອນ ໃນ ລະ ບົບ ຕ່ອງ ໂສ້ ຂອງ inference (ຫນຶ່ງ ແທນ ທີ່ ຈະ ເປັນ ສອງ).
· ກົດລະບຽບຮູບແບບຕໍ່ມາໃນ makefile override ກົດລະບຽບຮູບແບບທີ່ກ່ອນຫນ້ານີ້. (ນີ້ແມ່ນ
ກັບຄືນໄປບ່ອນຈາກ GNU ເຮັດໃຫ້.) ນີ້ຫມາຍຄວາມວ່າທ່ານຄວນວາງກົດລະບຽບທົ່ວໄປຂອງທ່ານ
ກ່ອນຫນ້ານີ້, ແລະກົດລະບຽບສະເພາະຂອງທ່ານຕໍ່ມາ. ຍົກຕົວຢ່າງ,
%o: %c # ກົດລະບຽບການລວບລວມຂໍ້ມູນທົ່ວໄປ.
ການປະຕິບັດ
special_%.o: special_%.c # ກົດລະບຽບພິເສດສໍາລັບໄຟລ໌ທີ່ມີ a
ການປະຕິບັດທີ່ແຕກຕ່າງກັນ # "special_" ຄໍານໍາຫນ້າ.
ກົດລະບຽບ ທາງເລືອກໃນການ
ບາງຄັ້ງມັນຈໍາເປັນຕ້ອງສະຫນອງທາງເລືອກເພີ່ມເຕີມເພື່ອດັດແປງວິທີການ makepp ປະຕິບັດ
ກົດລະບຽບ. ຕົວເລືອກເຫຼົ່ານີ້ຖືກລະບຸເປັນ ":optionname value", ບໍ່ວ່າຈະຢູ່ໃນແຖວທີ່ມີ
ການເພິ່ງພາອາໄສ, ຫຼືໃນແຖວຕໍ່ໄປ.
ການສະຫນອງທາງເລືອກໃນສາຍແຍກຕ່າງຫາກອາດຈະເຮັດໃຫ້ມັນເປັນໄປໄດ້ສໍາລັບທ່ານທີ່ຈະນໍາໃຊ້ດຽວກັນ
makefile ກັບ makepp ແລະເຮັດແບບດັ້ງເດີມ. ຍົກຕົວຢ່າງ,
ເປົ້າໝາຍ : ການເພິ່ງພາອາໄສ
: ລາຍເຊັນ target_newer
ຫຸ້ນ
ຈະເຮັດວຽກໄດ້ດີກັບ Unix ແບບດັ້ງເດີມ, ເພາະວ່າມັນຕີຄວາມຫມາຍເສັ້ນ ": ລາຍເຊັນ".
ເປັນຄໍາສັ່ງແກະ, ແລະຄໍາສັ່ງເລີ່ມຕົ້ນດ້ວຍຈໍ້າສອງເມັດບໍ່ເຮັດຫຍັງເລີຍ.
:build_cache /path/to/build/cache
ເປົ້າໝາຍ : ການເພິ່ງພາອາໄສ
: build_cache /put/cache/files/over/there
ຫຸ້ນ
ລະບຸເສັ້ນທາງໄປຫາ build cache ທີ່ຈະໃຊ້ສໍາລັບໄຟລ໌ທີ່ຜະລິດໂດຍກົດລະບຽບນີ້. ນີ້
overrides ຜົນກະທົບຂອງຄໍາສັ່ງ "build_cache" ຫຼືຄໍາສັ່ງ "--build-cache".
ທາງເລືອກແຖວ, ຖ້າມີ, ສໍາລັບກົດລະບຽບນີ້. ເບິ່ງ makepp_build_cache ສໍາລັບລາຍລະອຽດກ່ຽວກັບການກໍ່ສ້າງ
ແຄສ.
ຖ້າທ່ານລະບຸ "none" ແທນທີ່ຈະເປັນເສັ້ນທາງ, ທ່ານປິດການສ້າງ cache ສໍາລັບການນີ້
ກົດລະບຽບສະເພາະ. ນີ້ສາມາດເປັນປະໂຫຍດເພື່ອຫຼີກເວັ້ນການເສຍພື້ນທີ່ດິສກ໌ກັບໄຟລ໌ທີ່ທ່ານ
ຮູ້ວ່າບໍ່ເປັນປະໂຫຍດທີ່ຈະ cache, ບໍ່ວ່າຈະຍ້ອນວ່າທ່ານແນ່ໃຈວ່າພວກເຂົາຈະບໍ່ເປັນ
ຖືກນໍາໃຊ້ຄືນໃຫມ່ຫຼືຍ້ອນວ່າພວກມັນຖືກສ້າງຂື້ນໄວດັ່ງນັ້ນມັນບໍ່ຄຸ້ມຄ່າທີ່ຈະເກັບພວກມັນໄວ້.
:build_check build_check_method
ເປົ້າໝາຍ : ການເພິ່ງພາອາໄສ
: build_check target_newer
ຫຸ້ນ
ອັນນີ້ບອກ makepp ວ່າຈະໃຊ້ວິທີໃດເພື່ອຕັດສິນໃຈວ່າເປົ້າໝາຍຕ້ອງຖືກສ້າງໃໝ່ຫຼືບໍ່.
ເບິ່ງ makepp_build_check ສໍາລັບລາຍລະອຽດເພີ່ມເຕີມ. ນີ້ overrides ຜົນກະທົບຂອງ
ຄໍາສັ່ງ "build_check" ຫຼື "--build-check-method" ທາງເລືອກແຖວຄໍາສັ່ງ, ຖ້າມີ, ສໍາລັບ
ກົດລະບຽບນີ້.
:env ຄວາມເປັນໄປໄດ້ ...
ເພີ່ມການຂຶ້ນກັບຄ່າຂອງຕົວແປສະພາບແວດລ້ອມທີ່ມີຊື່. ຖ້າຫາກວ່າໃດໆຂອງເຂົາເຈົ້າ
ແຕກຕ່າງຈາກການກໍ່ສ້າງທີ່ຜ່ານມາ, ຫຼັງຈາກນັ້ນ, ເປົ້າຫມາຍແມ່ນຖືວ່າລ້າສະໄຫມ, ຖ້າ
build_check method ນັ້ນ dictates. (ທັງຫມົດຂອງການກໍ່ສ້າງໃນການກໍ່ສ້າງວິທີການກວດສອບຍົກເວັ້ນສໍາລັບ
target_newer ເຄົາລົບອັນນີ້.)
VARIABLE ອາດຈະຢູ່ໃນຮູບແບບ "ຊື່ໄຟລ໌ໃນ PATH_VARIABLE" (ໃນວົງຢືມ), ໃນກໍລະນີນີ້
ເປົ້າໝາຍຖືກພິຈາລະນາວ່າລ້າສະໄໝ ຖ້າໄດເຣັກທໍຣີທຳອິດຈາກເຄື່ອງໝາຍຈໍ້າສອງເມັດ
ຄ່າຂອງ PATH_VARIABLE ເຊິ່ງມີຊື່ໄຟລ໌ແຕກຕ່າງຈາກການສ້າງຫຼ້າສຸດ.
ນີ້ສາມາດຖືກນໍາໃຊ້ເພື່ອຫຼີກເວັ້ນການສ້າງເປົ້າຫມາຍໃຫມ່ເມື່ອ PATH_VARIABLE ມີການປ່ຽນແປງໃນ
ວິທີການທີ່ບໍ່ກ່ຽວຂ້ອງ.
: ຈັດສົ່ງ ຄໍາສັ່ງ ...
ຄັດຕິດແຕ່ລະການກະທຳຂອງແກະ (ແຕ່ບໍ່ແມ່ນຄຳສັ່ງ Perl ຫຼືຄຳສັ່ງ Perl) ໃນ "sh -c '...'"
ແລະນໍາຫນ້າດ້ວຍຄໍາສັ່ງ, ແຕ່ສົມມຸດວ່າເປົ້າຫມາຍບໍ່ຂຶ້ນກັບຄໍາສັ່ງ.
ນີ້ແມ່ນເປັນປະໂຫຍດຖ້າທ່ານຕ້ອງການສົ່ງການປະຕິບັດກັບລະບົບການຈັດແຖວວຽກ, ແຕ່ຜົນໄດ້ຮັບແມ່ນ
ສົມມຸດວ່າເປັນເອກະລາດຂອງຕົວກໍານົດການຄິວ, ເຊັ່ນດຽວກັນກັບບໍ່ວ່າຈະເປັນແຖວ
ລະບົບໄດ້ຖືກນໍາໃຊ້ທັງຫມົດ.
:ລວມ file_or_pattern
ກົດລະບຽບແຕກຕ່າງກັນໄປຕາມ compiler:
%.o : %.c
: ລວມ %.d : ລາຍເຊັນ C
gcc -MD -c ...
%.o : %.c
: include %.u : ລາຍເຊັນ C# IBM ໃຊ້ຄຳຕໍ່ທ້າຍທີ່ແຕກຕ່າງ
xlc -M -c ...
sub dependify { # ປ່ຽນການສົນທະນາຂອງ Microsoft ໃຫ້ເປັນຮູບແບບທີ່ເປັນປະໂຫຍດ
s/\$/\$\$/g;
s/(ໝາຍເຫດ: ລວມທັງໄຟລ໌: *)?(.+?)\r?\n/$1 ? "'$2' " : "'".f_output()."': "/e;
}
%.o : %.c
: ລວມ %.d : ລາຍເຊັນ C
cl -showIncludes -c ... >$(stem).d
&sed &dependify -o +<$(stem).d
ບາງ compilers (icc ຂອງ Intel ຄືກັນກັບ gcc ຂ້າງເທິງ, ຫຼື IBM's xlc) ສາມາດຜະລິດ dependency.
ໄຟລ໌ໃນການບິນ. ນັ້ນແມ່ນ, ໃນຂະນະທີ່ພວກເຂົາລວບລວມ, ພວກເຂົາຂຽນ makefile ທີ່ makepp ສາມາດເຮັດໄດ້
ລວມ. ປະໂຫຍດຫຼາຍກວ່າເຄື່ອງສະແກນຂອງ makepp ແມ່ນການຮັບປະກັນ 100%
ຖືກຕ້ອງ, ບ່ອນທີ່ພວກເຮົາພຽງແຕ່ເຂົ້າມາໃກ້.
ທາງເລືອກນີ້ harnesses ວ່າໃນວິທີການພິເສດ: ຖ້າຫາກວ່າໄຟລ໌ບໍ່ມີ, ເຊັ່ນ:
ໂດຍປົກກະຕິໃນການກໍ່ສ້າງທີ 1, ການສະແກນປົກກະຕິເກີດຂື້ນ. ແຕ່ຖ້າໄຟລ໌ມີຢູ່, ບໍ່ມີ
ການສະແກນເກີດຂຶ້ນ (ຊຶ່ງເປັນເຫດຜົນທີ່ພວກເຮົາລະບຸລາຍເຊັນອັດສະລິຍະຂ້າງເທິງ -- ບໍ່ແມ່ນການສະແກນຕົກ
ກັບຄືນໄປບ່ອນຄ່າເລີ່ມຕົ້ນ dumb ຂອງ timestamp ແລະຂະຫນາດ). ແທນທີ່ຈະ, ມັນປະກອບມີໄຟລ໌, ກ່ອນ
ປະຕິບັດກົດລະບຽບ. ຫຼັງຈາກປະຕິບັດກົດລະບຽບສົບຜົນສໍາເລັດ, ມັນລືມໃດກໍ່ຕາມມັນ
ອ່ານຄັ້ງທໍາອິດ, ເນື່ອງຈາກໄຟລ໌ອາດຈະລ້າສະໄຫມ. ແທນທີ່ຈະມັນອ່ານ
ໄຟລ໌ອີກເທື່ອຫນຶ່ງ, ຖ້າມັນມີການປ່ຽນແປງ, ສໍາລັບການມີຂໍ້ມູນການກໍ່ສ້າງທີ່ທັນສະໄຫມ.
ຄໍາເຕືອນ: ອັນນີ້ແມ່ນບໍ່ຫນ້າເຊື່ອຖື. ໄຟລ໌ທີ່ເພິ່ງພາອາໄສໄດ້ຮັບການຜະລິດໂດຍຫຼາຍ
ກົດລະບຽບທີ່ມັນເປັນການເພິ່ງພາອາໄສ. ໃນທາງກົງກັນຂ້າມ, ຜູ້ລວບລວມຂໍ້ມູນຮູ້ກ່ຽວກັບທັງຫມົດ
ມັນປະກອບມີຍ່ອຍພາຍໃນ, ເຊິ່ງ makepp ມັກຈະບໍ່ສົນໃຈ. ນີ້ແມ່ນຄວາມຫນ້າເຊື່ອຖື
ປະໂຫຍດພຽງແຕ່ສໍາລັບກໍລະນີທີ່ patch compiler ແກ້ໄຂພຽງແຕ່ຍ່ອຍ. ໄດ້
ລາຄາແມ່ນວ່າ makepp ສິ້ນສຸດລົງເບິ່ງໄຟລ໌ຫຼາຍ, ເຊິ່ງໃຊ້ເວລາ.
ມີການຈັບໃນເວລາທີ່ທ່ານເອົາຄໍາຖະແຫຼງ "#include" ອອກ ແລະ ໄຟລ໌ທີ່ສອດຄ້ອງກັນ:
ມັນຈະຍັງຖືກກ່າວເຖິງຢູ່ໃນເອກະສານການເພິ່ງພາອາໄສຈາກຄັ້ງສຸດທ້າຍ, ເມື່ອມັນແມ່ນ
ຕ້ອງການ. ໃນກໍລະນີດັ່ງກ່າວ, ທ່ານຕ້ອງແກ້ໄຂໄຟລ໌ dependency ເພື່ອເອົາ dependency
ຊຶ່ງບໍ່ສາມາດບັນລຸໄດ້ອີກຕໍ່ໄປ.
ຄຸນສົມບັດນີ້ບໍ່ສາມາດໃຊ້ກັບ build cache ໄດ້ເນື່ອງຈາກການດຶງໄຟລ໌ຈາກບ່ອນນັ້ນ
ຕ້ອງການຮູ້ທຸກຢ່າງກ່ຽວກັບໄຟລ໌. ແຕ່ໄຟລ໌ທີ່ເພິ່ງພາອາໄສແມ່ນຂຶ້ນກັບສິ່ງເຫຼົ່ານັ້ນ
ໄຟລ໌ makepp ຮຽນຮູ້ກ່ຽວກັບການອ່ານມັນ. ການຂື້ນກັບວົງວຽນດັ່ງກ່າວແມ່ນບໍ່ປົກກະຕິ
ເປັນໄປໄດ້ໃນລະບົບການກໍ່ສ້າງທີ່ເຊື່ອຖືໄດ້. ນີ້ແມ່ນຂໍ້ຍົກເວັ້ນເພາະວ່າຫຼັງຈາກການກໍ່ສ້າງໃຫມ່
ແລະການອ່ານໄຟລ໌ dependency ຄືນໃໝ່ທຸກຢ່າງແມ່ນຖືກຕ້ອງອີກຄັ້ງ.
ຖ້າທ່ານສ້າງຢູ່ໃນບ່ອນເກັບມ້ຽນຂອງທ່ານ, makepp ຈະເລືອກເອົາໄຟລ໌ທີ່ເພິ່ງພາອາໄສຈາກ
1 repository ທີ່ປະກອບດ້ວຍຫນຶ່ງ. ນີ້ແມ່ນແຕກຕ່າງຈາກໄຟລ໌ອື່ນໆ, ບ່ອນທີ່ມັນໃຊ້ເວລາທີ 1
ດ້ວຍລາຍເຊັນທີ່ຄາດໄວ້. ນີ້ແມ່ນດີກ່ວາສໍາລັບການກໍ່ສ້າງຖານຄວາມຈໍາ, ບ່ອນທີ່ຂາດແຄນ
ລາຍເຊັນ, ມັນບໍ່ສາມາດຊອກຫາໄຟລ໌ໄດ້.
:ໂອກາດສຸດທ້າຍ
ເປີດໃຊ້ກົດລະບຽບເປີດ, ເຊັ່ນ:
%.foo foo%.bar: :last_chance
&ສຽງ $@ -o $@
&cp $(ຜົນໄດ້ຮັບ)
ເນື່ອງຈາກວ່າກົດລະບຽບດັ່ງກ່າວສາມາດສ້າງຈໍານວນເປົ້າຫມາຍທີ່ບໍ່ມີຂອບເຂດທີ່ຈໍາເປັນ,
ເປົ້າໝາຍຂອງກົດລະບຽບນີ້ຈະບໍ່ກົງກັບຟັງຊັນ $(wildcard) ຫຼືກົດລະບຽບຮູບແບບເວັ້ນເສຍແຕ່
ບາງສິ່ງບາງຢ່າງອື່ນໄດ້ຍົກຕົວຢ່າງກົດລະບຽບໂດຍການອ້າງອີງເປົ້າຫມາຍໂດຍສະເພາະ.
ນອກຈາກນັ້ນ, ຖ້າ "--rm-stale" ຖືກລະບຸ, ຫຼັງຈາກນັ້ນເປົ້າຫມາຍທີ່ເຫລືອຈາກທີ່ຜ່ານມາ
makepp run ຈະປາກົດວ່າ stale ຖ້າວິທີດຽວທີ່ຈະສ້າງມັນແມ່ນຜ່ານກົດລະບຽບສຸດທ້າຍ
ທີ່ຍັງບໍ່ທັນໄດ້ຍົກຕົວຢ່າງສໍາລັບເປົ້າຫມາຍເທື່ອ, ຊຶ່ງເປັນພຶດຕິກໍາທີ່ຕ້ອງການເພາະວ່າ
ການກໍ່ສ້າງຈະລົ້ມເຫຼວຫຼາຍສະຫມໍ່າສະເຫມີໃນເວລາທີ່ມັນ erroneously ອີງໃສ່ຕົວແທນທີ່ຈະ
ຈັບຄູ່ເປົ້າໝາຍຈາກການແລ່ນກ່ອນໜ້າ.
ທາງເລືອກ ":last_chance" ມີຈຸດປະສົງເພື່ອຮຽກຮ້ອງຄວາມສົນໃຈຕໍ່ກັບພຶດຕິກໍາພິເສດຂອງ
ກົດລະບຽບກ່ຽວກັບການຈັບຄູ່ wildcards.
:parser ແມ່ບົດ
ນີ້ບອກ makepp ວິທີການແຍກຄໍາສັ່ງສໍາລັບການກວດສອບ (ລວມທັງ) ໄຟລ໌. ປົກກະຕິແລ້ວ,
makepp ຄາດເດົາວິທີການເຮັດມັນໂດຍອີງໃສ່ຄໍາທີ່ຢູ່ໃນຄໍາສັ່ງຂອງມັນເອງ (ເບິ່ງ
makepp_scanning ສໍາລັບລາຍລະອຽດ). ຢ່າງໃດກໍຕາມ, ຖ້າ makepp ຄາດເດົາຜິດ, ທ່ານອາດຈະຕ້ອງການ
ຊີ້ບອກຕົວວິເຄາະຢ່າງຈະແຈ້ງ, ເຊັ່ນນີ້:
%.o: %.abc
: parser c_compilation
ການປະຕິບັດຢູ່ທີ່ນີ້
ອັນນີ້ເຮັດໃຫ້ makepp ປະຕິບັດການແຍກ ແລະສະແກນແບບດຽວກັນກັບ C/C++
ກໍ່ສ້າງຄໍາສັ່ງ, ເຖິງແມ່ນວ່າມັນບໍ່ໄດ້ຮັບຮູ້ການປະຕິບັດເປັນການລວບລວມ C.
parser ເລີ່ມຕົ້ນແມ່ນຂຶ້ນກັບຄໍາສັ່ງ. ຖ້າທ່ານບໍ່ລະບຸຕົວເລືອກ ":parser",
ຫຼັງຈາກນັ້ນ, ຄໍາທໍາອິດຂອງແຕ່ລະຄໍາສັ່ງຖືກກວດສອບ. ຕົວຢ່າງສໍາລັບການລວບລວມຫຼືການເຊື່ອມຕໍ່
ຄໍາສັ່ງ, makepp ຈະໃຊ້ "c_compilation" parser; ຫຼືຖ້າຄໍາສັ່ງເບິ່ງຄືວ່າ
GNU variant, "gcc_compilation". ຖ້າບໍ່ພົບຕົວວິເຄາະ, ມັນໃຊ້ຕົວວິເຄາະ "none". ສໍາລັບ
ລາຍລະອຽດເພີ່ມເຕີມກ່ຽວກັບເລື່ອງນີ້, ຫຼືຖ້າທ່ານຕ້ອງການຂຽນ parser ຂອງທ່ານເອງຫຼືປ່ຽນ makepp's
ຕົວວິເຄາະເລີ່ມຕົ້ນ, ເບິ່ງ makepp_scanning.
ໃຫ້ສັງເກດວ່ານີ້ໃຊ້ກັບທຸກໆຄໍາສັ່ງໃນກົດລະບຽບ, ເຊິ່ງອາດຈະບໍ່ເປັນສິ່ງທີ່ທ່ານຕ້ອງການ:
%.o: %.c : parser c-compilation
@echo 'ການສ້າງ $(output)'
@funny_cc...
ນີ້ຍັງຈະຕີຄວາມຫມາຍ "echo" ເປັນ compiler ແລະ deduce ການໂຕ້ຖຽງຂອງຕົນ 'ການກໍ່ສ້າງ
mymodule.o' ເປັນການເພິ່ງພາອາໄສ implicit. ນີ້ຈະນໍາໄປສູ່ການຮ້ອງທຸກວ່າມັນ
ບໍ່ຮູ້ວິທີສ້າງໄຟລ໌ດັ່ງກ່າວ. ໃນກໍລະນີດັ່ງກ່າວນີ້, ທ່ານຈະດີກວ່າ
"register_parser". ຢູ່ທີ່ນັ້ນເຈົ້າຊອກຫາຄຳອະທິບາຍແນວໃດ ແມ່ບົດ ສາມາດໄດ້ຮັບການມອບໃຫ້ບໍ່ວ່າຈະເປັນ
classname ຫຼືຊື່ຟັງຊັນ.
:ລາຍເຊັນ signature_method
ເປົ້າໝາຍ : ການເພິ່ງພາອາໄສ
: ລາຍເຊັນ md5
ຫຸ້ນ
ອັນນີ້ບອກ makepp ວ່າຈະໃຊ້ອັນໃດອັນໜຶ່ງເພື່ອກຳນົດວ່າຄວາມເພິ່ງພາອາໄສໄດ້ປ່ຽນແປງຫຼືບໍ່.
ເບິ່ງ makepp_signatures ສໍາລັບລາຍລະອຽດເພີ່ມເຕີມ. ວິທີການລາຍເຊັນທີ່ລວມຢູ່ໃນ
ການແຈກຢາຍ makepp ແມ່ນ "ທໍາມະດາ", "md5", "C" ຫຼື "c_compilation_md5", ແລະ.
"shared_object". ນີ້ແທນທີ່ວິທີການລາຍເຊັນທີ່ລະບຸໄວ້ດ້ວຍ "-m" ຫຼື
"--signature-method" ຕົວເລືອກແຖວຄໍາສັ່ງ, ຫຼືດ້ວຍຄໍາຖະແຫຼງ "ລາຍເຊັນ".
ພິເສດ ລັກສະນະ
Makepp ສາມາດສະຫນັບສະຫນູນຊື່ໄຟລ໌ທີ່ມີລັກສະນະພິເສດໃນພວກມັນເຊັ່ນ: ຈໍ້າສອງເມັດຫຼືຊ່ອງຫວ່າງ.
ສໍາລັບຕົວຢ່າງ, ທ່ານຕ້ອງການສ້າງໄຟລ໌ທີ່ເອີ້ນວ່າ "a:thing" ຈາກໄຟລ໌ "b:thing".
ທ່ານບໍ່ສາມາດຂຽນກົດລະບຽບດ້ວຍວິທີນີ້:
a:thing : b:thing # ນີ້ແມ່ນຂໍ້ຜິດພາດຂອງໄວຍະກອນ
&cat $(input) -o $(output)
ເນື່ອງຈາກວ່າ makepp ຈະບໍ່ຮູ້ວ່າໂຄນໃຫຍ່ໃດທີ່ແຍກເປົ້າຫມາຍຈາກການເພິ່ງພາອາໄສແລະອັນໃດ
ສ່ວນຫນຶ່ງຂອງຊື່ໄຟລ໌. ແທນທີ່ຈະ, ພຽງແຕ່ໃສ່ຊື່ໃນວົງຢືມ, ເຊັ່ນນີ້:
"a:thing": "b:thing"
&cat $(input) -o $(output)
ໃນປັດຈຸບັນກົດລະບຽບແມ່ນບໍ່ແນ່ນອນ.
Syntax ວົງຢືມຂອງ Makepp ແມ່ນຂ້ອນຂ້າງຄ້າຍຄືກັນກັບ Shell's. ສໍາລັບຕົວຢ່າງ, ທ່ານສາມາດນໍາໃຊ້ດຽວ
quotes ແທນທີ່ຈະເປັນວົງຢືມຄູ່, ຫຼືທ່ານສາມາດຫນີຕົວອັກສອນພິເສດທີ່ມີ backslash:
a\:ສິ່ງ : 'b:thing'
&cat $(input) -o $(output)
ຕົວຢ່າງ, ສົມມຸດວ່າຊື່ໄຟລ໌ຂອງເຈົ້າແມ່ນ "'"!;\$". ດຽວນີ້ເປັນຫຍັງເຈົ້າຈຶ່ງຕ້ອງການຊື່ໄຟລ໌ດັ່ງກ່າວ.
ຂ້ອຍບໍ່ຮູ້, ແຕ່ນີ້ແມ່ນຫຼາຍວິທີທີ່ທ່ານສາມາດລະບຸມັນກັບ makepp (ແລະ shell):
\''"!;\$$'
"'\"!;\\$$"
ເອົາ ໃຈ ໃສ່ ກ່ຽວ ກັບ ເວ ລາ ທີ່ makepp strips quotes ແລະ ໃນ ເວ ລາ ທີ່ ແກະ ໄດ້. Makepp ເບິ່ງຢູ່
quotes ພຽງແຕ່ໃນກໍລະນີດັ່ງຕໍ່ໄປນີ້:
·ໃນຄອບຄົວ "ifeq" ຂອງການທົດສອບ
· ກ່ອນ ແລະ ຫຼັງ ຈໍ້າ ສອງ ເມັດ
·ໃນຄໍາສັ່ງສ້າງໃນ makepp
· ໃນຫນ້າທີ່ທີ່ກ່ຽວຂ້ອງກັບໄຟລ໌
ບໍ່ຄືກັບແກະ, makepp ບໍ່ໄດ້ຂະຫຍາຍວົງຢືມໃນຂະນະທີ່ກໍານົດພວກມັນໃຫ້ກັບຕົວແປ. ດັ່ງນັ້ນ
ກົດລະບຽບຕໍ່ໄປນີ້ແມ່ນຄືກັນ:
FILE = 'ຊື່ທີ່ມີຍະຫວ່າງ'
x := $(ພິມ $(FILE)) # ພຽງແຕ່ເພື່ອກວດເບິ່ງວ່າວົງຢືມຍັງມີຢູ່
$(FILE): # ວົງຢືມປະມານໄຟລ໌ດຽວທີ່ຖອດອອກໂດຍ makepp
&echo hello -o$(FILE) # ວົງຢືມປະມານໄຟລ໌ດຽວທີ່ຖອດອອກໂດຍ makepp
ສະທ້ອນຢູ່ທີ່ນັ້ນ >>$(FILE) # ວົງຢືມປະມານໄຟລ໌ດຽວທີ່ຖືກຖອດອອກໂດຍ Shell
'ຊື່ທີ່ມີຍະຫວ່າງ':
&ສະທ້ອນສະບາຍດີ -o'name with spaces'
echo there >>'$(output)' # quotes has stripped above, add them again
ໃຫ້ສັງເກດວ່າ (ບໍ່ຄືກັບ Shell) ຕົວແປທີ່ເລີ່ມຕົ້ນດ້ວຍ "$" ແມ່ນຂະຫຍາຍອອກເຖິງແມ່ນວ່າພາຍໃນດຽວ
ວົງຢືມ. ເຄື່ອງຫມາຍເງິນໂດລາບໍ່ສາມາດຖືກປົກປ້ອງໂດຍວົງຢືມຫຼື backslashes. ເພື່ອໃຫ້ໄດ້ຮັບການຮູ້ຫນັງສື
ເຄື່ອງຫມາຍເງິນໂດລາ, ໃຊ້ເຄື່ອງຫມາຍເງິນໂດລາຄູ່, ຕົວຢ່າງ,
$(ຟອກທັງໝົດ):
@&echo ນີ້ແມ່ນສັນຍາລັກເງິນໂດລາ: $$
@for val ໃນ abcd; ເຮັດສຽງສະທ້ອນ $$val; ສຳເລັດແລ້ວ
ໂດຍທົ່ວໄປແລ້ວ, ທ່ານຄວນຈະສາມາດຈັດການກັບລັກສະນະພິເສດໃດໆໂດຍການອ້າງເຖິງມັນ
ໃນບາງທາງ. ນີ້ປະກອບມີຊ່ອງຫວ່າງ, ລັກສະນະການຄວບຄຸມ, ແລະອື່ນໆ. ຢ່າງໃດກໍຕາມ, ຈົ່ງຮູ້ວ່າຢູ່ທີ່
ໃນປັດຈຸບັນ, ການຖອດຄໍາຄິດຄໍາເຫັນຂອງ makepp ແມ່ນຂ້ອນຂ້າງງ່າຍດາຍ, ແລະຕົວອັກສອນ "#".
ກ່ອນໜ້າດ້ວຍຊ່ອງຫວ່າງຈະຖືກຕີຄວາມໝາຍວ່າເປັນຄຳເຫັນບໍ່ວ່າພວກມັນຖືກອ້າງອີງແນວໃດ.
ເມື່ອຊື່ເປົ້າໝາຍ ຫຼືການເພິ່ງພາອາໄສຕົວແປອັດຕະໂນມັດເຊັ່ນ "$(output)", ຈາກນັ້ນ
ວົງຢືມ ແລະ backslashes ໃດຖືກຖອດອອກ. ນີ້ຫມາຍຄວາມວ່າຖ້າຫາກວ່າທ່ານຕ້ອງການທີ່ຈະອ້າງອິງ
ຊື່ໄຟລ໌ໃນການປະຕິບັດ, ທ່ານອາດຈະຕ້ອງອ້າງເຖິງມັນອີກເທື່ອຫນຶ່ງ, ເຊັ່ນນີ້:
"ຊື່ໄຟລ໌ທີ່ມີຍະຫວ່າງ":
ສຽງສະທ້ອນ "ເນື້ອໃນພິເສດ" > "$@"
ຖ້າທ່ານບໍ່ໃສ່ວົງຢືມປະມານ $@, ຫຼັງຈາກນັ້ນ shell ຈະເຫັນຄໍາສັ່ງ
echo "ເນື້ອໃນພິເສດ" > ຊື່ໄຟລ໌ທີ່ມີຍະຫວ່າງ
ເຊິ່ງຂຽນຂໍ້ຄວາມ "ຊື່ໄຟລ໌ເນື້ອຫາພິເສດທີ່ມີຊ່ອງຫວ່າງ" ໃສ່ໄຟລ໌ທີ່ເອີ້ນວ່າ a.
ນີ້ອາດຈະບໍ່ແມ່ນສິ່ງທີ່ທ່ານຕ້ອງການ.
ໃຊ້ makepp_rules ອອນລາຍໂດຍໃຊ້ບໍລິການ onworks.net