[원본]automake 도구,소프트웨어 구 조 를 만들어 주 고 Makefile 을 관리 합 니 다.

24178 단어 makefile
Makefile 관리 도구-Automake 및 Autoconf
 
이 프로젝트 다운로드 경로:http://files.cnblogs.com/iTsihang/hello-2.0.zip
automake 참고 자료:http://www.linuxforum.net/books/automake.html
autoconf 참고 자료:http://www.linuxforum.net/books/autoconf.html
automake 소스 코드 다운로드:ftp://ftp.gnu.org/gnu/automake/
autoconf 소스 다운로드:ftp://ftp.gnu.org/gnu/autoconf/
 
Automake 가 지원 하 는 디 렉 터 리 구조
현재 automake 는 세 가지 디 렉 터 리 차원 을 지원 합 니 다:flat,shallow,deep.
flat(평)는 모든 파일 이 같은 디 렉 터 리 에 있 음 을 말 합 니 다      모든 원본 파일,헤더 파일 및 기타 라 이브 러 리 파일 이 현재 디 렉 터 리 에 있 고 하위 디 렉 터 리 가 없습니다.Termutils 는 바로 이런 종류 다.
shallow(얕 음)는 주요 소스 코드 가 맨 위 디 렉 터 리 에 저장 되 고 다른 각 부분 은 하위 디 렉 터 리 에 저 장 됩 니 다      주요 원본 파일 은 현재 디 렉 터 리 에 있 고,다른 일부 기능 을 실현 하 는 원본 파일 은 각각 다른 디 렉 터 리 에 있 습 니 다.automake 자체 가 이런 부류 다.
deep(깊이)는 모든 소스 코드 가 하위 디 렉 터 리 에 저 장 된 것 을 말한다.맨 위 디 렉 터 리 는 주로 설정 정 보 를 포함 합 니 다이 예 디 렉 터 리 구 조 는 그림 에서 보 듯 이 deep 클래스 에 속 합 니 다.
 1 hello-2.0  2 ├── aclocal.m4  3 ├── AUTHORS  4 ├── autom4te.cache  5 │ ├── output.0  6 │ ├── output.1  7 │ ├── requests  8 │ ├── traces.0  9 │ └── traces.1 10 ├── autoscan.log 11 ├── ChangeLog 12 ├── configure 13 ├── configure.in 14 ├── COPYING -> /usr/share/automake-1.11/COPYING 15 ├── depcomp -> /usr/share/automake-1.11/depcomp 16 ├── home 17 │ ├── li 18 │ │ ├── inc 19 │ │ │ └── li.h 20 │ │ └── src 21 │ │ ├── li.c 22 │ │ ├── Makefile.am 23 │ │ └── Makefile.in 24 │ ├── wang 25 │ │ ├── inc 26 │ │ │ └── wang.h 27 │ │ └── src 28 │ │ ├── Makefile.am 29 │ │ ├── Makefile.in 30 │ │ └── wang.c 31 │ └── zhang 32 │ ├── inc 33 │ │ └── zhang.h 34 │ └── src 35 │ ├── Makefile.am 36 │ ├── Makefile.in 37 │ └── zhang.c 38 ├── INSTALL -> /usr/share/automake-1.11/INSTALL 39 ├── install-sh -> /usr/share/automake-1.11/install-sh 40 ├── main 41 │ ├── main.c 42 │ ├── Makefile.am 43 │ └── Makefile.in 44 ├── Makefile.am 45 ├── Makefile.in 46 ├── missing -> /usr/share/automake-1.11/missing 47 ├── NEWS 48 ├── park 49 │ ├── Makefile.am 50 │ ├── Makefile.in 51 │ ├── public.c 52 │ └── public.h 53 └── README 54 55 13 directories, 39 files

이것 은 기본 적 인 구조 로 비교적 성숙 한 소프트웨어 구 조 를 형성 할 수 있다.
 
예 소개
위의 그림 에서 보 듯 이 이 예 의 구조 적 차원 은 홈 디 렉 터 리 main,홈 디 렉 터 리 home 과 공원 디 렉 터 리 part 가 있 습 니 다.home 에서 성씨 에 따라 세 집 으로 나 뉘 었 습 니 다.li 집,wang 집 과 zhang 집 은 집집마다 똑 같은 구 조 를 가지 고 있 습 니 다.src 와 inc.파 트 는 세 개의 공동 소유 공공 디 렉 터 리 로 세 개의 공용 인터페이스 가 포함 되 어 있다.main 디 렉 터 리 는 실행 입 구 를 저장 하 는 홈 디 렉 터 리 입 니 다.집집마다 한 가지 일 을 하 는데 그것 은 바로 입구(main)에서 한 마디 씩 하 는 것 이다.hello.
 1 int main(void)  2 {  3  4 /* access home li */  5  lisayhello();  6  7 /* access home wang */  8  wangsayhello();  9 10 /* access home zhang */ 11  zhangsayhello(); 12 13 return 0; 14 }

 
순서    
각각 디 렉 터 리 에 Makefile.am 파일 을 만 들 고 편집 합 니 다.
autoconf 와 automake 자동 도 구 를 사용 하여 Makefile 을 생 성 할 때 이 도 구 는 프로젝트 디 렉 터 리 에서 Makefile.am 파일 을 찾 습 니 다.이 파일 이 있 는 디 렉 터 리 에서 해당 Makefile 파일 을 자동 으로 생 성 합 니 다.물론 후기 수 동 으로 추가 할 수도 있 습 니 다.일반적인 생 성 순 서 는:
1>프로젝트 구조 에 따라 Makefile 을 생 성 할 디 렉 터 리 에 Makefile.am 파일 을 만 듭 니 다.
Makefile 을 만 드 는 디 렉 터 리 는 home/li/src/,home/wang/src/,home/zhang/src/와 main/가 있어 야 하기 때문에 모두 4 개의 Makefile.am 파일 을 만들어 야 합 니 다.
2>Makefile.am 파일 을 편집 하고 이 디 렉 터 리 에서 해 야 할 작업 을 지적 합 니 다.예 를 들 어 원본 파일 을 컴 파일 하고 일부 라 이브 러 리 파일 을 연결 하 는 등 입 니 다.
여기에 세 가지 Makefile.am 이 있 는데 현재 전체 프로젝트 디 렉 터 리 에서 이 루어 진 기능 을 분류 하여 소개 합 니 다.  
집 디 렉 터 리 에 있 는 Makefile.am 은 같은 디 렉 터 리 에 있 는 원본 파일 을 컴 파일 하 는 데 사 용 됩 니 다.예 를 들 어 홈/li/src/Makefile.am 을 편집 하면 다음 과 같 습 니 다.
1 noinst_PROGRAMS= li #      2 li_SOURCES= li.c #         3 4 li_LDADD= #             5 li_LDFLAGS= #            6 li_a_LIBADD= #            7 8 DEFS += -D_GNU_SOURCE

다른 두 개의 성씨 목록 과 공원 목록 에 있 는 Makefile.am 파일 을 같은 이치 로 편집 하여 해당 필드 를 교체 하면 됩 니 다.
홈 디 렉 터 리 에 있 는 Makefile.am 은 최종 실행 가능 한 대상 프로그램 을 만 드 는 데 사 용 됩 니 다.홈 디 렉 터 리 에 있 는 성씨 제공 방법 이 필요 합 니 다.다음 편집:
 1 # executable file last created  2  3 noinst_PROGRAMS= hello  4  5 # main entry file  6  7 hello_SOURCES= main.c  8  9 # object file that needed 10 11 OBJECTS= $(top_srcdir)/home/li/src/li.o\ 12 13 $(top_srcdir)/home/zhang/src/zhang.o\ 14 15 $(top_srcdir)/home/wang/src/wang.o 16 17 # load object file when linking 18 19 hello_LDADD= $(OBJECTS) 20 21 # flags of libs 22 23 hello_LDFLAGS= -D_GNU_SOURCE 24 25 DEFS += -D_GNU_SOURCE 26 27 #LIBS= -lpthread

편폭 이 제한 되 어 있 습 니 다.각 줄 의 구체 적 인 의 미 는 관련 문 서 를 직접 보 거나 제 가 제공 한 링크 가 도움 이 될 수 있 습 니 다.
맨 위 디 렉 터 리 Makefile.am 은 automake 도구 에 프로젝트 의 하위 디 렉 터 리 경 로 를 제공 합 니 다.make 에 서 는 automake 가 어떤 디 렉 터 리 에 들 어가 Makefile 을 실행 해 야 하 는 지 알려 주 고 실행 과정 은 SUBDIRS 정의 순서에 따라 이 루어 집 니 다.다음 편집:
 1 SUBDIRS= home/li/src\  2  3 home/zhang/src\  4  5 home/wang/src\  6  7  park\  8  9  main 10 11 # automake need known where it is 12 13 CURRENTPATH= $(shell pwd) 14 15 # head files while linking 16 17 INCLUDES= -I$(CURRENTPATH)/park/include -I$(CURRENTPATH)/home/li/inc -I$(CURRENTPATH)/home/wang/inc -I$(CURRENTPATH)/home/zhang/inc 18 19 export INCLUDES

 
autoscan 명령 을 실행 하여 configure.scan 파일 을 생 성 합 니 다.
 1 # -*- Autoconf -*-  2  3 # Process this file with autoconf to produce a configure script.  4  5 AC_PREREQ([2.68])  6  7 AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])  8  9 AC_CONFIG_SRCDIR([home/zhang/src/zhang.c]) 10 11 AC_CONFIG_HEADERS([config.h]) 12 13 # Checks for programs. 14 15 AC_PROG_CC 16 17 # Checks for libraries. 18 19 # Checks for header files. 20 21 # Checks for typedefs, structures, and compiler characteristics. 22 23 # Checks for library functions. 24 25 AC_CONFIG_FILES([Makefile 26 27 home/li/src/Makefile 28 29 home/wang/src/Makefile 30 31 home/zhang/src/Makefile 32 33 park/Makefile 34 35 main/Makefile]) 36 37 AC_OUTPUT

위의 절 차 를 통 해 알 수 있 듯 이 autoscan 도 구 는 자동 으로 프로젝트 디 렉 터 리 를 찾 습 니 다.하위 디 렉 터 리 를 포함 하여 Makefile.am 이 존재 하 는 디 렉 터 리 에서 만 들 려 는 Makefile 에 프로젝트 경 로 를 표시 합 니 다.물론 필요 에 따라 이 파일 을 지정 할 수 있 습 니 다.다음 과 같 습 니 다.
 
configure.scan 파일 수정
$mv configure.scan configure.in(이전 버 전 은 configure.ac 를 지원 합 니 다.사용 하지 않 았 습 니 다)
다음 부분 을 수정 합 니 다:
 1 AC_CONFIG_SRCDIR([main/main.c]) #       ,            2  3 #AC_CONFIG_HEADERS([config.h])  4  5 AM_INIT_AUTOMAKE("hello", "2.0.0") #            ,             6  7 # Checks for programs.  8  9 AC_PROG_CC 10 11 # Checks for libraries. 12 13 # Checks for header files. 14 15 # Checks for typedefs, structures, and compiler characteristics. 16 17 # Checks for library functions. 18 19 AC_OUTPUT([Makefile 20 21 home/li/src/Makefile 22 23 home/wang/src/Makefile 24 25 home/zhang/src/Makefile 26 27 park/Makefile 28 29 main/Makefile])

 
프로젝트 디 렉 터 리 에 만 들 기:NEWS,README,ChangeLog,AUTHORS
touch NEWS README ChangeLog AUTHORS

 
/usr/share/automace-1X/디 렉 터 리 에 있 는 depcomp 와 copie 파일 을 이 디 렉 터 리 에 복사 합 니 다.
1 cp /usr/share/automake-1.x/depcomp . 2 cp /usr/share/automake-1.x/compile  .

 
aclocal 명령 실행
configure.in 설정 에 따라 aclocal.m4 파일 과 autom4te.cache 디 렉 터 리 를 생 성 합 니 다.
 
autoconf 실행
configure.in 설정 에 따라 설정 스 크 립 트-configure 를 생 성 합 니 다.
 
automake--add-missing 실행
automake 를 실행 하면 각 디 렉 터 리 에 있 는 Makefile.am 에서 make 의 매크로 정의 와 목표 또는 더 많은 파 라 메 터 를 읽 고 이 설정 에 따라 새 파일 인 Makefile.in 을 자동 으로 생 성 합 니 다.예 를 들 어 Makefile.am 에서 생 성 할 대상 파일 을 정의 하 는 동시에 대상 생 성에 필요 한 원본 파일 을 정의 할 수 있 습 니 다.의존 하 는 헤더 파일,대상 파일,대상 라 이브 러 리 등 을 포함 하고 소프트웨어 의 로드 표지 도 지정 할 수 있 습 니 다.
물론 GNU 배포 소프트웨어 기준 에 맞 게 이 명령 을 처음 실행 하면 AUTHORS,ChangeLog,NEWS,README 가 부족 하 다 는 것 을 알려 줍 니 다.이 파일 들 은 편집 할 필요 가 없 으 면 수 동 으로 만 들 수 있 습 니 다.또한,install-sh,missing,INSTALL,COPYING 링크 파일 을 생 성 합 니 다.이 링크 파일 들 은 각각 auto 도구 의 기본 설치 경 로 를 가리 키 고 있 습 니 다./usr/share/automace-1XX/디 렉 터 리 에 있 는 해당 파일 입 니 다.
그 밖 에 가장 중요 한 파일 은 위의 Makefile.in 파일 을 제외 하고 우리 가 필요 로 하 는 configure 파일 을 생 성 하 는 것 입 니 다.
 
배치 하 다.
공사 설치 와 운영 환경 을 설정 하고 이 절 차 를 통 해 공사 에 배치 와 설치 정보 등 을 전달 하고 마지막 으로 Makefile 을 생 성 할 수 있 습 니 다.
 
컴 파일
 Makefile,컴 파일 공정,링크 파일 을 실행 하고 대상 실행 프로그램 을 생 성 합 니 다.
 
문제 탐구
지정 한 install-sh,missing,INSTALL,COPYING 파일 의 링크 오류
이것 은 현재 시스템 에 설 치 된 도구 에 따라 결 정 됩 니 다.이 링크 를 automake 설치 디 렉 터 리 에 있 는 해당 파일 을 다시 가리 키 거나 automake 설치 디 렉 터 리 에 있 는 파일 을 프로젝트 디 렉 터 리 에 복사 할 수 있 습 니 다.그러나 GNU 스타일 의 완전 성 을 고려 하여 복사 절 차 를 실행 하 는 것 을 권장 합 니 다.그러면 재 링크 의 번 거 로 움 을 줄 일 수 있 습 니 다.더욱 중요 한 것 은 링크 처럼 설치 경로 와 버 전에 대한 의존 도가 높 지 않 고 복사 가 영원히 쉬 울 수 있 습 니 다.
 
어떤 이유 로 configure.in 을 수정 했다 면,수정 후 autoconf 명령 을 실행 하지 않 으 면 새로운 configure 가 생 성 되 지 않 습 니 다.
컴 파일 할 때"In function"과 유사 한 것 이 나 타 났 습 니 다.start'의 오류
automake 는 원본 프로그램 이 있 는 디 렉 터 리 마다 Makefile.am 을 만들어 야 한 다 는 것 을 알 고 있 습 니 다.그러나 automake 컴 파일 이 완료 되면 이 도 구 는 링크 과정 을 자동 으로 실행 합 니 다.컴 파일 될 대상 파일 은 같은 이름 의 실행 가능 한 프로그램 으로 자동 으로 연결 되 지만 원본 프로그램 에 지정 한 입구(Linux 에서"main"방법)가 없 기 때문에 링크 를 할 때 입 구 를 찾 을 수 없어 서"링크 오류"가 발생 합 니 다.
수정 방법:이 디 렉 터 리 에 Makefile.in 이 생 성 되 었 습 니 다.편집 은 링크 를 찾 아 실행 하고 차단 합 니 다.예 를 들 어 이 예 에서 home/li/src/Makefile.in 의 189 줄 을 차단 합 니 다.
#   $(li_LINK) $(li_OBJECTS) $(li_LDADD) $(LIBS)
다른 유사 한 문 제 는 모두 똑 같이 처리한다.
 
각 목표 간 의존 처리
컴 파일 할 때 의존 문제 에 부 딪 힐 수 있 습 니 다.의존 문제 란 다음 과 같다.
      A → B
      B → C
      …...
A 는 B 에 의존 하고 B 는 C 에 의존한다 면 목표 A 를 생 성 할 때 B 와 C 를 동시에 A 에 게 알려 야 한다.이 예 에서 목표 hello 를 생 성 할 때 li.o,wang.o,zhang.o 목표 가 필요 하기 때문에 최종 링크 를 할 때 이 목 표를 연결 해 야 합 니 다.
지금 제 가 해결 하지 못 한 문제 가 있 습 니 다.만약 에 목표 파일(최종 실행 가능 한 파일 이 아 닌)을 컴 파일 할 때 위의 의존 관계 가 존재 한다 면 어떻게 처리 합 니까?이 예 에서 프로젝트 의 Park/public.c 파일 입 니 다.만약 에 안의 방송 방법 이 한 집에 호출 된다 면 이 Makefile.am 은 어떻게 씁 니까?
마지막 으로 필요 하거나 어떤 이유 로 Makefile.am 을 수정 했다 면 automake 업데이트 Makefile.in 을 실행 해 야 합 니 다.
 

좋은 웹페이지 즐겨찾기