【发布时间】:2014-01-23 02:05:40
【问题描述】:
我有以下文件夹结构:
TOPDIR
|
├── a
│ ├── a.c
│ ├── a.h
│ └── a.mk
├── b
│ ├── b.c
│ ├── b.h
│ └── b.mk
├── c
│ ├── c.c
│ ├── c.h
│ └── c.mk
├── include
│ └── common.h
├── root
│ ├── main.c
│ └── root.mk
└── Makefile
每个条件
我的目标是在TOPDIR 下编写主Makefile 和子makefile,*.mk 在子文件夹中,include 文件夹包含一些常用定义。 root 文件夹包含我的主文件(main 函数位于此处)。同时在main.c中会调用a.c和b.c的函数,c.c是驱动相关的,会从a.c和b.c调用
问题
我写了sub-makefile like(我用了一个a.mk,其他的都一样,只有root.mk有点不同):
#MODULE will be modified for each sub folder
MODULE = a
LIB = $(MAKE_DIR)/libs/lib$(MODULE).a
SRCS = $(wildcard *.c)
OBJS = $(patsubst %.c, %.o, $(SRCS))
#generate lib file from obj file
$(LIB): $(OBJS)
@mkdir -p ../libs
@$(AR) cr $@ $^
@echo " Archive $(notdir $@)"
#compile obj file from source file
$(OBJS): $(SRCS)
@$(CC) $(CFLAGS) -c $^
@echo " CC $(OBJS)"
.PHONY: clean
clean:
@$(RM) -f $(LIB) $(OBJS)
@$(RM) -f *.expand
@echo " Remove Objects: $(OBJS)"
@echo " Remove Libraries: $(notdir $(LIB))"
我写了root.mk 喜欢:
PROG = ../prog/DEMO
SRCS = $(wildcard *.c)
OBJS = $(patsubst %.c, %.o, $(SRCS))
#generate finial target file for run
$(PROG): $(SRCS)
@mkdir -p ../prog
@$(CC) $^ $(CFLAGS) -Wl,-Map=$(PROG).map $(LIBS) -o $@
@echo " Generate Program $(notdir $(PROG)) from $^"
.PHONY: clean
clean:
@$(RM) -f $(OBJS) $(PROG)
@$(RM) -f *.expand
@$(RM) -rf ../prog ../libs
@echo " Remove Objects: $(OBJS)"
@echo " Remove Libraries: $(notdir $(PROG))"
我写了 main Makefile 喜欢:
MAKE_DIR = $(PWD)
ROOT_DIR := $(MAKE_DIR)/root
DRV_DIR := $(MAKE_DIR)/driver
INCLUDE_DIR := $(MAKE_DIR)/include
DEBUG_DIR := $(MAKE_DIR)/debug
INC_SRCH_PATH :=
INC_SRCH_PATH += -I$(ROOT_DIR)
INC_SRCH_PATH += -I$(DRV_DIR)
INC_SRCH_PATH += -I$(INCLUDE_DIR)
INC_SRCH_PATH += -I$(DEBUG_DIR)
LIB_SRCH_PATH :=
LIB_SRCH_PATH += -L$(MAKE_DIR)/libs
CC = gcc
LD = ld
#problem happan here, if I change the sequence of LIB,
#during the finial link, it will find some function un-referenced,
#why can I put liba first?
LIBS := -lc -lb -la
CFLAGS :=
CFLAGS += $(INC_SRCH_PATH) $(LIB_SRCH_PATH)
CFLAGS += -Wall -O -ggdb
CFLAGS += -DDEBUG -D_REENTRANT
LDFLAGS :=
export MAKE_DIR CC LD CFLAGS LDFLAGS LIBS LINT INC_SRCH_PATH
all:
@$(MAKE) -C a -f a.mk
@$(MAKE) -C b -f b.mk
@$(MAKE) -C c -f c.mk
@$(MAKE) -C root -f root.mk
.PHONY: clean
clean:
@$(MAKE) -C debug -f debug.mk clean
@$(MAKE) -C driver -f driver.mk clean
@$(MAKE) -C mw -f mw.mk clean
@$(MAKE) -C root -f root.mk clean
问题
在主
Makefile中,我定义了我将使用哪个LIB文件,如果需要将其移至root.mk更好?在 sub-makefile 中,我没有使用
-MM生成依赖文件,如果这导致了问题,我无法更改我的lib*的顺序,我也在Makefilecmets 中进行了描述。好像我的makefile系统无法检测到我更新了一些头文件,例如,我先编译了整个代码,然后,我修改了一个头文件,当我尝试重新编译时,没有编译任何源文件
如果:
#Automatic dependency magic:
%.d: src/%.c
$(CC) -MM -o$@ $<
-include (MYPROG_OBJECTS:%.o=%.d)
需要添加到每个子makefile中吗?
【问题讨论】:
-
对于 Makefile 新手来说总是值得一读的。 Recursive make considered harmful