lyjinger自留地之:我的Makefile
说明:自己平常学习linux c语言编程所编写的一个Makefile,放出来透透气。
分为两部分:
rule.Makefile是编译的公共规则,放置在自己的主目录下;
Makefile是编译选项,放置在需要编译的代码目录下。
个人觉得应该还是挺简单易懂的,如果有些地方不明白的话可以参考“读书笔记之:GNU make中文手册”。
如果有兴趣可以下载:
rule.Makefile:
http://pickup.mofile.com/7947921225125732
Makefile:
http://pickup.mofile.com/4964945184125783
################################################################################
# lyjinger的rule.Makefile说明:
# 作者:lyjinger email:lyjinger@gmail.com
#
# 1,默认加载./,./inc作为头文件目录
# 默认加载./,./lib作为库文件目录
#
# 2,默认交叉编译变量CROSS为空
# 默认使用gcc,g++,ar,ld,objcopy作为c编译器,c++编译器,打包器,链接器,反汇编器
#
# 3,默认编译当前目录下所有后缀为.c的文件并生成对应.o文件
# 默认生成可执行文件test
# 默认使用build.log作为编译日志记录文件
#
# 4,对$TARGET后缀为.so的执行编译(gcc -fPIC -shared)生成动态链接库
# 对$TARGET后缀为.a的执行打包(ar -rc)生成静态链接库
# 对其余的执行编译(gcc -o)生成可执行文件
#
# 5,默认删除动作将删除对象文件,目标文件,日志文件,临时文件
#
# 6,请将rule.Makefile拷贝至$HOME目录下,配合Makefile来使用
#
################################################################################
CUR_DIR := $(shell pwd)
INC += -I$(CUR_DIR) /
-I$(CUR_DIR)/inc
LIB += -L$(CUR_DIR) /
-L$(CUR_DIR)/lib
CC := $(CROSS)gcc
CXX := $(CROSS)g++
AR := $(CROSS)ar
LD := $(CROSS)ld
OBJCOPY := $(CROSS)objcopy
CFLAGS += $(INC)
CXXFLAGS+= $(INC)
LDFLAGS += $(LIB)
SRCS ?= $(wildcard *.c)
OBJS := $(addsuffix .o, $(basename $(SRCS)))
LOGFILE := build.log
TARGET ?= test
.PHONY:all
all:$(TARGET)
$(TARGET): $(OBJS)
ifeq ($(suffix $(TARGET)), .so)
$(CC) -fPIC -shared -o $@ $^ >>$(LOGFILE) 2>&1
else
ifeq ($(suffix $(TARGET)), .a)
$(AR) -rc $@ $^ >>$(LOGFILE) 2>&1
else
$(CC) -o $@ $^ $(LDFLAGS) >>$(LOGFILE) 2>&1
endif
endif
%.o:%.c
$(CC) -c $(CFLAGS) $< >>$(LOGFILE) 2>&1
.PHONY:clean
clean:
$(RM) $(OBJS) $(TARGET) $(LOGFILE) *.core *~ .*.swp
################################################################################
# lyjinger的makefile说明:
# 作者:lyjinger email:lyjinger@gmail.com
#
# 1,请先参考lyjinger的rule.Makefile说明
#
# 2,INC变量设置需要加载的头文件目录,格式:-I[inc-path1] -I[inc-path2] ...
# LIB变量设置需要加载的库文件目录,格式:-L[lib-path1] -L[lib-path2] ...
#
# 3,CFLAGS变量设置c编译选项
# CXXFLAGS变量设置c++编译选项
# LDFLAGS变量设置链接选项,需要加载的库在此处指出,格式:-l[lib1] -l[lib2] ...
#
# 4,SRCS变量设置需要编译的源文件,默认/注释掉的情况下编译当前目录所有.c文件
# TARGET变量设置make的目标文件,默认/注释掉的情况下生成test可执行文件
#
################################################################################
INC :=
LIB :=
CFLAGS := -g -Wall -pedantic
CXXFLAGS:=
LDFLAGS :=
#SRCS := $(wildcard *.c)
#TARGET := test
include $(HOME)/rule.Makefile
说明:自己平常学习linux c语言编程所编写的一个Makefile,放出来透透气。
分为两部分:
rule.Makefile是编译的公共规则,放置在自己的主目录下;
Makefile是编译选项,放置在需要编译的代码目录下。
个人觉得应该还是挺简单易懂的,如果有些地方不明白的话可以参考“读书笔记之:GNU make中文手册”。
如果有兴趣可以下载:
rule.Makefile:
http://pickup.mofile.com/7947921225125732
Makefile:
http://pickup.mofile.com/4964945184125783
################################################################################
# lyjinger的rule.Makefile说明:
# 作者:lyjinger email:lyjinger@gmail.com
#
# 1,默认加载./,./inc作为头文件目录
# 默认加载./,./lib作为库文件目录
#
# 2,默认交叉编译变量CROSS为空
# 默认使用gcc,g++,ar,ld,objcopy作为c编译器,c++编译器,打包器,链接器,反汇编器
#
# 3,默认编译当前目录下所有后缀为.c的文件并生成对应.o文件
# 默认生成可执行文件test
# 默认使用build.log作为编译日志记录文件
#
# 4,对$TARGET后缀为.so的执行编译(gcc -fPIC -shared)生成动态链接库
# 对$TARGET后缀为.a的执行打包(ar -rc)生成静态链接库
# 对其余的执行编译(gcc -o)生成可执行文件
#
# 5,默认删除动作将删除对象文件,目标文件,日志文件,临时文件
#
# 6,请将rule.Makefile拷贝至$HOME目录下,配合Makefile来使用
#
################################################################################
CUR_DIR := $(shell pwd)
INC += -I$(CUR_DIR) /
-I$(CUR_DIR)/inc
LIB += -L$(CUR_DIR) /
-L$(CUR_DIR)/lib
CC := $(CROSS)gcc
CXX := $(CROSS)g++
AR := $(CROSS)ar
LD := $(CROSS)ld
OBJCOPY := $(CROSS)objcopy
CFLAGS += $(INC)
CXXFLAGS+= $(INC)
LDFLAGS += $(LIB)
SRCS ?= $(wildcard *.c)
OBJS := $(addsuffix .o, $(basename $(SRCS)))
LOGFILE := build.log
TARGET ?= test
.PHONY:all
all:$(TARGET)
$(TARGET): $(OBJS)
ifeq ($(suffix $(TARGET)), .so)
$(CC) -fPIC -shared -o $@ $^ >>$(LOGFILE) 2>&1
else
ifeq ($(suffix $(TARGET)), .a)
$(AR) -rc $@ $^ >>$(LOGFILE) 2>&1
else
$(CC) -o $@ $^ $(LDFLAGS) >>$(LOGFILE) 2>&1
endif
endif
%.o:%.c
$(CC) -c $(CFLAGS) $< >>$(LOGFILE) 2>&1
.PHONY:clean
clean:
$(RM) $(OBJS) $(TARGET) $(LOGFILE) *.core *~ .*.swp
################################################################################
# lyjinger的makefile说明:
# 作者:lyjinger email:lyjinger@gmail.com
#
# 1,请先参考lyjinger的rule.Makefile说明
#
# 2,INC变量设置需要加载的头文件目录,格式:-I[inc-path1] -I[inc-path2] ...
# LIB变量设置需要加载的库文件目录,格式:-L[lib-path1] -L[lib-path2] ...
#
# 3,CFLAGS变量设置c编译选项
# CXXFLAGS变量设置c++编译选项
# LDFLAGS变量设置链接选项,需要加载的库在此处指出,格式:-l[lib1] -l[lib2] ...
#
# 4,SRCS变量设置需要编译的源文件,默认/注释掉的情况下编译当前目录所有.c文件
# TARGET变量设置make的目标文件,默认/注释掉的情况下生成test可执行文件
#
################################################################################
INC :=
LIB :=
CFLAGS := -g -Wall -pedantic
CXXFLAGS:=
LDFLAGS :=
#SRCS := $(wildcard *.c)
#TARGET := test
include $(HOME)/rule.Makefile