"make"명령 줄 인수 (-D)에서 C 소스 코드로 매크로 정의를 전달하는 방법은 무엇입니까?


107

나는 보통 "make command line"에서 "makefile"옵션을 사용하여 매크로 정의를 전달합니다 : -Dname = value. 정의는 makefile 내에서 액세스 할 수 있습니다.

또한 유사한 컴파일러 옵션을 사용하여 "makefile"의 매크로 정의를 "소스 코드"로 전달합니다. -Dname = value (많은 컴파일러에서 지원됨). 이 정의는 소스 코드에서 액세스 할 수 있습니다.

지금 필요한 것은 makefile의 사용자가 makefile에서 아무것도 변경하지 않고도 "make.exe 명령 줄"에서 "소스 코드"로 임의의 매크로 정의를 즉시 전달할 수 있도록하는 것입니다.

따라서 사용자는 다음을 입력 할 수 있습니다. make -f mymakefile.mk -SOMEOPTION var = 5

그런 다음 코드 main.c에서 var를 볼 수 있습니다.

int main()
{
  int i = var;
}

15
왜 반대 투표입니까? 나에게 완벽하게 합법적 인 질문처럼 보입니다.
Thomas

답변:


99

다음과 같이 make명령을 호출 하십시오.

make CFLAGS=-Dvar=42

그리고 $(CFLAGS)Makefile의 컴파일 명령에서 사용하십시오 . @ jørgensen이 언급했듯이 make명령 뒤에 변수 할당을 넣으면 CFLAGSMakefile에 이미 정의 된 값 이 재정의됩니다 .

또는 -Dvar=42다른 변수에 설정 CFLAGS한 다음이 변수를 다시 사용 CFLAGS하여 완전히 재정의하는 것을 방지 할 수 CFLAGS있습니다.


8
"CFLAGS = $ (CFLAGS) -Wall"을 사용할 수 없습니다. 이것은 재귀 적 정의이며 make는 이것을 허용하지 않습니다. "CFLAGS : = $ (CFLAGS) -Wall"또는 "CFLAGS + = -Wall"을 사용할 수 있지만 명령 줄의 할당이 더 높은 우선 순위를 갖기 때문에 작동하지 않습니다. "override CFLAGS + = -Wall"을 사용할 수 있지만 일반적으로 내부적으로 다른 변수를 선택하는 것이 좋습니다. GNU 코딩 표준에서는 CFLAGS 등이 사용자에게 남겨 져야하며 메이크 파일은 "local_CFLAGS = $ (CFLAGS) -Wall"과 같은 다른 변수를 선택합니다.
MadScientist

2
그냥 @MadScientist 노트에 추가하려면 상태도 코딩 표준 GNU$(CFLAGS) 사용자가 지정한 옵션이 무엇보다 우선합니다 그래서, 마지막으로 와야은 메이크 내부적으로 설정합니다. 그것은 예를 사용하는 것을 의미 local_CFLAGS = -Wall $(CFLAGS)합니다. 반대로, 정말로 우선 순위를두고 싶은 것이 있다면 $(CFLAGS)@MadScientist 코멘트에서와 같이 뒤에 넣으십시오 .
Sam

1
이것으로 여러 매크로를 설정하는 방법은 무엇입니까?
우디 황

2
예를 들어 CFLAGS="-Dvar1=42 -Dvar2=314"
@WoodyHuang

1
CPPFLAGSCFLAGS나 보다 더 나은 적합을 나타낼 수 있습니다 CXXFLAGS. stackoverflow.com/a/53527858/2278206
psq

11

이를 위해 특정 변수를 사용하십시오.

$ cat Makefile 
all:
    echo foo | gcc $(USER_DEFINES) -E -xc - 

$ make USER_DEFINES="-Dfoo=one"
echo foo | gcc -Dfoo=one -E -xc - 
...
one

$ make USER_DEFINES="-Dfoo=bar"
echo foo | gcc -Dfoo=bar -E -xc - 
...
bar

$ make 
echo foo | gcc  -E -xc - 
...
foo

10

이쪽 으로 전화

make CFLAGS=-Dvar=42

환경뿐만 아니라 Makefile의 CFLAGS를 재정의하기를 원하기 때문입니다 (Makefile 변수와 관련하여 우선 순위가 낮음).


6

평판이 낮기 때문에 받아 들여진 답변에 대해 언급 할 수 없습니다.

미리 정의 된 변수를 언급하고 싶습니다 CPPFLAGS. GNU Make 매뉴얼에 다음과 같이 설명되어 있으므로 CFLAGS또는 보다 더 잘 맞을 수 있습니다 .CXXFLAGS

C 전 처리기 및이를 사용하는 프로그램 (C 및 Fortran 컴파일러)에 제공 할 추가 플래그.

사용하는 기본 제공 암시 적 규칙의 예 CPPFLAGS

  • n.on.c다음 형식의 레시피 를 사용하여 자동으로 생성됩니다 .
    • $(CC) $(CPPFLAGS) $(CFLAGS) -c
  • n.on.cc, n.cpp에서 또는 n.C다음 형식의 레시피를 사용하여 자동으로 만들어집니다 .
    • $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c

하나는 명령 make CPPFLAGS=-Dvar=123을 사용하여 원하는 매크로를 정의합니다.

더 많은 정보


1
$ 고양이 x.mak
모두:
    에코 $ (옵션)
$ make -f x.mak 'OPTION = -DPASSTOC = 42'
에코 -DPASSTOC = 42
-DPASSTOC = 42

-4

요구 사항을 충족하기 위해 아래에서 C 파일 및 Makefile 구현을 찾으십시오.

foo.c

 main ()
    {
        int a = MAKE_DEFINE;
        printf ("MAKE_DEFINE value:%d\n", a);
    }

Makefile

all:
    gcc -DMAKE_DEFINE=11 foo.c

문제는 "makefile을 변경하지 않고"make 명령 줄에서 직접 C 소스 코드로 임의의 정의를 전달하는 것입니다. 그래서 나는 임의의 정의를 만들 수 있도록 makefile을 한 번 변경하고 싶었습니다.
MohamedEzz 2015 년

make를 위해 작동하지 않습니다. 즉 make -DMAKE_DEFINE = 11은 잘못된 옵션을 말합니다.
Ramakrishnan Kannan 2016
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.