명령줄을 통해 GNU make 변수에 추가
저는 GNU-Makefile을 사용하여 여러 타겟을 가진 C 프로젝트를 구축하고 있습니다.all
,clean
프로젝트 고유의 타겟이 몇 가지 있습니다).디버깅 중에 Makefile을 영구적으로 편집하지 않고 단일 빌드에 플래그를 추가하고 싶습니다(디버깅 기호 추가, 프리프로세서 플래그 설정 등).
이전에는 다음과 같이 했습니다(디버깅 기호 예를 사용).
make target CFLAGS+=-g
유감스럽게도, 이것은 다음 항목에 대응하고 있지 않습니다.CFLAGS
변수를 지우고 컴파일을 중지합니다.의 끝에 부가된 일종의 더미 변수를 정의하지 않고 이를 수행할 수 있는 깔끔한 방법이 있습니까?CFLAGS
그리고.LDFLAGS
?
오버라이드 디렉티브를 확인합니다.makefile을 한 번 수정해야 할 수도 있지만 원하는 대로 해야 합니다.
샘플 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.
그렇게,
- 변수가 사용되는 경우
override
한 번 덧붙일 수 있는 것은, 다른 문구를 붙이는 것 뿐입니다.override
(통상적인 할당은 무시됩니다). - 지금까지 없었던 때에
override
전혀 추가하려고 하지 않다+=
명령줄의 )는 해당 변수의 모든 인스턴스를 덮어씁니다.
언급URL : https://stackoverflow.com/questions/2129391/append-to-gnu-make-variables-via-command-line
'programing' 카테고리의 다른 글
vue에서 이미지 크기를 조정하는 방법 (0) | 2022.09.03 |
---|---|
Vue에서 렌더링된 목록 내에서 모달 열기 (0) | 2022.09.03 |
Vue 구성 요소 이벤트에서 Apollo 쿼리를 트리거하는 방법은 무엇입니까? (0) | 2022.09.03 |
Java 메인 메서드가 정적인 이유는 무엇입니까? (0) | 2022.09.03 |
.jar를 실행하려고 하면 "Invalid signature file"이 표시됩니다. (0) | 2022.09.03 |