make: "빌드"와는 아무 관련이 없습니다.

make: "빌드"와는 아무 관련이 없습니다.

저는 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, targ++) 을 들여씁니다.
  • 또는 대신 $(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보다 이전 파일이 아니므 로 더 이상 작업이 필요하지 않습니다. .cMake가 (재)빌드해야 하는 네 가지 상황이 있습니다.

  • .c파일 중 하나를 수정하면 최신 파일이 되며 hellomake를 실행할 때 다시 빌드해야 합니다.
  • 삭제되면 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냄새가 심해서 안쓰게 될 것 같아요 . 어쨌든 나중에 참고할 수 있도록 공개하겠습니다.

관련 정보