명령 줄에서 추가 변수 전달
변수를 명령 줄 인수로 GNU Makefile에 전달할 수 있습니까? 즉, 결국 Makefile에서 변수가 될 몇 가지 인수를 전달하고 싶습니다.
makefile 외부에서 변수를 설정하는 몇 가지 옵션이 있습니다.
환경에서 -각 환경 변수는 동일한 이름과 값을 가진 메이크 파일 변수로 변환됩니다.
-e
옵션 (일명--environments-override
) 을 설정하고 싶을 수도 있으며 환경 변수가 makefile에 대한 할당을 재정의합니다 (이러한 할당 자체가override
지시문을 사용하지 않는 한) . 그러나 권장되지 않으며?=
할당 (조건부 변수) 을 사용하는 것이 훨씬 더 좋고 유연 합니다 할당 연산자, 변수가 아직 정의되지 않은 경우에만 효과가 있습니다) :FOO?=default_value_if_not_set_in_environment
특정 변수는 환경에서 상속되지 않습니다.
MAKE
스크립트 이름에서 가져옴SHELL
makefile 내에서 설정되거나 기본값으로 설정됩니다/bin/sh
(이론 : 명령은 makefile 내에서 지정되며 셸에 따라 다릅니다).
명령 줄에서 -
make
대상과 혼합 된 명령 줄의 일부로 변수 할당을 사용할 수 있습니다.make target FOO=bar
그러나 할당
FOO
에서override
지시문 을 사용하지 않으면 makefile 내의 변수에 대한 모든 할당 이 무시 됩니다. (효과는-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
.
가장 간단한 방법은 다음과 같습니다.
make foo=bar target
그런 다음 메이크 파일에서 $(foo)
. 이것은 하위 메이크에 자동으로 전파되지 않습니다.
하위 메이크를 사용하는 경우이 문서를 참조하십시오. 변수를 하위 메이크에 전달
다음과 같은 makefile이 있다고 가정합니다.
action:
echo argument is $(argument)
그런 다음 make action argument=something
로부터 수동 :
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
이를 통해 다음을 수행 할 수 있습니다.
- w / 파일을 빌드하고 실행합니다
make -r class02
. - 모든 w /
make
또는make all
; - build and run all w/
make -r
(suppose that all of them contain some certain kind of assert stuff and you just want to test them all)
If you make a file called Makefile and add a variable like this $(unittest) then you will be able to use this variable inside the Makefile even with wildcards
example :
make unittest=*
I use BOOST_TEST and by giving a wildcard to parameter --run_test=$(unittest) then I will be able to use regular expression to filter out the test I want my Makefile to run
export ROOT_DIR=<path/value>
Then use the variable, $(ROOT_DIR)
in the Makefile.
참고URL : https://stackoverflow.com/questions/2826029/passing-additional-variables-from-command-line-to-make
'Programing' 카테고리의 다른 글
MS SQL Server 저장 프로 시저 내에서 배열을 선언하는 방법은 무엇입니까? (0) | 2020.10.05 |
---|---|
브라우저 창이 현재 활성화되어 있지 않은지 감지하는 방법이 있습니까? (0) | 2020.10.04 |
초기 텍스트가 "Select One"인 Android Spinner를 만드는 방법은 무엇입니까? (0) | 2020.10.04 |
jQuery.fn은 무엇을 의미합니까? (0) | 2020.10.04 |
Google Maps API로 마우스 스크롤 휠 크기 조정을 비활성화하는 방법 (0) | 2020.10.04 |