2017-10-21 2 views
1

패키지/lib _SOURCES 또는 패키지/lib 플래그 (CFLAGS, LDFLAGS, LDADD 등)를 조건부로 설정하는 경우 패키지의 플래그에 조건부로 추가하는 것이 좋습니다 , 예를 들면 :소스/플래그/libs에 대한 Automake 조건부 추가 또는 변수 할당

bin_PPROGRAMS = mypkg 
mypkg_SOURCES = mypkg.c 
if OS1 
mypkg_SOURCES += os1.c 
else 
if OS2 
mypkg_SOURCES += os2.c 
endif 
endif 

또는 조건부 변수를 할당하고 (여부 인구는 null) 패키지의 플래그로 그들 모두를 연결하는, 예를 들면 : 나는 그것을 두 가지를 보이고했습니다

if OS1 
os1_src = os1.c 
else 
if OS2 
os2_src = os2.c 
endif 
endif 

bin_PROGRAMS = mypkg 
mypkg_SOURCES = mypkg.c $(os1_src) $(os2_src) 

내가 볼 수 있습니다 각각에 이점. 전자의 경우 패키지에 플래그를 추가하는 실제 최종 조치는 조건부에서 명확하며 주어진 빌드에서 실제로는 의미가없는 변수를 사용하여 라인을 복잡하게 만들지 않았습니다. 후자의 경우 실제로 패키지에 포함 된 내용은 한 줄로 통합되어 보이지 않는 추가 기능은 다른 곳에서 발생하지 않지만 불투명 한 변수 이름에서 어떤 일이 벌어지고 있는지 실제로 알지 못할 수 있습니다.

또 다른 옵션은 옵션 2와 같은 일을하는 것이지만 변수를 configure 스크립트 (AC_SUBST를 사용하여 configure.ac)에 할당하는 것입니다. 하지만 필자는 구성 스크립트를 순수하게 사용 가능한 기능을 탐지하고 Makefile에서 사용할 옵션을 선택하여 유지하고 있습니다.

그들 중 한 명이 기술 단점이나 불쾌한 부작용이 있습니까?

답변

1

관찰 된 차이점은 크게 주관적이며 크게 주제와는 다른 스타일의 문제입니다. 하지만 실제 질문은 꽤 객관적입니다 :

그들 중 하나는 기술 단점이나 불쾌한 부작용이 있습니까?

아니요, 어느 누구도 알고 있습니다. 어느 방법이든 적어도 별개로 잘 작동합니다. 문맥이 커질수록 두 개 이상의 목표와 함께 변수를 재사용하는 것과 같은 두 번째 접근법의 변형을 선호 할 수 있습니다. 그러나 소스 파일을 선택하는 것보다 전 처리기 또는 링크 옵션의 경우가 더 가능성이 높습니다.


개인적으로, 나는 당신이 약간 다르게 발표 한 특별한 경우 구조 것이다 :

if OS1 
os_src = os1.c 
else 
if OS2 
os_src = os2.c 
endif 
endif 

bin_PROGRAMS = mypkg 
mypkg_SOURCES = mypkg.c $(os_src) 

확인하려면,이 스타일의 문제입니다, 그래서 당신에게 가치가 무엇 이건 받아 . 여기서 변수의 사용법은 조건의 구조와 일치합니다. OS1OS2대안 인이므로 두 변수 사이에서 변수 하나만을 제어합니다. 따라서 변수의 의미는 값이 설정된 지점과 사용 된 지점에서 모두 명확합니다.

여러 개의 변수가 서로 다른 관련이없는 여러 조건에 더 적합합니다.

+0

이것은 완벽한 대답입니다. 감사합니다. 많은 옵션 중 하나에 의해 제공되는 자산이 있으면 단일 변수로 나타냅니다. –

1

내가 좀 더 일반적인 패턴을 추가합니다 :

os1_src = os1.c 
os2_src = os2.c 
if OS1 
    myos = os1 
endif 
if OS2 
    myos = os12 
endif 

mypkg_SOURCES = mypkg.c $($(myos)_src) 

다른 :

경우 OS1 OS1 = 예 OS2 = 아니오 ENDIF 경우 OS2 OS1 = 아니오 이 OS2 = 예 ENDIF를 $ (os1) src = os1.c $ (os2) src = os2.c

mypkg_SOURCES = mypkg.c $(yessrc) 

os- 또는 프로세서 - 또는 configuratipn 특정 빌드 플래그를 제공하는 데 동일한 접근 방식을 사용할 수 있습니다. 흔히 하나 이상의 모듈에 사용되는 공통 설정이 있고 다른 플래그는 모듈마다 다릅니다.

각 접근법은 오용 될 수 있으며 불쾌한 결과를 초래할 수 있습니다.

하나의 모듈에 대한 플래그 또는 설정이 제대로 재설정되지 않고 다른 모듈에 대한 일부 설정이 실수로 '유출'될 위험이 있습니다. 그러나 또한 일부 모듈은 공통 플래그를 놓칠 수 있습니다.

이러한 위험을 줄이려면 빌드에 많은 모듈이 포함되어 있어도 동일한 기법을 고수하십시오.