program story

명령 줄을 통해 GNU make 변수에 추가

inputbox 2020. 12. 11. 08:08
반응형

명령 줄을 통해 GNU make 변수에 추가


나는 몇 목표 (와 C 프로젝트 구축하기 위해 GNU-메이크업 Makefile을 사용하고 all, clean그리고 몇 가지 프로젝트의 특정 목표를). 디버깅 과정에서 Makefile을 영구적으로 편집하지 않고 단일 빌드에 플래그를 추가하고 싶습니다 (예 : 디버깅 기호 추가 또는 전 처리기 플래그 설정).

과거에는 디버깅 기호 예제를 사용하여 다음과 같이 수행했습니다.

make target CFLAGS+=-g

불행히도 이것은 CFLAGS변수에 추가되지 않고 대신 변수를 지우고 컴파일을 중지합니다. CFLAGS끝에 추가 된 더미 변수를 정의하지 않고 이것을하는 깨끗한 방법이 LDFLAGS있습니까?


재정의 지시문을 확인하십시오 . makefile을 한 번 수정해야 할 수도 있지만 원하는 작업을 수행해야합니다.

메이크 파일의 예 :

override CFLAGS += -Wall

app: main.c
    gcc $(CFLAGS) -o app main.c 

명령 줄 예 :

$ make
gcc -Wall -o app main.c 
$ make CFLAGS=-g
gcc -g -Wall -o app main.c 

기록을 위해 @Carl Norum의 대답 은 명령 줄 관점에서 변수 앞에 추가 됩니다.

실제로 추가 할 방법이 필요했고 다음을 생각해 냈습니다.

override CFLAGS := -Wall $(CFLAGS)

만들 변수를 전달하는 두 가지 방법이 있습니다.

  • 명령 줄 인수 사용 :

    make VAR=value
    
  • 사용 환경 :

    export VAR=var; make
    

    또는 (현재 명령에 대해서만 환경을 변경하므로 더 좋습니다)

    VAR=var make
    

그들은 약간 다릅니다. 첫 번째는 더 강합니다. 그것은 당신이 원하는 것을 알고 있다는 것을 의미합니다. 두 번째는 힌트처럼 간주 될 수 있습니다. 그들 사이의 차이점은 연산자 =+=(없이 override) 에 관한 것입니다 . 이러한 연산자는 변수가 명령 줄에 정의 된 경우 무시되지만 변수가 환경에 정의 된 경우 무시되지 않습니다. 따라서 다음과 같은 Makefile을 사용하는 것이 좋습니다.

CC ?= gcc
CFLAGS += -Wall
INTERNAL_VARS = value

다음과 같이 호출하십시오.

CFLAGS=-g make

철회 -Wall하려면 다음을 사용할 수 있습니다.

make CFLAGS=

override키워드를 사용하지 마십시오. 그렇지 않으면에 영향을받는 변수를 변경할 방법이 없습니다 override.


내가 혼란 스러웠던 것에 따라 메모를 남겨주세요 testmake.

$(eval $(info A: CFLAGS here is $(CFLAGS)))

override CFLAGS += -B

$(eval $(info B: CFLAGS here is $(CFLAGS)))

CFLAGS += -C

$(eval $(info C: CFLAGS here is $(CFLAGS)))

override CFLAGS += -D

$(eval $(info D: CFLAGS here is $(CFLAGS)))

CFLAGS += -E

$(eval $(info E: CFLAGS here is $(CFLAGS)))

그때:

$ make -f testmake
A: CFLAGS here is 
B: CFLAGS here is -B
C: CFLAGS here is -B
D: CFLAGS here is -B -D
E: CFLAGS here is -B -D
make: *** No targets.  Stop.
$ make -f testmake CFLAGS+=-g
A: CFLAGS here is -g
B: CFLAGS here is -g -B
C: CFLAGS here is -g -B
D: CFLAGS here is -g -B -D
E: CFLAGS here is -g -B -D
make: *** No targets.  Stop.

override으로부터 삭제 지시 testmake파일 :

$ make -f testmake
A: CFLAGS here is 
B: CFLAGS here is -B
C: CFLAGS here is -B -C
D: CFLAGS here is -B -C -D
E: CFLAGS here is -B -C -D -E
make: *** No targets.  Stop.
$ make -f testmake CFLAGS+=-g
A: CFLAGS here is -g
B: CFLAGS here is -g
C: CFLAGS here is -g
D: CFLAGS here is -g
E: CFLAGS here is -g
make: *** No targets.  Stop.

그래서,

  • if a variable used override once, it can only be appended with another statement with override (the normal assignments will be ignored);
  • when there's been no override at all; trying to append (as in +=) from the command line overwrites every instance of that variable.

참고URL : https://stackoverflow.com/questions/2129391/append-to-gnu-make-variables-via-command-line

반응형