pretty code

2026年3月20日 星期五

Makefile

最近需要更改客戶的 Makefile,我才發現我以前真的不太懂 Makefile!

第一個我不知道的點是 receipe

receipe 指的就是在某 target 下,要執行的 shell command,也就是由 tabe 字元縮排的那些列。

all:
    @echo make all
    - do something

上面每一列都是單獨的指令,換句話說,每一列都會新起一個 shell 來執行(預設行為)。

我有一個需求類似下面這樣

all:
  ifeq ($(FLAG), xxx)
       $(eval FOLDER = 001)
       @cd $(FOLDER)
  else ifeq ($(FLAG), yyy)
       $(eval FOLDER = 002)
       @cd $(FOLDER)
  end

這段 code 是原本客戶的,我不太想大改它,只是把會變動的變數提取出來,剩下要做的 receipe 都一樣,因此就需要用 eval 的方式來設變數。

第二個我不知道的點是變數展開與環境變數間的優先性關係

FLAG ?= 0

ifneq ($(FLAG), 0)
    BUILD_OPTS += XXXX
endif 

上面這句其實有隱含假設環境變數 FLAG 也存在,就使用環境變數的值。

好死不死我的 bashrc 也宣告了一個同名的環境變數 FLAG。

於是便導致我 git push 後的檢查觸發行為跟別人不一樣,因為我的 FLAG 不等於 0。

不得不說,這些東西跟 AI 對話後,整個脈絡變得更清楚了。

 
我現在開始有點體會他說的話了。

下面是我跟 Claude Web 對話的一部分結果。


2026/03/20 洗完澡更新

剛剛才突然想到,如果跟 AI 討論《傷寒雜病論》會如何?


也許是時候跟他討論九陰真經了XD

沒有留言: