2012-01-30 2 views
2

환경 변수를 통해 버전 정보를 수집하는 gnu Makefile이 있습니다. 이제는 어떤 대상이 gnumake 구문을 사용하여 빌드되기 전에 "무언가"를 전역 적으로 수행하려고합니다. 의사 코드,이 의미 : 지정된 파일이 존재하는 경우에Gnu에서 일부 명령을 실행하는 방법 Makefile

  • 는, 캐릭터 라인의 배열을 통해 그것을
  • 실행을 삭제하고 나는이 시도

지정된 파일에 자신의 값을 넣어 :

C:\temp\Makefile.mak:72: *** missing separator. Stop. 
0 :
$(shell if exist $(subst /,\,$(products)filenames.h) del /F/Q $(subst /,\,$(products)filenames.h)) 
$(foreach Item, $(EnvFilenames), @echo $(Item) >> $(subst /,\,$(products)filenames.h)) 

이 나에게 오류를 제공

여기서 72 행은 $(shell ... 행입니다. 나는 define 섹션에 넣고 경우

$(products)$test.o : test.c $(commons) 
$(call foobar) 
$(cc) $(cflags_m) test.c [email protected] 

을하고 ...하지만 최대한 빨리 원하는대로 전화를해야하는지 수행합니다

define foobar 
$(shell if exist $(subst /,\,$(products)filenames.h) del /F/Q $(subst /,\,$(products)filenames.h)) 
$(foreach Item, $(EnvFilenames), @echo $(Item) >> $(subst /,\,$(products)filenames.h)) 
endef 

와 대상이 전화, 그것을 잘 실행 그것도 다른 define의 내부에서, 누락 된 분리 자와 함께 다시 실패합니다.

무슨 뜻이며 어떻게 해결할 수 있습니까?

컴파일은 Win32 플랫폼에서 수행되며 멀티 플랫폼 일 필요는 없습니다.

답변

6

Make 호출 당 한 번 충분하면 전역 할당에 넣을 수 있습니다.

# Ignore the value, calling for side effects 
IGNORE := $(shell commands with side effects) 

나는이 해킹을 권장하지만 상황이 편리 할 수 ​​있다고 상상할 수 있습니다.

+0

'IGNORE : ='를 제거한 경우에만 이것은 실행되지 않습니다. 하지만 그때 설명 된 오류가 발생합니다. 그런데 Make 3.82 사용하기. – Coder02

+0

여기에서 작동합니다 (예 : 'IGNORE : = $ (shell rm foobar)'는 당신이 호출하는 대상에 상관없이 foobar를 삭제합니다. ":"과 "="사이에 공백을 넣지 않았습니까? – Jens

+0

비고 : 명령을 배치 파일이나 셸 스크립트에 작성하고'IGNORE : = $ (shell foo.bat)'처럼 호출하여 정신 이상을 최소화 할 수 있습니다. –

관련 문제