GNU Make勉強会 / GNU Make Exercise

0a5d28eceda9a14b5b5f697b36620e8f?s=47 Pudding
August 30, 2020

GNU Make勉強会 / GNU Make Exercise

あくあたん工房でGNU Makeの勉強に使用した資料です。

リポジトリ:https://github.com/pddg/gnu-make-exercise

0a5d28eceda9a14b5b5f697b36620e8f?s=128

Pudding

August 30, 2020
Tweet

Transcript

  1. ྩ࿨͚ͩͲNBLFೖ໳ QVEEJOH 1

  2. 2 5XJUUFS !QVEEJOH@JOGP 1SPpMF ͋͋ͨ͘Μ޻๪0# 43&ͱͯ͠8FCܥاۀͰۈ຿ ίʔώʔ͕झຯ

  3. ͜ͷࢿྉͷλʔήοτ 3 ˔ .BLFΛ࢖ͬͨ͜ͱ͕ͳ͍ਓ ˔ .BLFΛීஈ࢖͍͠ͳ͍ਓ ˔ $$ ͷϔϏʔϢʔβͰͳ͍ਓ ˔

    δΣωϦοΫͳλεΫϥϯφʔΛٻΊ͍ͯΔਓ
  4. ? NBLF ࢖ͬͨ͜ͱ͋Γ·͔͢ʁ 4

  5. (/6.BLF 5 ˔ (/6ϓϩδΣΫτͷNBLF ˔ ݱࡏͷNBLFͷσϑΝΫτελϯμʔυ ˓ NBD04ʹϓϦΠϯ͞ΕͯΔ΋ͷͰ͢Β(/6.BLF ˓ 8JOEPXT޲͚ʹग़͍ͯΔ΋ͷ΋(/6.BLF

    ˔ ݱঢ়͜ΕҎ֎Λߟྀ͢Δඞཁ͸͋·Γͳ͍
  6. NBLF͸͍ͭ࢖͏ʁ 6 ˔ Կ͔ϑΝΠϧΛੜ੒͢ΔλεΫ͕͋Δͱ͖ ˓ ྫʣίϯύΠϧ࣮ͯ͠ߦόΠφϦΛ࡞Δ ɹɹಛఆͷϑΝΠϧΛࣗಈੜ੒͢ΔίϚϯυΛ࢖͏ ˔ Ұ࿈ͷૢ࡞Λ؆୯ʹ࣮ߦ͍ͨ͠ͱ͖ ˓

    ྫʣੜ੒࣮ͨ͠ߦόΠφϦΛ·ͱΊͯ࡟আ͍ͨ͠
  7. .BLFpMF 7 ˔ NBLFͷಈ࡞Λఆٛ͢Δ ˓ UBSHFUɿੜ੒͢Δ λʔήοτϑΝΠϧ܈ ˓ QSFSFRɿUBSHFUͷ ੜ੒ʹඞཁͳϑΝΠϧ܈

    ˓ DPNNBOEɿUBSHFUΛ ੜ੒͢ΔίϚϯυ܈ ˔ ஫ҙɿΠϯσϯτ͸λϒ # コメントは `#` で始める # prereqが無い場合 target1: command1 # targetとして定義した物を # 他のtargetのprereqにできる target4: target1 command1 # それぞれの要素は複数定義可 target2 target3: prereq1 prereq2 command1 command2
  8. ґଘάϥϑ 8 # コメントは `#` で始める # prereqが無い場合 target1: command1

    # targetとして定義した物を # 他のtargetのprereqにできる target4: target1 command1 # それぞれの要素は複数定義可 target2 target3: prereq1 prereq2 command1 command2 UBSHFU UBSHFU DPNNBOE DPNNBOE DPNNBOE DPNNBOE UBSHFU UBSHFU QSFSFR QSFSFR
  9. $ make target4 9 # コメントは `#` で始める # prereqが無い場合

    target1: command1 # targetとして定義した物を # 他のtargetのprereqにできる target4: target1 command1 # それぞれの要素は複数定義可 target2 target3: prereq1 prereq2 command1 command2 UBSHFU UBSHFU DPNNBOE DPNNBOE DPNNBOE DPNNBOE UBSHFU UBSHFU QSFSFR QSFSFR
  10. 10 # コメントは `#` で始める # prereqが無い場合 target1: command1 #

    targetとして定義した物を # 他のtargetのprereqにできる target4: target1 command1 # それぞれの要素は複数定義可 target2 target3: prereq1 prereq2 command1 command2 UBSHFU UBSHFU DPNNBOE DPNNBOE DPNNBOE DPNNBOE UBSHFU UBSHFU QSFSFR QSFSFR $ make target4
  11. 11 # コメントは `#` で始める # prereqが無い場合 target1: command1 #

    targetとして定義した物を # 他のtargetのprereqにできる target4: target1 command1 # それぞれの要素は複数定義可 target2 target3: prereq1 prereq2 command1 command2 UBSHFU UBSHFU DPNNBOE DPNNBOE DPNNBOE DPNNBOE UBSHFU UBSHFU QSFSFR QSFSFR $ make target4
  12. 12 # コメントは `#` で始める # prereqが無い場合 target1: command1 #

    targetとして定義した物を # 他のtargetのprereqにできる target4: target1 command1 # それぞれの要素は複数定義可 target2 target3: prereq1 prereq2 command1 command2 UBSHFU UBSHFU DPNNBOE DPNNBOE $ make target4 طʹ྆ํଘࡏ͠ɺ͔ͭɺ UBSHFUͷํ͕ΑΓ΋ߋ৽೔͕ݹ͍ ˣ Կ΋͠ͳ͍ طʹ྆ํଘࡏ͢Δ͕ɺ UBSHFUͷํ͕ΑΓ΋ߋ৽೔͕৽͍͠ ˣ UBSHFUΛࢦఆ͞ΕͨίϚϯυͰ࠶࡞੒
  13. ? ࠷ۙͷݴޠͬͯɺґଘղܾ͸ ݴޠଆͰ΍ͬͯ͘ΕΔΑͶʁ 13

  14. ʂ Ͱ͸.BLF͸ෆཁʂ ղࢄʂ 14

  15. ʂ Ͱ͸ͳ͍ 15

  16. ݱ୅ʹ͓͚Δ.BLFͷ࢖͍Ͳ͜Ζ 16 ˔ Ұͭͷݴޠͷείʔϓʹऩ·Βͳ͍ɺෳࡶͳૢ࡞΍ ଟ਺ͷΦϓγϣϯ෇͖ͷίϚϯυͷΤΠϦΞε ˓ ΫϩεϏϧυɾEPDLFSΛ࢖ͬͨϏϧυͳͲ ˓ MJOU΍୯ମςετͷ࣮ߦ ˓

    Ϗϧυ੒Ռ෺ͷύοέʔδϯά ˓ QSPUPDΛ࢖ͬͨίʔυੜ੒ͳͲ ˔ ϓϩδΣΫτϝϯόʔͱ࡞ۀख๏ͷڞ༗͕Ͱ͖Δ ˓ ෳࡶͳૢ࡞ΛӅṭ͠ɺ։ൃΛޮ཰Խ ˓ ֮͑΍͍͢ڞ௨ݴޠͱͯ͠ͷ.BLFpMF
  17. λεΫϥϯφʔͱͯ͠ීٴ͗ͨ͢͠ฐ֐ 17 ˔ ݩʑͷ༻్ͱͯ͠͸ϏϧυπʔϧͰ͋ΓɺͦΕΏ͑ʹ ޡͬͨ࢖༻๏͕૝ఆ֎ͷ݁ՌΛ΋ͨΒ͢͜ͱ͕͋Δ ˓ ٙࣅλʔήοτʢޙड़ʣ΍ɺม਺ͷ࢖༻๏ͳͲΛ ཧղ͓ͯ͘͠ ˔ σόοά͕೉͘͠ɺਖ਼͍͠৘ใΛಘʹ͍͘

    ˓ ΠϯλʔωοτͷීٴΑΓ΋ྺ࢙͕ݹ͍ͨΊ ˓ ΦϥΠϦʔͷʰ(/6.BLFୈࡾ൛ʱ͕͓͢͢Ί
  18. ʂ ·ͣ͸جૅΛݻΊΑ͏ʂ 18

  19. ʂ 19 &Y )FMMPXPSME

  20. ԋशϓϩδΣΫτͷ༻ҙ 20 ˔ ϦϙδτϦͷΫϩʔϯ ˓ IUUQTHJUIVCDPNQEEHHOVNBLFFYFSDJTF ˓ ·ͨ͸IUUQTHJUIVCDPNQEEHHOVNBLF FYFSDJTFBSDIJWFNBTUFS[JQ͔Βμ΢ϯϩʔυ ˔

    ϩʔΧϧͷϦϙδτϦΛ74$PEFͰ։͘ ˓ 3FNPUF$POUBJOFSTϓϥάΠϯΛೖΕͯ3FPQFO JODPOUBJOFS͢Δ &Y)FMMPXPSME
  21. ໰୊ઃఆ 21 ˔ ҎԼͷཁ݅Λຬͨ͢.BLFpMFΛॻ͚  main.cΛίϯύΠϧ͠ɺhelloͱ͍͏όΠφϦΛ ࡞੒͢Δ  main.cʹมߋ͕͋Ε͹helloΛ࠶Ϗϧυ͠ɺ มߋ͕ແ͚Ε͹Կ΋͠ͳ͍

     make helloͰhello͕࡞੒Ͱ͖Δ ˔ ิ଍ɿgcc -o バイナリ名 ソース名 &Y)FMMPXPSME
  22. ʂ 22 &Y 1IPOZUBSHFU ઌʹFYΛ΍ͬͯΈ͍ͯͩ͘͞

  23. λʔήοτͱٙࣅλʔήοτ 23 ˔ .BLFͷλʔήοτ͸࣮ࡏ͢Δʢ·ͨ͸͜Ε͔Β ੜ੒͢ΔʣϑΝΠϧ܈Λࢦ͢ ˔ Ͱ͸Α͘ݟΔmake clean΍make install͸ʁ ˓

    ͜ΕΒ͸ٙࣅλʔήοτͱݺ͹ΕΔ ˓ ࢦఆ͞Εͨͱ͖ৗʹ࣮ߦ͞ΕΔλʔήοτ ˓ DMFBO΍JOTUBMMͱ͍͏ϑΝΠϧ͕͋ͬͯ΋ײ஌͠ͳ͍ ˓ .BLFͷػೳͰ͸ͳ͍ͷͰɺͦΕΒͷॲཧ͸ࣗ෼Ͱ ॻ͘ඞཁ͕͋Δɻ &Y1IPOZUBSHFU
  24. .PHONY 24 ˔ ٙࣅλʔήοτʹ͢Δʹ͸ ಛघͳλʔήοτͰ͋Δ .PHONYͷQSFSFRͱͯ͠ ࢦఆ͢Δ ˔ ෳ਺ʹ෼͚ͯॻ͘͜ͱ΋ɺ Ұͭʹ·ͱΊͯॻ͘͜ͱ΋

    ग़དྷΔ # ターゲット一つずつに設定する場合 .PHONY: hoge hoge: fuga .PHONY: piyo piyo: poyo ˞ 1IPOZɿʹͤ΋ͷɾ·͕͍΋ͷ IUUQTEJDUJPOBSZHPPOFKQXPSEFOQIPOZ # まとめて設定する場合 .PHONY: hoge piyo hoge: fuga piyo: poyo &Y1IPOZUBSHFU
  25. ໰୊ઃఆ 25 ˔ &Yͷ.BLFpMFʹҎԼͷػೳΛ௥Ճ͢Δ  make buildͰhelloίϚϯυΛϏϧυ  make cleanͰϏϧυ੒Ռ෺Λ࡟আ

    ˔ ͨͩ͠ɺclean͓ΑͼbuildϑΝΠϧΛ࡟আͯ͠͸ ͳΒͳ͍ &Y1IPOZUBSHFU
  26. ʂ 26 &Y 7BSJBCMF

  27. ม਺ 27 ˔ ͜͜·Ͱ͸શͯϋʔυίʔσΟϯά͖ͯͨ͠ ˓ ࣅͨΑ͏ͳϧʔϧ͕ଟ਺͋ΔͱɺԿ͔վળ͢Δͨͼʹ ଟ਺ͷมߋΛඞཁͱͯ͠͠·͏ ˔ ͦ͜Ͱม਺Λར༻͢Δ ˓

    ܕͷΑ͏ͳ΋ͷ͸ແ͍ ˓ ୯ʹͦͷม਺Λར༻ͨ͠ࡍՕॴ͕ɺͦͷม਺ͷ஋ ʢจࣈྻʣʹஔ׵͞ΕΔɺͱߟ͑Δͱ$ͷdefine ͳͲʹ͍ۙ &Y7BSJBCMF
  28. 28 ˔ l変数名=値zͰએݴͰ͖Δ ˔ ࢖༻࣌͸l$(変数名)z ˔ એݴͨ͠৔ॴ͸ؔ܎ແ͍ ˓ શ෦ΛಡΈࠐΜͰ͔Βม ਺ͷ஋Λల։͢ΔͨΊ

    ˓ ಉ໊ͷม਺ͷ஋͸࠷ޙʹ એݴ͞Εͨ΋ͷͰ্ॻ͖ # コンパイラを変数化 CC=gcc hello: main.c $(CC) -o hello main.c # targetやprereqにも使える SRC_FILES=a.txt b.txt c.txt MERGED_FILE=merged.txt $(MERGED_FILE): $(SRC_FILES) cat $(SRC_FILES) \ > $(MERGED_FILE) ม਺ &Y7BSJBCMF # 表示されるのは2.0.0 VERSION=1.0.0 .PHONY: print_version print_version: echo $(VERSION) VERSION=2.0.0
  29. 29 ˔ ࣄલʹఆٛ͞Ε͍ͯΔ ಛघͳม਺΋ଘࡏ͢Δ ˔ ίϚϯυͰ࢖͑Δࣗಈม਺ ͱ͍͏΋ͷ΋͋Δ ˓ ίϚϯυதͷλʔήοτ ໊ͳͲͷϋʔυίʔυΛ

    ๷͛Δ ˔ σϑΥϧτλʔήοτ͸ .DEFAULT_GOALͰઃఆ .PHONY: print print: # 使用するMakeのバージョン echo $(MAKE_VERSION) # 指定されたターゲット一覧 echo "$(MAKECMDGOALS)" # 変数一覧 echo "$(.VARIABLES)" # カレントディレクトリのパス echo $(CURDIR) ಛघͳม਺ &Y7BSJBCMF # $< → prereqの最初の一つ # $@ → ターゲット名 main.o: main.c gcc -c $< -o $@ # $^ → prereqの一覧 hello: main.o gcc $^ -o $@ # 単にmakeと実行されたとき # helloをターゲットとする .DEFAULT_GOAL=hello
  30. 30 ˔ .BLFpMFͷ֎෦͔Βม਺Λ ౉͢ํ๏͸छྨ ˔ ؀ڥม਺ ˓ தͰఆ͍ٛͯ͠Δ஋Λ ্ॻ͖Ͱ͖ͳ͍ ˔

    NBLFͷҾ਺ ˓ தͰఆ͍ٛͯ͠Δ஋Λ ্ॻ͖Ͱ͖Δ # Makefileの中身 VAR=hoge # これは定義済み扱い DEFINED= .PHONY: print print: @echo $(VAR) @echo $(DEFINED) @echo $(ENV_VAR) ֎෦͔Β஋Λ౉͢ &Y7BSJBCMF # 環境変数 $ VAR=fuga DEFINED=hoge ENV_VAR=piyo \ make print hoge piyo # makeの引数 $ make print \ VAR=fuga DEFINED=hoge ENV_VAR=piyo fuga hoge piyo
  31. ໰୊ઃఆ 31 ˔ ҎԼͷཁ݅Λຬͨ͢Α͏ʹɺ.BLFpMFʹมߋΛՃ͑Αɻ ˓ $47ϑΝΠϧΛੜ੒͢ΔϓϩάϥϜ͕มߋʹͳͬͨ ࡍʹɺมߋՕॴ͕ՕॴͰࡁΉ ˓ ੜ੒͢Δσʔλྔʢ-n 10ʣ͕มߋʹͳͬͨͱ͖

    ʢྫ͑͹-n 100ʣʹมߋՕॴ͕ՕॴͰࡁΉ ˔ ͨͩ͠ɺ$47ϑΝΠϧ͸HFO@EBUBQZΛ༻͍ͯੜ੒͢Δ΋ͷ ͱ͠ɺHFO@EBUBQZࣗମΛมߋ͢Δ͜ͱ͸ෆՄͱ͢Δɻ &Y7BSJBCMF
  32. ʂ 32 &Y 1BUUFSO

  33. 33 ˔ ͋Δ֦ுࢠΛ࣋ͭϑΝΠϧ Λੜ੒͢Δͱ͖ɺଟ͘ͷ৔ ߹ͦͷϧʔϧ͸ͲΕ΋ಉ͡ Ͱ͋Δ ˔ % ΛϫΠϧυΧʔυͱͯ͠ ࢖༻Ͱ͖Δ

    ˓ ࣗಈม਺Λ͏·͘ ׆༻͢Δͱྑ͍ # .cから.oを生成するルール %.o: %.c gcc -o $@ $< # .oから実行バイナリを作るルール %: %.o gcc -o $@ $^ ύλʔϯϚον &Y1BUUFSO
  34. ҉໧ͷϧʔϧ 34 ˔ .BLFʹ͸ࣄલʹఆٛ͞Εͨ҉໧ͷϧʔϧ͕ଘࡏ͢Δ ˓ ྫ͑͹ %.o: %.c $(COMPILE.c) $(OUTPUT_OPTION)

    $< ˔ શͯͷ҉໧ͷϧʔϧ͸make --print-data-baseͰ දࣔͰ͖Δ &Y1BUUFSO
  35. ໰୊ઃఆ 35 ˔ ҎԼͷཁ݅Λຬͨ͢Α͏ʹɺ.BLFpMFʹมߋΛՃ͑Αɻ ˓ DTWͱ͍͏֦ுࢠΛ࣋ͭϑΝΠϧͷੜ੒ϧʔϧΛՕ ॴʹ·ͱΊΑ ˓ ಉ༷ʹKTPOͱ͍͏֦ுࢠΛ࣋ͭϑΝΠϧͷੜ੒ϧʔ ϧΛՕॴʹ·ͱΊΑ

    ˔ ͨͩ͠ɺ$47͓Αͼ+40/ϑΝΠϧ͸HFO@EBUBQZΛ༻ ͍ͯੜ੒͢Δ΋ͷͱ͠ɺHFO@EBUBQZࣗମΛมߋ͢Δ͜ ͱ͸ෆՄͱ͢Δɻ &Y1BUUFSO
  36. ʂ 36 &Y 1BUUFSO5BSHFU4QFDJpD7BSJBCMF

  37. 37 ˔ .BLFpMFதͷม਺͸جຊత ʹશͯάϩʔόϧͰ͋Δ ˔ ޙ͔Βఆٛ͠௚͢ͱɺͦͷ ஋͸্ॻ͖͞Εͯ͠·͏ ˔ ಛఆͷϧʔϧ͚ͩ஋Λม͑ ͍ͨʜʜͱ͍͏৔߹ɺӈͷ

    ํ๏Ͱ͸μϝ # 表示されるのはどちらも2.0.0 VERSION=1.0.0 .PHONY: print_version print_version: echo $(VERSION) VERSION=2.0.0 .PHONY: print_version2 print_version2: echo $(VERSION) ม਺ͷείʔϓ &Y1BUUFSO5BSHFU4QFDJpD7BSJBCMF
  38. 38 ˔ ಛఆͷείʔϓʹݶͬͯม ਺ͷ஋Λมߋ͢Δ ˓ ಛఆͷύλʔϯʹϚον ͢Δ৔߹ ˓ ಛఆͷλʔήοτͷ৔߹ ˔

    ্ॻ͖͢Δ͜ͱʹ஫ҙ ˓ BQQFOEͰ͸ແ͍ # make print_version # → 1.0.0が表示される # make print_version2 # → 2.0.0が表示される .PHONY: print_version .PHONY: print_version2 print_version: VERSION=1.0.0 print_version2: VERSION=2.0.0 print_version print_version2: echo $(VERSION) ݻ༗ͷม਺ &Y1BUUFSO5BSHFU4QFDJpD7BSJBCMF
  39. ໰୊ઃఆ 39 ˔ ҎԼͷཁ݅Λຬͨ͢Α͏ʹɺ.BLFpMFʹมߋΛՃ͑Αɻ ˓ .csv͓Αͼ.jsonͷ֦ுࢠΛ࣋ͭϑΝΠϧʢCSVS ͓ΑͼJSONSʣΛੜ੒͢ΔϧʔϧΛҰͭʹ·ͱΊΑ ˓ ·ͨɺlarge_dataͱ͍͏จࣈྻΛϑΝΠϧ໊ʹؚΉ ৔߹ɺੜ੒͢Δσʔλ਺Λʢ-n

    100ʣͱͤ Αɻ ˔ ͨͩ͠ɺ$47͓Αͼ+40/ϑΝΠϧ͸HFO@EBUBQZΛ༻ ͍ͯੜ੒͢Δ΋ͷͱ͠ɺHFO@EBUBQZࣗମΛมߋ͢Δ͜ ͱ͸ෆՄͱ͢Δɻ &Y1BUUFSO5BSHFU4QFDJpD7BSJBCMF
  40. ʂ 40 &Y $POEJUJPO

  41. ৚݅෼ذ 41 ˔ .BLFpMF಺Ͱ৚݅෼ذΛهड़Ͱ͖Δ ˓ ifdefɿ͋Δม਺͕ఆٛ͞Ε͍ͯΕ͹USVF ˓ ifeqɿͭͷ஋͕౳͚͠Ε͹USVF ˓ ifneqɿͭͷ஋͕౳͘͠ͳ͚Ε͹USVF

    ˔ ॻ͖ํʹগ͠Ϋη͕͋ΔͨΊɺ࢖༻͢Δࡍʹ͸஫ҙ͢Δ͜ͱ &Y$POEJUJPO
  42. 42 ˔ ؀ڥม਺ͱ૊Έ߹Θͤͯ ࢖͏ͳͲ ˔ ؀ڥม਺ʹର͢Δ σϑΥϧτ஋ͷఆٛʹ͸ ?=Λ࢖ͬͨํ͕εϜʔζʹ ॻ͚Δ ˔

    ݸਓతʹ͸͋·Γ࢖͍ Ͳ͜Ζ͕ͳ͍ʁ SUDO=sudo ifdef SUDO_USER SUDO=sudo -u $(SUDO_USER) endif .PHONY: install install: $(SUDO) mv hoge /usr/local/bin/ JGEFG &Y$POEJUJPO
  43. 43 ˔ Λ࢖͏ํ๏ͱlzΛ࢖͏ ํ๏͕͋Δɻ ˓ ͷ৔߹ɺલޙͷۭന΋ ൺֱ͞ΕΔ ˓ ΍΍͍͜͠ͷͰޙऀਪ঑ ˔

    "/%ͱ͔03͕ॻ͚ͳ͍ ifeq ($(HOGE),hoge) HOGE=fuga endif # 以下はfalse ifeq (hoge, hoge) HOGE=hoge endif ifeq "$(HOGE)" "hoge" HOGE=fuga endif JGFRɾJGOFR &Y$POEJUJPO
  44. 44 ˔ ৚݅෼ذ͸ίϚϯυͷهड़ ʹ΋࢖͑Δ ˔ ͨͩ͠ɺJGઅશମΛUBCͰ Πϯσϯτͯ͠͠·͏ͱɺ શ͕ͯίϚϯυͱ࣮ͯ͠ߦ ͞Εͯ͠·͏ ˔

    JG৚݅ͷΠϯσϯτ͸ εϖʔεͰߦ͏ # インデントしない方が良い main: ifeq "$(ANOTHER)" “another.c" gcc -o main another.c else gcc -o main main.c endif JGͷΠϯσϯτ &Y$POEJUJPO # タブでインデントするとエラー # # $ make # /bin/sh: 1: ifeq: not found # make: *** [Makefile:2: main] Error 127 main: ifeq "$(ANOTHER)" “another.c" gcc -o main another.c else gcc -o main main.c endif
  45. ໰୊ઃఆ 45 ˔ ҎԼͷཁ݅Λຬͨ͢Α͏ʹ.BLFpMFʹมߋΛՃ͑Α ˓ DRYRUNͱ͍͏ม਺͕USVFͰ͋Δͱ͖ɺ࣮ࡍʹ λʔήοτΛੜ੒ͤͣɺ୅ΘΓʹ࣮ߦίϚϯυΛ දࣔ͢Δ ˓ TFFEUYUҎ֎͕ࢦఆ͞Εͨͱ͖ɺܯࠂΛදࣔ͢Δ

    ˓ CIͱ͍͏؀ڥม਺͕ઃఆ͞Ε͍ͯͨͱ͖ɺNUM=1ʹ͢Δ ˔ ͨͩ͠ɺHFO@EBUBQZࣗମΛมߋ͢Δ͜ͱ͸ෆՄͱ͢Δ &Y$POEJUJPO
  46. ʂ 46 &Y 'VODUJPOT

  47. ؔ਺ 47 ˔ .BLFʹ͸༷ʑͳػೳΛఏڙ͢Δ૊ΈࠐΈؔ਺͕͋Δ ˓ TIFMMɿγΣϧεΫϦϓτΛ࣮ߦ͢Δ ˓ XJMEDBSEɿಛఆͷύλʔϯΛ࣋ͭϑΝΠϧσΟϨΫ τϦΛྻڍ͢Δ ˓

    EJSɿࢦఆ͞ΕͨύεͷσΟϨΫτϦ෦Λநग़͢Δ ˓ TVCTUɿจࣈྻதͷಛఆͷจࣈྻΛஔ׵͢Δ ˓ GPSFBDIɿෳ਺ͷཁૉʹؔ਺Λద༻͢Δ &Y'VODUJPOT
  48. 48 • $(関数名 引数1,引数2) ˔ ஫ҙࣄ߲ ˓ ΧϯϚͷલޙʹۭനΛೖ Εͳ͍ ˓

    $Λ࢖͍͍ͨ৔߹ɺ$$ͱ ͯ͠Τεέʔϓ͢Δ ࢖͍ํ &Y'VODUJPOT # 直下にあるCのソースコードを列挙 C_SRCS=$(wildcard *.c) # ファイル名の.cと.oを置換 O_FILES=$(subst .c,.o,$(C_SRCS)) %.o: %.c echo "gcc -o $@ $<" $(O_FILES): $(C_SRCS) # パイプも使える FILES=$(shell ls -a | grep -v .git) .PHONY: ls ls: echo $(FILES)
  49. ໰୊ઃఆ 49 ˔ ҎԼͷཁ݅Λຬͨ͢.BLFpMFΛॻ͚ ˓ DNEσΟϨΫτϦҎԼʹ͋ΔͭͷίϚϯυΛϏϧυ͠ɺ ͦΕͧΕCJOσΟϨΫτϦҎԼʹ഑ஔ͢Δ ˓ lib/*.go ͱstatik/*.goɺ͓Αͼ֤ίϚϯυͷ(P

    ϑΝΠϧɺgo.mod͕มߋ͞ΕͨΒ࠶౓Ϗϧυ͕૸Δ ˓ makeͱ࣮ߦ͢ΔͱͭͷίϚϯυ͕Ϗϧυ͞Εɺ make cleanͰશͯ࡟আ͞ΕΔ ˔ ͨͩ͠ɺ.BLFpMFதʹ(PͷιʔείʔυϑΝΠϧ໊Λ ϋʔυίʔυͯ͠͸ͳΒͳ͍ ˔ ิ଍ɿgo build -o バイナリへのパス ./cmd/コマンド名 &Y'VODUJPOT
  50. ʂ 50 &Y 5ZQFPG7BSJBCMF

  51. छྨͷม਺ͷ࢖͍෼͚ 51 ˔ ࣮͸એݴͷ࢓ํʹΑͬͯ.BLFpMFͷม਺͸छྨ͋Δ ˓ ୯७ల։ม਺ɿVAR := value ˓ ࠶ؼల։ม਺ɿVAR

    = value ˔ ͦΕͧΕͷม਺͸ධՁ͞ΕΔλΠϛϯά͕ҟͳΔ ˓ ୯७ల։ม਺ɿͦͷ৔Ͱ஋͕ల։͞ΕΔ ˓ ࠶ؼల։ม਺ɿ࢖ΘΕΔͱ͖ʹ஋͕ల։͞ΕΔ &Y5ZQFPG7BSJBCMF
  52. 52 ˔ ؔ਺ͳͲΛ࢖ͬͯಈతʹ มΘΓಘΔ஋ΛऔΔม਺Ͱ ҧ͍͕ൃੜ͢Δ ˔ ࠷ॳʹఆ͍ٛͯ͠Δ͚ͩͷ DATEม਺ͷ஋͕࣮ߦͷ౓ʹ มԽ͍ͯ͠Δ ˔

    ҰํDATE_FIXED͸ มԽ͍ͯ͠ͳ͍ ۩ମతͳڍಈ &Y5ZQFPG7BSJBCMF DATE=$(shell date) DATE_FIXED:=$(shell date) .DEFAULT_GOAL=all .PHONY: print print%: @echo $(DATE) @echo $(DATE_FIXED) @sleep 1 .PHONY: all all: print1 print2 print3 $ make Sat 29 Aug 2020 06:44:17 PM UTC Sat 29 Aug 2020 06:44:17 PM UTC Sat 29 Aug 2020 06:44:18 PM UTC Sat 29 Aug 2020 06:44:17 PM UTC Sat 29 Aug 2020 06:44:19 PM UTC Sat 29 Aug 2020 06:44:17 PM UTC
  53. 53 ˔ ɿະఆٛͷͱ͖ʹ୅ೖ ˓ ؀ڥม਺Λѻ͏ͷʹศར ˔ ɿఆٛࡁΈͷ஋ʹ৽ͨͳ ஋ΛՃ͑Δ ˓ ಛఆͷλʔήοτ͚ͩ

    ϏϧυΦϓγϣϯΛ௥Ճ ͍ͨ͠ͳͲ ͍ͭͰʹଞͷԋࢉࢠ &Y5ZQFPG7BSJBCMF HOGE?=hoge HOGE += fuga .PHONY: print print: @echo $(HOGE) $ make hoge fuga $ HOGE=piyo make piyo fuga
  54. ໰୊ઃఆ 54 ˔ ҎԼͷཁ݅Λຬͨ͢Α͏ʹɺ.BLFpMFʹมߋΛՃ͑Αɻ ˓ ϑΝΠϧͷੜ੒ޙɺ֦ுࢠΛআ͍ͨϑΝΠϧ໊͕ಉ͡෺ಉ࢜ͷ ૊ΛɺҰͭͷΞʔΧΠϒʹ·ͱΊΔ ˗ ྫ͑͹foo.csvͱfoo.json͔Βfoo.tar.gzΛ࡞Δ ˔

    ͨͩ͠ɺΞʔΧΠϒ໊ʹ͸Ϗϧυ࣌ͷ࣌ؒΛՃ͑ɺྫ͑͹ foo_20200830-000000.tar.gzͱͳΔΑ͏ʹ͢Δ͜ͱɻ ˔ ·ͨɺಉ࣌ʹੜ੒ͨ͠ΞʔΧΠϒ໊ͷ೔͕࣌ἧ͏Α͏ʹ஫ҙ͢Δ ˔ ิ଍ ˓ ೔࣌ੜ੒ɿdate +%Y%m%d-%H%M%S ˓ ΞʔΧΠϒੜ੒ɿtar czf アーカイブ名 ファイル1 ファイル2… &Y5ZQFPG7BSJBCMF
  55. ʂ ͔͜͜Βઌ͸ൃల՝୊ 55

  56. ʂ 56 &Y 1PSUBCJMJUZ

  57. ؀ڥʹॊೈʹରԠ͢Δ 57 ˔ ؀ڥʹΑ༷ͬͯʑͳҧ͍͕͋Δ ˓ -JOVY΍.BDͰ͸࡟আίϚϯυ͕rm ͕ͩ8JO͸del ˓ -JOVYͷsed ͱ.BDͷsed

    ͸Φϓγϣϯ͕ҧ͏ ˔ ͜ΕΒͷࠩҟΛٵऩ͢Δʹ͸Ͳ͏͢Ε͹ྑ͍͔ʁ ˓ Ͱ͖Δ͚ͩ.BLFͷػೳΛ࢖͏ ʢshellͷ࢖༻Λආ͚Δʣ ˓ ࣮ߦίϚϯυΛม਺Խͯ͠؀ڥ͝ͱʹ੾Γସ͑ &Y1PSUBCJMJUZ
  58. 58 ˔ ·ͣ͸ $(OS) Ͱ൑ఆ ˔ -JOVYͱ.BDͷ൑ఆ͸ uname ίϚϯυΛ࢖͏ ˔

    ͦΕͧΕͷ৚݅෼ذ಺Ͱ ඞཁͳϑϥάͷ௥Ճ΍ɺ ίϚϯυͷมߋΛߦ͏ 04͝ͱʹ෼ذ &Y1PSUBCJMJJUZ ifeq "$(OS)" “Windows_NT" # Windows else UNAME=$(shell uname -s) ifeq "$(UNAME)" "Linux" # Linux else # macOS endif endif
  59. ໰୊ઃఆ 59 ˔ -JOVY΍.BDͰ͸࡟আίϚϯυ͕SN͕ͩ8JO͸EFM ˔ -JOVYͷTFEͱ.BDͷTFE͸Φϓγϣϯ͕ҧ͏ ˔ ͜ΕΒͷࠩҟΛٵऩ͢Δʹ͸Ͳ͏͢Ε͹ྑ͍͔ʁ &Y1PSUBCJMJUZ

  60. ʂ 60 &Y 4FDPOEBSZ&YQBOTJPO

  61. ໰୊ઃఆ 61 ˔ &YͷΑ͏ͳ.BLFpMF͸·ͩඇޮ཰ ˓ Ϗϧυ͍ͨ͠શͯͷίϚϯυΛྻڍ͢Δඞཁ͕͋Δ ˓ ࣮͸͜ΕΛ͏·͘ղܾ͢Δํ๏͕͋Δ ˔ ύλʔϯϚονͰॻ͍ͯXJMEDBSEͰల։Ͱ͖ͨΒخ͍͠

    ˓ ͭ·Γbin/%ʹϚονͨ͠λʔήοτͷQSFSFRͰ $(wildcard cmd/%/*.go)Έ͍ͨͳ͜ͱ͕͍ͨ͠ &Y4FDPOEBSZ&YQBOTJPO IUUQTXXXHOVPSHTPGUXBSFNBLFNBOVBM NBLFIUNM4FDPOEBSZ&YQBOTJPO
  62. ͦͷଞUJQT 62 ˔ ίϚϯυͷ࣮ߦ݁Ռ੍ޚ ˓ A!AΛ෇͚Δͱɺ࣮ߦίϚϯυΛදࣔ͠ͳ͍ ˓ AAΛ෇͚Δͱɺࣦഊͯ͠΋ແࢹ͢Δ ˔ ෳ਺λʔήοτΛฒྻʹੜ੒

    ˓ AK/Aʢ/͸੔਺ʣͱ͍͏Φϓγϣϯ෇͖Ͱ࣮ߦ͢Δ ˔ Α͘ݟΔDPOpHVSFͬͯԿʁ ˓ .BLFpMFࣗମΛ͜ΕΛ࢖ͬͯੜ੒͢Δ ˓ BVUPNBLFͷΑ͏ͳ΋ͷ΋͋ΔͷͰڵຯ͕͋Ε͹ ˔ ΋ͬͱ৽͍͠.BLFΈ͍ͨͳͷͳ͍ͷʁ ˓ CB[FMͱ͔͋Δ͚ͲٻΊͯΔͷͱ͸ҧ͏͔΋
  63. ·ͱΊ 63 ˔ (/6.BLF͸ϑΝΠϧΛੜ੒͢ΔϧʔϧΛهड़͢Δ΋ͷ ˓ ͨͩ͠λεΫϥϯφʔͱͯ͠΋࢖͑Δ ˔ ޮ཰తͳॻ͖ํΛ͢Δ͜ͱͰɺϋʔυίʔσΟϯάΛ ݮΒͤΔ ˓

    ύλʔϯϚονɾ૊ΈࠐΈؔ਺ͳͲ ˔ ଞʹ΋ଟ਺ͷػೳ͕͋Δ ˓ (/6.BLFୈࡾ൛ͷߪೖΛ͓͢͢Ί͠·͢
  64. ? ࣭໰λΠϜ 64