代码重构编译---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就失效

posted @   codestacklinuxer  阅读(169)  评论(0编辑  收藏  举报
编辑推荐:
· 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代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示