2014-12-24 3 views
1

내 Makefile에 컴퓨터에 설치되어있는 경우에만 라이브러리에 링크하려고합니다.Makefile의 조건부 연결

이런 식으로 뭔가를 할 어쨌든 거기 : 그래서, 예를 들어 라이브러리는 다음 작업을 수행 할 싶어 hwloc 경우? 즉, 특정 라이브러리가 설치되어 있는지 확인하고이를 Makefile의 조건으로 사용할 수 있습니까? 메이크 파일에서 실행

xfoo : foo.o 
    if (hwloc installed); then gcc foo.o -o [email protected] -lhwloc; else gcc foo.o -o [email protected]; fi 

명령 그냥 간단한 단일 명령 될 필요가 없습니다 :

+0

사용 모델을 이해할 수 없습니다. 컴퓨터에 heloc이 설치되어 있지 않습니다. 어떤 엔티티가 "참조 된"기호를 해결할 것입니까? –

+0

참조 된 기호는 전 처리기를 사용하여 비활성화됩니다. 따라서 foo.o는 두 경우 모두 동일하지 않습니다. 짧은 예제에서 오해해서 죄송합니다. – Rakib

+0

고려해야 할 또 다른 가치는 사용자가 Makefile의 맨 위에 간단한 변수를 사용하여 hwloc을 연결하려는 경우/방법을 구성하도록하는 것입니다. –

답변

1

다음은 잘못된 대답. 쉘이 실행할 수있는 모든 것은 Makefile에서 호출 할 수 있습니다. 한 줄에 전체 스크립트를 포함합니다.

여기가 올바른 대답입니다.

그러나 위의 방법은 잘못된 것입니다. 많은 무료 소프트웨어 패키지가 항상 이런 종류의 일을한다는 것을 알게 될 것입니다 : 라이브러리에 조건부로 링크 (사용 가능한 경우).

하지만 완료하려면 make를 실행하기 전에 별도의 configure 스크립트를 실행해야합니다. 소스 tarball을 원하는 임의의 자유 소프트웨어 패키지로 가져 와서 설치 지침을 읽으십시오. 그들은 make을 실행하기 전에 configure 스크립트를 먼저 실행하도록 알려줍니다.

대부분의 자유 소프트웨어 패키지는 GNU 도구 체인을 사용하여 빌드 시스템 (configure 스크립트 및 Makefile)을 만듭니다. GNU 툴체인은 autoconfautomake 도구로 구성되어 있습니다 (많은 경우 libtool). 자세한 내용은 Google로 이동하십시오.

덜 인기있는 툴체인이 많이 있지만, GNU 툴체인이 이런 종류의 일에 가장 자주 사용됩니다. 그래서, 당신이 뭘 하려는지의 라인을 따라 뭔가를이 일반적으로 수행됩니다 방법은 다음과 같습니다

configure.ac 파일에서

다음 Makefile.am 파일에서

AC_CHECK_LIB(hwloc,some_function_in_the_hwloc_library,[LINK_HWLOC=-lhwloc]) 
AC_SUBST(LINK_HWLOC) 

:

[email protected][email protected] 

그게 전부입니다. 이것이 바로 대부분의 자유 소프트웨어 패키지가 똑같은 일을 할 필요가있는 셀 수없이 많은 횟수로 수행되는 방식입니다. autoconfautomake은 쉘 스크립트와 makefile을 작성하는데 도움을 줄 것입니다.

0

autotools/etc에 관여하고 싶지 않은 경우. 이것을 위해 (합리적인 해결책은 합리적인 것이지만이 간단한 것을 피하기 위해 합리적입니다.) 사람들은이 hwloc 라이브러리가 설치되어 있거나 없을 수도있는 곳을 추측하여 게임을하고 싶지는 않습니다. 사람들이 수동으로 기능을 켜도록하는 것입니다.

3 개의 (또는 4 개의) make 변수를 사용하십시오. USE_HWLOC, HWLOC_LDLIBS, HWLOC_CFLAGS 및 가능하면 HWLOC_LDFLAGS.

그런 다음 USE_HWLOC이 정의되면 라이브러리와 연결하고 다른 3 개의 변수도 사용합니다.

ifdef USE_HWLOC 
HWLOC:=-lhwloc 
else 
HWLOC:= 
HWLOC_LDLIBS:= 
HWLOC_LDFLAGS:= 
HWLOC_CFLAGS:= 
endif 

xfoo : foo.o 
    gcc foo.o -o [email protected] $(HWLOC_LDLIBS) $(HWLOC) 
1

리눅스 컴퓨터에 액세스 할 수 없으므로 내 대답이 테스트되지 않습니다.

저는 전임자와 정중하게 의견이 다를 것입니다.

먼저 autotools를 사용하여 기존 Makefile을 수정하는 것은 좋지 않습니다. Autotools는 간단한 유스 케이스에서 좋은 Makefile을 만드는 것에 대한 걱정을 피하기 위해 만들어졌다. OP는 "어떻게 내 파이썬 스크립트에서 -+을 변경하려면"질문과 대답이었다 할 이유

두 번째 대답은, "스크립트를 수정 임시 파일에 저장하고 파일을 실행하는 쉘 스크립트를 작성"그것은 마치입니다 자동으로 고통없이 수행 할 수있는 경우 수동으로 수행해야 할 작업이 있습니까?

xfoo: foo.o $(wildcard libhwloc.a) 
    gcc $(patsubst lib%.a, -l%, $^) -o [email protected] 

참고 :

그래서 정답은 IMHO,이 $(wildcard)에 대한 정확한 사용 사례는 라이브러리 설치 여부를 미리 있지만 하지는 빌드하는 동안 만들 수있다.

+0

이것이 어떻게 작동하는지 설명해 주시겠습니까? 나는 $ (와일드 카드)에 익숙하지 않다. 그리고 네. 이 빌드 전에 라이브러리가 설치되었는지 여부. – Rakib

+0

@Rakib 죄송합니다. 제발 기분을 상하게하지 말고, 이제 와일드 카드와 팻 서브 트랩이 어떻게 작동하는지 매뉴얼을 읽어야합니다. –

+0

오. 괜찮아. 나는 그것을 시도 할 것이다. 감사. – Rakib