답변:
makefile 외부에서 변수를 설정하는 몇 가지 옵션이 있습니다.
환경에서 -각 환경 변수는 동일한 이름과 값을 가진 makefile 변수로 변환됩니다.
-e
옵션 (aka --environments-override
) 을 설정하고 싶을 수도 있으며 환경 변수는 makefile에 지정된 할당을 무시합니다 (이러한 할당 자체가 override
지시문을 사용 하지 않는 한 권장되지는 않지만 할당을 사용하는 것이 훨씬 좋고 유연 ?=
합니다 (조건부 변수) 대입 연산자의 경우 변수가 아직 정의되지 않은 경우에만 효과가 있습니다.)
FOO?=default_value_if_not_set_in_environment
특정 변수는 환경에서 상속되지 않습니다.
MAKE
스크립트의 이름에서 얻습니다SHELL
은 makefile 내에 설정되거나 기본값으로 설정됩니다 /bin/sh
(이론 : makefile 내에 명령이 지정되며 쉘에 따라 다릅니다).명령 행에서 - make
대상과 혼합 된 명령 행의 일부로 변수 지정을 수행 할 수 있습니다.
make target FOO=bar
그러나 지정 에 지시문 을 사용하지 않으면 makefile 내의 변수에 대한 모든 지정 FOO
이 무시 됩니다. (효과는 환경 변수 옵션 과 동일 합니다).override
-e
상위 Make에서 내보내기-Makefile에서 Make 를 호출하면 일반적으로 다음과 같은 변수 할당을 명시 적으로 작성해서는 안됩니다.
# Don't do this!
target:
$(MAKE) -C target CC=$(CC) CFLAGS=$(CFLAGS)
대신 이러한 변수를 내보내는 것이 더 나은 해결책 일 수 있습니다. 변수를 내 보내면 모든 셸 호출 환경으로 변수가 만들어지고 이러한 명령을 호출하면 위에서 지정한 환경 변수가 선택됩니다.
# Do like this
CFLAGS=-g
export CFLAGS
target:
$(MAKE) -C target
인수없이 사용하여 모든 변수를 내보낼 수도 있습니다 export
.
export PROJECT_MAKE_ARGS = CC=$(CC) CFLAGS=$(CFLAGS)
하고 전달하는 것 make -C folder $(PROJECT_MAKE_FLAGS)
입니다. 환경을 무시하도록 라이브러리의 makefile에 지시하는 방법이 있다면 이상적입니다 (-e와 반대).
make target FOO=bar
make FOO=bar target
?
가장 간단한 방법은 다음과 같습니다.
make foo=bar target
그런 다음 makefile에서을 참조하십시오 $(foo)
. 이것은 하위 메이크에 자동으로 전파되지 않습니다.
하위 메이크를 사용하는 경우이 기사 : 하위 메이크에 변수 전달
included
로 메인 makefile 의 makefile을 의미 합니까?
로부터 수동 :
make의 변수는 make가 실행되는 환경에서 올 수 있습니다. make 시작시 확인되는 모든 환경 변수는 이름과 값이 같은 make 변수로 변환됩니다. 그러나 makefile 또는 명령 인수를 사용하여 명시 적으로 지정하면 환경이 대체됩니다.
그래서 당신은 (bash에서) 할 수 있습니다 :
FOOBAR=1 make
FOOBAR
Makefile에 변수 가 생깁니다.
Stallman과 McGrath의 GNU Make 책에는 http://www.chemie.fu-berlin.de/chemnet/use/info/make/make_7.html을 참조 하십시오 . 예를 제공합니다.
archive.a: ...
ifneq (,$(findstring t,$(MAKEFLAGS)))
+touch archive.a
+ranlib -t archive.a
else
ranlib archive.a
endif
지정된 매개 변수가에 나타나는지 확인하는 과정이 포함됩니다 MAKEFLAGS
. 예를 들어 .. c ++ 11의 스레드에 대해 연구하고 있고 여러 파일 ( class01
, ..., classNM
)로 연구를 나누었 으며 다음을 수행하려고한다고 가정합니다. 플래그가 지정된 경우 ( -r
예 :) 시간을 지정하고 실행하십시오 . 따라서 다음을 수행 할 수 있습니다 Makefile
.
CXX=clang++-3.5
CXXFLAGS = -Wall -Werror -std=c++11
LDLIBS = -lpthread
SOURCES = class01 class02 class03
%: %.cxx
$(CXX) $(CXXFLAGS) -o $@.out $^ $(LDLIBS)
ifneq (,$(findstring r, $(MAKEFLAGS)))
./$@.out
endif
all: $(SOURCES)
.PHONY: clean
clean:
find . -name "*.out" -delete
그렇게하면 :
make -r class02
;make
또는make all
;make -r
특정 종류의 어설트가 포함되어 있고 모두 테스트하고 싶다고 가정하십시오)
make A='"as df"'