GNU Make에서 환경 변수를 사용하여 레시피 단축

GNU Make에서 환경 변수를 사용하여 레시피 단축

GNU Make의 레시피에서 명령줄 인수 대신 환경 변수를 사용하여 각 명령의 변경 사항에 더 집중할 수 있도록 더 짧게 만들면 좋겠습니다. 예를 들어, 다음을 보는 대신:

g++ -g -I/path1 -I/path2 -DFLAG  -Wall -c hello.cpp -o hello.o

나는 다음과 같은 것을 보고 싶습니다:

g++ -c hello.cpp -o hello.o

여기서는 g++포함 디렉터리와 환경 변수의 다른 모든 항목을 읽습니다. 따라서 다음을 사용하지 마십시오.

compile.cxx = $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c

%.o: %.cpp
    $(compile.cxx) $< -o $@

나는 이것을 사용하고 있습니다 :

compile.cxx = CPATH="$(CPATH)" LIBRARY_PATH="$(LIBRARY_PATH)" bash -c $(CXX) -c

%.o: %.cpp
    $(compile.cxx) $< -o $@

그러나 나는 다음과 같은 결과를 얻습니다.

CPATH="irrelevant" LIBRARY_PATH="irrelevant" bash -c g++ -c hello.cpp -o hello.o
g++: fatal error: no input files

따라서 g++해당 인수가 수신되지 않은 것으로 보입니다.

나는 또한 비슷한 결과를 얻을 수 있는 대안(예: 더 짧은 요리법)에도 열려 있습니다.

답변1

다음 위치에 있는 소위 컴파일러 응답 파일을 사용할 수 있습니다.마이크로소프트 툴체인. 분명히 최신 버전의 GCC도 이를 지원합니다(참조:수동).

CXX = g++
CPPFLAGS = -I/path1 -I/path2 -DFLAG
CXXFLAGS = -g -Wall
CXXOPTS = $(CURDIR)/cxx.opts

%.o: %.cpp $(CXXOPTS)
        $(CXX) @$(CXXOPTS) -c -o $@ $<

$(CXXOPTS):
        echo "$(CPPFLAGS) $(CXXFLAGS)" >$@

clean:
        rm -f *.o
        rm -f $(CXXOPTS)

세션 예:

$ touch a.cpp b.cpp c.cpp
$ make a.o b.o c.o
echo "-I/path1 -I/path2 -DFLAG -g -Wall" >cxx.opts
g++ @cxx.opts -c -o a.o a.cpp
g++ @cxx.opts -c -o b.o b.cpp
g++ @cxx.opts -c -o c.o c.cpp
$ make clean
rm -f *.o
rm -f cxx.opts

답변2

이것은 완전한 답변은 아니지만 첫 번째 팁입니다. 보기 흉해 보입니다.

v:=bash -x -c "
all:
    $vls -l"

하지만 작동합니다.

답변3

문제는 간단합니다. bash -c는 인수를 1개만 사용하므로 간단하므로 필요하지 않습니다. 노력하다:

compile.cxx = CPATH="$(CPATH)" LIBRARY_PATH="$(LIBRARY_PATH)" $(CXX) -c

답변4

일부 메이크파일은 하나의 명령을 인쇄하고 복잡할 수 있는 매크로를 사용하여 다른 명령을 실행하도록 설정됩니다. 간단한 방법은 다음과 같습니다.

ifeq(debug,)
cc = $(CC) $(CFLAGS)
else
cc = @cc () { echo "\$$(CC) $<"; $(CC) $(CFLAGS) "$$@" }; cc
endif

foo.o: foo.c
        $(cc) $<

이 코드 조각은 변수에 null이 아닌 값이 있는 경우 debug정상적으로 명령을 인쇄합니다 . 그렇지 않은 경우 이 코드 조각은 명령을 숨기고(명령줄은 로 시작 @) 실제 명령을 실행하기 전에 더 간단한 대체 명령을 인쇄합니다.

나는 아주 간단한 예를 들었다. 여러 프로젝트에 더 복잡한 변형이 존재합니다. 예를 들어, Linux 커널은 상당히 진보된 솔루션을 사용합니다.

나는 이 방법을 사용하면 makefile 디버깅을 더 어렵게 만들기 때문에 권장하지 않습니다. 일부 작업은 잘못된 포함 경로 또는 기타 이유로 인해 실패하며 make 출력에서는 이를 알려주지 않습니다. 전체 명령을 파일에 기록하고 축약된 명령을 터미널에 표시하는 복잡한 방식이 가능합니다.

make의 출력을 더 읽기 쉽게 만들려면 다음을 고려하십시오.컬러 생산대신에.

관련 정보