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

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

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 : autoscanautoscan# cmd : mv configure.scan configure.acmv configure.scan configure.ac# cmd : aclocalaclocal# cmd : autoconfautoconf# cmd : touch Makefile.amtouch Makefile.am# cmd : touch src/Makefile.amtouch src/Makefile.am# cmd : automakeautomake --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)/includebin_PROGRAMS=\$(top_srcdir)/bin/test__top_srcdir__= Blogsdirtop_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/

    你可能感兴趣的文章
    Mysql 分页
    查看>>
    Mysql 分页语句 Limit原理
    查看>>
    MySql 创建函数 Error Code : 1418
    查看>>
    MySQL 创建新用户及授予权限的完整流程
    查看>>
    mysql 创建表,不能包含关键字values 以及 表id自增问题
    查看>>
    mysql 删除日志文件详解
    查看>>
    mysql 判断表字段是否存在,然后修改
    查看>>
    MySQL 到底能不能放到 Docker 里跑?
    查看>>
    mysql 前缀索引 命令_11 | Mysql怎么给字符串字段加索引?
    查看>>
    MySQL 加锁处理分析
    查看>>
    mysql 协议的退出命令包及解析
    查看>>
    mysql 参数 innodb_flush_log_at_trx_commit
    查看>>
    mysql 取表中分组之后最新一条数据 分组最新数据 分组取最新数据 分组数据 获取每个分类的最新数据
    查看>>
    MySQL 命令和内置函数
    查看>>
    MySQL 和 PostgreSQL,我到底选择哪个?
    查看>>
    mysql 四种存储引擎
    查看>>
    MySQL 在并发场景下的问题及解决思路
    查看>>
    MySQL 在控制台插入数据时,中文乱码问题的解决
    查看>>
    MySQL 基础架构
    查看>>
    MySQL 基础模块的面试题总结
    查看>>