저는 C++를 배우고 있는데 지금은 일반적인 질문이 있지만 프로그래머에게는 적합하지 않지만 IMHO는 Linux 사용자에게 가장 적합합니다.
나는 원해요:
make
이 명령은 항상 새로운 바이너리를 빌드합니다. 이는 Bash 별칭을 생성하여 쉽게 수행할 수 있습니다. 예를 들면 다음과 같습니다.
alias make='\make clean && \make'
나는 이것을 정의하고 싶지 않습니다. 이것이 alias
한쪽에서 달성될 수 있습니까?Makefile
Makefile
내가 생각할 수 있는 가장 간단한 것은 다음과 같습니다.
PROGRAM=project
CXXFLAGS=-std=c++17 -Wall -Wextra -Werror -Wpedantic -pedantic-errors
OPTIMIZATION=-O2
.PHONY: build
.PHONY: clean
.PHONY: distrib
build: ${PROGRAM}
clean:
rm ${PROGRAM}
distrib:
tar -czf ${PROGRAM}.tar.gz ${PROGRAM}.cpp Makefile
${PROGRAM}:
g++ ${PROGRAM}.cpp ${CXXFLAGS} ${OPTIMIZATION} -o ${PROGRAM}
이제 이 상태에서는 다음과 같이 말합니다.
make: Nothing to be done for 'build'.
본질적으로 가장 최근의 타임스탬프를 볼 수 있고 빌드되지 않을 수도 있다고 생각합니다.
편집 1:
이것만 추가하겠습니다질문관련이 없습니다 Tab. 바이너리가 제자리에 있지 않으면 제대로 빌드됩니다.
편집 2:
Katsura Sato의 답변을 기반으로 수정했습니다.
다음과 같습니다 Makefile
.
https://www.vlastimilburian.cz/public/linux/Makefile.gz
(탭은 텍스트로 표시할 수 없어서 올렸습니다)
여전히 위에 표시된 대로:
make: Nothing to be done for 'build'.
편집 3:
$ make --version
GNU Make 4.1
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2014 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
간단한 체크리스트는 다음과 같습니다.
- TAB을 사용하여 작업 줄(
rm
,tar
등g++
) 을 들여씁니다. - 또는 대신
$(FOO)
변수를 확장 하려면FOO
${FOO}
$FOO
- 관련된 경우 종속성을 추가합니다.
여러분의 Makefile
행은 다음과 같아야 합니다(다시 말하지만, 줄은 공백이 아닌 탭으로 들여쓰기됩니다).
PROGRAM=project
CXXFLAGS=-std=c++17 -Wall -Wextra -Werror -Wpedantic -pedantic-errors
OPTIMIZATION=-O2
.PHONY: build
.PHONY: clean
.PHONY: distrib
build: $(PROGRAM)
clean:
rm $(PROGRAM)
distrib:
tar -czf $(PROGRAM).tar.gz $(PROGRAM).cpp Makefile
$(PROGRAM): $(PROGRAM).cpp
g++ $(PROGRAM).cpp $(CXXFLAGS) $(OPTIMIZATION) -o $(PROGRAM)
답변2
내가 찾았어StackOverflow에 대한 답변.
나는 인용한다:
Make가 올바르게 작동합니다. 이미 존재하며 해당 파일
hello
보다 이전 파일이 아니므 로 더 이상 작업이 필요하지 않습니다..c
Make가 (재)빌드해야 하는 네 가지 상황이 있습니다.
.c
파일 중 하나를 수정하면 최신 파일이 되며hello
make를 실행할 때 다시 빌드해야 합니다.- 삭제되면
hello
당연히 다시 빌드해야 합니다.- 이 옵션을 사용하면 make가 모든 것을 다시 빌드하도록 강제할 수 있습니다
-B
.make -B all
make clean all
삭제되어hello
다시 작성해야 합니다. (@Mat의 의견을 살펴보는 것이 좋습니다.rm -f *.o hello
따라서 이전에 버그로 잘못 평가했던 소스 코드 파일을 변경하지 않는 한 더 이상 항상 빌드를 고집하지 않을 것입니다. 소스 코드를 변경하면 처음 실행할 때 make
올바르게 빌드됩니다. 분명히 두 번째로 만들 필요가 없기 때문에 지능적이라고 인간은 말할 수도 있습니다.
어떤 경우에도 항상 다시 빌드하고 싶은 경우 다음과 같이 정의할 수 있습니다.
alias make='make -B'
또는 더 자명하게 설명할 수 있습니다.
alias make='make --always-make'
그러나 다음과 같이 명시되어 있습니다.
Unconditionally make all targets.
all targets
냄새가 심해서 안쓰게 될 것 같아요 . 어쨌든 나중에 참고할 수 있도록 공개하겠습니다.