zoukankan      html  css  js  c++  java
  • 代码重构编译---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
    LDFLAGS         += $(shell for i in `cat $(PREFIX_CONF_PATH)/conf_path.conf`; do echo -Wl,-rpath,$$i/lib -L$$i/lib; done;)

    此时所有平台都用一样的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的胖子
  • 相关阅读:
    绍一集训Round#2
    CF 799B T-shirt buying
    Luogu P2827 蚯蚓
    Luogu P4053 [JSOI2007]建筑抢修
    【LGR-049】洛谷7月月赛
    浅谈可持久化数据结构
    CF 888E Maximum Subsequence
    在平衡树的海洋中畅游(三)——Splay
    浅谈单调栈/队列
    CF 859E Desk Disorder
  • 原文地址:https://www.cnblogs.com/codestack/p/14269024.html
Copyright © 2011-2022 走看看