"make -f"로 자동화되는 이상한 동작

미역취 속의 일종

일부 디렉토리에는 메이크 파일이 포함되어 있고 일부 메이크 파일에는 clean타겟이 있습니다. 상위 디렉토리에 간단한 스크립트가 있습니다.

#!/bin/bash

for f in *; do
        if [[ -d $f && -f $f/makefile ]]; then
                echo "Making clean in $f..."
                make -f $f/makefile clean
        fi
done

이것은 (정의 된) "깨끗한"대상이없는 메이크 파일이있는 디렉토리에 도달 할 때 이상한 일을합니다. 예를 들어, 두 개의 디렉토리 onetwo,

하나 / 메이크 파일

clean:
        -rm *.x

두 / 메이크 파일

clean:

두 번째 경우 "clean"은 지시문없이 존재하므로 "make clean"을 실행 two하면 다음과 같은 결과를 얻을 수 있습니다.

make: Nothing to be done for `clean'.

"clean"이없는 경우와 비교 :

make: *** No rule to make target `clean'.  Stop.

그러나 설명하려는 문제의 경우 대상이 있지만 정의되지 않았거나 존재하지 않는 경우 결과는 동일합니다. clean.sh상위 디렉토리에서 실행 ;

Making clean in one...
rm *.x
rm: cannot remove `*.x': No such file or directory
make: [clean] Error 1 (ignored)

그래서 one청소가 필요하지 않았습니다. 별거 아니에요, 예상대로입니다. 하지만:

Making clean in two...
cat clean.sh >clean 
chmod a+x clean

cat clean.sh>clean등? 참고 : 위에 표시된대로 정확히 최소한의 예제를 만들었습니다. 주변에 다른 파일이나 디렉토리가 없습니다 (clean.sh, 디렉토리 1과 2, 아주 최소한의 메이크 파일). 그러나 clean.sh가 실행 된 후 make복사 clean.sh > clean하여 실행 가능하게 만들었습니다. 그런 다음 clean.sh를 다시 실행하면 :

Making clean in one...
make: `clean' is up to date.
Making clean in two...
make: `clean' is up to date.
Press any key to continue...

지금은 지정된 메이크 파일을 전혀 사용하지 않기 때문에 더 이상한 것입니다. "최신"미스터리 타겟을 사용하고 있습니다.

아마도 관련된 현상을 발견했습니다. clean.sh에서 테스트 절 중 하나를 다음과 같이 제거하면 :

#       if [[ -d $f && -f $f/makefile ]]; then
        if [[ -d $f ]]; then

그리고 threemakefile없이 디렉토리 생성합니다 . 출력에는 다음이 포함됩니다.

Making clean in three...
make: three/makefile: No such file or directory
make: *** No rule to make target `three/makefile'.  Stop.

내가 이해하는 그러한 파일이나 디렉토리가 없는데 왜 make그 이름을 가진 대상을 찾습니까? 맨 페이지는 매우 간단합니다.

-f 파일, --file = file, --makefile = FILE

  Use file as a makefile.
Lesmana

그 행동은 버그가 아닙니다. 기능입니다. 정확한 기능 및 가능한 사용자 오류.

문제의 기능은 Make의 암시 적 규칙 중 하나입니다. 귀하의 경우 "빌드" *.sh파일에 대한 암시 적 규칙 입니다. 사용자 오류, 오류는 하위 디렉토리에서 makefile을 호출하기 전에 작업 디렉토리를 변경하지 않습니다.


TL; DR :이 문제를 해결하려면 다음 중 하나 이상을 수행 할 수 있습니다.

  1. 쉘 스크립트를 수정하여 작업 디렉토리를 변경하십시오.

    #!/bin/bash
    
    for f in *; do
            if [[ -d $f && -f $f/makefile ]]; then
                    echo "Making clean in $f..."
                    (cd $f; make clean)
            fi
    done
    
  2. 빈 규칙을 명시 적으로 만듭니다.

    clean: ;
    
  3. clean표적을 가짜로 만듭니다 .

    .PHONY: clean
    

상해:

Make에는 암시 적 규칙이 많이 있습니다. 이를 통해 makefile을 작성하지 않고도 간단한 프로젝트에서 make를 호출 할 수 있습니다.

데모를 위해 이것을 시도하십시오.

  1. 빈 디렉토리를 만들고 디렉토리로 변경하십시오.
  2. 이름이 clean.sh.
  3. 운영 make clean

산출:

$ make clean
cat clean.sh >clean 
chmod a+x clean

BAM! 그것이 묵시적 규칙의 힘입니다. 자세한 내용 은 암시 적 규칙에 대한 make 매뉴얼 을 참조하십시오.


나머지 미해결 질문에 답하려고 노력할 것입니다.

첫 번째 메이크 파일에 대해 암시 적 규칙을 호출하지 않는 이유는 무엇입니까? 암시 적 규칙을 명시 적 규칙으로 덮어 썼기 clean때문입니다.

clean두 번째 메이크 파일 규칙이 암시 적 규칙을 덮어 쓰지 않는 이유는 무엇 입니까? 레시피가 없었기 때문입니다. 레시피가없는 규칙은 암시 적 규칙을 덮어 쓰지 않고 전제 조건 만 추가합니다. 자세한 내용 은 여러 규칙에 대한 make 매뉴얼 을 참조하십시오. 명시 적으로 비어있는 레시피가있는 규칙에 대한 make 매뉴얼 도 참조하십시오 .

서브 디렉토리에서 메이크 파일을 호출하기 전에 작업 디렉토리를 변경하지 않는 것이 왜 오류입니까? make는 작업 디렉토리를 변경하지 않기 때문입니다. Make는 상속 된 작업 디렉토리에서 작동합니다. 기술적으로 이것은 반드시 오류는 아니지만 대부분의 경우 오류입니다. 하위 디렉터리의 메이크 파일이 하위 디렉터리에서 작동하도록 하시겠습니까? 아니면 부모 디렉터리에서 작동하도록 하시겠습니까?

clean두 번째 호출에서 make 가 첫 번째 makefile 의 명시 적 규칙을 무시하는 이유는 무엇 clean.sh입니까? 이제 대상 파일이 clean이미 존재하기 때문입니다. 규칙 clean에 전제 조건이 없기 때문에 대상을 다시 빌드 할 필요가 없습니다. 이 문제를 정확히 설명하는 가짜 타겟에 대한 make 매뉴얼을 참조하십시오 .

three/makefile세 번째 호출에서 대상 검색하는 이유는 무엇 입니까? make는 항상 다른 작업을 수행하기 전에 makefile을 다시 만들려고하기 때문입니다. makefile을 사용하여 명시 적으로 요청 -f했지만 존재하지 않는 경우 특히 그렇습니다 . 자세한 정보는 makefile 재 작성에 대한 make 매뉴얼 을 참조하십시오.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

"make -f"로 자동화되는 이상한 동작

분류에서Dev

printf ()로 이상한 동작

분류에서Dev

jQueryUI 자동 완성이 한 번만 대화 상자로 작업

분류에서Dev

변수를 설정하는 것처럼 보이는 대상으로`make -f`를 호출한다는 것은 무엇을 의미합니까? (그리고 왜 그것이 나를 위해 작동하지 않습니까?)

분류에서Dev

대화 상자로 작동하는 활동에서 "앱 이름"비활성화

분류에서Dev

비동기로 동기화하는 비동기 작업에 이상한 동작이 있습니다.

분류에서Dev

EnvironmentObject 이상한 동작으로 사용되는 SwiftUI ObservableObject

분류에서Dev

로깅 및 paramiko 이상한 동작

분류에서Dev

perl, s ///로 이상한 동작

분류에서Dev

Python Flask 이상한 로깅 동작 (kubernetes)

분류에서Dev

FBSession 로그인시 이상한 동작

분류에서Dev

Laravel 경로 이상한 동작

분류에서Dev

c # 다운로드 이상한 동작

분류에서Dev

bg 명령으로 이상한 동작

분류에서Dev

이상한 플로트 동작

분류에서Dev

로거의 이상한 동작

분류에서Dev

BOOL로 UIView 이상한 동작

분류에서Dev

초기화 된지도가 비어있는 것으로보고되는 이상한 동작

분류에서Dev

예상대로 작동하지 않는 예상으로 vncserver 자동화

분류에서Dev

.htaccess 규칙이 이상한 문자로 작동하지 않음

분류에서Dev

스크립트가 bash로 파이프되는 경우 이상한 adb 동작

분류에서Dev

UISwipeGestureRecognizer의 이상한 동작-마이크로 동결 앱

분류에서Dev

Delphi : LoadLibrary로 DLL을로드하는 이상한 동작

분류에서Dev

Java 오버로딩으로 인한 이상한 동작

분류에서Dev

강화 학습에서 동일한 상태로 이어지는 여러 작업

분류에서Dev

방화벽을 구성하는 symfony2-로그인시 이상한 동작

분류에서Dev

문자열로 이상한 동작을 보여주는 Javascript 관계 연산자

분류에서Dev

사용자 로그인시 이상한 nodejs 동작

분류에서Dev

\ 'X 문자열로 바꿀 때 이상한 Ruby 동작

Related 관련 기사

  1. 1

    "make -f"로 자동화되는 이상한 동작

  2. 2

    printf ()로 이상한 동작

  3. 3

    jQueryUI 자동 완성이 한 번만 대화 상자로 작업

  4. 4

    변수를 설정하는 것처럼 보이는 대상으로`make -f`를 호출한다는 것은 무엇을 의미합니까? (그리고 왜 그것이 나를 위해 작동하지 않습니까?)

  5. 5

    대화 상자로 작동하는 활동에서 "앱 이름"비활성화

  6. 6

    비동기로 동기화하는 비동기 작업에 이상한 동작이 있습니다.

  7. 7

    EnvironmentObject 이상한 동작으로 사용되는 SwiftUI ObservableObject

  8. 8

    로깅 및 paramiko 이상한 동작

  9. 9

    perl, s ///로 이상한 동작

  10. 10

    Python Flask 이상한 로깅 동작 (kubernetes)

  11. 11

    FBSession 로그인시 이상한 동작

  12. 12

    Laravel 경로 이상한 동작

  13. 13

    c # 다운로드 이상한 동작

  14. 14

    bg 명령으로 이상한 동작

  15. 15

    이상한 플로트 동작

  16. 16

    로거의 이상한 동작

  17. 17

    BOOL로 UIView 이상한 동작

  18. 18

    초기화 된지도가 비어있는 것으로보고되는 이상한 동작

  19. 19

    예상대로 작동하지 않는 예상으로 vncserver 자동화

  20. 20

    .htaccess 규칙이 이상한 문자로 작동하지 않음

  21. 21

    스크립트가 bash로 파이프되는 경우 이상한 adb 동작

  22. 22

    UISwipeGestureRecognizer의 이상한 동작-마이크로 동결 앱

  23. 23

    Delphi : LoadLibrary로 DLL을로드하는 이상한 동작

  24. 24

    Java 오버로딩으로 인한 이상한 동작

  25. 25

    강화 학습에서 동일한 상태로 이어지는 여러 작업

  26. 26

    방화벽을 구성하는 symfony2-로그인시 이상한 동작

  27. 27

    문자열로 이상한 동작을 보여주는 Javascript 관계 연산자

  28. 28

    사용자 로그인시 이상한 nodejs 동작

  29. 29

    \ 'X 문자열로 바꿀 때 이상한 Ruby 동작

뜨겁다태그

보관