2009-08-19 6 views
3

외부 소스의 일부 리소스에 액세스하는 Makefile을 업데이트합니다. 즉, 무제한 리소스에 대해 예상대로 작동하는설정되지 않은 경우 콘솔에서 Makefile 변수 읽기

$(External)/% : 
    cvs up [email protected] 

... 형식의 규칙이 있습니다. 이제는 기능 편차가 있었고 외부 리소스에는 더 복잡한 로그인이 필요하므로 규칙이 다음과 같이 너무 많이 변경되지 않았습니다.

$(External)/% : 
    cvs -d :pserver:$(CVSUSER)@cvs-server up [email protected] 

... 규칙에 변수가 종속되어 있습니다. CVSUSER. 이것을 실행하는 빠르고 쉬운 방법은 정의되지 않은 경우 유용한 오류 메시지로 중단하는 것입니다. 그러나 그것은 재미가 아닙니다. 변수 CVSUSER를 필요로 할 때까지 콘솔에서 읽으 려합니다. 나는 순진하게

CVSUSER ?= $(shell read -p "User name: ") 

을 시도했지만 분명히 작동하지 않습니다.

답변

1

아 물론 당연히 재귀 변수가 필요합니다. 그런 식으로 변수를 자체에 의존하게하고 일반 Make 유틸리티를 사용하여 조건부로 변수를 설정할 수 있습니다. 조건부 할당은 암시 적으로 일반 (재귀) 하나 만들고, 그래서 내가해야 하나

CVSUSER := $(shell if [ -z $(CVSUSER) ] ; then read -p "User name: " REPLY ; echo $$REPLY ; fi) 

또는

ifndef CVSUSER 
    CVSUSER := $(shell then read -p "User name: " REPLY ; echo $$REPLY ; fi) 
endif 
3

$(shell) 셸 명령의 출력을 가져옵니다. 그러나 read은 변수 (기본값으로 REPLY)의 입력을 읽고 출력하지 않습니다. 다음은 빠른 수정입니다.

CVSUSER ?= $(shell read -p "User name: ";echo $$REPLY) 
+0

, 즉 쉘 명령을 변수에 액세스 할 때마다 호출하는 것입니다. 몇 백 개의 파일 업데이트를 수행 할 때 좋지 않습니다 :) – Christoffer

2

이미 솔루션을 직접 발견했지만, 나는 그것이 나쁜 것을 제안 호출 한 후 어느 시점에서든 사용자 상호 작용에 의존하는 makefile을 만드는 연습. 이렇게하면 빌드가 자동화 된 빌드 시스템 (예 : CruiseControl, AntHill 등)에 통합하기가 어려워지고 분산 빌드 시스템 (pvmgmake 등)에 통합하기가 더 어려워집니다.

더 나은 방법은 CVSUSER이 설정되지 않은 경우 makefile을 호출하는 래퍼 스크립트에 CVSUSER의 확인을 넣은 다음 오류가있는 즉시 makefile을 종료하는 것입니다.

안부,

에릭 Melski 여전히

http://blog.electric-cloud.com

+0

Makefile이 소프트웨어 빌드에 사용되지 않고 대신 템플릿에서 다양한 구성 파일을 간단하게 만드는 데 사용되는 경우 ("여기에서 실행하면 가상 기계 "), 사용자 입력을 읽는 것이 정당화 될 수 있습니다. 일반적인 경우는 아니지만 이전에 본 적이있는 유스 케이스입니다. –

관련 문제