代码重构编译---make
前景:一套代码要在两个平台上使用,涉及到x86以及ARM编译,其使用的代码绝大部分相同,只是小部分不一样!
目前状态:目前一份一样的代码在svn 上分了两份存储,一份给x86编译使用另一份给ARM编译使用,每份代码上的编译器已经写死!!!
竟然弄了两份svn 目录一份x86一份arm;作为一个见不得-------算了不说了,吐血啊!!!!没办法 有洁癖的人 来搞一搞吧
目标:x86和arm平台的代码合并, 编译脚本合并;
思考:目前既然代码绝大部分都一样,只是编译的时候编译器不一样而已,那么每个进程的编译脚本Makefile应该怎样写??
所以可以这样处理,设置一个变量根据实际情况赋值为gcc或者arm-linux-gcc
AS = $(CROSS_COMPILE)as LD = $(CROSS_COMPILE)ld CC = $(CROSS_COMPILE)gcc CPP = $(CROSS_COMPILE)g++ AR = $(CROSS_COMPILE)ar RANLIB = $(CROSS_COMPILE)ranlib NM = $(CROSS_COMPILE)nm STRIP = $(CROSS_COMPILE)strip SSTRIP = $(CROSS_COMPILE)sstrip OBJCOPY = $(CROSS_COMPILE)objcopy OBJDUMP = $(CROSS_COMPILE)objdump
ifneq ($(arch), X86_INTEL) CFLAGS += -g -pipe -Werror endif ifeq ($(arch), X86_AMD) CFLAGS += -g -pipe -DX86 endif ifeq ($(arch), ARM-FT) CFLAGS += -g -pipe -DARM_FT -g -O0 endif
LDFLAGS = -Wl,-rpath,$(PREFIX_LIB) -L$(PREFIX_LIB) ifeq ($(arch), X86_INTEL) LDFLAGS += -Wl,-rpath,/lib/x86_64-linux-gnu/ -L/lib/x86_64-linux-gnu/ LDFLAGS += -Wl,-rpath,/usr/lib/x86_64-linux-gnu/ -L/usr/lib/x86_64-linux-gnu/ endif
此时所有平台都用一样的Makefile 经行编译,只是根据不同平台设置不同的CROSS_COMPILE最后实现gcc或者arm-linux-gcc或者mips-linux-gcc对源代码经行编译
那么make的规则怎么写呢??要编译很多进程,每个进程写一个Makefile,一个Makefile内容那么多,那也太累了吧?
每个Makefile都有很多共同点能不能提出来组成一个公共的东西呢??
所以肯定会有一个Rules.make文件----------此文件怎么写??
Rules.make
%.s: %.c $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -S $< -o $@ %.i: %.c $(CPP) $(CFLAGS) $(EXTRA_CFLAGS) $< > $@ %.o: %.c $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -c -o $@ $<
其Makefile为:
BIN_TARGET = dpdkd OPT_CFLAGS += ....... OPT_LDFLAGS += ........ ###################################### C__SOURCES := $(wildcard *.c) obj-y += $(C__SOURCES:%.c=%.o) include $(PATHDIR)/Rules.make
问题二:目前shell 以及Makefile 编译的过程中发现报错了但是没有立刻终止?
在shell中加入set -e set+e shell 运行出错时就回立刻终止
Makefile中:目前可以使用cmd || exit "$$?" 执行cmd 后检测返回值
在shell 中set 一般都是用来 修改shell的环境运行参数的
比如:
set -u
执行脚本的时候,如果遇到不存在的变量,Bash 默认忽略它
set -x
用来在运行结果之前,先输出执行的那一行命令
执行结果
可以看到,执行echo 命令
之前,该命令会先打印出来,行首以+
表示。这对于调试复杂的脚本是很有用的
shell脚本里面有运行失败的命令(返回值非0),Bash 默认会继续执行后面的命令;
实际执行中,如果某个命令失败,往往需要脚本停止执行,防止错误累积。这时,一般采用下面的写法。
command || exit 1
# 写法一 command || { echo "command failed"; exit 1; } # 写法二 if ! command; then echo "command failed"; exit 1; fi # 写法三 command if [ "$?" -ne 0 ]; then echo "command failed"; exit 1; fi
但是这样写比较麻烦;所以一般都使用set -e
set -e
有一个例外情况,就是不适用于管道命令
管道命令,就是多个子命令通过管道运算符(|
)组合成为一个大的命令。
Bash 会把最后一个子命令的返回值,作为整个命令的返回值。
也就是说,只要最后一个子命令不失败,管道命令总是会执行成功,因此它后面命令依然会执行,set -e
就失效
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南