注:makefile中的目标不能和当前目录下的子目录重名,否则提示“make: 'test' is up to date.”
示例代码 http://pan.baidu.com/s/1dFNlNVz
单文件夹模板
源文件 main.c
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
printf("I am main function\r\n");
}
makefile
src := $(shell ls *.c)
objs := $(patsubst %.c,%.o,$(src))
target := main
$(target): $(objs)
gcc -o $@ $^
%.o: %.c
gcc -c -o $@ $<
clean:
rm -f $(target) $(objs)
多文件夹模板
源文件 main.c, test/test.c
//main.c
#include <stdio.h>
#include <stdlib.h>
#include "test/test.h"
void main(void)
{
printf("I am main function\r\n");
}
//test/test.h
void test(void);
//test/test.c
#include <stdio.h>
#include <stdlib.h>
#include "test.h"
void test(void)
{
printf("I am test function\r\n");
}
makefile
sub_dirs := test .
ls_tmp := $(foreach d,$(sub_dirs),$(d)/*.c)
src := $(shell ls $(ls_tmp))
objs := $(patsubst %.c,%.o,$(src))
target := main
$(target): $(objs)
gcc -o $@ $^
%.o: %.c
gcc -c -o $@ $<
clean:
rm -f $(target) $(objs)
高级模板
###############################################################################
#
## A smart Makefile template for GNU/LINUX programming
#
## Author: PRC (ijkxyz AT msn DOT com)
# Date: 2011/06/17
# #
# # Usage:
# # $ make Compile and link (or archive)
# # $ make clean Clean the objectives and target.
# ###############################################################################
CROSS_COMPILE =
OPTIMIZE := -O2
WARNINGS := -Wall -Wno-unused -Wno-format
DEFS :=
EXTRA_CFLAGS :=
INC_DIR =
SRC_DIR =
OBJ_DIR =
EXTRA_SRC =
EXCLUDE_FILES =
SUFFIX = c cpp cc cxx
TARGET :=
#TARGET_TYPE :=
TARGET_TYPE :=
#TARGET_TYPE :=
#####################################################################################
# Do not change any part of them unless you have understood this script very well #
# This is a kind remind. #
#####################################################################################
#FUNC# Add a new line to the input stream.
define add_newline
$1
endef
#FUNC# set the variable `src-x' according to the input $1
define set_src_x
src-$1 = $(filter-out $4,$(foreach d,$2,$(wildcard $d/*.$1)) $(filter %.$1,$3))
endef
#FUNC# set the variable `obj-x' according to the input $1
define set_obj_x
obj-$1 = $(patsubst %.$1,$3%.o,$(notdir $2))
endef
#VAR# Get the uniform representation of the object directory path name
ifneq ($(OBJ_DIR),)
prefix_objdir = $(shell echo $(OBJ_DIR)|sed 's:\(\./*\)*::')
prefix_objdir := $(filter-out /,$(prefix_objdir)/)
endif
GCC := $(CROSS_COMPILE)gcc
G++ := $(CROSS_COMPILE)g++
SRC_DIR := $(sort . $(SRC_DIR))
inc_dir = $(foreach d,$(sort $(INC_DIR) $(SRC_DIR)),-I$d)
#--# Do smart deduction automatically
$(eval $(foreach i,$(SUFFIX),$(call set_src_x,$i,$(SRC_DIR),$(EXTRA_SRC),$(EXCLUDE_FILES))))
$(eval $(foreach i,$(SUFFIX),$(call set_obj_x,$i,$(src-$i),$(prefix_objdir))))
$(eval $(foreach f,$(EXTRA_SRC),$(call add_newline,vpath $(notdir $f) $(dir $f))))
$(eval $(foreach d,$(SRC_DIR),$(foreach i,$(SUFFIX),$(call add_newline,vpath %.$i $d))))
all_objs = $(foreach i,$(SUFFIX),$(obj-$i))
all_srcs = $(foreach i,$(SUFFIX),$(src-$i))
CFLAGS = $(EXTRA_CFLAGS) $(WARNINGS) $(OPTIMIZE) $(DEFS)
TARGET_TYPE := $(strip $(TARGET_TYPE))
ifeq ($(filter $(TARGET_TYPE),so ar app),)
$(error Unexpected TARGET_TYPE `$(TARGET_TYPE)')
endif
ifeq ($(TARGET_TYPE),so)
CFLAGS += -fpic -shared
LDFLAGS += -shared
endif
PHONY = all .mkdir clean
all: .mkdir $(TARGET)
define cmd_o
$(obj-$1): $2%.o: %.$1 $(MAKEFILE_LIST)
$(GCC) $(inc_dir) -Wp,-MT,$@ -Wp,-MMD,$@.d $(CFLAGS) -c -o $@ $<
endef
$(eval $(foreach i,$(SUFFIX),$(call cmd_o,$i,$(prefix_objdir))))
ifeq ($(TARGET_TYPE),ar)
$(TARGET): AR := $(CROSS_COMPILE)ar
$(TARGET): $(all_objs)
rm -f $@
$(AR) rcvs $@ $(all_objs)
else
$(TARGET): LD = $(if $(strip $(src-cpp) $(src-cc) $(src-cxx)),$(G++),$(GCC))
$(TARGET): $(all_objs)
$(LD) $(LDFLAGS) $(all_objs) -o $@
endif
.mkdir:
@if [ ! -d $(OBJ_DIR) ]; then mkdir -p $(OBJ_DIR); fi
clean:
rm -f $(prefix_objdir)*.o $(TARGET)
-include $(patsubst %.o,%.o.d,$(all_objs))
.PHONY: $(PHONY)