[makefile] 명령 줄에서 추가 변수를 전달하여 작성

명령 줄 인수로 변수를 GNU Makefile에 전달할 수 있습니까? 다시 말해, 나는 Makefile에서 변수가 될 인수를 전달하고 싶다.



답변

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.


답변

가장 간단한 방법은 다음과 같습니다.

make foo=bar target

그런 다음 makefile에서을 참조하십시오 $(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

그렇게하면 :

  • 파일을 빌드하고 실행 make -r class02 ;
  • 모든 승 구축 / make또는make all ;
  • 모든 빌드 및 실행 (모두 make -r특정 종류의 어설트가 포함되어 있고 모두 테스트하고 싶다고 가정하십시오)

답변

그것은 보인다

명령 인수는 환경 변수를 덮어 씁니다.

메이크 파일

send:
    echo $(MESSAGE1) $(MESSAGE2)

예제 실행

$ MESSAGE1=YES MESSAGE2=NG  make send MESSAGE2=OK
echo YES OK
YES OK


답변

Makefile이라는 파일을 만들고 $ (unittest)와 같은 변수를 추가하면 와일드 카드로도 Makefile 내에서이 변수를 사용할 수 있습니다

예 :

make unittest=*

BOOST_TEST를 사용하고 –run_test = $ (unittest) 매개 변수에 와일드 카드를 제공하면 정규식을 사용하여 Makefile을 실행하려는 테스트를 필터링 할 수 있습니다.