2013-12-16 1 views
1

을 재정의 Makefile 다음의 종류에 따라 메이크 변수가 내가 쓴

INTERACTION=nonstopmode 

all: 
    make read.pdf > /dev/null 
    make clean > /dev/null 
diagnostic: 
    INTERACTION=batchmode 
    make read.pdf 
    make clean 
%.pdf: %.tex biblio.bib 
    bash makepdf.sh $(INTERACTION) $< 
clean: 
    rm -f *.aux *.log *.bbl *.bak *.blg *.toc *.out *.glg *.glo *.gls *.ist *~ *.*~* *.backup 

Makefile 두 가지 모드를 제공합니다 : 출력 오류 및 경고 메시지 및 진단을하지 않는 간단하게 파일을 모드로 설정하여 문제를 찾기 위해 pdflatex이 사용자와 상호 작용하도록하십시오. 에 관계없이 사실 make 또는 make diagnostic가 호출되는지 여부를

filename=$(basename $2) 
filename="${filename%.*}" 
pdflatex -interaction=$1 $2 
makeglossaries "$filename" 2 
makeindex "$filename" 2 
pdflatex -interaction=$1 $2 
echo $1 

을, 프로그램은 항상 nonstopmode에서 실행 다음과 같이

makepdf.sh 보인다. Makefile 변수를 덮어 쓸 수 있습니까? 그렇다면 어떻게이 문제를 해결할 수 있습니까? 그렇지 않으면이 코드에 어떤 문제가 있습니까?

답변

2

이 메이크 파일은 아주 이상합니다. 기본적으로 올바르게 쓰여지지 않았습니다.

질문에 대한 가장 직접적인 대답은 makefile 제조법의 모든 행이 별도의 쉘에서 호출된다는 것을 인식하고 UNIX/POSIX 시스템에서는 프로세스가 부모의 환경에 영향을 줄 수 없다는 것을 인식하는 것입니다. 즉, 쉘에서 환경 변수를 호출 한 변경 사항은 make 프로세스 나 후속 쉘에 영향을 미치지 않습니다. 따라서 INTERACTION=batchmode은 쉘에서 실행되고 으로 변수를 설정하면 쉘이 종료되고 해당 설정은 잊어 버리고 다음 줄이 이전 설정으로 실행됩니다. 변수를 적용하려면 레서피의 동일한 논리 행에 변수를 넣어야합니다.

그러나이 메이크 심지어 더 근본적인 문제가있다. 먼저 으로 실행하여 make을 실행하여 재귀 적 make를 호출해야합니다. 항상 $(MAKE) 변수를 사용하십시오.

두 번째로, 어쨌든 서브 마인을 실행해서는 안됩니다. 메이크 파일에 선행 조건을 나열하는 모든 목적은 규칙 호출에 대한 명령을 시행하는 것입니다. 여기에서는 재귀 적으로 명령을 실행하여 make의 작업을 대신 수행하려고합니다. 당신은 GNU를 사용하는 가정 셋째

, 당신은 (참조 GNU 수동을) 훨씬 더 쉽게하고 싶은 당신을 위해 무엇을 목표 특정 변수를 사용할 수 있습니다합니다. 예를 들어 당신의 메이크 더 정확하게 다음과 같이 쓸 수있다 (참고, 전혀 재귀!) : 그것은 각 빌드 후 자동으로 clean 규칙을 실행하지 않습니다

INTERACTION = nonstopmode 

all: read.pdf 

diagnostic: INTERACTION = batchmode 
diagnostic: all 

%.pdf: %.tex biblio.bib 
     bash makepdf.sh $(INTERACTION) $< 

clean: 
     rm -f *.aux *.log *.bbl *.bak *.blg *.toc *.out *.glg *.glo *.gls *.ist *~ *.*~* *.backup 

.