本文主要目的,不是要你新增什麼源碼來產生或是記錄編譯次數,基本上若您有興趣配合著用也行。先說一下編譯時,通常是用 make, 也就是說,它會讀一個檔叫 Makefile,有在用 make 的人應該都知道 Makefile 可以定義變數,甚至請 make 把變數丟進源碼中。
那麼本文的目的是啥?就是希望讓你可以每次編譯,都產生一個獨立而遞增的編號,以便源碼能引用,以便區別,Kernel 就是這麼做的。先來看一個簡單的 Makefile 範例:
# Makefile
OBJECTS=bnum.o
a.out: $(OBJECTS)
$(CC) $(LDFLAGS) -o $@ $(OBJECTS)
根據規則,會把 bnum.c 產生 a.out,每次都是這個結果。讓我們再來看一個修改過的 Makefile:
# Makefile
# Name of text file containing build number.
BUILD_NUMBER_FILE=build-number.txt
OBJECTS=bnum.o
a.out: $(OBJECTS) $(BUILD_NUMBER_FILE)
$(CC) $(LDFLAGS) $(BUILD_NUMBER_LDFLAGS) -o $@ $(OBJECTS)
# Create an auto-incrementing build number.
BUILD_NUMBER_LDFLAGS = -Xlinker --defsym -Xlinker __BUILD_DATE=$$(date +'%Y%m%d')
BUILD_NUMBER_LDFLAGS += -Xlinker --defsym -Xlinker __BUILD_NUMBER=$$(cat $(BUILD_NUMBER_FILE))
# Build number file. Increment if any object file changes.
$(BUILD_NUMBER_FILE): $(OBJECTS)
@if ! test -f $(BUILD_NUMBER_FILE); then echo 0 > $(BUILD_NUMBER_FILE); fi
@echo $$(($$(cat $(BUILD_NUMBER_FILE)) + 1)) > $(BUILD_NUMBER_FILE)
這邊引進了一個變數 BUILD_NUMBER_FILE 用來當儲存媒介,儲存編譯次數,每次編譯時我們想辦法讓它遞增 1。這樣,就可以拿來產生不同的 target 出來。這個 BUILD_NUMBER_FILE,也就是 build-number.txt 一開始可以不必存在,機制設計上會自動把 '0' 寫進去,然後每次編譯自動遞增 1 寫進去,供讀進後設定成 __BUILD_NUMBER
不知道有沒有看到 BUILD_NUMBER_LDFLAGS 裡頭,把 __BUILD_NUMBER 傳給 Linker, 因此編譯器可以把它讓源碼看到,若有興趣的話也可以引用,底下是個範例:
#include
extern char __BUILD_DATE;
extern char __BUILD_NUMBER;
main()
{
printf("Build date : %u\n", (unsigned long) &__BUILD_DATE);
printf("Build number: %u\n", (unsigned long) &__BUILD_NUMBER);
}
要看執行結果嗎?原文裡面也有:
$ rm bnum.o; make
cc -c -o bnum.o bnum.c
cc -Xlinker --defsym -Xlinker __BUILD_DATE=$(date +'%Y%m%d') \
-Xlinker --defsym -Xlinker __BUILD_NUMBER=$(cat build-number.txt) -o a.out bnum.o
$ ./a.out
Build date : 20080708
Build number: 24
$ rm bnum.o; make
cc -c -o bnum.o bnum.c
cc -Xlinker --defsym -Xlinker __BUILD_DATE=$(date +'%Y%m%d') \
-Xlinker --defsym -Xlinker __BUILD_NUMBER=$(cat build-number.txt) -o a.out bnum.o
$ ./a.out
Build date : 20080708
Build number: 25
0 意見:
張貼留言