linux c 一个autotools的最简单例子
1、准备:需要工具autoscan aclocal autoheader automake autoconf make 等工具.
2、测试程序编写:
建立目录:mkdir include src
编写程序:include/str.h
#include
<
stdio.h
>
int str( char * string );
int str( char * string );
编写程序:src/str.c
#include
"
str.h
"
// print string
int str( char * string ) {
printf("\n----PRINT STRING----\n\"%s\"\n",string);
return 0;
}
// interface of this program
int main( int argc , char ** argv) {
char str_read[1024];
printf("Please INPUT something end by [ENTER]\n");
scanf("%s",str_read);
return str(str_read );
}
// print string
int str( char * string ) {
printf("\n----PRINT STRING----\n\"%s\"\n",string);
return 0;
}
// interface of this program
int main( int argc , char ** argv) {
char str_read[1024];
printf("Please INPUT something end by [ENTER]\n");
scanf("%s",str_read);
return str(str_read );
}
3、生成configure.in
configure.in是automake的输入文件,所以必须先生成该文件。
执行命令:
修改 configure.in
修改
FULL-PACKAGE-NAME 为程序名称,VERSION为当前版本, BUG-REPORT-ADDRESS为bug汇报地址
添加 AM_INIT_AUTOMAKE
添加 AC_CONFIG_FILES([Makefile])
4、执行aclocal
5、制作Makefile.am
6、autoheader
7、automake必须文件:
8、执行automake
9、autoconf
10、执行测试:
执行./configure
11、测试程序:
到此结束!!
--------------------
添加测试包:
添加一个支持子目录、静态库、自定义configure选项的包
支持子目录Makefile.am 选项 SUBDIR =
EXTRA_DIST 用于添加除源码外的文件到dist包
configure.in是automake的输入文件,所以必须先生成该文件。
执行命令:
[root
@localhost
str]
#
ls
include src
[root @localhost str] # autoscan
autom4te : configure . ac : no such file or directory
autoscan : / usr / bin / autom4te failed with exit status : 1
[root @localhost str] # ls
autoscan . log configure . scan include src
[root @localhost str] # cp configure.scan configure.in
include src
[root @localhost str] # autoscan
autom4te : configure . ac : no such file or directory
autoscan : / usr / bin / autom4te failed with exit status : 1
[root @localhost str] # ls
autoscan . log configure . scan include src
[root @localhost str] # cp configure.scan configure.in
修改 configure.in
#
-*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ( 2.59 )
AC_INIT(FULL - PACKAGE - NAME , VERSION , BUG - REPORT - ADDRESS)
AC_CONFIG_SRCDIR([include / str . h])
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.
# Checks for library functions.
AC_OUTPUT
# Process this file with autoconf to produce a configure script.
AC_PREREQ( 2.59 )
AC_INIT(FULL - PACKAGE - NAME , VERSION , BUG - REPORT - ADDRESS)
AC_CONFIG_SRCDIR([include / str . h])
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.
# Checks for library functions.
AC_OUTPUT
修改
AC_INIT(FULL
-
PACKAGE
-
NAME
,
VERSION
,
BUG
-
REPORT
-
ADDRESS)
为
AC_INIT(str
,
0.0
.
1
,
[bug
@sounos
.
org])
FULL-PACKAGE-NAME 为程序名称,VERSION为当前版本, BUG-REPORT-ADDRESS为bug汇报地址
添加 AM_INIT_AUTOMAKE
添加 AC_CONFIG_FILES([Makefile])
#
-*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ( 2.59 )
# AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_INIT(str , 0.0 . 1 , [bug @sounos . org])
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([include / str . h])
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.
# Checks for library functions.
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
# Process this file with autoconf to produce a configure script.
AC_PREREQ( 2.59 )
# AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_INIT(str , 0.0 . 1 , [bug @sounos . org])
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([include / str . h])
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.
# Checks for library functions.
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
4、执行aclocal
[root
@localhost
str]
#
aclocal
/ usr / share / aclocal / libfame . m4 : 6 : warning : underquoted definition of AM_PATH_LIBFAME
run info ' (automake)Extending aclocal '
or see http :// sources . redhat . com / automake / automake . html # Extending-aclocal
/ usr / share / aclocal / libfame . m4 : 6 : warning : underquoted definition of AM_PATH_LIBFAME
run info ' (automake)Extending aclocal '
or see http :// sources . redhat . com / automake / automake . html # Extending-aclocal
5、制作Makefile.am
[root
@localhost
str]
#
cat Makefile.am
#Makefile.am
bin_PROGRAMS = str
str_SOURCES = include / str . h src / str . c
str_CPPFLAGS = - I include /
#Makefile.am
bin_PROGRAMS = str
str_SOURCES = include / str . h src / str . c
str_CPPFLAGS = - I include /
6、autoheader
[root
@localhost
str]
#
autoheader
7、automake必须文件:
*
install
-
sh
* missing
* INSTALL
* NEWS
* README
* AUTHORS
* ChangeLog
* COPYING
* depcomp
其中
* missing
* INSTALL
* NEWS
* README
* AUTHORS
* ChangeLog
* COPYING
* depcomp
*
install
-
sh
* missing
* INSTALL
* COPYING
* depcomp
可以通过automake -a选项自动生成,所以这里只需要建立如下文件
* missing
* INSTALL
* COPYING
* depcomp
[root
@localhost
str]
#
touch NEWS README AUTHORS ChangeLog
8、执行automake
[root
@localhost
str]
#
automake -a
configure . ac : installing ` ./ install - sh '
configure.ac: installing `./missing '
Makefile . am : installing ` ./ INSTALL '
Makefile.am: installing `./COPYING '
Makefile . am : installing ` ./ compile '
Makefile.am: installing `./depcomp '
configure . ac : installing ` ./ install - sh '
configure.ac: installing `./missing '
Makefile . am : installing ` ./ INSTALL '
Makefile.am: installing `./COPYING '
Makefile . am : installing ` ./ compile '
Makefile.am: installing `./depcomp '
9、autoconf
[root
@localhost
str]
#
autoconf
[root @localhost str] # ls
aclocal . m4 autoscan . log config . h . in configure . scan include Makefile . am NEWS
AUTHORS ChangeLog configure COPYING INSTALL Makefile . in README
autom4te . cache compile configure . ac depcomp install - sh missing src
[root @localhost str] # ls
aclocal . m4 autoscan . log config . h . in configure . scan include Makefile . am NEWS
AUTHORS ChangeLog configure COPYING INSTALL Makefile . in README
autom4te . cache compile configure . ac depcomp install - sh missing src
10、执行测试:
执行./configure
[root
@localhost
str]
#
./configure --prefix=/u
checking for a BSD - compatible install / usr / bin / install - c
checking whether build environment is sane yes
checking for gawk gawk
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 ANSI C none needed
checking for style of include used by make GNU
checking dependency style of gcc gcc3
configure : creating ./ config . status
config . status : creating Makefile
config . status : creating config . h
config . status : config . h is unchanged
config . status : executing depfiles commands
执行 make
checking for a BSD - compatible install / usr / bin / install - c
checking whether build environment is sane yes
checking for gawk gawk
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 ANSI C none needed
checking for style of include used by make GNU
checking dependency style of gcc gcc3
configure : creating ./ config . status
config . status : creating Makefile
config . status : creating config . h
config . status : config . h is unchanged
config . status : executing depfiles commands
[root
@localhost
str]
#
make
make all - am
make[ 1 ] : Entering directory ` / data / devel / c / str '
if gcc -DHAVE_CONFIG_H -I. -I. -I. -I include/ -g -O2 -MT str-str.o -MD -MP -MF ".deps/str-str.Tpo" -c -o str-str.o `test -f ' src / str . c ' || echo ' ./ ' `src/str.c; \
then mv -f ".deps/str-str.Tpo" ".deps/str-str.Po"; else rm -f ".deps/str-str.Tpo"; exit 1; fi
gcc -g -O2 -o str str-str.o
make[1]: Leaving directory `/data/devel/c/str '
执行 make install
make all - am
make[ 1 ] : Entering directory ` / data / devel / c / str '
if gcc -DHAVE_CONFIG_H -I. -I. -I. -I include/ -g -O2 -MT str-str.o -MD -MP -MF ".deps/str-str.Tpo" -c -o str-str.o `test -f ' src / str . c ' || echo ' ./ ' `src/str.c; \
then mv -f ".deps/str-str.Tpo" ".deps/str-str.Po"; else rm -f ".deps/str-str.Tpo"; exit 1; fi
gcc -g -O2 -o str str-str.o
make[1]: Leaving directory `/data/devel/c/str '
[root
@localhost
str]
#
make install
make[ 1 ] : Entering directory ` / data / devel / c / str '
test -z "/u/bin" || mkdir -p -- "/u/bin"
/usr/bin/install -c ' str ' ' / u / bin / str '
make[1]: Nothing to be done for `install-data-am ' .
make[ 1 ] : Leaving directory ` / data / devel / c / str '
make[ 1 ] : Entering directory ` / data / devel / c / str '
test -z "/u/bin" || mkdir -p -- "/u/bin"
/usr/bin/install -c ' str ' ' / u / bin / str '
make[1]: Nothing to be done for `install-data-am ' .
make[ 1 ] : Leaving directory ` / data / devel / c / str '
11、测试程序:
[root
@localhost
str]
#
/u/bin/str
Please INPUT something end by [ENTER]
abcksdhfklsdklfdjlkfd
---- PRINT STRING ----
" abcksdhfklsdklfdjlkfd "
Please INPUT something end by [ENTER]
abcksdhfklsdklfdjlkfd
---- PRINT STRING ----
" abcksdhfklsdklfdjlkfd "
到此结束!!
--------------------
添加测试包:
[root
@localhost
str]
#
make dist-gzip
{ test ! - d str - 0.0 . 1 || { find str - 0.0 . 1 - type d ! - perm - 200 - exec chmod u + w {} ' ; ' && rm - fr str - 0.0 . 1 ; }; }
mkdir str - 0.0 . 1
find str - 0.0 . 1 - type d ! - perm - 777 - exec chmod a + rwx {} \ ; - o \
! - type d ! - perm - 444 - links 1 - exec chmod a + r {} \ ; - o \
! - type d ! - perm - 400 - exec chmod a + r {} \ ; - o \
! - type d ! - perm - 444 - exec / bin / sh / data / devel / c / str / install - sh - c - m a + r {} {} \ ; \
|| chmod - R a + r str - 0.0 . 1
tardir = str - 0.0 . 1 && / bin / sh / data / devel / c / str / missing -- run tar chof - " $tardir " | GZIP =-- best gzip - c > str - 0.0 . 1 . tar . gz
{ test ! - d str - 0.0 . 1 || { find str - 0.0 . 1 - type d ! - perm - 200 - exec chmod u + w {} ' ; ' && rm - fr str - 0.0 . 1 ; }; }
{ test ! - d str - 0.0 . 1 || { find str - 0.0 . 1 - type d ! - perm - 200 - exec chmod u + w {} ' ; ' && rm - fr str - 0.0 . 1 ; }; }
mkdir str - 0.0 . 1
find str - 0.0 . 1 - type d ! - perm - 777 - exec chmod a + rwx {} \ ; - o \
! - type d ! - perm - 444 - links 1 - exec chmod a + r {} \ ; - o \
! - type d ! - perm - 400 - exec chmod a + r {} \ ; - o \
! - type d ! - perm - 444 - exec / bin / sh / data / devel / c / str / install - sh - c - m a + r {} {} \ ; \
|| chmod - R a + r str - 0.0 . 1
tardir = str - 0.0 . 1 && / bin / sh / data / devel / c / str / missing -- run tar chof - " $tardir " | GZIP =-- best gzip - c > str - 0.0 . 1 . tar . gz
{ test ! - d str - 0.0 . 1 || { find str - 0.0 . 1 - type d ! - perm - 200 - exec chmod u + w {} ' ; ' && rm - fr str - 0.0 . 1 ; }; }
添加一个支持子目录、静态库、自定义configure选项的包
支持子目录Makefile.am 选项 SUBDIR =
#
Automake interface
SUBDIRS = src
支持静态库Makefile.am
SUBDIRS = src
EXTRA_DIST 用于添加除源码外的文件到dist包
#
Automake interface
bin_PROGRAMS = hello
hello_SOURCES = hello . c lib / sbase . h
hello_CPPFLAGS = - I lib
hello_LDFLAGS = - static lib / libsbase . a
EXTRA_DIST = lib / libsbase . a
configure.in
bin_PROGRAMS = hello
hello_SOURCES = hello . c lib / sbase . h
hello_CPPFLAGS = - I lib
hello_LDFLAGS = - static lib / libsbase . a
EXTRA_DIST = lib / libsbase . a
AC_PREREQ(
2.59
)
# AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_INIT(hello , 0.0 . 1 , [SounOS @gmail . com])
# AM 声明
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([src / hello . c])
AC_CONFIG_HEADER([config . h])
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS([stdint . h stdlib . h sys / socket . h])
# Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
AC_TYPE_SIZE_T
AC_TYPE_UINT32_T
AC_TYPE_UINT64_T
# 用于自定义configure 选项,见acinclude.am
AC_CHECK_EXTRA_OPTIONS
# Checks for library functions.
AC_CONFIG_FILES([Makefile
src / Makefile])
AC_OUTPUT
# AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_INIT(hello , 0.0 . 1 , [SounOS @gmail . com])
# AM 声明
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([src / hello . c])
AC_CONFIG_HEADER([config . h])
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS([stdint . h stdlib . h sys / socket . h])
# Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
AC_TYPE_SIZE_T
AC_TYPE_UINT32_T
AC_TYPE_UINT64_T
# 用于自定义configure 选项,见acinclude.am
AC_CHECK_EXTRA_OPTIONS
# Checks for library functions.
AC_CONFIG_FILES([Makefile
src / Makefile])
AC_OUTPUT