源代码目录结构(deep模式 注1)(还有flat,shallow模式)
工程目录
./home/nari/nsc
头文件目录
./home/nari/nsc/includes
源代码目录
./home/nari/nsc/calcyx
参数文件目录
./home/nari/nsc/para
控制台所在目录./home/nari/nsc
1. 自动扫描源文件
命令:autoscan
生成文件:autoscan.log和configure.scan
文件内容:autoscan.log为空
configure.scan内容如下:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.61)
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR([calcyx/CalcYx.c])
AC_CONFIG_HEADER([config.h])
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
AC_STRUCT_TM
# Checks for library functions.
AC_OUTPUT
2. 修改configure.scan文件内容并改名为configure.in
Ø 更改名称 #mv configure.scan configure.in
Ø 更改文件内容:
将AC_CONFIG_HEADER改为AM_CONFIG_HEADER
在AC_CONFIG_HEADER([config.h])下添加AM_INIT_AUTOMAKE(calcyx,1.0)
在AC_OUTPUT之前添加AC_CONFIG_FILES([Makefile calcyx/Makefile])
3. 手动编写Makefile.am文件(在源码目录下也需要)
AUTOMAKE_OPTIONS = foreign
# Note:target part
bin_PROGRAMS = calcyx
# noinst_PROGRAMS = calcyx
# Note:source part
calcyx_SOURCES = CalcYx.c CalcYxDpYx.c CalcYxLogic.c CommFunction.c temp.c test.c
# calcyx_LDADD =
# calcyx_LDFLAGS =
# calcyx_DEPENDENCIES =
# Note:lib part
# lib_LIBRARIES =
# sntp_a_SOURCES =
# sntp_a_LDADD =
# sntp_a_LIBADD =
# sntp_a_LDFLAGS =
# Note:header part
include_HEADERS = CalcYx.h CalcYxDpYx.h CalcYxLogic.h CommFunction.h ConstDef.h DataTypeDefine.h Environ.h FromFxg.h NumLimit.h StruDef.h temp.h test.h
# Note:data part
# data_DATA =
4. 使用aclocal命令生成autom4te.cache文件夹和aclocal.m4文件
命令:#aclocal
生成文件:autom4te.cache文件夹和aclocal.m4
文件内容:参照该文件。
5. 生成配置脚本文件
命令:# autoconf
生成文件:configure
文件内容:参照该文件。
6. 生成头文件
命令:autoheader
生成文件:config.h.in
文件内容:参照该文件。
7. 生成配置Makefile用脚本文件
命令:automake --add-missing
生成文件:install-sh、missing、depcomp
文件内容:参照该文件。
8. 生成Makefile文件
命令:./configure
打印信息:
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
checking whether struct tm is in sys/time.h or time.h... time.h
configure: creating ./config.status
config.status: creating Makefile
config.status: creating config.h
config.status: executing depfiles commands
生成文件:Makefile,config.h,./config.status
9. 编译代码
命令:工程目录下make
10.
源代码目录下make
注1:
automake支持三种目录模式:
1) flat模式,所有文件都位于同一个目录中,包括源文件、头文件、其他库文件都位于当前目录中,且没有子目录。
2) shallow模式,主要的源代码都存储在顶层目录中,其他部分则存储在子目录中。
3) deep模式,所有源代码都存储在子目录中,顶层目录主要包含配置信息,也就是说所有源文件以及自己写的头文件位于当前目录的子目录中,而且当前目录里没有任何源文件。
注1:configure.scan的基本格式:
AC_INIT
测试程序AC_PROG_CC
测试函数库
测试头文件
测试类型定义
测试结构
测试编译器特性
测试库函数
测试系统调用
AC_OUTPUT
automake支持三种目录层次:flat、shallow和deep。
一个flat包指的是所有文件都在一个目录中的包。为这类包提供的Makefile.am不需要SUBDIRS这个宏。这类包的一个例子是termutils。对应咱们程序员来说:就是所有源文件及自己写的头文件都位于当前目录里面,且没有子目录。
一个deep包指的是所有的源代码都被储存在子目录中的包;顶层目录主要包含配置信息。GNU cpio是这类包的一个很好的例子,GNU tar也是。deep包的顶层Makefile.am将包括宏SUBDIRS,但没有其它定义需要创建的对象的宏。对应咱们程序员来说:就是所有源文件及自己写的头文件都位于当前目录的一个子目录里面,而当前目录里没有任何源文件。
一个shallow包指的是主要的源代码储存在顶层目录中,而各个部分(典型的是库)则储存在子目录中的包。automake本身就是这类包(GNU make也是如此,它现在已经不使用automake)。对应咱们程序员来说:就是主要源文件在当前目录里,而其它一些实现各部分功能的源文件各自位于不同目录。
前两个层次的程序编辑方法非常简单,按照上述步骤一步步即可。而第三种层次shallow稍微复杂一点,但这是我们经常写程序用到的结构。