Jump to content

Make (software)

This is a fully translated article. Click here for more information.
From DawoumWiki, the free Mathematics self-learning
Make
Paradigmmacro, declarative
Designed byStuart Feldman
First appearedApril 1976; 48 years ago (1976-04)
Implementation languageC
OSUnix-like, Inferno
File formatsMakefile
Major implementations
BSD, GNU, nmake
Dialects
BSD make, GNU make, Microsoft nmake
Influenced
Ant, Rake, MSBuild, and others

소프트웨어 개발에서, Make는 대상 프로그램을 파생시키는 방법을 지정하는 Makefiles이라는 파일을 읽음으로써 소스 코드에서 실행 가능한 프로그램라이브러리를 자동으로 빌드하는 빌드 자동화 도구입니다. 비록 통합 개발 환경언어-지정 컴파일러 기능이 역시 빌드 과정을 관리하기 위해 사용될 수 있지만, Make는 특히 유닉스유닉스-계열 운영 시스템에서 널리 사용됩니다.

프로그램을 빌드하는 것 외에도, Make는 일부 파일이 다른 파일이 변경될 때마다 다른 파일에서 자동으로 업데이트되어야 하는 모든 프로젝트를 관리하기 위해 사용될 수 있습니다.

Troubleshootings

CPU 자원을 100%를 사용하면, cpu 온도가 점점 올라가는 문제가 있고, 다른 프로그램과 멀티태스킹에 문제를 일으킬지 조심스러울 수 있습니다. 대형 프로젝트를 컴파일할 때, 코어의 제한이 필요할 수 있습니다: 다음 내용을 ~/.bashrc 정도에 적어줄 수 있습니다:

export GNUMAKEFLAGS="-j16"

Origin

현재 많은 종속성-추적 빌드 유틸리티가 있지만, Make는 주로 소프트웨어 개발 임무를 대상으로 하는 다양한 도구를 특징으로 하는 PWB/UNIX 1.0부터 시작하여 유닉스에 포함되었기 때문에 가장 널리 사용되는 유틸리티 중 하나입니다.[1] 그것은 원래 1976년 4월 Bell Labs에서 Stuart Feldman에 의해 만들어졌습니다.[2][3][1] Feldman은 이 널리 퍼진 도구의 저작에 대해 2003년 ACM 소프트웨어 시스템 상을 받았습니다.[4]

Feldman은 실행 파일이 실수로 변경 사항으로 업데이트되지 않은 자신의 프로그램을 헛되게 디버깅한 동료의 경험에 의해 Make를 작성하게 되었습니다:

Make는 Steve Johnson (yacc 등의 저자)의 방문에서 시작되었으며, 내 사무실에 습격하여, 올바른 프로그램을 디버깅하는 데 아침을 낭비하게 만든 운명을 저주했습니다 (버그가 수정되었고, 파일이 컴파일되지 않았으며, cc *.o는 따라서 영향을 받지 않았습니다. 내가 작업하고 있는 프로젝트에서 같은 참사에 대처하는 데 전날 저녁의 일부를 보냈을 때, 그것을 해결할 도구에 대한 아이디어가 떠올랐습니다. 그것은 의존성 분석기에 대한 정교한 아이디어로 시작하여, 훨씬 더 간단한 것으로 요약되고, Make를 해당 주말로 바뀌었습니다. 아직 젖어 있는 도구를 사용하는 것은 문화의 일부였습니다. Makefiles는 마법처럼 인코딩된 바이너리가 아니라 텍스트 파일이었는데, 왜냐하면 그것이 유닉스 정신: 인쇄 가능, 디버그 가능, 이해 가능한 것이었습니다.

— Stuart Feldman, The Art of Unix Programming, Eric S. Raymond 2003

Make가 도입되기 전에, 유닉스 빌드 시스템은 가장 공통적으로 운영 시스템 종속적인 "make"와 "install" 쉘 스크립트와 동반하는 프로그램 소스로 구성되었습니다. 다른 대상에 대한 명령을 단일 파일로 결합하고 종속성 추적과 아카이브 처리를 추상화할 수 있다는 것은 현대 빌드 환경의 방향에서 중요한 단계였습니다.

Derivatives

Screenshot of GNU Make, an implementation of Make

Make는 같은 파일 형식과 기본 알고리듬 원칙을 사용되고 자체 비-표준 개선 사항을 제공되는 여러 처음부터 시작하는 변형을 포함하여 많은 재작성을 거쳤습니다. 그 중 일부는 다음과 같습니다:

  • Sun DevPro Make는 1986년 SunOS-3.2와 함께 등장했습니다. SunOS-3.2와 함께, 그것은 선택적 프로그램으로 제공되었습니다 SunOS-4.0와 함께, SunPro Make가 기본 Make 프로그램이 되었습니다.[5] 2006년 12월에, Sun DevPro Make는 솔라리스를 오픈-소스화하려는 노력의 일환으로 오픈 소스가 되었습니다.[6][7]
  • Sun Solaris Studio와 함께 기본 Make로 제공되는 dmake 또는 Distributed Make, 그러나 솔라리스 운영 시스템 (SunOS)에서는 기본 Make가 아닙니다. 그것은 원래 OpenOffice를 빌드하기 위해 요구되었지만, 2009년에[8] 빌드 시스템이 GNU Make를 사용하도록 다시 작성되었습니다. Apache OpenOffice는 여전히 두 빌드 시스템의 혼합물이 포함되어 있지만,[9] 훨씬 더 활발하게 개발된 LibreOffice는 오직 현재 현대화된 "gbuild"를 사용합니다.[8]
  • BSD Make (pmake,[10] bmake[11] 또는 fmake[12])는 대상을 병렬로 구축할 수 있는 Make 버전에 대한 Adam de Boor의 작업에서 파생되었고, FreeBSD,[11] NetBSD[13]OpenBSD에서 다양한 수정의 정도에서 살아남았습니다.[14] 독특하게, 그것은 구문 분석 단계에서 적용되는 조건부 및 반복 루프를 가지고 런타임 시 대상 생성을 포함하여 조건부 및 프로그램적으로 makefile을 구성하기 위해 사용될 수 있습니다.[15]
  • GNU Make (short gmake)는 Linux와 macOS에 대해 Make의 표준 구현입니다.[16] 그것은 조건문과 같은 원래 Make에 대한 여러 확장을 제공합니다. 그것은 역시 makefile 규칙에서 쉘 스크립팅의 필요성을 제거하고 makefile에서 설정되고 사용되는 변수를 조작하기 위해 사용될 수 있는 많은 내장 함수를 제공합니다.[17] 예를 들어, foreach 함수는 주어진 디렉토리에서 파일 이름과 같은 값의 목록을 반복하기 위해 사용될 수 있습니다.[18] GNU Make는 GCC (버전 3.4 이후[19]), 리눅스 커널,[20][21] Apache OpenOffice,[9] LibreOffice,[8]Mozilla Firefox[22]를 포함한 많은 소프트웨어 시스템을 구축하는 것에 요구됩니다.
  • Rocky Bernstein의 Remake는 GNU Make의 포크이고 더 나은 위치 및 오류-위치 보고, 실행 추적, 실행 프로파일링과 같은 GNU Make에 대한 여러 확장을 제공하고 그것은 디버거를 포함하고 있습니다.[23]
  • Glenn Fowler의 nmake[24] 같은 이름의 Microsoft 프로그램과 관련이 없습니다. 그것의 입력은 Make와 유사하지만, 호환되지 않습니다. 이 프로그램은 개발자에 따르면 makefile의 크기를 10배로 줄이는 바로 가기와 내장 기능을 제공합니다.
  • Microsoft nmake, 통상적으로 Visual Studio의 일부인 명령줄 도구입니다.[25] 그것은 명령줄 또는 makefile 내에서 설정한 변수를 사용하는 포함 및 조건식과 같은 전처리기 지시문을 지원합니다.[26][27] 추론 규칙은 Make와 다릅니다; 예를 들어 그것들은 검색 경로를 포함할 수 있습니다.[28] Embarcadero 제품과 함께 제공되는 Make 도구는 "MAKE가 Microsoft의 NMAKE를 모방하도록 합니다"라는 명령줄 옵션을 가집니다.[29] Qt ProjectJam 도구는 nmake의 복제품입니다.[30]
  • Mk는 버전 9부터 시작하여 Research Unix에서 Make를 대체했습니다.[31] Bell Labs 프로그래머 Andrew G. Hume에 의해 원래 도구의 재설계, 그것은 다른 구문을 특징으로 합니다. Mk는 Bell Labs에 의해 의도된 유닉스의 후속 제품, Plan 9에서 표준 빌드 도구가 되었습니다.[32]
  • KatiAndroid OS 빌드에 사용되는 GNU Make의 구글의 대체입니다. 그것은 더 빠른 증분 빌드를 위해 makefile을 ninja로 변환합니다.[33]

POSIX는 기본 기능의 표준화와 Make 유틸리티의 연산을 포함하고, Make의 유닉스-기반 버전에서 다양한 정도의 완성도로 구현됩니다. 일반적으로, 간단한 makefile은 합리적인 성공과 함께 다양한 Make 버전 사이에서 사용될 수 있습니다. GNU Make, Makepp 및 BSD Make의 일부 버전은 기본적으로 각각 "GNUmakefile",[34] "Makeppfile"[35] 및 "BSDmakefile"이라는[36] 이름의 파일을 찾는 것으로 기본 설정되어 있으며, 이것은 별도의 위치에서 구현-정의된 동작을 사용하는 메이크파일을 넣는 것을 허용합니다.

Behavior

Make는 전형적으로 소스 코드에서 실행 가능한 프로그램과 라이브러리를 빌드하기 위해 사용됩니다. 일반적으로 그래도, Make는 소스 파일을 대상 결과로 변환하기 위해 임의의 명령을 실행하는 것을 포함하는 임의의 프로세스에 적용할 수 있습니다. 예를 들어, Make는 이미지 파일 (소스)에 대한 변경 사항을 감지하기 위해 사용될 수 있고 변환 동작은 파일을 어떤 특정 형식으로 변환하고, 결과를 콘텐츠 관리 시스템에 복사하고, 그런-다음 이메일을 위의 작업이 수행되었음을 나타내는 미리 정의된 사용자 집합에 보내는 것일 수 있습니다.

Make는 명령줄 인수로 빌드할 대상 파일 이름의 목록과 함께 호출됩니다:

make [TARGET ...]

인수없이, Make는 makefile에 나타나는 첫 번째 대상을 빌드하며, 이 대상은 전통적으로 all이라는 상징적인 "가짜" 대상입니다.

Make는 파일 수정 시간을 비교함으로써 대상을 재생성해야 하는지 여부를 결정합니다.[37] 이것은 이미 최신의 파일의 빌딩을 피하는 문제를 해결하지만, 파일이 변경되지만 수정 시간이 과거로 유지되면 실패합니다. 그러한 변경은 원본 파일의 이전 버전을 복원하거나, 네트워크 파일시스템이 파일의 원본이고 그것의 시계 또는 시간대가 Make를 실행하는 기계와 동기화되지 않을 때 발생할 수 있습니다. 사용자는 전체 빌드를 강제함으로써 이 상황을 처리해야 합니다. 반대로, 만약 소스 파일의 수정 시점이 미래이면, 그것은 불필요한 재구축을 유발하여, 사용자에게 불편을 줄 수 있습니다.

Makefile은 전통적으로 코드 (*.c, *.cc, *.C, 등)를 컴파일하는 데 사용되지만, 그것들은 공통적인 임무를 자동화하는 명령을 제공하는 데에도 사용될 수 있습니다. 그러한 makefile 중 하나는 명령줄에서 호출됩니다:

make            # Without argument runs first TARGET
make help       # Show available TARGETS
make dist       # Make a release archive from current dir

Makefile

Make는 현재 디렉토리에서 사용할 makefile을 검색합니다. 예를 들어, GNU Make는 GNUmakefile, makefile, 또는 Makefile 중 하나의 이름지은 파일을 찾기 위해 파일을 검색하고 그런-다음 (오직) 해당 파일에서 지정된 (또는 기본) 대상을 실행합니다.

makefile 언어는 선언적 프로그래밍과 유사합니다.[38][39][40] 필요한 종료 조건이 설명되어 있지만 조치를 취하게 되는 동작에서 순서는 중요하지 않은 이 언어 클래스는 명령형 프로그래밍에 익숙한 프로그래머에게 때때로 혼동을 줍니다.

빌드 자동화에서 한 가지 문제는 빌드 과정을 주어진 플랫폼에 맞게 조정하는 것입니다. 예를 들어, 한 플랫폼에서 사용되는 컴파일러는 또 다른 플랫폼에서 사용되는 것과 같은 옵션을 허용하지 않을 수 있습니다. 이것은 Make에 의해 잘 처리되지 않습니다. 이 문제는 전형적으로 플랫폼-지정 빌드 지침에 의해 처리되며, 차례로 Make에 의해 처리됩니다. 이 프로세스를 위한 공통적인 도구는 Autoconf, CMake 또는 GYP (또는 고급 NG)입니다.

Makefile에는 5가지 종류가 포함될 수 있습니다:[41]

  1. 명시적 규칙은 규칙의 대상이라고 하는 하나 이상의 파일을 언제 어떻게 다시 만들지 알려줍니다. 그것은 대상의 전제 조건이라고 하는 대상이 의존하는 다른 파일을 나열하고, 대상을 생성하거나 업데이트하기 위해 사용할 레시피를 제공할 수도 있습니다.
  2. 암시적 규칙은 이름을 기반으로 파일 클래스를 언제 어떻게 다시 만들지 알려줍니다. 그것은 대상이 대상과 유사한 이름을 가진 파일에 어떻게 의존하는지 설명하고 그러한 대상을 생성하거나 업데이트하기 위한 레시피를 제공합니다.
  3. 변수 정의는 나중에 텍스트로 대체될 수 있는 변수에 대한 텍스트 문자열 값을 지정하는 줄입니다.
  4. 지시문은 make에 대해 또 다른 makefile을 읽는 것과 같이 makefile을 읽는 동안 특별한 일을 하도록 지시하는 것입니다.
  5. #로 시작하는 줄은 주석에 대해 사용됩니다.

Rules

makefile은 규칙으로 구성됩니다. 각 규칙은 대상과 그 뒤에 콜론 (:)이 오고 선택적으로 대상이 의존하는 구성 요소 (파일 또는 기타 대상)의 열거을 정의하는 텍스트 종속성 줄로 시작합니다. 종속 줄은 대상 (콜론의 왼쪽 변)이 구성 요소 (콜론의 오른쪽 변)에 종속되도록 정렬됩니다. 구성 요소를 대상의 전제 조건으로 참조하는 것이 공통적입니다.[42]

target [target ...]: [component ...]
Tab ↹[command 1]
	   .
	   .
	   .
Tab ↹[command n]

보통 각 규칙은 여러 대상이 아니라 단일 고유한 대상을 가집니다.

예를 들어, C .o 객체 파일은 .c 파일에서 생성되므로, .c 파일이 먼저 옵니다 (즉, 특정 객체 파일 대상은 C 소스 파일과 헤더 파일에 따라 다릅니다). Make 자체가 다른 종류의 파일을 이해, 인식 또는 구별하지 못하기 때문에, 이것은 사람에 의한 오류에 대해 가능성이 열려 있습니다. 잊었거나 여분의 종속성이 즉시 명확하지 않을 수 있고 생성된 소프트웨어에 미묘한 버그를 초래합니다. 타사 도구를 호출함으로써 이들 종속성을 생성하는 makefile을 작성할 수 있고, GNU 프로젝트에 의해 제공된 Automake 도구 모음과 같은 일부 makefile 생성기는 자동으로 그렇게 할 수 있습니다.

각 종속성 줄 뒤에는 구성 요소 (보통 소스 파일)를 대상 (보통 "출력")으로 변환하는 방법을 정의하는 일련의 TAB 들여쓰기 명령줄이 올 수 있습니다. 만약 전제 조건 중 어떤 것이 대상보다 보다 최근 수정 시간을 가지면, 명령줄이 실행됩니다. GNU Make 문서는 규칙과 관련된 명령을 "레시피"라고 참조합니다.

첫 번째 명령은 세미콜론으로 구분된 전제 조건 뒤에 같은 줄에 나타날 수 있습니다:

targets : prerequisites ; command

예를 들어,

hello: ; @echo "hello"

Make는 토폴로지 정렬을 통해 시작할 위치를 결정할 수 있습니다.

각 명령줄은 명령으로 인식될 탭 문자로 시작해야 합니다. 탭은 공백 문자이지만, 스페이스 문자는 같은 특별한 의미를 갖지 않습니다. 이것은 탭과 일련의 스페이스 문자 사이에 시각적 차이가 없을 수 있기 때문에 문제가 됩니다. makefile 구문의 이러한 측면은 종종 비판의 대상이 됩니다; 그것은 Eric S. Raymond에 의해 "유닉스의 역사에서 최악의 디자인 서투른 일 중 하나"로 묘사되었고,[43] The Unix-Haters Handbook은 "구문의 일부로 탭을 사용하는 것은 The Green Berets의 펀치 스틱 트랩 중 하나와 같다"라고 말했습니다. Feldman은 아주 초기 사용자와의 역호환성에 대해 열망에 의해 보존된 초기 구현 어려움에 대해 해결 방법으로 인한 선택을 설명합니다:

왜 1열에서 탭입니까? Yacc는 새로운 것이었고, Lex는 아주 새로운 것이었습니다. 나도 둘 다 시도하지 않았으므로, 이것이 배울 좋은 핑계가 될 것이라고 생각했습니다. Lex를 처음 시도를 해서 스스로 당황한 후, 나는 그냥 newline-tab 패턴으로 간단한 일을 했습니다. 그것은 작동했으며, 그것에 머물렀습니다. 그리고 몇 주 후 나는 약 12명의 사용자 집단을 갖게 되었고, 대부분의 대부분은 친구였고. 나는 임베디드 기반을 망치고 싶지 않았습니다. 나머지는 슬프게도 역사입니다.

— Stuart Feldman[43]

어쨌든, 버전 3.82 이후의 GNU Make는 .RECIPEPREFIX 특수 변수를 사용하여 레시피 접두사로 임의의 기호 (한 문자)를 선택하는 것을 허용합니다. 예를 들면:

.RECIPEPREFIX := :
all:
:@echo "recipe prefix symbol is set to '$(.RECIPEPREFIX)'"

각 명령은 별도의 또는 명령줄 해석기 인스턴스에 의해 실행됩니다. 운영 시스템은 다른 명령줄 해석기를 사용하기 때문에, 이것은 이식-불가능한 makefile로 이어질 수 있습니다. 예를 들어, GNU Make (모든 POSIX Makes)는 기본적으로 cp와 같은 유닉스 명령이 통상적으로 사용되는 /bin/sh로 명령을 실행합니다. 그것과 대조적으로, Microsoft의 nmakecopy와 같은 배치 명령이 사용될 수 있지만 반드시 cp가 아닌 cmd.exe로 명령을 실행합니다.

규칙은 정의된 명령줄을 가질 수 없을 것입니다. 종속성 줄은 대상을 참조하는 구성 요소로만 구성될 수 있습니다. 예를 들어:

realclean: clean distclean

규칙의 명령줄은 보통 그것들이 대상을 생성하도록 정렬됩니다. 예제: 만약 file.html이 더 최신이면, 그것은 텍스트로 변환됩니다. makefile의 내용:

file.txt: file.html
	lynx -dump file.html > file.txt

위의 규칙은 Make가 "file.txt"를 업데이트할 때 트리거됩니다. 다음 호출에서, Make는 전형적으로 "file.html"이 더 최신이면 "file.txt" 대상을 업데이트하기 위해 이 규칙을 사용합니다.

make file.txt

명령줄은 다음 세 가지 접두사 중 하나 이상을 가질 수 있습니다:

  • hyphen-minus (-), 오류가 무시되도록 지정합니다
  • at sign (@), 명령이 실행되기 전에 표준 출력으로 인쇄되지 않도록 지정합니다
  • plus sign (+), "실행하지 않음" 모드에서 Make가 호출되더라도 명령이 실행됩니다

오류를 무시하고 반향을 침묵시키는 것은 특수 대상 .IGNORE.SILENT를 통해 대안적으로 얻어질 수 있습니다.[44]

Microsoft의 NMAKE는 이들 makefile에서 생략될 수 있는 미리 정의된 규칙을 가집니다, 예를 들어, c.obj $(CC)$(CFLAGS).

Macros

makefile은 매크로 정의를 포함할 수 있습니다. 매크로는 그것들이 {{{1}}}와 같은 간단한 문자열 정의를 보유할 때 보통 변수로 참조됩니다. Makefile의 매크로는 Make 유틸리티에 전달된 명령줄 인수에서 덮어쓸 수 있습니다. 환경 변수는 역시 매크로로 사용할 수 있습니다.

매크로는 사용자에게 빌드 과정 동안 호출된 프로그램과 기타 사용자 정의 동작을 지정하는 것을 허용합니다. 예를 들어, 매크로 CCC 컴파일러의 위치를 참조하기 위해 makefile에서 자주 사용되고, 사용자는 사용할 특정 컴파일러를 지정하기를 원할 수 있습니다.

새로운 매크로 (또는 간단한 "변수")는 전통적으로 대문자를 사용하여 정의됩니다:

MACRO = definition

매크로는 그것을 확장함으로써 사용됩니다. 전통적으로 이것은 $() 안에 이름을 둘러쌈으로써 수행됩니다. (괄호를 생략하면 $ 뒤의 다음 문자를 전체 변수 이름으로 해석하는 것으로 이어집니다.) 동등한 형식은 괄호 대신 중괄호, 즉, ${}를 사용하며, 이것은 BSD에서 사용되는 스타일입니다.

NEW_MACRO = $(MACRO)-$(MACRO2)

매크로는 백틱 (`)에 의해 표시되는 명령 치환 연산자를 사용함으로써 쉘 명령으로 구성될 수 있습니다.

YYYYMMDD  = ` date `

정의의 내용은 "있는 그대로" 저장됩니다. 지연 평가가 사용되며, 매크로는 통상적으로 규칙의 명령줄에서 사용될 때와 같이 확장이 실제로 요구될 때 오직 확장됩니다. 확장된 예제:

PACKAGE   = package
VERSION   = ` date +"%Y.%m%d" `
ARCHIVE   = $(PACKAGE)-$(VERSION)

dist:
	#  Notice that only now macros are expanded for shell to interpret:
	#    tar -cf package-`date +"%Y%m%d"`.tar

	tar -cf $(ARCHIVE).tar .

명령줄에서 매크로를 덮어쓰는 일반 구문은 다음과 같습니다:

make MACRO="value" [MACRO="value" ...] TARGET [TARGET ...]

Makefiles은 미리 정의된 여러 내부 매크로에 어떤 것을 접근할 수 있으며, ?@가 가장 공통적입니다.

target: component1 component2
	# contains those components which need attention (i.e. they ARE YOUNGER than current TARGET).
	echo $? 
	# evaluates to current TARGET name from among those left of the colon.
	echo $@

다소 공통적인 구문 확장은 등호 대신 +=, ?=, 및 !=의 사용입니다. 그것은 BSD와 GNU makes에서 똑같이 작동합니다.[45]

Suffix rules

접미사 규칙은 .FROM.TO 형식에서 이름을 가진 "대상"을 가지고 파일 확장자를 기반으로 동작을 시작하기 위해 사용됩니다. 접미사 규칙의 명령줄에서, POSIX는 내부 매크로 $<가 첫 번째 전제 조건을 참조하고 $@가 대상을 참조하도록 지정합니다.[46] HTML 파일을 텍스트로 변환하는 이 예제에서, 쉘 리다이렉션 토큰 >은 명령줄의 일부이지만 $<는 HTML 파일을 참조하는 매크로입니다:

.SUFFIXES: .txt .html

# From .html to .txt
.html.txt:
	lynx -dump $<   >   $@

명령줄에서 호출될 때, 위의 예가 확장됩니다.

$ make -n file.txt
lynx -dump file.html > file.txt

Pattern rules

접미사 규칙은 자체의 임의의 전제 조건을 가질 수 없습니다.[47] 만약 그것들이 임의의 것을 가지면, 그것들은 접미사 규칙이 아닌 특이한 이름을 가진 일반 파일로 처리됩니다. GNU Make는 이전 makefile과의 호환성을 위해 접미사 규칙을 지원하지만 그렇지 않으면 패턴 규칙의 사용을 권장합니다.[48]

패턴 규칙은 그것의 대상이 문자열 내에 정확하게 하나의 % 문자를 포함한다는 점을 제외하면 보토의 규칙처럼 보입니다. 대상은 일치하는 파일 이름에 대해 패턴으로 여겨집니다: %는 0개 이상의 임의의 하위문자열과 일치할 수 있지만,[49] 다른 문자는 오직 자신과 일치합니다. 전제 조건은 마찬가지로 %를 그것들의 이름이 대상 이름과 관련되는 방법을 보여주기 위해 사용합니다.

접미사 규칙의 위의 예제는 다음 패턴 규칙과 같습니다:

# From %.html to %.txt
%.txt : %.html 
	lynx -dump $< > $@

Other elements

단일-줄 주석해시 기호 (#)로 시작됩니다.

Makefile에서 일부 지시문은 다른 makefile을 포함할 수 있습니다.

줄 연쇄는 줄 끝에 백슬래시 \ 문자로 표시됩니다.

   target: component \
           component
   Tab ↹command ;          \
   Tab ↹command |          \
   Tab ↹piped-command

Example makefiles

The makefile:

PACKAGE	 = package
VERSION	 = ` date "+%Y.%m%d%" `
RELEASE_DIR  = ..
RELEASE_FILE = $(PACKAGE)-$(VERSION)

# Notice that the variable LOGNAME comes from the environment in
# POSIX shells.
#
# target: all - Default target. Does nothing.
all:
	echo "Hello $(LOGNAME), nothing to do by default"
		# sometimes: echo "Hello ${LOGNAME}, nothing to do by default"
	echo "Try 'make help'"

# target: help - Display callable targets.
help:
	egrep "^# target:" [Mm]akefile

# target: list - List source files
list:
	# Won't work. Each command is in separate shell
	cd src
	ls

	# Correct, continuation of the same shell
	cd src; \
	ls

# target: dist - Make a release.
dist:
	tar -cf  $(RELEASE_DIR)/$(RELEASE_FILE) && \
	gzip -9  $(RELEASE_DIR)/$(RELEASE_FILE).tar

아래는 기본적으로 ("all" 규칙이 먼저 나열됨) 시스템의 C 컴파일러를 사용하여 "helloworld.c"라는 소스 파일을 컴파일하고 역시 사용자가 다시 시작하려고 희망하면 생성된 파일을 제거하기 위해 "깨끗한" 대상을 제공하는 매우 간단한 makefile입니다. $@$<는 소위 내부 매크로 (역시 자동 변수라고 알려져 있음) 2개이고 각각 대상 이름과 "암시적" 소스를 나타냅니다. 아래 예제에서, $^는 선행 조건의 스페이스 구분된 목록으로 확장됩니다. 다른 내부 매크로가 많이 있습니다.[46][50]

CFLAGS ?= -g

all: helloworld

helloworld: helloworld.o
	# Commands start with TAB not spaces
	$(CC) $(LDFLAGS) -o $@ $^

helloworld.o: helloworld.c
	$(CC) $(CFLAGS) -c -o $@ $<

clean: FRC
	$(RM) helloworld helloworld.o

# This pseudo target causes all targets that depend on FRC
# to be remade even in case a file with the name of the target exists.
# This works with any make implementation under the assumption that
# there is no file FRC in the current directory.
FRC:

많은 시스템은 파일 접미사를 기반으로 하는 컴파일과 같은 공통적인 임무를 지정하기 위해 미리-정의된 Make 규칙과 매크로가 함께 제공됩니다. 이것은 사용자에게 소스에서 대상을 생성하는 방법의 실제 (종종 이식-불가능한) 지침을 생략하는 것을 시킵니다. 그러한 시스템에서, 위의 makefile은 다음과 같이 수정할 수 있습니다:

all: helloworld

helloworld: helloworld.o
	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^

clean: FRC
	$(RM) helloworld helloworld.o

# This is an explicit suffix rule. It may be omitted on systems
# that handle simple rules like this automatically.
.c.o:
	$(CC) $(CFLAGS) -c $<

FRC:
.SUFFIXES: .c

"helloworld.c"에 의존하는 "helloworld.o"는 이제 Make에 의해 자동으로 처리됩니다. 여기에 설명된 것과 같은 그런 간단한 예제에서, 이것이 거의 중요하지 않지만, 접미사 규칙의 진정한 힘은 소프트웨어 프로젝트에서 소스 파일 수가 증가하기 시작할 때 분명해집니다. 연결 단계에 대한 규칙을 작성하고 객체 파일을 전제 조건으로 선언하기만 하면 됩니다. Make는 그런-다음 모든 객체 파일을 만들고 모든 소스 파일에서 변경 사항을 찾는 방법을 암시적으로 결정할 것입니다.

단순 접미사 규칙은 소스 파일이 서로 의존하지 않고 헤더 파일과 같은 다른 파일에 의존하지 않은 한 잘 작동합니다. 빌드 과정을 단순화하는 또 다른 길은 컴파일러-지원 종속성 생성과 결합될 수 있는 소위 패턴 일치 규칙을 사용하는 것입니다. gcc 컴파일러와 GNU Make를 필요로 하는 마지막 예제로서, 여기에 폴더에 있는 모든 C 파일을 해당 오브젝트 파일로 컴파일하고 그런-다음 그것들을 최종 실행 파일에 연결하는 일반 makefile이 있습니다. 컴파일이 일어나기 전에, 종속성은 makefile-친숙한 형식으로 숨겨진 파일 ".depend"로 수집되어 makefile에 포함됩니다. 이식 가능한 프로그램은 아래에 사용된 구문을 피해야 합니다.

# Generic GNUMakefile

# Just a snippet to stop executing under other make(1) commands
# that won't understand these lines
ifneq (,)
This makefile requires GNU Make.
endif

PROGRAM = foo
C_FILES := $(wildcard *.c)
OBJS := $(patsubst %.c, %.o, $(C_FILES))
CC = cc
CFLAGS = -Wall -pedantic
LDFLAGS =
LDLIBS = -lm

all: $(PROGRAM)

$(PROGRAM): .depend $(OBJS)
	$(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) -o $(PROGRAM) $(LDLIBS)

depend: .depend

.depend: cmd = gcc -MM -MF depend $(var); cat depend >> .depend;
.depend:
	@echo "Generating dependencies..."
	@$(foreach var, $(C_FILES), $(cmd))
	@rm -f depend

-include .depend

# These are the pattern matching rules. In addition to the automatic
# variables used here, the variable $* that matches whatever % stands for
# can be useful in special cases.
%.o: %.c
	$(CC) $(CFLAGS) -c $< -o $@

%: %.o
	$(CC) $(CFLAGS) -o $@ $<

clean:
	rm -f .depend $(OBJS)

.PHONY: clean depend

See also

References

  1. ^ a b Thompson, T. J. (November 1980). "Designer's Workbench: Providing a Production Environment". Bell System Technical Journal. 59 (9): 1811–1825. doi:10.1002/j.1538-7305.1980.tb03063.x. S2CID 27213583. In the general maintenance of DWB, we have used the Source Code Control System and make utility provided by the PWB/UNIX* interactive operating system.
  2. ^ "V7/usr/src/cmd/make/ident.c". tuhs.org. 1 September 2013. Archived from the original on 1 September 2013. Retrieved 18 March 2018.
  3. ^ Feldman, S. I. (April 1979). "Make --- A Program for Maintaining Computer Programs". Software: Practice and Experience. 9 (4): 255–265. CiteSeerX 10.1.1.39.7058. doi:10.1002/spe.4380090402.
  4. ^ Matthew Doar (2005). Practical Development Environments. O'Reilly Media. p. 94. ISBN 978-0-596-00796-6.
  5. ^ "Google Groups". arquivo.pt. Archived from the original on 22 January 2011. Retrieved 18 March 2018.{{cite web}}: CS1 maint: bot: original URL status unknown (link)
  6. ^ "OpenSolaris at Two (Jim Grisanzio)". 12 December 2013. Archived from the original on 12 December 2013. Retrieved 18 March 2018.
  7. ^ Grisanzio, Jim. The OpenSolaris Story.
  8. ^ a b c "Development/Gbuild - The Document Foundation Wiki". wiki.documentfoundation.org. Retrieved 18 March 2018.
  9. ^ a b "Apache OpenOffice Building Guide - Apache OpenOffice Wiki". wiki.openoffice.org. Retrieved 18 March 2018.
  10. ^ FreeBSD 2.0.5 Make Source Code, 1993
  11. ^ a b https://www.freebsd.org/cgi/man.cgi?query=bmake&sektion=1
  12. ^ https://manpages.debian.org/jessie/freebsd-buildutils/fmake.1
  13. ^ "make". NetBSD Manual Pages. Retrieved 9 July 2020.
  14. ^ "make(1) - OpenBSD manual pages". man.openbsd.org. Retrieved 18 March 2018.
  15. ^ "make". FreeBSD. Retrieved 9 July 2020. Makefile inclusion, conditional structures and for loops reminiscent of the C programming language are provided in make.
  16. ^ Arnold Robbins (2005), Unix in a Nutshell, Fourth Edition, O'Reilly
  17. ^ "8. Functions for Transforming Text", GNU make, Free Software Foundation, 2013
  18. ^ "8.5 The foreach Function", GNU make, Free Software Foundation, 2013
  19. ^ "GCC 3.4 Release Series Changes, New Features, and Fixes". Free Software Foundation. 2006.
  20. ^ Javier Martinez Canillas (December 26, 2012). "Kbuild: the Linux Kernel Build System". Linux Journal.
  21. ^ Greg Kroah-Hartman (2006), Linux Kernel in a Nutshell, O'Reilly
  22. ^ "Build Instructions".
  23. ^ Rocky Bernstein. "Remake – GNU Make with comprehensible tracing and a debugger".
  24. ^ Glenn Fowler (January 4, 2012). "nmake Overview". Information and Software Systems Research, AT&T Labs Research. Archived from the original on September 2, 2015. Retrieved May 26, 2014.
  25. ^ "NMAKE Reference Visual Studio 2015". Microsoft. 2015.
  26. ^ "Makefile Preprocessing Directives". 2014.
  27. ^ "Makefile Preprocessing Operators". Microsoft. 2014.
  28. ^ "Search Paths in Rules". Microsoft. 2014.
  29. ^ "MAKE". CodeGear(TM). 2008.
  30. ^ "Jom - Qt Wiki". Qt Project. 2021.
  31. ^ McIlroy, M. D. (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 (PDF) (Technical report). Bell Labs. CSTR 139.
  32. ^ Hume, Andrew G.; Flandrena, Bob (2002). "Maintaining files on Plan 9 with Mk". Plan 9 Programmer’s Manual. AT&T Bell Laboratories. Archived from the original on July 11, 2015.
  33. ^ "google/kati: An experimental GNU make clone". GitHub. 30 November 2020.
  34. ^ "GNU 'make'". Free Software Foundation.
  35. ^ "Makepp".
  36. ^ "Free BSD make".
  37. ^ How to sort Linux ls command file output Archived September 13, 2016, at the Wayback Machine
  38. ^ an overview on dsls Archived October 23, 2007, at the Wayback Machine, 2007/02/27, phoenix wiki
  39. ^ Re: Choreography and REST Archived September 12, 2016, at the Wayback Machine, from Christopher B Ferris on 2002-08-09
  40. ^ Target Junior Makefiles Archived January 7, 2010, at the Wayback Machine, Andrew W. Fitzgibbon and William A. Hoffman
  41. ^ 3.1 What Makefiles Contain, GNU make, Free Software Foundation
  42. ^ "Prerequisite Types (GNU make)". GNU.org. GNU Project. Retrieved 15 December 2020.
  43. ^ a b "Chapter 15. Tools: make: Automating Your Recipes", The Art of Unix Programming, Eric S. Raymond 2003
  44. ^ make – Reference, The Single UNIX Specification, Issue 7 from The Open Group
  45. ^ make(1) – FreeBSD General Commands Manual
  46. ^ a b "make". www.opengroup.org. Retrieved 18 March 2018.
  47. ^ "GNU make manual: suffix rules". Free Software Foundation.
  48. ^ "GNU make manual: pattern rules". Free Software Foundation.
  49. ^ See section Pattern Matching Rules in the SunPro man page Archived May 29, 2014, at the Wayback Machine
  50. ^ Automatic Variables Archived April 25, 2016, at the Wayback Machine GNU `make'

External links