GNU Makefile -更改项目目录结构后修改Makefile,并输出到不同的文件夹



我正在为一个项目制作一个旧的Makefile。当前项目包含所有转储到一个名为src的项目中的文件。

我想重组项目,使其具有以下结构:

-src           (C files)
|- include   (header files)
- build        (intermediary build files - *.d, *.o)
- bin          (built binary [executable])
- lib          (built library)

这是一个Makefile的总结,以及我到目前为止所做的更改(创建了新的文件夹结构等)。

SOURCE_DIR = src
HEADER_DIR = $(SOURCE_DIR)/include
BUILD_DIR = build
LIB_DIR = lib
BIN_DIR = bin

OBJS = foo.o foobar.o foofoobar.o barbar.o barfoo.o barbarfoo.o 
all: dir release
dir:
test -d $(HEADER_DIR) || mkdir -p $(HEADER_DIR)
test -d $(BUILD_DIR) || mkdir $(BUILD_DIR)
test -d $(LIB_DIR) || mkdir $(LIB_DIR)
test -d $(BIN_DIR) || mkdir $(BIN_DIR)

debug : CC = gcc
debug : CFLAGS = -std=c99 -O0 -g
debug : LDLIBS = -lm
debug : project
release : CC = gcc
release : CFLAGS = -std=c99 -O3 -fno-strict-aliasing
release : LDLIBS = -lm
release : project
debug_cpp : CC = g++
debug_cpp : CFLAGS = -x c++ -std=c++11 -O0 -g
ifeq ($(PLATFORM),Darwin) # macOS
debug_cpp : WARNINGS += -Wcast-qual
endif
debug_cpp : LDLIBS = -lstdc++
debug_cpp : project
release_cpp : CC = g++
release_cpp : CFLAGS = -x c++ -std=c++11 -O3 -fno-strict-aliasing
ifeq ($(PLATFORM),Darwin) # macOS
release_cpp : WARNINGS += -Wcast-qual
endif
release_cpp : LDLIBS = -lstdc++
release_cpp : project
.c.o :
$(CC) -c  $(CFLAGS) $(WARNINGS) $<
project : main.o libproject.a
$(CC) -o $(BIN_DIR)/project main.o -L. -lproject $(LDLIBS)

libproject.a : $(OBJS)
rm -f $@   
ar cq $@ $(OBJS)   
clean : 
-rm -f main.o $(OBJS)
-rm -f $(BIN_DIR)/project $(BIN_DIR)/libproject.a

.PHONY : all project clean debug release debug_cpp release_cpp
# Dependencies generated using "gcc -MM *.c"
foo.o: file1.c afile.h bfile.h cfile.h dfile.h hfile.h 
gfile.h file2.c file3.c fil4.c file5.c 

如何修改Makefile

  1. 编译二进制可执行文件并放置在bin文件夹中(同时将中间文件转储在$(Build)文件夹
  2. 中)
  3. 构建二进制库并放置在lib文件夹(同时在$(Build)文件夹
  4. 中转储中间文件)

我只固定了release目标,所以你可以做剩下的。

.PRECIOUS和%/。'规则是自动创建目录的好方法。

.SECONDEXPANSION| $$(@D)/.位是依赖于创建目录的好方法。

您生成了依赖并手工包含了它们(我没有在我的回答中包含它们)。好。你必须记得在需要的时候更新它们。Make手册包含了一个关于如何完全自动处理这些依赖的建议。在我看来,这种自动的方法并不总是能正确地工作,所以必须手工操作。

给你

SOURCE_DIR = src
BUILD_DIR = build/
LIB_DIR = lib
BIN_DIR = bin
PROJECT := $(BIN_DIR)/project
LIB := $(LIB_DIR)/libproject.a
OBJS:= $(addprefix $(BUILD_DIR),foo.o foobar.o foofoobar.o barbar.o barfoo.o barbarfoo.o)
all: release
release : CC = gcc
release : CFLAGS = -std=c99 -O3 -fno-strict-aliasing
release : LDLIBS = -lm
release : $(PROJECT)
.PRECIOUS: %/.
%/.:
mkdir -p $(@:/.=)
.SECONDEXPANSION:
$(BUILD_DIR)%.o : $(SOURCE_DIR)/%.c Makefile | $$(@D)/.
$(CC) -c  $(CFLAGS) $(WARNINGS) $< -o $@
$(PROJECT) : $(BUILD_DIR)main.o $(LIB) Makefile | $$(@D)/.
$(CC) -o $@ $< -L$(LIB_DIR) -lproject $(LDLIBS)

$(LIB) : $(OBJS) Makefile | $$(@D)/.
rm -f $@   
ar cq $@ $(OBJS)   

.PHONY : all clean release

最新更新