春祭りは、自宅でいくつかの進歩的なメイクファイル、問題の一部を書いて。次の私は、GUNは読書の自由なハンドブックを作りたいです。そうでない場合は、お皿あまりにもこの点インチ
GUNは手動で作る
実行するために環境変数を設定できるようにする必要があるとか、デバッグBUILD_MODE
1つのソースファイル名の目標は、ハードコードされ、そして一度複数のターゲットをコンパイル
PROJECT_ROOT = $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
OBJS = lsdemo.o test.o
ifeq ($(BUILD_MODE),debug)
CFLAGS += -g
else ifeq ($(BUILD_MODE),run)
CFLAGS += -O2
else
$(error Build mode $(BUILD_MODE) not supported by this Makefile)
endif
all: lsdemo test
lsdemo: lsdemo.o
$(CXX) -o $@ $^
lsdemo.o: $(PROJECT_ROOT)/ch01/lsdemo.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
test: test.o
$(CXX) -o $@ $^
test.o: $(PROJECT_ROOT)/ch01/test.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
clean:
rm -fr lsdemo test $(OBJS)
図2に示すようにファイルCのすべての変数は、ソースファイルとしてCH01 /ディレクトリを横断OBJSオブジェクトファイルの複数によって定義されます
PROJECT_ROOT = $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
OBJS = lsdemo.o test.o
ifeq ($(BUILD_MODE),debug)
CFLAGS += -g
else ifeq ($(BUILD_MODE),run)
CFLAGS += -O2
else
$(error Build mode $(BUILD_MODE) not supported by this Makefile)
endif
all: lsdemo
lsdemo: $(OBJS)
$(CXX) -o $@ $^
%.o: $(PROJECT_ROOT)/ch01/%.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
#test: test.o
# $(CXX) -o $@ $^
#
#test.o: $(PROJECT_ROOT)/ch01/test.c
# $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
#
clean:
rm -fr lsdemo test $(OBJS)
3つのCH01 CH02複数のサブディレクトリの下の多目的コンパイラ
PROJECT_ROOT = $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
CH01OBJS = lsdemo.o test.o
CH02OBJS = test21.o test22.o
ifeq ($(BUILD_MODE),debug)
CFLAGS += -g
else ifeq ($(BUILD_MODE),run)
CFLAGS += -O2
else
$(error Build mode $(BUILD_MODE) not supported by this Makefile)
endif
all: lsdemo ch02
lsdemo: $(CH01OBJS)
$(CXX) -o $@ $^
%.o: $(PROJECT_ROOT)/ch01/%.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
ch02: $(CH02OBJS)
$(CXX) -o $@ $^
%.o: $(PROJECT_ROOT)/ch02/%.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
#test: test.o
# $(CXX) -o $@ $^
#
#test.o: $(PROJECT_ROOT)/ch01/test.c
# $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
#
clean:
rm -fr lsdemo test $(OBJS)
サブディレクトリAPP_NAMEがケースAPUE学習に適用可能な手順を書き込み、指定されたパスのコンパイル、CH_NOを変更することによって、最後に切り替えた4つのアプリケーション
CH_NO = ch01
APP_NAME = lsdemo
# 获取makefile路径
PROJECT_ROOT = $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
$(info MAKEFILE_LIST is: $(MAKEFILE_LIST))
$(info PROJECT_ROOT is: $(PROJECT_ROOT))
# 拼接路径
SOURCE_FRAGMENT :=$(CH_NO)/$(APP_NAME)
SOURCE_ROOT := $(PROJECT_ROOT)$(SOURCE_FRAGMENT)
$(info SOURCE_ROOT is: $(SOURCE_ROOT))
BUILD_ROOT := $(PROJECT_ROOT)build/make.debug.linux.x86_64/$(SOURCE_FRAGMENT)/
$(info BUILD_ROOT is: $(BUILD_ROOT))
ifeq ($(BUILD_MODE),debug)
CFLAGS += -g
else ifeq ($(BUILD_MODE),run)
CFLAGS += -O2
else
$(error Build mode $(BUILD_MODE) not supported by this Makefile)
endif
$(shell if [ ! -d $(BUILD_ROOT) ]; then mkdir -p $(BUILD_ROOT); fi;)
SOURCE := $(shell find $(SOURCE_ROOT) -name '*.c' |xargs -n1 basename)
OBJS := $(SOURCE:.c=.o)
$(info SOURCE is: $(SOURCE))
$(info OBJS is: $(OBJS))
all: $(APP_NAME)
#
$(APP_NAME): $(OBJS)
$(CXX) -o $(BUILD_ROOT)/$@ $(addprefix $(BUILD_ROOT), $^)
%.o: $(SOURCE_ROOT)/%.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $(BUILD_ROOT)/$@ $<
clean:
rm -fr $(BUILD_ROOT)
ディレクトリ構造の第4のケースを取り付けます
appweb@simon-ububtu18-desk-2:~/600.self/03.code/01.cpp/03.APUE$ tree
.
├── build
│ └── make.debug.linux.x86_64
│ └── ch01
│ └── lsdemo
│ ├── lsdemo
│ ├── lsdemo.o
│ └── test.o
├── ch01
│ └── lsdemo
│ ├── lsdemo.c
│ └── test.c
└── Makefile