쉘 스크립트 대신 make를 사용하는 이유는 무엇입니까?


129

Make는 명령 줄 인수를 약간 더 쉽게 처리 할 수있는 쉘 스크립트처럼 보입니다.

./make.sh 대신 make를 실행하는 것이 표준 인 이유


반대 질문에 대한 질문 : 특히 시스템 관리자 작업의 경우 make 대신 쉘 스크립트를 사용하는 이유 (명령 줄 인수를 쉽게 처리 할 수 ​​있기 때문에), 여기를 읽으십시오 : unix.stackexchange.com/a/497601/1170
lesmana

답변:


126

일반적인 아이디어는 make(합리적으로) 최소한의 재 빌드 를 지원 한다는 것입니다. 즉, 프로그램의 어떤 부분이 다른 부분에 의존하는지 알려주는 것입니다. 프로그램의 일부를 업데이트하면 그에 의존하는 부분 만 다시 빌드됩니다. 쉘 스크립트로이 작업을 수행 할 는 있지만 훨씬 더 많은 작업 이 될 것입니다 (모든 파일에서 최종 수정 날짜를 명시 적으로 확인하는 등). 쉘 스크립트의 유일한 대안은 매번 모든 것을 다시 빌드하는 것입니다. 작은 프로젝트의 경우 이것은 완벽하게 합리적인 접근 방식이지만 큰 프로젝트의 경우 전체 재 구축에 1 시간 이상이 쉽게 걸릴 수 있습니다.을 사용 make하면 1 ~ 2 분 안에 동일한 작업을 쉽게 수행 할 수 있습니다.

적어도 광범위하게 유사한 기능을 가진 몇 가지 대안이 있다고 덧붙여 야 할 것입니다. 특히 대규모 프로젝트에서 몇 개의 파일 만 다시 빌드하는 경우 일부 파일 (예 : Ninja )이 make보다 훨씬 빠릅니다.


67

Make는 전문가 시스템입니다.

쉘 스크립트로는하기 어려운 여러가지 일들이 있습니다 ...

  • 물론 빌드에 필요한 것만 빌드하기 위해 오래된 항목을 확인합니다.
  • 모든 전제 조건이 모든 종속성 이전에 빌드되고 한 번만 빌드되도록 오래된 것을 빌드하기 위해 무엇이 그리고 어떤 순서에 의존하는지 결정 하는 토폴로지 정렬 또는 다른 종류의 트리 분석을 수행합니다.
  • 선언적 프로그래밍을 위한 언어입니다 . 명령형 제어 흐름에 병합하지 않고도 새 요소를 추가 할 수 있습니다.
  • 여기에는 규칙, 패턴 및 날짜를 ​​처리 하는 추론 엔진 이 포함되어 있으며 ,이를 특정 Makefile의 규칙과 결합하면 make가 전문가 시스템이 됩니다.
  • 매크로 프로세서가 있습니다.
  • 참조 : make의 이전 요약 .

2
하지만 전문가 시스템으로는 상당히 제한적입니다. 예를 들어 각 추론은 동일한 규칙을 한 번만 사용할 수 있습니다.
reinierpost

1
좀 더 평범한 엔지니어링 용어로 포인트 2)에 대해 자세히 설명하기 위해 쉘 스크립트는 선형 순서를 적용하는 반면 makefile은 트리와 유사합니다. 불필요한 시간적 종속성을 제거합니다 (실제로 make 프로세스는 선형으로 실행 됨).
Sridhar Sarnobat 2014 년

2
... 쉘 스크립트를 통한 Makefile의 문제는 자바 스크립트를 통한 CSS 문제와 유사하다고 생각합니다. 각 노드가 실행되는 시간순 순서는 거의 명확하지 않습니다. 적어도 Makefile을 사용하면 실제 쉘 명령을 볼 수 있습니다. CSS를 사용하면 추상화됩니다.
Sridhar Sarnobat 2014 년

누군가가 그것을 명확히 해주면 감사하게 생각하는 몇 가지 의견이 있습니다. 1 / 토폴로지 정렬이 증분 빌드가 구현되는 방식이라는 점에서 첫 번째와 두 가지 점이 관련이 있지 않습니까? 2 / 함수 구성을 사용하여 구현 된 3 번을 지적 할 수 없습니까? 3 / I는 메이크 최종 사용자에 대해 4 단계와 5의 장점에 대해 더 이해하고 싶은, 그리고 왜 이러한 장점은 함께 쉘 명령을 구성하여 구현 될 수 없다
아민 Hajyoussef을

전문가 시스템으로 설명 된 Make를 처음 접하게되었습니다. 전문가 시스템을 구축 한 사람으로서 저는 고려하지 않았을 것입니다. Make에는 분명히 makefile에 지정된 선언적 규칙을 통해 프로그램을 빌드하는 방법을 추론하는 추론 엔진이 있지만 (리프) 규칙이 사실이 아닌 실행되는 셸 명령이기 때문에 지식 기반 시스템이라는 것은 분명하지 않습니다. 그리고 "전문가 시스템"이라는 용어는 세계적 수준의 전문가의 전문성을 성공적으로 포착 한 시스템을 가리키는 데 사용됩니다. 배심원은 여전히 ​​나를 위해 밖에 있습니다.
Dennis

9

Make는 소스 파일을 변경할 때 필요한 파일 만 다시 컴파일되도록합니다.

예를 들면 :

final : 1.o 2.o
    gcc -o final 1.o 2.o

1.o : 1.c 2.h
    gcc -c 1.c

2.o : 2.c 2.h
    gcc -c 2.c

파일 2.h만 변경하고 make실행하면 3 개의 명령이 모두 역순으로 실행됩니다.

파일 1.c만 변경하고 make실행하면 처음 두 명령 만 역순으로 실행됩니다.

자신의 쉘 스크립트로이를 수행하려면 많은 if/else검사 가 필요합니다 .


또는 rsync -r -c -I $SOURCE $DEST_DIR쉘에서 이와 같은 것을 사용하십시오 .
Spartacus9

9

위와 마찬가지로 Make는 선언적 (-ish) 병렬 프로그래밍 언어입니다.

변환 할 그래픽 파일이 4,000 개이고 CPU가 4 개 있다고 가정 해 보겠습니다. CPU를 포화시키면서 안정적으로 수행 할 10 줄 셸 스크립트 (여기서는 관대함)를 작성해보십시오.

아마도 진짜 질문은 사람들이 왜 쉘 스크립트를 작성하는 것을 귀찮게 하는가입니다.


1
예, 전체 선형 순서를 더 나무와 같은 순서로 느슨하게하고 있습니다.
Sridhar Sarnobat 2014 년

4

make는 의존성을 처리합니다 : makefile은 그것들을 설명합니다 : 바이너리는 객체 파일에 의존하고, 각 객체 파일은 소스 파일과 헤더에 의존합니다. .

Makefile에 설명 된 모든 것을 빌드하지 않도록 하나의 타겟을 직접 호출 할 수 있습니다.

또한 make 구문은 대체, vpath를 제공합니다.

이 모든 것은 쉘 스크립트로 작성할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.