2017-11-10 16 views
1

매우 구체적인 문제가 있습니다. Python 패키지 (egg)를 배포하고 개발자의 삶을 편하게하기 위해 노력하고 있습니다. Makefile을 개발했습니다.Makefile에서 필수 구성 요소의 전제 조건을 무시합니다.

내 배포판에는 코드 (Python 소스 파일)가 포함되어 있고 일부에는 Dokumentation (HTML, PDF, ...)이 포함되어 있습니다.

따라서, 내 Makefile 이러한 목표를 가지고 :

doc/admin/html: doc/admin/src/* 
    echo "Build the HTML doc..." 

doc/admin/pdf: doc/admin/src/* 
    echo "Build the PDF doc..." 

doc: doc/admin/html doc/admin/pdf 

$(PACKAGE).egg: doc/admin/html doc/admin/pdf src/* 
    echo "Build the egg..." 

egg: $(PACKAGE).egg 

이 지금까지 잘 작동합니다. 개발자가 소스 파일이나 문서를 변경하자마자 doc 대상 및/또는 egg 대상이있는 전체 배포판을 사용하여 문서를 다시 작성할 수 있습니다.

이제 내 문제 : 배포판을 테스트하기 위해 다른 대상이 test_egg 있습니다. 내 현재 대상이 정의를 다음과 같이

test_egg: $(PACKAGE).egg 
    echo "Test the egg..." 

이 타겟은 개발자와 CI에서 하나를 수행한다. 문제 : CI 중에 $(PACKAGE).egg 파일이 다른 작업에 의해 빌드 된 다음 테스트 환경으로 전송됩니다 (gitlab-ci를 사용하고 있습니다). 따라서이 테스트 환경에서는 $(PACKAGE).egg이 있지만 설명서의 경우 doc/admin/htmldoc/admin/pdf 폴더는 존재하지 않습니다. 그들은이 달걀을위한 중간 파일 일 뿐이므로이 타겟을 필요로하지 않습니다.

내 질문은 다음과 같습니다 test_egg 대상을 정의하여 을 실행하고 $(PACKAGE).egg이있을 때 문서를 다시 작성하지 않으려면 어떻게해야합니까?

doc/admin/* 폴더를 INTERMEDIATE으로 정의 할 수 있지만 개발자가 doc 대상을 사용하여 문서를 작성하지 못하게합니다.

도움을 주시면 감사하겠습니다.

답변

0

test_egg의 전제 조건으로 $(PACKAGE).egg을 선언하지 않는 것이 가장 좋습니다. 이를 수행하는 방법은 여러 가지가 있습니다.

  1. 당신은 test_egg에 대해 서로 다른 조리법을 인스턴스화하는 조건문을 사용할 수 있습니다

    test_egg: 
    ifeq ($(wildcard $(PACKAGE).egg),) 
        $(error Ooops!) 
    else 
        echo "Test the egg..." 
    endif 
    
  2. 당신은 조리법에 메이크업 if 기능을 사용할 수 있습니다 :

    test_egg: 
        $(if $(wildcard $(PACKAGE).egg),,$(error Ooops!)) 
        echo "Test the egg..." 
    
  3. 당신은을 사용할 수 있습니다 쉘의 조건 :

    $(PACKAGE).egg이 존재하지 않을 경우 모든 경우에

,의 test_egg 목표는 오류 메시지와 함께 실패합니다. $(PACKAGE).egg이있는 경우 test_egg 목표가 실행되지만 $(PACKAGE).egg은 오래된 경우에도 업데이트되지 않습니다.사용

예 : 힌트

$ cat Makefile 
PACKAGE = foo 
$(PACKAGE).egg: a b 
    @echo "Making [email protected]" 
    @touch [email protected] 
a b: 
    @touch [email protected] 
.PHONY: test_egg 
test_egg: 
ifeq ($(wildcard $(PACKAGE).egg),) 
    $(error $(PACKAGE).egg not found, please build it first) 
else 
    @echo "Test the egg..." 
endif 
$ make test_egg 
Makefile:10: *** foo.egg not found, please build it first. Stop. 
$ make foo.egg 
Making foo.egg... 
$ make test_egg 
Test the egg... 
$ touch a b 
$ make test_egg 
Test the egg... 
+0

감사합니다,하지만이 작동하지 않습니다. 어쨌든 계란을 재건할지 여부를 확인 중입니다 ..'대상 파일 'test_egg'을 고려하십시오. 'test_egg'파일이 없습니다. 대상 파일 'cs.erp-10.1.1-py2.7.egg'고려 중. 대상 파일 'doc/admin/html'을 고려하십시오. –

+0

개발자가 알을 만들기 위해 리버브해야하는 방법 중 하나로서 난 알에 대한 종속성을 제거했습니다. 이 목표는 CI를위한 것이며, CI에서 나는 계란이 있다는 것을 알고 있으며 그렇지 않다면 나는 그것을 실패하고 싶습니다.하지만 여전히 고마워요! 이것이 다른 사람들을위한 올바른 답변 일 수 있으므로 대답을 수락 할 것입니다. –

+0

맞습니다. 문제를 충분히 이해하지 못했고 주문에만 필요한 전제 조건이 필요하지 않습니다. 필요에 따라 다시 빌드되지만, 이것에 의존하는 대상도 다시 빌드되지 않습니다. 당신이 필요로하는 것이 아닙니다. 내 대답을 더 나은 옵션으로 수정했습니다. –