makefile学习六
2011-09-23 23:45
204 查看
前面学习的makefile是基于递归的,如果要生成obj就进入到相应的源码目录进行编译,生成obj的过程就是不断进去源码目录调用make;其实还有一种思路就是非递归make。这个主要思想就是每个目录就是把需要编译的源文件加入到一个统一的源码列表里面,然后再进行统一编译。这样每个目录不需要能够进行单独编译,只需要将源码文件加入list即可,相对来说mk的过程就比较简单。下面是一个典型例子:
.PHONY all clean
.DEFAULT_GOAL all
TARGET_NAME = target
OBJ_DIR = ./obj
LIB_DIR = ./
LIB_LIST =
LIBS = $(addprex -l,$(LIB_LIST))
CROSS_COMPILER =
ROOT = ../../software
SIM = .
ADDED_PATH := $(ROOT)/include \
$(ROOT)/pub/include
MIPS_ENDEIAN ?= -EB
MIPS_FLAGS := $(MIPS_ENDEIAN) -m xx
dir := $(ROOT)/infra
include $(dir)/infra.mk
VPATH += C_SRCS ADDED_PATH
INCLUDES := $(addprex -I,$(VPATH))
CFLAGS := -O3 -Wall -Werror -ffreestanding -fno-builtin $(MIPS_FLAGS) $(INCLUDES)
AFLAGS := $(MIPS_FLAGS) $(INCLUDES)
AS = $(CROSS_COMPILER) as
...........
OBJS := $(addprex $(OBJ_DIR)/, $(notdir $(patsubst %.S,%.o,$(S_SRCS))) $(notdir $(patsubst %.c,%.o,$(C_SRCS))) )
ELF := $(TARGET_NAME)
DEPEND := $(TARGET_NAME).
$(OBJ_DIR)/%.o : %.c
$(CC) $(C_FLAGS) -c -o $@ $^
$(OBJ_DIR)/%.o : %.S
$(CC) $(A_FLAGS) -c -o $@ $^
CLEANABLE := $(OBJ_DIR)/*.o $(OBJ_DIR)/*.d
all : dep $(OBJS)
ifneq ($(basename $(S_SRCS)), )
dep :
$(CC) -MM -MQ $(MIPS_FLAGS ) $(INCLUDES) $(C_SRCS) > $(DEPEND)
$(CC) -MM -MQ $(MIPS_FLAGS ) $(INCLUDES) $(S_SRCS) >> $(DEPEND)
else
dep :
$(CC) -MM -MQ $(MIPS_FLAGS ) $(INCLUDES) $(C_SRCS) > $(DEPEND)
endif
clean : $(CLEANABLE)
dir.mk
###################
sp := $(sp).x
dirstack_$(sp) := $(d)
d := $(dir)
#################
dir := $(d)/arch
include $(dir)/arch.mk
.................
#################
d := $(dirstack_$(sp))
sp := $(basename $(sp))
#file mk
###################
sp := $(sp).x
dirstack_$(sp) := $(d)
d := $(dir)
#################
C_RSCS += $(d)/a.c \
$(d)/b.c \
#################
d := $(dirstack_$(sp))
sp := $(basename $(sp))
.PHONY all clean
.DEFAULT_GOAL all
TARGET_NAME = target
OBJ_DIR = ./obj
LIB_DIR = ./
LIB_LIST =
LIBS = $(addprex -l,$(LIB_LIST))
CROSS_COMPILER =
ROOT = ../../software
SIM = .
ADDED_PATH := $(ROOT)/include \
$(ROOT)/pub/include
MIPS_ENDEIAN ?= -EB
MIPS_FLAGS := $(MIPS_ENDEIAN) -m xx
dir := $(ROOT)/infra
include $(dir)/infra.mk
VPATH += C_SRCS ADDED_PATH
INCLUDES := $(addprex -I,$(VPATH))
CFLAGS := -O3 -Wall -Werror -ffreestanding -fno-builtin $(MIPS_FLAGS) $(INCLUDES)
AFLAGS := $(MIPS_FLAGS) $(INCLUDES)
AS = $(CROSS_COMPILER) as
...........
OBJS := $(addprex $(OBJ_DIR)/, $(notdir $(patsubst %.S,%.o,$(S_SRCS))) $(notdir $(patsubst %.c,%.o,$(C_SRCS))) )
ELF := $(TARGET_NAME)
DEPEND := $(TARGET_NAME).
$(OBJ_DIR)/%.o : %.c
$(CC) $(C_FLAGS) -c -o $@ $^
$(OBJ_DIR)/%.o : %.S
$(CC) $(A_FLAGS) -c -o $@ $^
CLEANABLE := $(OBJ_DIR)/*.o $(OBJ_DIR)/*.d
all : dep $(OBJS)
ifneq ($(basename $(S_SRCS)), )
dep :
$(CC) -MM -MQ $(MIPS_FLAGS ) $(INCLUDES) $(C_SRCS) > $(DEPEND)
$(CC) -MM -MQ $(MIPS_FLAGS ) $(INCLUDES) $(S_SRCS) >> $(DEPEND)
else
dep :
$(CC) -MM -MQ $(MIPS_FLAGS ) $(INCLUDES) $(C_SRCS) > $(DEPEND)
endif
clean : $(CLEANABLE)
dir.mk
###################
sp := $(sp).x
dirstack_$(sp) := $(d)
d := $(dir)
#################
dir := $(d)/arch
include $(dir)/arch.mk
.................
#################
d := $(dirstack_$(sp))
sp := $(basename $(sp))
#file mk
###################
sp := $(sp).x
dirstack_$(sp) := $(d)
d := $(dir)
#################
C_RSCS += $(d)/a.c \
$(d)/b.c \
#################
d := $(dirstack_$(sp))
sp := $(basename $(sp))
相关文章推荐
- 学习makefile的一个工程示例
- makefile学习笔记
- makefile学习
- 我的学习之旅(8) Makefile
- Makefile学习笔记---------自动化变量
- makefile学习之旅
- Makefile学习(一)变量
- Linux makefile学习
- makefile(摘自linux_c编程一站式学习)
- makefile的学习使用
- Makefile学习之清空目标文件的规则
- [Linux学习]一个简单的Makefile入门
- makefile 学习的点滴总结-(7)
- Makefile学习教程
- Makefile个人学习笔记一
- 深入学习Make命令和Makefile(下)(1)
- Makefile学习笔记
- Kconfig和Makefile文件的学习总结
- makefile学习(一)
- contiki Makefile.include 四个关注点<contiki学习之二>