Last updated on December 23, 2013
ปกติผมคุ้นเคยกับ autotools อย่าง make อยู่แล้วเพราะใช้ลินุกซ์มาถ้าไม่เคย build โปรแกรมลงเองซักครั้งมันเหมือนยังเข้าไม่ถึงแก่นความยากของลินุกซ์ที่ user ทั่วไปบ่นกัน แต่ก็ไม่เคยได้ลองทำโปรเจกต์ที่เขียนด้วย C จนต้องใช้ autotools แต่ครั้งนี้ด้วยความขี้เกียจที่ต้อง compile ด้วย command line หลายไฟล์และขี้เกียจพิมพ์ parameters ยาวยืดตอน compile เลยได้เขียน makefile จนได้
ครั้งแรกที่เขียนอารมณ์เหมือน config ที่เป็น YML เลยครับแต่ตัว interpreter ของ makefile มันแย่กว่านั้นเยอะเพราะมันรองรับแค่ tab ถ้าใช้ editor ทั่วไปที่ไม่โชว์ symbol tab, space จะลำบากมาก ผมก็เขียนง่ายๆ ของผมตามนี้ครับ
CC = gcc CFLAGS = -Wall -g BIN_DIR = bin OUT_DIR = output ex1: $(CC) $(CFLAGS) -o $@ ex1.c bmp.c mv $@ $(BIN_DIR) ex2: $(CC) $(CFLAGS) -o $@ ex2.c bmp.c mv $@ $(BIN_DIR) ex3: $(CC) $(CFLAGS) -o $@ ex3.c bmp.c mv $@ $(BIN_DIR) ex4: $(CC) $(CFLAGS) -o $@ ex4.c bmp.c mv $@ $(BIN_DIR) ex5: $(CC) $(CFLAGS) -o $@ ex5.c bmp.c -lm mv $@ $(BIN_DIR) all: ex1 ex2 ex3 ex4 ex5 clean: rm ./$(BIN_DIR)/ex* rm ./$(OUT_DIR)/ex* rm *.o
บรรทัดที่ 1-4 คือตัวแปร ส่วน ex1-ex4, all, clean คือ target ข้างในเราก็เรียนไว้ว่าจะให้ทำอะไรบ้าง เวลาจะ compile ก็ใช้คำสั่ง make TAGET_NAME ได้เลย ส่วน $@ เป็นคำสั่งพิเศษของ makefile คือมันจะเอาชื่อ target มาแทนเวลาทำงาน