博客
关于我
【notes】自动生成工程Makefile文件及部署脚本
阅读量:791 次
发布时间:2019-03-24

本文共 7332 字,大约阅读时间需要 24 分钟。

0. 环境、内容、汇总、自动部署脚本

1. 编译环境

在编译和运行环境的设置上,本文使用以下工具和版本:

  • 编译环境ubuntu-1804(x86_64)
  • 运行环境qca-IPQ6018,支持armarm64,基于openwrt系统

2. 文章内容

本文将逐步解释以下内容:

  • 编写本地程序:"

  • 指定toolchain,交叉编译

  • 多级文件如何定义、生成Makefile相关文件

  • 3. 汇总步骤

    1. 步骤汇总

  • autoscanf:用于生成configure.scan文件
  • 修改配置文件:将scan文件改名为configure.ac,并对相关内容进行修改
  • aclocal:用于生成aclocal.m4文件
  • autoconf:根据上述M4文件生成configure脚本
  • 新增Makefile.am文件:定义生成Makefile的规则
  • 生成Makefile.in文件:使用automake --add-missing命令
  • 编译、执行:运行./configure并编译项目
  • 2. 命令汇总

    以下是完整的命令列表:

    # cmd : autoscan
    autoscan
    # cmd : mv configure.scan configure.ac
    mv configure.scan configure.ac
    # cmd : aclocal
    aclocal
    # cmd : autoconf
    autoconf
    # cmd : touch Makefile.am
    touch Makefile.am
    # cmd : touch src/Makefile.am
    touch src/Makefile.am
    # cmd : automake
    automake --add-missing
    # cmd : ./configure
    ./configure

    在交叉编译过程中,需要指定以下参数:

    # 交叉编译示例
    ./configure --host=arm-openwrt-linux --prefix=/[路径]/toolchain-qca/toolchain-arm_cortex-a7_gcc-5.2.0_musl-1.1.16_eabi

    4. 多级文件生成Makefile

    工程文件结构

    .
    ├── bin/
    ├── include/
    │ └── common.h
    └── src/
    ├── func.c
    └── main.c

    步骤汇总

  • 修改配置文件:更新configure.ac中的AC_CONFIG_SRCDIRAC_OUTPUT命令
  • 在子目录中定义Makefile.am文件:分别为bin/src/目录下创建Makefile.am
  • 编译并生成文件:使用automake工具进行编译
  • 5. 自动部署脚本

    操作步骤

  • 将以下脚本内容复制到编译环境并赋予执行权限
  • 指定一个文件夹名并执行脚本
  • 脚本源码

    #!/bin/sh
    # Liam
    # 20210524
    # GPL Version 3
    # 1. 检查环境和命令
    # 2. 创建项目并初始化源代码
    # 3. 执行autoscan并修改配置文件
    # 4. 执行aclocal、autoconf
    # 5. 创建Makefile.am文件并生成Makefile.in
    # 6. 编译和运行
    function func_0_check_project_name {
    if [[ -z "$1" ]]; then
    echo "Error: need [project name]"
    exit 1
    fi
    }
    function func_1_check_env {
    CMD_AUTOSCAN=$(which autoscan)
    CMD_ACLOCAL=$(which aclocal)
    CMD_AUTOCONF=$(which autoconf)
    CMD_AUTOMAKE=$(which automake)
    if [[ -z "$CMD_AUTOSCAN" ]] || [[ -z "$CMD_ACLOCAL" ]] || [[ -z "$CMD_AUTOCONF" ]] || [[ -z "$CMD_AUTOMAKE" ]]; then
    echo "> env check : fail"
    echo "Tips: try 'sudo apt install automake'"
    exit 1
    else
    echo "> env check : OK"
    fi
    }
    function func_2_new_pjt_init_code {
    if [[ -d "$1" ]] || [[ -f "$1" ]]; then
    echo "> init : fail"
    echo "Tips: change [project name] or try 'rm -r $1' first"
    exit 1
    fi
    touch "$1"
    mkdir -p "$1/bin" "$1/include" "$1/src"
    touch "$1/include/common.h"
    touch "$1/src/main.c"
    touch "$1/src/func.c"
    echo "#ifndef __COMMON_H__
    #define __COMMON_H__
    #define __SOFT_VERSION__ \"1.0.0\"
    void show_version(void);
    #endif" > "$1/include/common.h"
    echo "#include
    #include \"common.h\"
    int main() {
    show_version();
    return 0;
    }
    " > "$1/src/main.c"
    echo "#include
    void show_version(void) {
    printf(\"ver:%s\\n\", __SOFT_VERSION__);
    }
    " > "$1/src/func.c"
    if [[ -f "$1/include/common.h" ]] || [[ -f "$1/src/main.c" ]] || [[ -f "$1/src/func.c" ]]; then
    echo "> init : OK"
    else
    echo "> init : fail"
    exit 1
    fi
    }
    function func_3_autosacn_M_ac {
    autoscan "$1" || exit 1
    if [[ ! -f "$1/configure.scan" ]]; then
    echo "> autoscan : fail"
    exit 1
    fi
    mv "$1/configure.scan" "$1/configure.ac"
    sed -i "s#FULL-PACKAGE-NAME#$1#g" "$1/configure.ac"
    sed -i "s#VERSION#1.0#g" "$1/configure.ac"
    sed -i "s#BUG-REPORT-ADDRESS#liam@liam.com#g" "$1/configure.ac"
    sed -i "s/AC_CONFIG_HEADERS/#AC_CONFIG_HEADERS(g)/g" "$1/configure.ac"
    sed -i "s#(\\[config.h\\])#(\\[config.h\\])\\nAM_INIT_AUTOMAKE#g" "$1/configure.ac"
    sed -i "s#AC_OUTPUT#AC_OUTPUT(Makefile src/Makefile)#g" "$1/configure.ac"
    echo "> autoscan : done"
    }
    function func_4_aclocal {
    cd "$1"
    if [[ ! -f "configure.ac" ]]; then
    echo "> aclocal : fail"
    echo "Tips: no configure.ac"
    exit 1
    fi
    aclocal
    if [[ ! -f "aclocal.m4" ]]; then
    echo "> aclocal : fail"
    exit 1
    else
    echo "> aclocal : OK"
    fi
    cd "`pwd`" > /dev/null
    }
    function func_4_autoconf {
    cd "$1"
    if [[ ! -f "aclocal.m4" ]]; then
    echo "> aclocal.m4 : fail"
    echo "Tips: no aclocal.m4"
    exit 1
    fi
    autoconf
    if [[ ! -f "configure" ]]; then
    echo "> autoconf : fail"
    exit 1
    else
    echo "> autoconf : OK"
    fi
    cd "`pwd`" > /dev/null
    }
    function func_5_automake {
    cd "$1"
    echo "AUTOMAKE_OPTIONS=foreignSUBDIRS=src" > Makefile.am
    echo "AM_CPPFLAGS=-I\$(top_srcdir)/include
    bin_PROGRAMS=\$(top_srcdir)/bin/test
    __top_srcdir__= Blogsdir
    top_srcdir= Blogsdir" > src/Makefile.am
    if [[ ! -f "configure" ]] || [[ ! -f "configure.ac" ]]; then
    echo "> automake : fail"
    echo "Tips: no configure / configure.ac"
    exit 1
    fi
    if [[ ! -f "Makefile.am" ]] || [[ ! -f "src/Makefile.am" ]]; then
    echo "> automake : fail"
    echo "Tips: no ./*/Makefile.am"
    exit 1
    fi
    automake --add-missing
    if [[ ! -f "Makefile.in" ]] || [[ ! -f "src/Makefile.in" ]]; then
    echo "> automake : fail"
    exit 1
    else
    echo "> automake : OK"
    fi
    cd "`pwd`" > /dev/null
    }
    function func_6_configure {
    cd "$1"
    if [[ ! -f "configure" ]] || [[ ! -f "configure.ac" ]]; then
    echo "> automake : fail"
    echo "Tips: no configure / configure.ac"
    exit 1
    fi
    ./configure --host=arm-openwrt-linux --prefix=/[路径]/toolchain-qca/toolchain-arm_cortex-a7_gcc-5.2.0_musl-1.1.16_eabi
    if [[ ! -f "Makefile" ]]; then
    echo "> configure : fail"
    exit 1
    else
    echo "> configure : OK"
    fi
    cd "`pwd`" > /dev/null
    }
    function func_0_make_run {
    cd "$1"
    if [[ ! -f "Makefile" ]] || [[ ! -f "src/Makefile" ]]; then
    echo "> test : fail"
    echo "Tips: no Makefile / src/Makefile"
    exit 1
    fi
    if [[ ! -f "include/common.h" ]] || [[ ! -f "src/main.c" ]] || [[ ! -f "src/func.c" ]]; then
    echo "> test : fail"
    echo "Tips: no source code"
    exit 1
    fi
    make
    if [[ ! -f "bin/test" ]]; then
    echo "> test : fail"
    echo "Tips: no bin/test"
    exit 1
    fi
    ./bin/test
    cd "`pwd`" > /dev/null
    echo "> test : done"
    }
    case $1 in
    --env)
    func_1_check_env
    ;;
    --init)
    func_0_check_project_name $2 || exit 1
    func_2_new_pjt_init_code $2
    ;;
    --autoscan)
    func_0_check_project_name $2 || exit 1
    func_3_autosacn_M_ac $2
    ;;
    --aclocal)
    func_0_check_project_name $2 || exit 1
    func_4_aclocal $2
    ;;
    --autoconf)
    func_0_check_project_name $2 || exit 1
    func_4_autoconf $2
    ;;
    --automake)
    func_0_check_project_name $2 || exit 1
    func_5_automake $2
    ;;
    --configure)
    func_0_check_project_name $2 || exit 1
    func_6_configure $2
    ;;
    --test)
    func_0_check_project_name $2 || exit 1
    func_0_make_run $2
    ;;
    --new)
    func_1_check_env || exit 1
    func_0_check_project_name $2 || exit 1
    func_2_new_pjt_init_code $2 || exit 1
    func_3_autosacn_M_ac $2 || exit 1
    func_4_aclocal $2 || exit 1
    func_4_autoconf $2 || exit 1
    func_5_automake $2 || exit 1
    func_6_configure $2 || exit 1
    echo "DE done, new project named : $2"
    ;;
    --help)
    echo "usage : ./script.sh --new [project name]"
    ;;
    *)
    echo "usage : ./script.sh --new [project name]"
    ;;
    esac

    转载地址:http://luuuk.baihongyu.com/

    你可能感兴趣的文章
    Nginx + Spring Boot 实现负载均衡
    查看>>
    Nginx + uWSGI + Flask + Vhost
    查看>>
    Nginx - Header详解
    查看>>
    Nginx Location配置总结
    查看>>
    Nginx Lua install
    查看>>
    Nginx upstream性能优化
    查看>>
    Nginx 中解决跨域问题
    查看>>
    Nginx 动静分离与负载均衡的实现
    查看>>
    Nginx 反向代理 MinIO 及 ruoyi-vue-pro 配置 MinIO 详解
    查看>>
    nginx 反向代理 转发请求时,有时好有时没反应,产生原因及解决
    查看>>
    Nginx 反向代理解决跨域问题
    查看>>
    Nginx 反向代理配置去除前缀
    查看>>
    nginx 后端获取真实ip
    查看>>
    Nginx 学习总结(16)—— 动静分离、压缩、缓存、黑白名单、性能等内容温习
    查看>>
    Nginx 学习总结(17)—— 8 个免费开源 Nginx 管理系统,轻松管理 Nginx 站点配置
    查看>>
    Nginx 常用配置清单
    查看>>
    nginx 常用配置记录
    查看>>
    Nginx 我们必须知道的那些事
    查看>>
    Nginx 的 proxy_pass 使用简介
    查看>>
    Nginx 的配置文件中的 keepalive 介绍
    查看>>