目录

  • 0. 序言
  • 1. 项目描述
  • 2. 项目构建
    • 2.1 编译规则
    • 2.2 构建过程
  • 3. 覆盖率分析


0. 序言

在开始正文之前,请允许我先说明一下本文的目的和写作的动机,好让读者不惑。

我们知道,在Linux环境中,很多软件的组织都遵循GNU软件标准。不论是自己开发GNU软件还是阅读别人写好的源程序,能了解、熟悉GNU项目的构建方式,对我们的工作会起到事半功倍的效果。本文的目的,就是从零开始,告诉大家怎么构建一个GNU项目,如何阅读GNU源程序。

文章会涉及到的工具有:

  • automake
  • autoconf
  • aclocal
  • gcc、gfotran
  • makefile
  • libtool
  • gcov、 gcovr

在阅读本文之前,上述工具需要安装部署完成,同时期望读者对一下的知识和技能有一定的了解和掌握:

  1. C、C++、Fortran语言
  2. 基本的编译、链接过程和原理
  3. Makefile基本知识
  4. Linux-shell基本命令

不要被前面的要求吓到,笔者也是从对上面知识一无所知,经过两三周时间摸索,写出了这篇文章的。文章内容涉及到的知识不够深刻,但是基本上可以帮助像半个月前的笔者一样茫然的入门者。文章中不严谨的表述或者表述、理解方面的错误,欢迎大家留言指正。

另外,本文只是告诉大家如何快速的完成一个GNU项目。其中涉及到的autotools工具和相关语言的细节,请大家阅读文章后面的链接文章。

好了,我们开始正文!


1. 项目描述

这一章节,主要说明我们的目的:

我们最终要完成一个deep风格的项目组织。项目使用c和Fortran混合编程,利用GNU-autotools来完成项目构建,利用gcov完成项目覆盖率分析。最后形成通过覆盖率分析优化后的项目发布包。该发布包能够直接发布在网络,供其他用户下载、安装并使用。

项目最终的目录如下:

➜  csdemo tree
.
├── AUTHORS
├── auto.sh
├── ChangeLog
├── data
│   └── thch
│       └── JANAF
├── doc
│   └── README
├── examples
├── makeconfig
│   └── make.global
├── NEWS
├── preprocessor
├── README
├── src
│   ├── alge
│   │   ├── alge.c
│   │   └── alge.h
│   ├── apps
│   │   └──csrun.c
│   ├── base
│   │   ├── addfld.f90
│   │   └── paramx.f90
│   ├── bft
│   │   ├── bft.c
│   │   └──bft.h
│   ├── cdo
│   │   ├── cdo.c
│   │   └──cdo.h
│   ├── cogz
│   │   └── matmul.f90
│   ├── comb
│   │   ├── comb.c
│   │   └──comb.h
│   └── lib
└── test

读者可以在这里下载源码。

下面我们就通过几个章节的内容,详细的说明如何从零开始生成这个项目。


2. 项目构建

我们将这个项目放置在csdemo路径下面:

这里:data路径下面存放项目的数据文件,doc为项目的说明文档,examples存放用户案例,test存放测试用例,preprocessor存放前处理相关程序,src存放主体程序代码。在src下面alge是c语言文件,apps是用户可执行程序,其他子文件夹分别完成一些特定的功能。

将下载到的源码分别复制进对应的路径得到如上文的项目组织。下一步我们就要开始进行项目构建。

项目的构建一般可以通过一下几步来完成:

  1. 在每个需要编译的子路径下面编写编译规则Makefile.am文件。
  2. 在根目录(项目根目录)下执行autoscan命令,形成configure.scan文件
  3. configure.scan文件命名为configure.ac
  4. 按照规则修改configure.ac文件
  5. 执行aclocal文件,形成m4宏命令(有时需要手动编写m4宏)
  6. 执行autoheader命令生成头文件
  7. 执行autoconf形成config文件
  8. 执行libtoolize --automake声明automake宏(这一步按情况选择执行)
  9. 执行automake -a命令,生成makefile.in文件
  10. 执行./configure命令,生成makefile文件

至此,一个典型的GNU项目构建完成。至于每一步怎么操作,后文会详细给出。

在完成上面操作之后,我们就可以发布自己的软件,用户通过:

./configure

make

make install

轻松完成软件的安装和配置。后面的三个命令是不是很熟悉。

2.1 编译规则

坚持往下走。我们先来完成第一步,源码的编译。这一步您需要对gcc编译和链接有一定的了解,同时如果您知道目标文件、静态库、动态库就更好了,他能帮助我们更好的完成本节的内容。

我们平时对于单个或者少量的源文件直接用gcc编译链接,中等大小的项目我们可以手写Makefile,但是对于多文件,手写Makefile仍然很繁琐,这个时候我们就可以使用autotools套件中的automake来自动生成makefile文件。

  1. 我们在根目录下建立文件Makefile.am,编写如下内容:
## ./Makefile.am   ## 双#表示注释
SUBDIRS          = src      ## 递归子文件夹
## 需要打包发布的文件夹和文件
EXTRA_DIST       = doc data examples preprocessor test
  1. 进入到src下面,建立Makefile.am,编写如下内容:
##./src/Makefile.am
SUBDIRS          = alge base bft cdo comb cogz apps
EXTRA_DIST       = lib
  1. 进入到src/alge下面,建立Makefile.am,编写如下内容:
##./src/alge/Makefile.am
noinst_LIBRARIES   = libalge.a   ## 生成静态库,前缀noinst表示不安装。
libalge_a_SOURCES = alge.cAM_CPPFLAGS      = -I$(top_srcdir)/src/alge  ## AM_CPPFLAGS给出头文件路径
  1. 进入到src/apps下面,建立Makefile.am,编写如下内容:
##./src/apps/Makefile.am
bin_PROGRAMS  = csrun
csrun_SOURCES = csrun.c## 头文件
csrun_CPPFLAGS    =      \
-I$(top_srcdir)/src/alge \
-I$(top_srcdir)/src/bft  \
-I$(top_srcdir)/src/cdo  \
-I$(top_srcdir)/src/comb ## 依赖静态库
csrun_LDADD      = \
$(top_srcdir)/src/alge/libalge.a \
$(top_srcdir)/src/bft/libbft.a   \
$(top_srcdir)/src/cdo/libcdo.a   \
$(top_srcdir)/src/comb/libcomb.a \
$(top_srcdir)/src/base/libbase.a \
$(top_srcdir)/src/cogz/libcogz.a AM_CFLAGS = -lgfortran
  1. 进入到src/base下面,建立Makefile.am,编写如下内容:
##./src/base/Makefile.am
noinst_LIBRARIES = libbase.a
libbase_a_SOURCES = addfld.f90AM_FCFLAGS      = -I$(top_srcdir)/src/base
  1. 进入到src/bft下面,建立Makefile.am,编写如下内容:
##./src/bft/Makefile.am
noinst_LIBRARIES   = libbft.a
libbft_a_SOURCES = bft.cAM_CPPFLAGS      = -I$(top_srcdir)/src/bft
  1. 进入到src/cdo下面,建立Makefile.am,编写如下内容:
##./src/cdo/Makefile.am
noinst_LIBRARIES   = libcdo.a
libcdo_a_SOURCES = cdo.cAM_CPPFLAGS      = -I$(top_srcdir)/src/cdo
  1. 进入到src/cogz下面,建立Makefile.am,编写如下内容:
##./src/cogz/Makefile.am
noinst_LIBRARIES = libcogz.a
libcogz_a_SOURCES = matmul.f90
  1. 进入到src/comb下面,建立Makefile.am,编写如下内容:
##./src/comb/Makefile.am
noinst_LIBRARIES   = libcomb.a
libcomb_a_SOURCES = comb.cAM_CPPFLAGS      = -I$(top_srcdir)/src/comb

为了编写方便,本文案例中都是用生成静态库的方式来完成模块目录的编译。当然,用户也可以生成动态库或者目标文件(automake文档中没有明确的对目标文件的支持,但其实可以使用automake生成目标文件)。

至此,我们完成了项目构建十步中的第一步。(不用怕,后面的基本都是输入命令,不用编写大量文件。)

2.2 构建过程

  1. 在完成第一步工作的基础上,在根目录执行:
autoscan

在根目录生成两个文件:configure.scanautoscan.log。后者在我们执行这条命令出错时帮助我们查找问题,这里主要关注第一个文件。

  1. configure.scan重命名为configure.ac
  2. 打开configure.ac文件
#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.AC_PREREQ([2.69])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AC_CONFIG_SRCDIR([src/cdo/cdo.h])
AC_CONFIG_HEADERS([config.h])# Checks for programs.
AC_PROG_CC
AC_PROG_MAKE_SET# Checks for libraries.
# FIXME: Replace `main' with a function in `-lgfortran':
AC_CHECK_LIB([gfortran], [main])# Checks for header files.# Checks for typedefs, structures, and compiler characteristics.# Checks for library functions.AC_CONFIG_FILES([Makefilesrc/Makefilesrc/alge/Makefilesrc/apps/Makefilesrc/base/Makefilesrc/bft/Makefilesrc/cdo/Makefilesrc/cogz/Makefilesrc/comb/Makefile])
AC_OUTPUT
  1. 修改文件成如下(修改的地方打上了注释,一个#开始为注释):
#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.AC_PREREQ([2.69])
AC_INIT(csrun, 1.0, mx@mx.com)  # 三个参数分别为:项目名称、版本号、bug提交邮箱
AC_CONFIG_SRCDIR([src/apps/csrun.c])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE[foreign tar-pax]  # 这行必须添加,用来指明与automake联用
# Checks for programs.
AC_PROG_CC                       # 查询c编译器
AC_PROG_FC                       # 查询Fortran编译器# Checks for libraries.# Checks for header files.
AC_PROG_RANLIB                  # 启用静态库编译# Checks for typedefs, structures, and compiler characteristics.# Checks for library functions.AC_CONFIG_FILES([Makefilesrc/Makefilesrc/apps/Makefilesrc/alge/Makefilesrc/base/Makefilesrc/bft/Makefilesrc/cdo/Makefilesrc/comb/Makefilesrc/cogz/Makefile])  # 这里需要指明生成Makefile的路径
AC_OUTPUT
  1. 执行aclocal命令,这个命令会生成一些m4文件。暗示不用过多关注它们。
  2. 执行autoheader,生成config.h文件
  3. 执行autoconf,生成configure文件
  4. 执行automake -a,生成Makefile.in文件(每个makefile.am对应一个Makefile.in)
  5. 执行./configure
  6. 执行三部曲.

至此,我们的项目已经构建完成!!


3. 覆盖率分析

在本部分正文展开之前,读者可能需要知道什么是覆盖率,为什么需要覆盖率分析等。这部分的知识可以参考相关文章。

我们利用gcc提供的gcov和Python提供的gcovr两个工具来分析覆盖率。对于单个文件,直接执行

gcov *.c

就可以得到其覆盖率(具体的生成流程,请参考笔者关于覆盖率的博文。)

对于大型的复杂项目,生成覆盖率需要将gcovautomake结合使用。我们直接在编译规则里面完成对覆盖率选项的添加。

即,在上文中每一个Makefile.am文件中添加如下命令:

AM_CFLAGS += -fprofile-arcs -ftest-coverage   ## for c compile
AM_FCFLAGS += -fprofile-arcs -ftest-coverage  ## for fortran compile

再执行:

automake -a
./configure
make

这个时候就会看到在相应的源码路径生成对应的.gcon等文件。然后在每个目录下面执行:

gcov *.c

就可以生成覆盖率文件。

但是,我们这样做,需要手动到每个子路径下面输入这个命令,比较麻烦,借助makefile将其简化。

在每个Makefile.am中添加如下语句:

export MAKEINCLUDE=${top_srcdir}/makeconfig/make.global
include ${MAKEINCLUDE}cleanall: cleanallsubdirs-rm -f *.gcda *.gcov *.gcnogcov: gcovsubdirs@echo "generating base coverage ..."gcov -f *.c *.f90gcovr: gcovrsubdirsgcovr -r . --html --html-details -o coverage.html

这个时候makefile会帮我们自动递归相关的文件夹。

转载于:https://www.cnblogs.com/baowee/p/11491854.html

GNU大型项目构建和覆盖率生成(第一篇)相关推荐

  1. 团队作业4——第一次项目冲刺(Alpha版本)-第一篇

    第一次项目冲刺--第一阶段 今天我们在宿舍开了个会,每个人都斗志昂扬的.撸起袖子加油干! 分工讨论 团队成员 任务 郭达  完成博客随笔和leangoo 刘德培  设计好数据库 石浩洋  搭建好LAM ...

  2. Cassandra在海量数据存储及大型项目案例介绍-part4

    Cassandra是一套开源分布式NoSQL数据库系统.它最初由Facebook开发,用于储存收件箱等简单格式数据,此后,由于Cassandra良好的可扩展性,被Digg.Twitter等知名Web ...

  3. 使用ThreeJs从零开始构建3D智能仓库——第一章(一切的基础)

    引用链接:https://blog.csdn.net/homula123/article/details/101197463 使用ThreeJs从零开始构建3D智能仓库--第一章 写在前面 如何实现 ...

  4. 【QT开发笔记-基础篇】| 第一章 QT入门 | 1.4 项目构建流程

    本节对应的视频讲解:B_站_链_接 https://www.bilibili.com/video/BV1cW4y1y7Lw 在上一节课中,我们新建了第一个 Qt 工程,其中包括 5 个文件: Hell ...

  5. Java初级项目学习第一讲:Maven项目构建

    Maven项目构建 一.什么是Maven Maven这个单词来自于意第绪语(犹太语),意为知识的积累.Apache Maven是一个(特别是Java编程)项目管理及自动构建工具,由Apache软件基金 ...

  6. vue 打印出git提交信息_VUE项目构建打包生成Git信息(VERSION和COMMITHASH文件)

    Git版本Webpack插件 git-revision-webpack-plugin git-revision-webpack-plugin:可在构建过程中生成VERSION和COMMITHASH文件 ...

  7. 【阅读笔记】精益开发实践用看板管理大型项目

    [阅读笔记]精益开发实践用看板管理大型项目 参考 精益开发实践用看板管理大型项目 文章目录 [阅读笔记]精益开发实践用看板管理大型项目 一.我们如何工作(案例研究) 1.项目背景 2.组织团队 3.每 ...

  8. b2c项目基础架构分析(二)前端框架 以及补漏的第一篇名词解释

    b2c项目基础架构分析(二)前端框架 以及补漏的第一篇名词解释 继续上篇,上篇里忘记了也很重要的前端部分,今天的网站基本上是以一个启示页,然后少量的整页切换,大量的浏览器后台调用web服务局部.动态更 ...

  9. db和model用哪个开发大型项目 thinkphp_Java程序员开发大型应用程序时,必须要掌握几个的技巧...

    假如你是一名Java开发者,正在开发和维护包含2000个类并使用了很多框架的应用程序.你要如何理解这些代码呢?在典型的Java企业项目小组中,大部分能够帮你的高级工程师看起来都很忙,文档也很少.你需要 ...

  10. C实战:项目构建Make,Automake,CMake

    C实战:项目构建Make,Automake,CMake 在本系列文章<C实战:强大的程序调试工具GDB>中我们简要学习了流行的调试工具GDB的使用方法.本文继续"C实战" ...

最新文章

  1. ProgreassBar 60秒走完,
  2. 发现了一个很好的做excel、ppt 水晶易表、spss的好网站
  3. 知乎:国家何时整治程序员的高薪现象?
  4. Vue - Markdown编辑器
  5. Kafka分布式环境搭建
  6. macOS Big Sur 11.1更新了!苹果macOS Big Sur 11.1正式版发布
  7. struct数组初始化
  8. 配置tomcat用户
  9. html点击控制盒子左右移动,JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例...
  10. ucosii 如何确定定时器的时间_全国中小学寒假时间确定,家长如何安排孩子们假期更合理?...
  11. hive-jdbc/odbc的解读和看法
  12. aix oracle 创建实例,11gR2 for AIX使用dbca创建数据库遇到ORA-03113错误的案例
  13. 独家揭秘影响SEO排名的17项核心因素
  14. leetcode 三数之和
  15. 【T+】畅捷通T+选项设置界面没有“数据精度”调整项
  16. c 语言解析png图片文件信息,使用CImage加载PNG图片文件
  17. postgres内存上下文
  18. YOLOv5报错:OSError: cannot open resource
  19. linux没有manconfig文件,linux shell man命令详细介绍
  20. Java帝国之宫廷内斗(2)

热门文章

  1. 材料力学考研可以用计算机吗,2020海南大学材料力学专业超详细考研经验分享...
  2. 威纶触摸屏与电脑连接_如何将威纶通tk6070ip触摸屏程序上传到电脑里。请大侠讲解具体步骤...
  3. fpga开发教程 labview_NILabVIEW高性能FPGA开发者指南.pdf
  4. SQL语句批量替换某个指定的字符串
  5. 姜小凡:物理世界的数据越来越有价值
  6. 网页在线播放器 ····
  7. Json格式以及常见的Json解析器
  8. 数控系统市场下行压力逐渐增大
  9. 软件测试自学指南---从入门到精通V1.0
  10. 小布老师Oracle 9i DBA Fundamentals I视频讲座