리눅스 환경에서 프로그래밍을 한다면 Makefile의 필요성을 절실하게 느낄겁니다. 

Makefile이 있기에 수 많은 파일을 간단한 명령어 하나로 손쉽게 빌드하는게 가능하기 때문입니다. 

문제는 대규모 프로젝트에서 Makefile을 문법에 맞게 작성하는것이 간단한 일은 손이 많이 가고 귀찮은 일일 겁니다. 


이럴 때 autotool을 사용해 보세요. 

초기 설정과 수정이 용이하고, 누구나 쉽게 변경 할 수 있게 해줍니다. 


프로젝트 폴더로 이동해서 아래의 순서에 따라 명령어를 수행해 보세요. 









$ autoscan 

하위 폴더를 검색해서 configure.scan 파일을 생성해줍니다. 

이 파일을 configure.ac로 이름을 변경해서 사용 하면 됩니다. 


파일명을 변경 한 후 configure.ac 파일을 열어서 대괄호로 묶여 있는 변수에 적절한 값을 채워주세요. 



예를 들면  'AC_INIT'에는 이렇게 되어 있을 겁니다. 


AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])


여기에 아래와 같이 현재 프로젝트에 맞게 값을 채워주시면 됩니다.  


AC_INIT(iwinfo, 1.0, bugreports@kthan.co.kr )




$ autoconf 

configure 스크립트를 생성합니다. (동시에 autom4te.cache 파일도 생성해줍니다. )

이 과정을 위해서는 configure.ac 파일이 존재해야 합니다. 

즉, configure.ac 파일에 있는 설정을 참고해서 configure 파일을 생성하는 겁니다. 



$ aclocal

다음 과정인 automake를 하기 위해 필요한 aclocal.m4 파일을 생성해줍니다. 

이 파일에는 automake에서 쓰는 매크로(macros)에 대한 내용이 들어있습니다. 



$ automake 

Makefile을 만드는데 필요한 Makefile.in 파일을 만들어 줍니다. 

automake명령어를 수행하게 되면 Makefile.am 파일을 참고해서 Makefile.in 파일을 생성해줍니다. 


Makefile.am은  프로그래머가 작성해 줘야 하는 파일로, 해당 프로젝트에 해당하는 정보를 기술해 주는 파일입니다. 

결과물로 생성될 실행 파일 이름을 뭐라고 할 지, 하위 디렉터리, 소스 파일, 사용할 라이브러리 정보 등을 써주셔야 합니다. 



bin_PROGRAMS = kthanUtil

SUBDIRS = tools

kthanUtil_SOURCES = parser.c util.c main.c


AM_CFLAGS = -Wall  -g


kthanUtil_LDADD =

kthanUtil_LDFLAGS= -lm -lpcre



위의 예제만 봐도 대충 어떻게 작성해줘야 하는지 감을 잡을 수 있을 겁니다. 

이 파일은 프로젝트의 모든 디렉터리 마다(include 폴더는 제외) 작성해 주어야 하며, 해당 경로에 소스코드가 없다면 'SUBDIRS'만 쓰면 됩니다. 


Makefile.am 파일의 문법에 대해 자세히 알고 싶으시다면 다음 링크를 참고하세요. 




만약, automake 과정에서 아래와 같은 에러가 발생하면.. 


configure.ac: no proper invocation of AM_INIT_AUTOMAKE was found.

configure.ac: You should verify that configure.ac invokes AM_INIT_AUTOMAKE,


configure.ac 에 아래처럼  'AM_INIT_AUTOMAKE'를 추가해 줘야 합니다. 


AM_INIT_AUTOMAKE(iwinfo, 1.0)



$ autoreconf 

automake 과정에서 config.h.in 파일이 없다고 아래와 같은 오류가 나오면 실행해 줍시다. 


configure.ac:7: required file `config.h.in' not found


그러면 config.h.in 파일이 생성됩니다. 



$ automake --add-missing

automake 에서 아래와 같이  'COPYING' 이 필요한데 없다고 에러가 나면 실행해 줍시다. 


Makefile.am: required file `./COPYING' not found

Makefile.am:   `automake --add-missing' can install `COPYING'


그러면, 'COPYING'와 같은 automake 에 필요한 디렉터리가 자동으로 생성됩니다. 



$ ./configure

autoconf로 생성한 configure를 실행 시킵니다. 

이 스크립트는 automake로 생성한 Makefile.in을 참고해서 Makefile을 만들어줍니다. (중간 과정에서 config.status 파일이 생성됩니다. )

이 과정까지 모두 오류없이 진행 하였다면 Makefile이 생성되어 있어야 합니다. 



$ make

위 과정에서 생성한 Makefile에 따라 빌드를 수행합니다.



$ make install

필요에 따라 빌드한 결과를 설치하면 됩니다. 



결과적으로 직접 만들어 줘야 하는 것은 Makefile.am 파일 하나 밖에 없구요. configure.ac는 조금 수정만 해주면 됩니다. 

과정이 조금 복잡해 보이기는 하지만 한 번 설정 해두면 복잡한 문법의  Makefile  대신 하위 디렉터리, 소스코드 이름 정도만 나열해 주면 되는 Makefile.am파일만 수정하면 되기 때문에 매우 편하게 작업을 할 수 있답니다. 



Posted by KT한
,