autoconf와 automake 사용시 object화일이 만들어지지가 않네요

ehacker의 이미지

autoconf 와 automake을 사용하여 패키지를 만들려고 합니다.
autoconf version 은 2.57 이고 automake version은 1.7.2 입니다.

순서는 다음과 같은 순서로 하였습니다.
1.configure.ac 파일을 만들고
2.aclocal
3.autoheader
4.autoconf
5.automake
6../configure
7.make

문제는 7번 make 할때 제대로 object화일이 만들어지지 않습니다.

make all-recursive
make[1]: Entering directory `/home/ehacker/becamp/common/sms/JDAnalyzer-auto'
Making all in lib
make[2]: Entering directory `/home/ehacker/becamp/common/sms/JDAnalyzer-auto/lib'
source='CAnalyzer.cpp' object='CAnalyzer.o' libtool=no \
depfile='.deps/CAnalyzer.Po' tmpdepfile='.deps/CAnalyzer.TPo' \
depmode=none /bin/bash ../depcomp \
g++ -DHAVE_CONFIG_H -I. -I. -I.. -g -O2 -c -o CAnalyzer.o `test -f 'CAnalyzer.cpp' || echo './'`CAnalyzer.cpp
source='DecodePacket.cpp' object='DecodePacket.o' libtool=no \
depfile='.deps/DecodePacket.Po' tmpdepfile='.deps/DecodePacket.TPo' \
depmode=none /bin/bash ../depcomp \
g++ -DHAVE_CONFIG_H -I. -I. -I.. -g -O2 -c -o DecodePacket.o `test -f 'DecodePacket.cpp' || echo './'`DecodePacket.cpp
source='RawPacket.cpp' object='RawPacket.o' libtool=no \
depfile='.deps/RawPacket.Po' tmpdepfile='.deps/RawPacket.TPo' \
depmode=none /bin/bash ../depcomp \
g++ -DHAVE_CONFIG_H -I. -I. -I.. -g -O2 -c -o RawPacket.o `test -f 'RawPacket.cpp' || echo './'`RawPacket.cpp
rm -f libanalyzer.a
ar cru libanalyzer.a CAnalyzer.o DecodePacket.o RawPacket.o
ar: CAnalyzer.o: No such file or directory
make[2]: *** [libanalyzer.a] Error 1
make[2]: Leaving directory `/home/ehacker/becamp/common/sms/JDAnalyzer-auto/lib'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/ehacker/becamp/common/sms/JDAnalyzer-auto'
make: *** [all] Error 2

왜 object 화일이 안만들어질까요?... ㅠ.ㅠ

하지만 또 따로 lib 디렉토리로 가서 다음과 같이 하면 object화일이 만들어집니다.
g++ -DHAVE_CONFIG_H -I. -I. -I.. -g -O2 -c -o CAnalyzer.o `test -f 'CAnalyzer.cpp' || echo './'`CAnalyzer.cpp
또는
source='CAnalyzer.cpp' object='CAnalyzer.o' libtool=no depfile='.deps/CAnalyzer.Po' tmpdepfile='.deps/CAnalyzer.TPo' depmode=none g++ -DHAVE_CONFIG_H -I. -I. -I.. -g -O2 -c -o CAnalyzer.o `test -f 'CAnalyzer.cpp' || echo './'`CAnalyzer.cpp
이렇게 하면 object화일이 만들어집니다.

하지만 "/bin/bash ../depcomp" 을 중간에 삽입되면 object 화일들이 안되는군요..

미리 답변 감사합니다.

다음 제 디렉토리 구조및 중요파일의 설정값 내용입니다.

현재 저의 디렉토리는 deep 구조이고 디렉토리는 src와 lib 입니다.

AUTHORS CVS INSTALL NEWS TODO clean depcomp lib mkinstalldirs
COPYING ChangeLog Makefile.am README auto configure.ac install-sh missing src

다음은 최상위 디렉토리의 configure.ac 내용입니다.
----- configure.ac -----
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.57)
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR([src/CAnalyzer_test.cpp])
AC_CONFIG_HEADER([config.h])
AM_INIT_AUTOMAKE(ehacker, 1.0)

# Checks for programs.
AC_PROG_CXX
AC_PROG_CC
AC_PROG_RANLIB

# Checks for libraries.
# FIXME: Replace `main' with a function in `-lnsl':
AC_CHECK_LIB([nsl], [main])
# FIXME: Replace `main' with a function in `-lpcap':
AC_CHECK_LIB([pcap], [main])
# FIXME: Replace `main' with a function in `-lpthread':
AC_CHECK_LIB([pthread], [main])
# FIXME: Replace `main' with a function in `-lsocket':
AC_CHECK_LIB([socket], [main])

# Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS([arpa/inet.h netdb.h netinet/in.h stdlib.h string.h strings.h sys/socket.h sys/timeb.h unistd.h])

# Checks for typedefs, structures, and compiler characteristics.
AC_HEADER_STDBOOL
AC_C_CONST
AC_C_INLINE
AC_HEADER_TIME

# Checks for library functions.
AC_FUNC_MALLOC
AC_FUNC_SELECT_ARGTYPES
AC_TYPE_SIGNAL
AC_CHECK_FUNCS([bzero ftime gethostbyname gethostname gettimeofday inet_ntoa memset select socket strdup strstr])

AC_CONFIG_FILES([Makefile
lib/Makefile
src/Makefile])
AC_OUTPUT

-----------------

다음은 최상위 디렉토리의 Makefile.am 파일내용입니다.

----- Makefile.am -----
SUBDIRS = lib src
-----------------------

src 디렉토리의 Makefile.am 의 내용입니다.
------------------------- ./src/Makefile.am -----------
bin_PROGRAMS=test
test_SOURCES=CAnalyzer_test.cpp
noinst_HEADERS=CAnalyzer_Def.h CAnalyzer.h
LDADD=../lib/libanalyzer.a -lpthread -lpcap -lsocket -lnsl
-------------------------------------------------------

lib 디렉토리의 Makefile.am의 내용입니다.
------ ./lib/Makefile.am -----
noinst_LIBRARIES=libanalyzer.a
libanalyzer_a_SOURCES=CAnalyzer.cpp DecodePacket.cpp RawPacket.cpp
noinst_HEADERS=CAnalyzer.h CAnalyzer_Def.h DecodePacket.h Packet_Def.h RawPacket.h
------------------------------

pynoos의 이미지

도움이 안될 것 같지만... 혹 추측해보시라고...

source='CAnalyzer.cpp' object='CAnalyzer.o' libtool=no \ 
depfile='.deps/CAnalyzer.Po' tmpdepfile='.deps/CAnalyzer.TPo' \ 
depmode=none /bin/bash ../depcomp \ 
g++ -DHAVE_CONFIG_H -I. -I. -I.. -g -O2 -c -o CAnalyzer.o `test -f 'CAnalyzer.cpp' || echo './'`CAnalyzer.cpp 

요렇게 쓰이는 것은 사실...

source='CAnalyzer.cpp' object='CAnalyzer.o' libtool=no \ 
depfile='.deps/CAnalyzer.Po' tmpdepfile='.deps/CAnalyzer.TPo' \ 
depmode=none /bin/bash ../depcomp \ 

이 것과 아래의

g++ -DHAVE_CONFIG_H -I. -I. -I.. -g -O2 -c -o CAnalyzer.o `test -f 'CAnalyzer.cpp' || echo './'`CAnalyzer.cpp 

요걸로 나뉩니다.

depcomp 라는 놈은 source로 부터 object를 만드는데 있어서
source가 include하고 있는 녀석들의 list 를 tmpdepfile 안에 만들고
하나라도 변하면 depcomp 뒤의 명령을 실행하도록 되어 있습니다.

보통 sh 에서는

ENV1=value1 ENV2=value2 ENV3=value3 command arg1 arg2

형태의 명령을 사용할 수 있지요.. 앞에 오는 놈이 = 으로 된 environment setting인지를 보고 command에 넘길 때, 임시로 환경변수를 만들어 넘깁니다.

문제가 되는 것은 depcomp를 사용하지 않으면 object를 만드는데,
사용하면 만들지 않는다로 해석되구요... 따라서 depcomp에 문제가 있는 것 같습니다.

어떤 OS인지 잘 모르겠지만, mode가 잘못되거나, mtime 값이 제대로 비교가 안되는 상황이 발생하는 것인가 보군요...

automake -a -c -f 로 depmode를 다시 설치하는 것은 어떨까요?

ehacker의 이미지

답변을 주셔서 넘 감사합니다..

근데.. 글중에서. 궁금한것이 있어서요..

처음에 automake 하면 depcomp가 없다고 메세지가 나와서
최상위 디렉토리에 touch depcomp 으로 화일을 만들어는데.

automake -a -c -f 명령으로 depcomp을 만든것인가 봐요..
처음 알았어요..

그럼 다음과 같은 순서로 패키지를 만드나요?

1.configure.ac 파일을 만들고
2.aclocal
3.autoheader
4.autoconf
5.automake -a -c -f
6.automake
7../configure
8.make

실제로 이렇게 하니까 잘 되네요.. ^^;
다시 한번 답변 감사드립니다.

pynoos의 이미지

1. autoscan
2. mv configure.scan configure.ac
3. autoheader
4. vi configure.ac
5. vi Makefile.am
6. automake -a -c
7. vi configure.ac
8. autoconf
9. ./configure

대충 써봤는데, 반드시 위와 같은 순서는 아닙니다.

automake -a -c 같은 경우는 전체중에 한번만 하면되는 일입니다.
configure.ac 를 두번 수정하는데, 실은 훨씬 많이 수정하지요.
처음에는 PACKAGE 관련 변수 설정..
다음에는 automake 관련 macro 수정..
그 뒤로는 check 하는 macro 집어 넣는데 사용하지요....

사실.. autoconf는 automake를 모른다고 해도 과언이 아닙니다.
autoconf는 단지 local directory에서는 aclocal.m4 Makefile.in 을 이용할 뿐이지요.

aclocal.m4 와 Makefile.in 을 automake가 만들어 줌으로써, autoconf가
간접적으로 automake를 사용하는 것입니다.
aclocal.m4 에는 원래의 autoconf가 사용하는 macro를 확장한 것과 automake에 추가되는 것들이 들어가게 됩니다.

ehacker의 이미지

^^;

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.