いくつかのプログレッシブメイクファイル

春祭りは、自宅でいくつかの進歩的なメイクファイル、問題の一部を書いて。次の私は、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

おすすめ

転載: www.cnblogs.com/simoncook/p/12283120.html