前景:一套代码要在两个平台上使用,涉及到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
就失效
http代理服务器(3-4-7层代理)-网络事件库公共组件、内核kernel驱动 摄像头驱动 tcpip网络协议栈、netfilter、bridge 好像看过!!!!
但行好事 莫问前程
--身高体重180的胖子