programing

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

prostudy 2022. 9. 3. 09:12
반응형

명령줄을 통해 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

반응형