[linux] makefile이 대상을 재 빌드하도록 강제하는 방법

빌드하고 다른 makefile을 호출하는 makefile이 있습니다. 이 makefile은 작업을 수행하는 더 많은 makefile을 호출하므로 실제로 변경되지 않습니다. 따라서 프로젝트가 최신 상태로 유지되고 있다고 생각합니다.

dnetdev11 ~ # make
make: `release' is up to date.

makefile이 대상을 다시 빌드하도록하려면 어떻게해야합니까?

clean = $(MAKE) -f ~/xxx/xxx_compile.workspace.mak clean


build = svn up ~/xxx                                                       \
        $(clean)                                                                \
        ~/cbp2mak/cbp2mak -C ~/xxx ~/xxx/xxx_compile.workspace        \
        $(MAKE) -f ~/xxx/xxx_compile.workspace.mak $(1)                    \


release:
        $(build )

debug:
        $(build DEBUG=1)

clean:
        $(clean)

install:
        cp ~/xxx/source/xxx_utility/release/xxx_util /usr/local/bin
        cp ~/xxx/source/xxx_utility/release/xxxcore.so /usr/local/lib

참고 : 무고한 사람을 보호하기 위해 이름이 제거되었습니다.

편집 : 최종 고정 버전 :

clean = $(MAKE) -f xxx_compile.workspace.mak clean;


build = svn up;                                         \
        $(clean)                                        \
        ./cbp2mak/cbp2mak -C . xxx_compile.workspace;   \
        $(MAKE) -f xxx_compile.workspace.mak    $(1);   \


.PHONY: release debug clean install

release:
        $(call build,)

debug:
        $(call build,DEBUG=1)

clean:
        $(clean)

install:
        cp ./source/xxx_utillity/release/xxx_util /usr/bin
        cp ./dlls/Release/xxxcore.so /usr/lib



답변

하나 이상의 대상을 가짜라고 선언 할 수 있습니다 .

가짜 대상은 실제로 파일 이름이 아닌 대상입니다. 오히려 명시적인 요청을 할 때 레시피가 실행되는 이름 일뿐입니다. 가짜 대상을 사용해야하는 두 가지 이유가 있습니다. 동일한 이름의 파일과의 충돌을 피하고 성능을 향상시키는 것입니다.

가짜 대상은 실제 대상 파일의 전제 조건이 아니어야합니다. 그렇다면 파일을 업데이트 할 때마다 레시피가 실행됩니다. 가짜 대상이 실제 목표의 전제 조건이 아닌 한, 가짜 대상 레시피는 가짜 대상이 지정된 목표 인 경우에만 실행됩니다.


답변

-B그 긴 형태의 메이크업에 스위치는 --always-make, 알 make무시 타임 스탬프에 지정된 목표를합니다. 이것은 make를 사용하는 목적을 상실 할 수도 있지만 필요한 것일 수도 있습니다.


답변

Sun 매뉴얼에 문서화되어 make왔던 한 가지 트릭은 존재하지 않는 대상 ‘.FORCE’를 사용하는 것입니다. 다음을 포함하는 force.mk 파일을 작성하여이를 수행 할 수 있습니다.

.FORCE:
$(FORCE_DEPS): .FORCE

그런 다음 기존 makefile이라고 가정하면 다음을 makefile실행할 수 있습니다.

make FORCE_DEPS=release -f force.mk -f makefile release

.FORCE존재하지 않기 때문에 그것에 의존하는 것은 오래되고 재건됩니다.

이 모든 것은 모든 버전의 make; Linux에는 GNU Make가 있으므로 논의 된대로 .PHONY 대상을 사용할 수 있습니다.

make릴리스가 최신 버전 인 이유를 고려해야합니다. touch release실행 된 명령 중에 명령 이 있기 때문일 수 있습니다 . ‘release’라는 파일 또는 디렉토리가 존재하고 종속성이 없으며 최신 버전이기 때문일 수 있습니다. 그렇다면 실제 이유가 있습니다 …


답변

다른 사람이 .PHONY를 제안했는데 이는 옳습니다. .PHONY는 입력과 출력 간의 날짜 비교가 유효하지 않은 규칙에 사용해야합니다. 양식의 대상이 없으므로 모든 대상에 output: input.PHONY를 사용해야합니다!

말했듯이, 아마도 다양한 파일 이름에 대해 makefile 상단에 일부 변수를 정의하고 입력 및 출력 섹션이 모두있는 실제 make 규칙을 정의하여 make의 이점을 사용할 수 있습니다. 즉 실제로 컴파일 만합니다. copmile에 필요한 것들!

편집 : 예를 추가했습니다. 테스트되지 않았지만 이것이 당신이하는 방법입니다.

.PHONY: clean
clean:
    $(clean)


답변

올바르게 기억한다면 ‘make’는 타임 스탬프 (파일 수정 시간)를 사용하여 대상이 최신인지 여부를 결정합니다. 재 빌드를 강제하는 일반적인 방법은 ‘touch’명령을 사용하여 해당 타임 스탬프를 업데이트하는 것입니다. Makefile에서 ‘touch’를 호출하여 대상 중 하나 (아마 하위 하위 파일 중 하나)의 타임 스탬프를 업데이트하면 Make가 해당 명령을 강제로 실행할 수 있습니다.


답변

이 간단한 기술을 사용하면 강제 실행을 원하지 않을 때 makefile이 정상적으로 작동 할 수 있습니다. makefile 끝에 force 라는 새 대상을 작성하십시오 . 힘의 대상이 기본 대상에 의존하는 파일을 터치합니다. 아래 예제에서 touch myprogram.cpp를 추가했습니다 . 또한 재귀 호출을 추가 하기를 . 이렇게하면 make force 를 입력 때마다 기본 대상이 만들어집니다 .

yourProgram: yourProgram.cpp
       g++ -o yourProgram yourProgram.cpp

force:
       touch yourProgram.cpp
       make


답변

나는 이것을 시도했고 그것은 나를 위해 일했다.

이 줄을 Makefile에 추가하십시오

clean:
    rm *.o output

new: clean
    $(MAKE)     #use variable $(MAKE) instead of make to get recursive make calls

저장하고 지금 전화

make new

다시 모든 것을 다시 컴파일합니다

어떻게 된 거예요?

1) ‘새로운’통화가 깨끗합니다. ‘clean’do ‘rm’은 확장자가 ‘.o’인 모든 오브젝트 파일을 제거합니다.

2) ‘신규’는 ‘make’를 호출합니다. ‘make’는 ‘.o’파일이 없다는 것을 알기 때문에 모든 ‘.o’를 다시 만듭니다. 링커는 모든 .o 파일을 하나의 실행 가능한 출력으로 연결합니다.

행운을 빕니다