2012-03-11 4 views
1

우리는 다중 패키지 소프트웨어를 구축하기 위해 automake & autoconf을 사용하고 있습니다. 변수의 값을 어떻게 출력하는지 궁금합니다. 쉘 스크립트를 한 번 사용한 다음 다시 사용하십시오. := 대신 =의 사용 등이 필요 DIRSautomake 변수를 한 번만 평가하십시오

INCLUDES := -I`some-ext-config --incdir` 

여기이 변수가 너무 some-ext-config 만 (AFAIK이 일반 make에서 제공)를 한 번 호출됩니다 한 번 작성합니다. 물론 INCLUDES은 희박한 사촌 인 AM_CPPFLAGS이지만 그 대신에 셸 스크립트가 각 컴파일에 대해 호출되었을 것입니다.

AM_CPPFLAGS 대신 을 사용하면 나를 수용할만한 해결책이 될 수 있습니다 (그러나 이식성 문제가있을 수 있다고 생각하지만). libtool이 라이브러리

libmylib_la_LDFLAGS := `some-ext-config --ldflags` # will always be evaluated 

나는 이러한 외부 도구를 여러 번 호출되지 않습니다 있는지 확인하려면 automake 내부의 일반적인 솔루션은 무엇인가에 대한 LDFLAGS? 나는 우리 패키지가 서브 디렉토리 (일부는 configure.ac)에서 빌드 될 수 있고 최상위 레벨에서 재귀적인 make와 함께 configure.ac을 빌드 할 수 있어야하므로 configure.ac에 명백한 AC_SUBST을 사용하지 않기를 원합니다. 서로 다른 하위 프로젝트에 대해 너무 많이 알 필요가 없습니다.

답변

2

:=은 GNU-make에만 해당하므로 automake에서는 = 만 사용하는 것이 좋습니다. INCLUDES (또는 AM_CPPFLAGS가 중요하지 않을 때마다) 쉘 스크립트를 실행하지 않으려면 configure.ac에서 스크립트를 실행하고 AC_SUBST를 통해 변수 대체를 사용하십시오. 그것은 본질적으로 pkg-config가 할 일이며 - 그것에 대해 말하기 위해, .pc 파일이 있다면 some-ext-config 대신에 이것을 사용할 수 있습니다.

# configure.ac 
libfoo_CPPFLAGS=$(some-ext-config --incdir); 
libfoo_LIBS=$(some-ext-config --libs); 
AC_SUBST([libfoo_CPPFLAGS]) 
AC_SUBST([libfoo_LIBS]) 

# Makefile.am 
AM_CPPFLAGS = -Iwhatever ${libfoo_CPPFLAGS} 
bin_PROGRAMS = foo 
foo_LDADD = ${libfoo_LIBS} 
+0

흠, 필자는 몇 가지 외부적인 이유 때문에 이것을'configure.ac'에 넣는 것을 멀리하고 싶다고 썼다. –

+1

@honk : 그러면 이러한 외부적인 이유 (예 :'AC_CONFIG_SUBDIRS' 사용)를 수정하거나 휴대용 Makefile을 쓰지 않아야합니다. – adl

+0

외부적인 이유는 최상위'Makefile.am'에 서브 디렉토리'Makefile's에'AC_OUTPUT'을 추가 할 수 있기를 원하지만 각 서브 디렉토리에서'configure'를 호출하지 않고 (5 번 만큼 우리의 빌드). 우리는 GNU make에 이식 할 수 있어야합니다.이 automake 변수를 한 번만 채울 방법이 없다는 것을 올바르게 이해합니까? –

0

이것은 jørgensen의 대답에 대한 의견에서 제안한 내용에 대한 더 긴 설명입니다. 당신이 어떤 하위 프로젝트의 configure (서브 configure을 실행하지 않도록

내가 필요한 테스트를 원하는 경우에만 제공 최상위 configure.ac 여러 하위 프로젝트의 메이크 파일을 생성해야 이해하고 수행 이 특정 하위 프로젝트에서 작업).

그런 경우 다양한 configure.ac에서 가능한 한 많은 내용을 복제하지 않으려합니다. 서브 코드 configure의 모든 코드를 고려해보십시오.이 코드는 매크로의 configure 매크로에서 수행해야합니다. m4 매크로. 여기에는 테스트 인 AC_SUBSTSMakefile 선언이 포함됩니다.

예를 들어 one-subproject 만 사용하십시오.

AC_INIT([toplevel], [1.0]) 
AM_INIT_AUTOMAKE([foreign -Werror]) 
SUB1_COMMON([sub1/]) dnl Stuff from the subproject 
AC_CONFIG_FILES([Makefile]) 
AC_OUTPUT 

./Makefile.am으로 : m4/common.m4에 정의 SUB1_COMMON

AC_INIT([sub1], [1.0]) 
AM_INIT_AUTOMAKE([foreign -Werror]) 
AC_CONFIG_MACRO_DIR([m4]) 
SUB1_COMMON 
AC_OUTPUT 

: 지금 여기

ACLOCAL_AMFLAGS = -I sub1/m4 
SUBDIRS = sub1 

하위 프로젝트에 대한 sub1/configure.ac 여기 최상위 ./configure.ac입니다

AC_DEFUN([SUB1_COMMON], 
    [AC_SUBST([PYTHON3LIB], [`pkg-config --libs python3`]) 
    AC_CONFIG_FILES([$1Makefile])]) 

그리고 마지막으로 sub1/Makefile.am은 다음과 같습니다

ACLOCAL_AMFLAGS = -I m4 
# Build something. 
... 

SUB1_COMMON 당신이 두 configure.ac 파일 사이에 공유하고, 적절하게 설정 파일을 재배치 인수 $1을 사용하고자하는 모든 코드를 포함하는. 이 예에서 변수 PYTHON3LIB은 실행 된 configure에 관계없이 정의됩니다.