>  기사  >  백엔드 개발  >  Linux에서 Makefile을 생성하기 위해 autoconf 및 automake를 사용하는 원리에 대한 자세한 설명

Linux에서 Makefile을 생성하기 위해 autoconf 및 automake를 사용하는 원리에 대한 자세한 설명

伊谢尔伦
伊谢尔伦원래의
2016-11-25 15:43:401656검색

리눅스에서 프로그램을 개발하다 보면 Makefile을 접해본 적이 있을 것입니다. 작성한 프로그램을 컴파일하기 위해 make 명령을 사용하는 것은 참으로 매우 편리합니다. 일반적인 상황에서는 누구나 손으로 간단한 Makefile을 작성합니다. 이 기사에서는 autoconf와 automake라는 두 가지 도구를 사용하여 자동으로 Makefile을 작성하는 방법을 소개합니다. 자유 소프트웨어 규칙을 준수하는 Makefile로, "./configure", "make" 및 "make install"을 사용하여 일반적인 GNU 프로그램처럼 Linux 시스템에 프로그램을 설치할 수 있습니다. 이는 오픈 소스 소프트웨어를 만들고자 하는 프로그램 개발자에게 특히 적합할 것이며, 작은 Toy 프로그램을 직접 작성하는 경우에도 이 기사가 큰 도움이 될 것입니다.

1. Makefile 소개

Makefile은 자동 컴파일 및 링크에 사용됩니다. 프로젝트는 여러 파일로 구성되어 있으므로 각 파일을 변경하면 프로젝트가 다시 연결되지만 모든 파일이 연결되는 것은 아닙니다. Makefile은 파일 정보를 기록하며, 링크하는 동안 어떤 파일을 다시 컴파일해야 하는지 결정됩니다.

Makefile의 목적은 파일을 컴파일하기 위해 의존해야 하는 다른 파일이 무엇인지 컴파일러에 알리는 것입니다. 해당 종속성 파일이 변경되면 컴파일러는 자동으로 생성된 최종 파일이 오래된 파일인지 확인하고 해당 모듈을 다시 컴파일합니다.

Makefile의 기본 구조는 그다지 복잡하지 않지만, 프로그램 개발자가 Makefile을 작성하기 시작하면 자신이 작성한 내용이 관례에 맞는지 의심하는 경우가 많고, 자신이 작성한 Makefile이 자신의 개발과 연관되는 경우가 많습니다. 시스템 환경 변수나 경로가 변경된 후에는 그에 따라 Makefile을 수정해야 할 수도 있습니다. 이로 인해 Makefile을 수동으로 작성할 때 많은 문제가 발생했으며, automake는 이러한 문제를 해결하는 데 매우 도움이 됩니다.

automake를 사용하면 프로그램 개발자는 미리 정의된 매크로가 포함된 몇 가지 간단한 파일만 작성하면 됩니다. autoconf는 하나의 매크로 파일을 기반으로 구성을 생성하고, automake는 다른 매크로 파일을 기반으로 Makefile.in을 생성한 다음 Makefile을 기반으로 구성을 사용합니다. 일반적인 Makefile을 생성합니다. 아래에서는 Makefile의 automake 생성 방법을 자세히 소개하겠습니다.

2. 사용 환경

이 글에서 언급한 프로그램은 우리가 사용하고자 하는 autoconf와 automake가 포함된 Linux 배포 버전인 Fedora Core release 1을 기반으로 합니다.

3. helloworld 시작하기

가장 일반적으로 사용되는 예제 프로그램인 helloworld부터 시작해 보겠습니다.

간단히 말하면 다음 프로세스는 다음과 같습니다.

세 개의 파일을 만듭니다.

helloworld.c  configure.in  Makefile.am

그런 다음 순서대로 실행합니다.

autoscan; aclocal; autoconf; automake --add-missing; ./configure; make; ./helloworld;

Makefile이 생성되고 helloworld.c가 컴파일되어 전달되는 것을 볼 수 있습니다. 매우 간단합니다. 몇 가지 명령만으로 기존의 Makefile을 만들 수 있습니다. 어떤 느낌인가요? 이제 자세한 프로세스를 소개하겠습니다.

1. 디렉토리 생성

작업 디렉토리에 helloworld 디렉토리를 생성하고 /home과 같은 helloworld 프로그램 및 관련 파일을 저장합니다. / my/build 아래:

$ mkdir helloword
$ cd helloworld

2. helloworld.c

그런 다음 원하는 편집기를 사용하여 helloworld.c 명령과 같이 helloworld.c 파일을 작성합니다. helloworld.c의 내용으로 다음 코드를 사용합니다.

int main(int argc, char** argv)
{
    printf("Hello, Linux World! ");
    return 0;
}

완료 후 저장하고 종료하세요. 이제 helloworld 디렉토리에 당신이 작성한 helloworld.c가 있을 것입니다.

3. 구성 생성

autoscan 명령을 사용하여 디렉토리의 소스 코드를 기반으로 구성.in 템플릿 파일을 생성합니다.

명령:

$ autoscan
$ ls
configure.scan helloworld.c

실행 후 hellowrold 디렉터리에 파일이 생성됩니다:configure.scan, 이는 구성.in의 청사진으로 사용할 수 있습니다.

4, generateconfigure.in

이제configure.scan의 이름을configure.in으로 바꾸고 다음과 같이 편집하고 관련 없는 문을 제거하십시오.

Code
============================configure.in内容开始=========================================
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_INIT(helloworld.c)
AM_INIT_AUTOMAKE(helloworld, 1.0)
# 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(Makefile)
============================configure.in内容结束=========================================

5 aclocal을 실행합니다. 및 autoconf

그런 다음 aclocal 및 autoconf 명령을 실행하면 각각 aclocal.m4 및 구성 두 파일이 생성됩니다.

$ aclocal
$ls
aclocal.m4 configure.in helloworld.c
$ autoconf
$ ls
aclocal.m4 autom4te.cache configure configure.in helloworld.c

configure.in 내용을 볼 수 있습니다. 이는 매크로 정의입니다. . autoconf에 의해 처리된 후 이러한 매크로는 시스템 특성, 환경 변수 및 소프트웨어에 필요한 매개변수를 확인하는 쉘 스크립트가 됩니다.

autoconf 是用来生成自动配置软件源代码脚本(configure)的工具。configure脚本能独立于autoconf运行,且在运行的过程中,不需要用户的干预。

要生成configure文件,你必须告诉autoconf如何找到你所用的宏。方式是使用aclocal程序来生成你的aclocal.m4。

aclocal根据configure.in文件的内容,自动生成aclocal.m4文件。aclocal是一个perl 脚本程序,它的定义是:“aclocal - create aclocal.m4 by scanning configure.ac”。

autoconf从configure.in这个列举编译软件时所需要各种参数的模板文件中创建configure。

autoconf需要GNU m4宏处理器来处理aclocal.m4,生成configure脚本。

m4是一个宏处理器。将输入拷贝到输出,同时将宏展开。宏可以是内嵌的,也可以是用户定义的。除了可以展开宏,m4还有一些内建的函数,用来引用文件,执行命令,整数运算,文本操作,循环等。m4既可以作为编译器的前端,也可以单独作为一个宏处理器.

6、新建Makefile.am

新建Makefile.am文件,命令:$ vi Makefile.am

内容如下:

AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=helloworld
helloworld_SOURCES=helloworld.c

automake会根据你写的Makefile.am来自动生成Makefile.in。Makefile.am中定义的宏和目标,会指导automake生成指定的代码。例如,宏bin_PROGRAMS将导致编译和连接的目标被生成。

7、运行automake

命令:

$ automake --add-missing
configure.in: installing `./install-sh'
configure.in: installing `./mkinstalldirs'
configure.in: installing `./missing'
Makefile.am: installing `./depcomp'

automake会根据Makefile.am文件产生一些文件,包含最重要的Makefile.in。

8、执行configure生成Makefile

$ ./configure
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 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: executing depfiles commands
$ ls -l Makefile
-rw-rw-r-- 1 yutao yutao 15035 Oct 15 10:40 Makefile

你可以看到,此时Makefile已经产生出来了。

9、使用Makefile编译代码

$ make
if gcc -DPACKAGE_NAME="" -DPACKAGE_TARNAME="" -DPACKAGE_VERSION="" -
DPACKAGE_STRING="" -DPACKAGE_BUGREPORT="" -DPACKAGE="helloworld" -DVERSION="1.0"
-I. -I. -g -O2 -MT helloworld.o -MD -MP -MF ".deps/helloworld.Tpo"
-c -o helloworld.o `test -f 'helloworld.c' || echo './'`helloworld.c;
then mv -f ".deps/helloworld.Tpo" ".deps/helloworld.Po";
else rm -f ".deps/helloworld.Tpo"; exit 1;
fi
gcc -g -O2 -o helloworld helloworld.o

10, 运行helloworld

$ ./helloworld
Hello, Linux World!

这样helloworld就编译出来了,你如果按上面的步骤来做的话,应该也会很容易地编译出正确的helloworld文件。你还可以试着使用一些其他的make命令,如make clean,make install,make dist,看看它们会给你什么样的效果。感觉如何?自己也能写出这么专业的Makefile,老板一定会对你刮目相看。

四、深入浅出

针对上面提到的各个命令,我们再做些详细的介绍。

1、 autoscan

autoscan是用来扫描源代码目录生成configure.scan文件的。autoscan可以用目录名做为参数,但如果你不使用参数的话,那么autoscan将认为使用的是当前目录。autoscan将扫描你所指定目录中的源文件,并创建configure.scan文件。

2、 configure.scan

configure.scan包含了系统配置的基本选项,里面都是一些宏定义。我们需要将它改名为configure.in

3、 aclocal

aclocal是一个perl 脚本程序。aclocal根据configure.in文件的内容,自动生成aclocal.m4文件。aclocal的定义是:“aclocal - create aclocal.m4 by scanning configure.ac”。

4、 autoconf

使用autoconf,根据configure.in和aclocal.m4来产生configure文件。configure是一个脚本,它能设置源程序来适应各种不同的操作系统平台,并且根据不同的系统来产生合适的Makefile,从而可以使你的源代码能在不同的操作系统平台上被编译出来。

configure.in文件的内容是一些宏,这些宏经过autoconf 处理后会变成检查系统特性、环境变量、软件必须的参数的shell脚本。configure.in文件中的宏的顺序并没有规定,但是你必须在所有宏的最前面和最后面分别加上AC_INIT宏和AC_OUTPUT宏。

在configure.ini中:

#号表示注释,这个宏后面的内容将被忽略。

AC_INIT(FILE) 这个宏用来检查源代码所在的路径。

AM_INIT_AUTOMAKE(PACKAGE, VERSION) 이 매크로는 생성할 소프트웨어 패키지의 이름과 버전 번호를 설명하는 데 필요합니다. PACKAGE는 소프트웨어 패키지의 이름이고 VERSION은 버전 번호입니다. make dist 명령을 사용하면 해당 소프트웨어 패키지의 이름과 버전 번호가 포함된 helloworld-1.0.tar.gz와 유사한 소프트웨어 배포 패키지가 생성됩니다.

AC_PROG_CC 이 매크로는 시스템에서 사용하는 C 컴파일러를 확인합니다.

AC_OUTPUT(FILE) 이 매크로는 출력하려는 ​​Makefile의 이름입니다.

automake를 사용할 때 실제로는 다른 매크로를 사용해야 하지만 aclocal을 사용하면 매크로를 자동으로 생성할 수 있습니다. aclocal을 실행하면 aclocal.m4 파일이 생성됩니다.

configure.in 및 aclocal.m4 매크로 파일을 생성한 후 autoconf를 사용하여 구성 파일을 생성할 수 있습니다.

5. Makefile.am

Makefile.am은 Makefile.in을 생성하는 데 사용되며 이를 위해서는 수동으로 작성해야 합니다. Makefile.am은 일부 콘텐츠를 정의합니다:

AUTOMAKE_OPTIONS 이것은 automake 옵션입니다. automake를 실행할 때 표준 GNU 소프트웨어 패키지에 포함되어야 하는 AUTHORS, ChangeLog, NEWS 및 기타 파일과 같은 다양한 파일이 디렉토리에 있는지 확인합니다. 외부로 설정하면 automake는 일반 소프트웨어 패키지의 표준을 사용하여 확인합니다.

bin_PROGRAMS 생성하려는 실행 파일의 파일 이름을 지정합니다. 여러 개의 실행 파일을 생성하려면 이름을 공백으로 구분하세요.

helloworld_SOURCES "helloworld"를 생성하는 데 필요한 소스 코드를 지정합니다. 여러 소스 파일을 사용하는 경우 공백으로 구분하세요. 예를 들어 helloworld.h, helloworld.c가 필요한 경우 helloworld_SOURCES= helloworld.h helloworld.c라고 작성하세요.

bin_PROGRAMS에 여러 개의 실행 파일을 정의하는 경우 각 실행 파일마다 해당 filename_SOURCES를 정의해야 합니다.

6. automake

configure.in과 Makefile.am을 기반으로 Makefile.in을 생성하기 위해 automake를 사용합니다.

--add-missing 옵션의 정의는 "누락된 표준 파일을 패키지에 추가"이며, 이를 통해 automake는 표준 소프트웨어 패키지에 필요한 일부 파일을 추가할 수 있습니다.

automake를 사용하여 생성한 Makefile.in 파일은 GNU Makefile 규칙을 준수합니다. 그런 다음 적절한 Makefile 파일을 생성하려면 구성 셸 스크립트만 실행하면 됩니다.

7. Makefile

GNU Makefiel 규칙을 준수하는 Makefile에는 사전 정의된 기본 작업이 포함되어 있습니다.

컴파일 소스 코드 만들기, 연결 및 생성 Makefile 개체 파일, 실행 파일입니다.

make clean 마지막 make 명령으로 생성된 개체 파일(접미사 ".o"가 붙은 파일)과 실행 파일을 지웁니다.

make install 성공적으로 컴파일된 실행 파일을 시스템 디렉터리(일반적으로 /usr/local/bin 디렉터리)에 설치합니다.

make dist 배포 패키지 파일(예: 배포 패키지)을 생성합니다. 이 명령은 실행 파일과 관련 파일을 tar.gz 압축 파일로 패키지하여 소프트웨어 게시용 소프트웨어 패키지로 사용합니다. 현재 디렉터리에 "PACKAGE-VERSION.tar.gz"와 유사한 이름의 파일이 생성됩니다. PACKAGE와 VERSION은 우리가configure.in에서 정의한 AM_INIT_AUTOMAKE(PACKAGE, VERSION)입니다.

make distcheck  릴리스 패키지를 생성하고 테스트하여 릴리스 패키지의 정확성을 확인합니다. 이 작업은 압축된 패키지 파일의 압축을 자동으로 풀고 구성 명령을 실행하여 컴파일 오류가 없는지 확인합니다. 마지막으로 소프트웨어 패키지가 준비되었으며 릴리스될 수 있다는 메시지가 표시됩니다.
make distclean make clean과 유사하지만 Makefile을 포함하여 구성으로 생성된 모든 파일을 삭제합니다.

5. 공정도

Linux에서 Makefile을 생성하기 위해 autoconf 및 automake를 사용하는 원리에 대한 자세한 설명

6.결론

위 소개를 통해 GNU 규칙을 준수하는 Makefile과 해당 프로젝트 파일을 쉽게 생성할 수 있을 것입니다. 규칙을 준수하는 더 복잡한 Makefile을 작성하려면 임베디드 데이터베이스 sqlite, 단위 테스트 cppunit과 같은 일부 개방형 코드 프로젝트에서configure.in 및 Makefile.am 파일을 참조할 수 있습니다.


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:git 공통 명령 메모다음 기사:git 공통 명령 메모