명령 줄을 통해 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 withoverride
(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
'program story' 카테고리의 다른 글
파이썬의 정적 / 클래스 변수에 대한 __getattr__ (0) | 2020.12.12 |
---|---|
익명 함수에 레이블을 지정하기위한 Javascript '콜론'? (0) | 2020.12.12 |
SessionTimeout : web.xml 대 session.maxInactiveInterval () (0) | 2020.12.11 |
PHP cURL HTTP PUT (0) | 2020.12.11 |
MongoDB에서 $ in 쿼리에 전달되는 최대 매개 변수 수는 얼마입니까? (0) | 2020.12.11 |