make clean
내 노력의 과정 에서씌우다모든 출력이 정리되었는지 확인하는 특정 변수:
clean-lib:
override ARCH=32
rm -rf $(NEWLIB)$(LIBNAME).so $(NEWLIB)$(LIBNAME).a
override ARCH=64
rm -rf $(NEWLIB)$(LIBNAME).so $(NEWLIB)$(LIBNAME).a
LIBNAME
다음과 같이 구성됩니다.
ARCH=64
PROJNAME=libWebSightR220
LIBNAME=$(PROJNAME)x$(ARCH)
사용자는 버전 32를 사용해야 합니다 make lib ARCH=32
. 변경된 ARCH
투척 코드:
make: override: Command not found
또한 make 업데이트를 시도했지만 이미 최신 상태입니다.
XXXXX@debianvirtualbox:~/$ make --version
GNU Make 4.0
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
답변1
이는 사용 중인 make 버전과 아무 관련이 없습니다. "target:dependent" 줄 뒤에 입력한 명령은 셸을 통해 실행되며 이름이 지정된 Linux 명령이 전혀 없습니다 override
. override
내부 make
명령이므로 이 위치에 나타날 수 없습니다. 다음과 같이 작동합니다.
override ARCH=64
all:
echo $(ARCH)
편집: 원하는 것을 달성하는 방법(적어도 GNU make를 사용하여)은 다음과 같습니다.
all:
$(eval override ARCH=32)
echo $(ARCH)
$(eval override ARCH=64)
echo $(ARCH)
그런데 이 방법으로 make ARCH=45
및 둘 다 ARCH=45 make
"32\n64"를 출력하고, override
전자가 없으면 "45\n45"를 출력하고, 후자만 "32\n64"를 출력합니다.
답변2
Make는 빌드 레시피 라인의 변수 할당을 평가하지 않습니다. 이는 엄밀히 말하면 쉘 코드입니다.
GNU Make에서는 다음을 사용할 수 있습니다.타겟별 변수 할당특정 대상을 업데이트하는 규칙을 실행하는 동안 변수 값을 일시적으로 변경합니다. 이를 활용하기 위해 규칙을 두 부분으로 나눕니다.
.PHONY: clean-lib-32 clean-lib-64 clean-lib
clean-lib: clean-lib-32 clean-lib-64
# Target-specific assignments
clean-lib-32: ARCH := 32
clean-lib-64: ARCH := 64
clean-lib-32 clean-lib-64:
rm -rf $(NEWLIB)$(LIBNAME).so $(NEWLIB)$(LIBNAME).a
이것이 작동하려면 NEWLIB
즉시변수가 아닌 지연변수여야 합니다. 즉 말하자면:
NEWLIB = whatever$(ARCH)whateverelse
# NOT this:
NEWLIB := whatever$(ARCH)whateverelse
=
대체될 때 확장되는 확장되지 않은 텍스트(매크로와 유사)를 저장하기 위해 작성된 변수 와 :=
나중에 대체될 때 추가 확장을 포함하지 않는 확장된 텍스트를 저장하는 변수를 사용하십시오. 물론 $(ARCH)
대상별 할당이 적용되도록 하려면 이후 단계에서 대체 작업을 수행해야 합니다.
전체 테스트 사례:
$ cat Makefile
.PHONY: clean-lib-32 clean-lib-64 clean-lib
NEWLIB = newlib/
LIBNAME = lib-$(ARCH)
clean-lib: clean-lib-32 clean-lib-64
# Target-specific assignments
clean-lib-32: ARCH := 32
clean-lib-64: ARCH := 64
clean-lib-32 clean-lib-64:
echo rm -rf $(NEWLIB)$(LIBNAME).so $(NEWLIB)$(LIBNAME).a
특정 대상을 사용하여 32비트 라이브러리를 정리할 수 있습니다.
$ make clean-lib-32
echo rm -rf newlib/lib-32.so newlib/lib-32.a
rm -rf newlib/lib-32.so newlib/lib-32.a
64비트 라이브러리에서도 마찬가지입니다.
$ make clean-lib-64
echo rm -rf newlib/lib-64.so newlib/lib-64.a
rm -rf newlib/lib-64.so newlib/lib-64.a
공통 목표를 사용하여 clean-lib
두 가지를 모두 정리할 수 있습니다.
$ make clean-lib
echo rm -rf newlib/lib-32.so newlib/lib-32.a
rm -rf newlib/lib-32.so newlib/lib-32.a
echo rm -rf newlib/lib-64.so newlib/lib-64.a
rm -rf newlib/lib-64.so newlib/lib-64.a