0
点赞
收藏
分享

微信扫一扫

代码重构编译---make

minute_5 06-24 01:10 阅读 3

前景:一套代码要在两个平台上使用,涉及到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

用来在运行结果之前,先输出执行的那一行命令

代码重构编译---make_bash

 

 执行结果

代码重构编译---make_linux_02

 

 可以看到,执行​​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​​就失效

http代理服务器(3-4-7层代理)-网络事件库公共组件、内核kernel驱动 摄像头驱动 tcpip网络协议栈、netfilter、bridge 好像看过!!!! 但行好事 莫问前程 --身高体重180的胖子

举报

相关推荐

0 条评论