makefile学习六

前面学习的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))

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值