2011-05-03 6 views
13
로 설치 경로를 얻는 방법 내 프로그램은 내 프로그램이 폴더가 어디 있는지 알 필요로 ./configure --datadir=/somewhere

의 Autoconf : config.h의

에 주어진 어떤 폴더에 설치됩니다 런타임에 일부 파일을로드 할 필요

런타임에는 C 코드가 경로를 문자열로 액세스 할 수 있도록 # 기호를 어딘가에 정의해야합니다.

나는 현재 컴파일러 플래그를 수정하여이 일을하고

가 : configure 스크립트가 이미 다른 것들의 무리와 함께 config.h의 파일을 생성로

AM_CPPFLAGS = -DDATA_PATH=\"$(pkgdatadir)\" 

는 그러나, 나는 기호를 가지고 싶습니다 대신 거기에 나타납니다.

그럴 수 있습니까?

답변

4
AC_DEFINE_UNQUOTED([DATA_PATH], ["$pkgdatadir"]) 

컴파일러 플래그를 수정하는 것이 실제로는 더 일반적인 방법입니다.

+0

감사합니다! '평소'와 같은 방식으로 어떤 이점이 있습니까? 나는 표준을 지키기 위해 모든 노력을 기울 였지만, 단지 더 복잡해 보였다. – Malvineous

+0

장점은 구성 할 때'./configure CPPFLAGS = -DDATA_PATH =/path/to/alternate/data'를 실행하여 CPPFLAGS를 무시할 수 있다는 것입니다. config.h와 함께하기 위해서는'./configure --prefix =/alternate/prefix'가 필요합니다.이 옵션은 다양한 디렉토리의 위치를 ​​덜 제어 할 수있게합니다. – ptomato

6

귀하의 솔루션이 올바른 것입니다. Autoconf/Automake가 (쉽게) 설치 경로를 config.h에 넣는 것을 (쉽게) 지원하지 않는 이유는 이론적으로 빌드시 경로를 무시할 수 있다고 가정하기 때문입니다 (예 : make prefix=/else/where). 이 가능성은 오늘날 다소 모호하지만 그 이유가 있습니다. (이것은 make install prefix=/else/where/과 구별되며, DESTDIR에도 불구하고 여전히 유용합니다.)

6

답변이 가장 선호되는 방법입니다. autoconf 매뉴얼은 "make install"시간에 다양한 변수를 오버라이드 (override)하는 법을 설명합니다 (예를 들어 패키징에 매우 유용합니다).

A corollary is that you should not use these variables except in 
makefiles. For instance, instead of trying to evaluate `datadir' in 
`configure' and hard-coding it in makefiles using e.g., 
`AC_DEFINE_UNQUOTED([DATADIR], ["$datadir"], [Data directory.])', you 
should add `-DDATADIR='$(datadir)'' to your makefile's definition of 
`CPPFLAGS' (`AM_CPPFLAGS' if you are also using Automake). 

autotools를하고, 일반적으로 시스템을 구축 뒤얽힌 사업이며, 아무도 아직 일을하는 좋은 깔끔한 방법을 마련하지 않았다 : 이렇게 그것은 (설치 디렉토리 변수 "섹션에서) 말한다 일반적으로, 우리는이 부분을 읽고 완전히 풀어야한다는 것을 의미합니다. 어떤 경우에 당신의 직감은 정확합니다!

1

당신이 알고 있어야하는 그런 일련의 경로가 있다면 (예 : -DPATH1 =/path/to/something -DPATH2 =/path2/to/something2 -DPATH3 =/path3/to/something3 ... ad infinitum)을 사용하여 컴파일에서 과도한 잡음을 피하려면 어떤 사람들에게는 바람직 할 수있는 대안이 예를 들어, 라인

#define PATH1 "@[email protected]" 
#define PATH2 "@[email protected]" 
#define PATH3 "@[email protected]" 

와 함께, 새로운 "mynewheader.h.in"를 작성하고 configure.ac의 AC_CONFIG_FILES 라인에 추가 :

AC_CONFIG_FILES([Makefile mynewheader.h]) 
관련 문제