2012-04-18 2 views
3

필자는 필자의 autotools 저장소에 서브 패키지 설정을 가지고 있는데, 여기에는 마스터 configure.ac와 Makefile.am을 사용하여 몇 개의 관련 프로젝트가 함께 붙어있다.하위 패키지 설정에서 automake 변수를 전파하려면 어떻게해야합니까?

컴파일 순서와는 달리 AC_CONFIG_SUBDIRS() 매크로를 통해 쉽게 수행 할 수 있으므로 지나치게 결합 된 하위 프로젝트간에 필요한 헤더와 라이브러리 위치를 내 보내야합니다.

--- configure.ac 
|- Makefile.am 
|- subproj1 --- configure.ac 
|   |- Makefile.am 
|   |- src 
|   \- include 
[...] 
| 
\- subprojN --- configure.ac // requires -I${top_srcdir}/subprojX/include and 
       |- Makefile.am // -L${top_srcdir}/subprojX/src 
       |- src 
       \- include 

이러한 패키지를 하나의 옵션으로 재 그룹화하는 것은 불행한 일입니다. AC_SUBST() 및/또는 make의 내보내기 명령을 사용하여 변수를 내보내려고했지만 아무 쓸모가 없습니다.

모든 하위 프로젝트 Makefile에서 이러한 플래그를 사용할 수있는 유일한 방법은 CPPFLAGS 및 LDFLAGS를 루트 구성 호출에 전달하는 것입니다 (명령 줄을 통해). 그러나 autotools 물건 안에 이러한 값을 유지하는 방법이 있다면 대신 별도의 스크립트를 만들어야 할 필요는 없습니다.

PS : automake and project dependencies

+0

관련 외부 [질문] (http://old.nabble.com/sub-package-tt28680783.html#a28680783). – milton

답변

2

autotools는 패키지 관리 시스템이되도록 설계되지는 않았으므로 사용하기가 어렵지만 하위 프로젝트의 빌드 트리 외부에서 상대 경로를 참조 할 수 있습니다. 즉, subprojN/Makefile.am에서, 당신은 추가 할 수 있습니다 subprojN/구성이 libsubprojX를 찾으려고하면 대신 구성을 위해 CPPFLAGS와 LDFLAGS에 ../subprojX/{include,lib}을 추가하지 않으면

AM_CPPFLAGS = -I$(srcdir)/../subprojX/include 
AM_LDFLAGS = -L$(srcdir)/../subprojX/lib 

을이 시나리오에서는 실패합니다 , 이는 configure.ac에서 수행 할 수 있습니다 : 하위 프로젝트의 구성 스크립트가 결합 된 하위 프로젝트의 라이브러리에 대한 확인되지 않은

CPPFLAGS="$CPPFLAGS -I${srcdir}/../subprojX/include 
LDFLAGS="$LDFLAGS -L${srcdir}/../subprojX/lib" 

경우, 아마를 얻을 수 Makefile.am에서 LDADD을 지정 청소기 것 필요한 도서관이 연결되어 있습니다.

+0

-L 플래그는'$ srcdir'보다는'$ builddir'을 참조해야한다고 제안되어 왔으며, 나는 그 생각에 대해 약간의 경향이 있습니다. 그러나, configure 스크립트는 빌드되기 전에 builddir의 것을 사용하려고하기 때문에 이것은 실제로 작동하지 않을 것입니다. 물론 같은 인자에 의해 configure 스크립트는 아직 존재하지 않을 수있는 srcdir에있는 라이브러리와 연결을 시도 할 것입니다. 그래서 자동 관리 도구가 패키지 관리 시스템으로 사용되어서는 안됩니다./usr/local에 종속물을 설치하고 이러한 문제에 대해 걱정하지 마라! –

0

CPPFLAGS와 LDFLAGS와 유사한 거의 명령 행 (개인 의견)에 직접 전달해서는 안하지만 config.site에 설정해야합니다. 할당을 $ {prefix} /share/config.site 또는 $ CONFIG_SITE (즉, $ HOME/config.site 파일에서)로 지정하고 configure를 실행하는 환경에서 CONFIG_SITE = $ HOME/config.site를 설정하십시오. 이 스크립트는 모든 구성 호출에 의해 제공됩니다. 나는 당신이 "autotool stuff 안에이 값들을 유지하라"는 것이 정확히 무엇인지 모르겠다.하지만 config.site를 사용하는 것은 그것을 만족시킨다. LDFLAGS와 CPPFLAGS는 configure 스크립트에 라이브러리의 비표준 위치를 알려주는 올바른 메커니즘이므로이를 사용하지 않는 모든 솔루션은 autotools의 일반적인 범위 밖에 있습니다. (물론 가장 좋은 해결책은 라이브러리를 표준 위치에 설치하여 툴체인이 별도의 노력없이 찾을 수 있도록하는 것입니다. gcc를 사용하고 LIBRARY_PATH 및 CPATH를 설정할 수 있습니다.

+0

config.site는 좋지만, 동일한 구성 요소를 작성해야하는 다른 사람들에게 보내야합니다. – milton

+0

autotools 안에 물건을 두어두면 configure.ac와 Makefile.am을 만들 필요가 없습니다. autogen.sh 스크립트가 필수 플래그를 전달하는 것과 같습니다. – milton

+0

@ milton - 아니요, 사람들에게 배송 할 필요가 없습니다. 사용자가 자신의 시스템을 사용하는 방법을 알고 있다고 가정합니다. 표준 위치에 라이브러리를 설치하면 아무 것도 할 필요가 없습니다. 비표준 위치에 설치하는 경우 구성 스크립트에이를 알리고 표준 방법은 LDFLAGS/CPPFLAGS를 통해 이루어집니다. 관리자가 당신 상황에서 할 일은 아무것도 없습니다! –