Programing

명령 줄에서 추가 변수 전달

lottogame 2020. 10. 4. 10:18
반응형

명령 줄에서 추가 변수 전달


변수를 명령 줄 인수로 GNU Makefile에 전달할 수 있습니까? 즉, 결국 Makefile에서 변수가 될 몇 가지 인수를 전달하고 싶습니다.


makefile 외부에서 변수를 설정하는 몇 가지 옵션이 있습니다.

  • 환경에서 -각 환경 변수는 동일한 이름과 값을 가진 메이크 파일 변수로 변환됩니다.

    -e옵션 (일명 --environments-override) 을 설정하고 싶을 수도 있으며 환경 변수가 makefile에 대한 할당을 재정의합니다 (이러한 할당 자체가 override지시문을 사용하지 않는 한) . 그러나 권장되지 않으며 ?=할당 (조건부 변수) 을 사용하는 것이 훨씬 더 좋고 유연 합니다 할당 연산자, 변수가 아직 정의되지 않은 경우에만 효과가 있습니다) :

    FOO?=default_value_if_not_set_in_environment
    

    특정 변수는 환경에서 상속되지 않습니다.

    • MAKE 스크립트 이름에서 가져옴
    • SHELLmakefile 내에서 설정되거나 기본값으로 설정됩니다 /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

결과적으로 FOOBARMakefile에 변수 가 생깁니다.


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

반응형