제조(소프트웨어)

Make (software)
만들다
패러다임매크로, 선언적
설계자스튜어트 펠드먼
처음 등장한1976년 4월, 46년 전(1976-04)
구현 언어C
OSUnix 라이크, Inferno
파일 형식파일 만들기
주요 구현
BSD, GNU, nmake
사투리
BSD 제조사, GNU 제조사, Microsoft nmake
영향받은
개미, 레이크, MSBuild

소프트웨어 개발에서 Make는 대상 프로그램을 도출하는 방법을 지정하는 Makefiles라는 파일읽어냄으로써 소스 코드에서 실행 가능한 프로그램과 라이브러리자동으로 빌드하는 빌드 자동화 도구입니다.빌드 프로세스를 관리하기 위해 통합 개발 환경과 특정 언어 컴파일러 기능을 사용할 수도 있지만 Make는 특히 Unix 및 Unix 유사 운영 체제에서 널리 사용됩니다.

프로그램을 빌드하는 것 외에 Make를 사용하여 다른 파일이 변경될 때마다 자동으로 업데이트되어야 하는 프로젝트를 관리할 수 있습니다.

기원.

현재는 의존관계 추적 빌드 유틸리티가 다수 존재하지만 Make는 소프트웨어 개발 [1]태스크를 대상으로 한 다양한 툴을 특징으로 하는 PWB/UNIX 1.0을 시작으로 Unix에 포함되어 있기 때문에 가장 널리 보급되어 있습니다.이것은 1976년 4월 Stuart Feldman에 의해[2][3][1]연구소에서 처음 만들어졌습니다.Feldman은 이 광범위한 [4]툴의 오서링으로 2003년 ACM Software System Award를 수상했습니다.

Feldman은 동료가 실수로 실행 파일이 변경으로 업데이트되지 않은 프로그램을 디버깅한 경험을 바탕으로 Make를 작성하게 되었습니다.

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

--

Make가 도입되기 전에 Unix 빌드 시스템은 일반적으로 운영체제에 의존하는 "make"와 "install" 셸 스크립트로 구성되어 프로그램 소스에 첨부되어 있었습니다.서로 다른 타겟에 대한 명령어를 하나의 파일로 결합할 수 있고 의존관계 추적 및 아카이브 처리를 추상화할 수 있는 것은 현대 빌드 환경의 방향에서 중요한 단계였습니다.

파생상품

Make의 구현인 GNU Make의 스크린샷

Make는 동일한 파일 형식과 기본 알고리즘 원리를 사용하고 자체 비표준 기능 확장을 제공하는 스크래치 변형 등 여러 번 다시 쓰기를 거쳤습니다.그 중 몇 가지는 다음과 같습니다.

  • Sun DevPro Make는 1986년에 SunOS-3.2와 함께 등장했습니다.SunOS-3.2에서는 옵션 프로그램으로 제공되었으며 SunOS-4.0에서는 SunPro Make가 기본 Make 프로그램으로 [5][better source needed]지정되었습니다.2006년 12월,[6][7] Sun DevPro Make는 Solaris의 오픈 소스의 일환으로서 오픈 소스가 되었습니다.
  • Sun Solaris Studio와 함께 제공된 dmake 또는 Distributed Make를 기본 Make로 지정하지만 Solaris 운영체제(SunOS)에서는 기본 Make가 아닙니다.원래 OpenOffice를 구축하기 위해 필요했지만 2009년에 빌드 시스템이[8] GNU Make를 사용하도록 다시 작성되었습니다.Apache OpenOffice는 여전히 두 빌드 [9]시스템의 혼합을 포함하고 있지만, 훨씬 더 적극적으로 개발된 LibreOffice는 현재 [8]현대화된 "gbuild"만을 사용합니다.
  • BSD Make(pmake,[10] bmake[11] 또는 fmake[12])는 Adam de Boor가 병렬로 타겟을 구축할 수 있는 Make 버전에 대해 수행한 작업에서 파생되었으며 [11]FreeBSD[13], NetBSD [14]및 OpenBSD에서 다양한 수준의 수정으로 살아남습니다.특이하게 해석 단계에서 적용되는 조건과 반복 루프를 가지며 실행 [citation needed]시 타깃 생성을 포함하여 조건적이고 프로그래밍적으로 make [15]파일을 구축하기 위해 사용될 수 있습니다.
  • GNU Make(짧은 gmake)는 Linux [16]및 MacOS용 Make의 표준 구현입니다.원래 Make에 대한 여러 확장(예: 조건)을 제공합니다.또한 makefile 규칙에서 셸 스크립팅의 필요성을 없애고 makefile에서 [17]설정 및 사용되는 변수를 조작하기 위해 사용할 수 있는 많은 내장 함수를 제공합니다.예를 들어, foreach 함수를 사용하여 특정 [18]디렉토리의 파일 이름 등 값 목록에 대해 반복할 수 있습니다.GNU Make는 GCC(버전 3.4[19] 이후), Linux 커널,[20][21] Apache OpenOffice,[9] LibreOffice [8] Mozilla [22]Firefox를 포함한 많은 소프트웨어 시스템을 구축하기 위해 필요합니다.
  • Rocky Bernstein's[23] Remake는 GNU Make의 포크이며 더 나은 위치 및 오류 위치 보고, 실행 추적, 실행 프로파일링과 같은 GNU Make에 대한 몇 가지 확장을 제공합니다.
  • 글렌 파울러의 nmake[24] 같은 이름의 마이크로소프트 프로그램과 관련이 없습니다.입력은 Make와 비슷하지만 호환되지 않습니다.이 프로그램은 바로 가기 기능과 내장 기능을 제공하며, 개발자에 따르면 makefile의 크기를 10배까지 줄인다.
  • Microsoft nmake는 일반적으로 Visual [25]Studio의 일부인 명령줄 도구입니다.명령줄 또는 makefile [26][27]내에 설정된 변수를 사용하는 include 및 조건부 식과 같은 사전 프로세서 명령을 지원합니다.추론 규칙은 Make와 다릅니다. 예를 들어 검색 [28]경로를 포함할 수 있습니다.Embacadero 제품과 함께 제공되는 Make 도구에는 "Make가 Microsoft의 [29]NMAKE를 모방합니다."라는 명령줄 옵션이 있습니다.Qt Project의 Jom 툴은 nmake [30]복제품입니다.
  • Mk는 버전 [31]9부터 Research Unix의 Make를 대체했습니다.Bell Labs 프로그래머 Andrew G에 의한 오리지널 툴의 재설계.흄, 다른 구문이 특징이에요.Mk는 Bell Labs가 의도한 [32]Unix의 후속 제품인 Plan 9의 표준 빌드 툴이 되었습니다.
  • Kati구글이 안드로이드 OS 빌드에 사용하는 GNU Make를 대체한 것입니다.makefile을 ninja로 변환하여 빌드 속도를 [33]높입니다.
  • Snakemake생물정보학 워크플로우를 [34]컴파일 및 실행하기 위한 파이썬 기반 구현입니다.

POSIX에는 Make 유틸리티의 기본 기능과 동작의 표준화가 포함되어 있으며 Unix 기반 Make 버전에서 다양한 완성도로 구현됩니다.일반적으로 Make의 다양한 버전 간에 간단한 make 파일을 사용할 수 있습니다.GNU Make, Makepp 및 일부 버전의 BSD 각각 "GNumakefile",[35] "Makeppile"[36] 및 "BSDmakefile"[37]이라는 이름의 파일을 먼저 찾도록 기본값을 설정합니다.이것에 의해, 다른 장소에서 실장 정의의 동작을 사용하는 putfile을 작성할 수 있습니다.

행동

Make는 일반적으로 소스 코드로 실행 가능한 프로그램 및 라이브러리를 빌드하는 데 사용됩니다.그러나 일반적으로 Make는 소스 파일을 대상 결과로 변환하는 임의 명령을 실행하는 모든 프로세스에 적용할 수 있습니다.예를 들어 이미지 파일(소스)에 대한 변경을 검출하기 위해 Make를 사용할 수 있습니다.변환 액션은 파일을 특정 형식으로 변환하고 결과를 콘텐츠 관리 시스템에 복사한 다음 위의 액션이 수행되었음을 나타내는 전자 메일을 미리 정의된 일련의 사용자에게 보내는 것입니다.

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

[타깃...]을 작성하다

인수 없이 Make는 makefile에 나타나는 첫 번째 대상을 빌드합니다.makefile은 전통적으로 all이라는 이름의 상징적인 "위장" 대상입니다.

Make는 파일 수정 [38]시간을 비교하여 대상을 재생성해야 하는지 여부를 결정합니다.이것에 의해, 이미 최신인 파일의 빌드를 회피하는 문제가 해결됩니다만, 파일이 변경되어도 수정 시간이 과거가 되어 버리면 실패합니다.이러한 변경은 이전 버전의 소스 파일을 복원하거나 네트워크 파일 시스템이 파일의 소스이고 해당 클럭 또는 시간대가 Make를 실행하는 시스템과 동기화되지 않은 경우에 발생할 수 있습니다.사용자는 완전한 빌드를 강제하여 이 상황을 처리해야 합니다.반대로 소스 파일의 수정 시간이 향후인 경우 불필요한 재구축이 트리거되어 사용자에게 불편을 줄 수 있습니다.

makefile은 전통적으로 코드 컴파일(*.c, *.cc, *.C 등)에 사용되지만 공통 작업을 자동화하는 명령어 제공에도 사용할 수 있습니다.이러한 make 파일 중 하나가 명령줄에서 호출됩니다.

make # 인수 없이 먼저 TARGET make help # 사용 가능한 TARGET make dist # 현재 dir에서 릴리스 아카이브를 만듭니다.

파일 만들기

사용할 makefile을 현재 디렉토리로 검색합니다(예: GNU 다음 중 하나라는 이름의 파일을 검색하기 위해 파일 만들기).GNUmakefile, makefile 또는 Makefile을 실행한 후 해당 파일에서 지정된(또는 기본) 대상을 실행합니다.

makefile 언어는 선언형 프로그래밍과 [39][40][41]유사합니다.필요한 최종 조건이 설명되지만 액션이 실행되는 순서는 중요하지 않은 이 언어 클래스는 명령형 프로그래밍에 익숙한 프로그래머에게 때때로 혼란을 줍니다.

빌드 자동화의 한 가지 문제는 빌드 프로세스를 특정 플랫폼에 맞게 조정하는 것입니다.예를 들어, 어떤 플랫폼에서 사용되는 컴파일러는 다른 플랫폼에서 사용되는 것과 동일한 옵션을 받아들이지 않을 수 있습니다.이것은 Make에서 잘 처리되지 않습니다.이 문제는 일반적으로 플랫폼 고유의 빌드 명령을 생성하여 처리되며, 이 명령어는 Make에 의해 처리됩니다.이 프로세스의 일반적인 도구는 Autoconf, CMake 또는 GYP(또는 고급 NG)입니다.

makefile에는 다음 5가지 [42]종류가 있습니다.

  1. 명시적 규칙은 규칙의 대상이라고 하는 하나 이상의 파일을 다시 만드는 시기와 방법을 나타냅니다.타깃이 의존하는 다른 파일(타깃의 전제조건)을 나열하고 타깃을 작성 또는 갱신하기 위한 레시피를 제공할 수도 있습니다.
  2. 암묵적인 규칙은 파일 클래스를 이름을 기반으로 다시 만드는 시기와 방법을 나타냅니다.대상과 이름이 유사한 파일에 대상이 종속되는 방법을 설명하고 이러한 대상을 만들거나 업데이트할 수 있는 방법을 제공합니다.
  3. 변수 정의는 나중에 텍스트로 대체할 수 있는 변수의 텍스트 문자열 값을 지정하는 행입니다.
  4. 지시문은 다른 makefile을 읽는 등 makefile을 읽는 동안 특별한 작업을 하도록 지시하는 것입니다.
  5. 다음 행으로 시작하는 행#코멘트에 사용됩니다.

규칙.

makefile은 규칙으로 구성됩니다.각 규칙은 대상을 정의하는 텍스트 종속성 행에서 시작하여 콜론(:)을 정의하고 선택적으로 대상이 종속되는 구성 요소(파일 또는 기타 대상)를 열거합니다.대상(대장의 왼쪽)이 구성 요소(대장의 오른쪽)에 따라 달라지도록 종속 선이 배열됩니다.일반적으로 타깃의 전제조건으로 [43]컴포넌트를 참조합니다.

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

일반적으로 각 규칙에는 여러 개의 대상이 아닌 하나의 고유한 대상이 있습니다.

를 들어, C .o 오브젝트 파일은 .c 파일에서 생성되므로 .c 파일이 우선됩니다(즉, 특정 오브젝트 파일 대상은 C 소스 파일과 헤더 파일에 의존합니다).Make 자체는 다른 종류의 파일을 이해, 인식, 구별하지 못하기 때문에 인위적인 오류의 가능성이 있습니다.잊어버렸거나 의존성이 높아졌다고 해서 금방 알 수 있는 것은 아니며 생성된 소프트웨어에 미묘한 오류가 발생할 수 있습니다.서드파티 툴을 호출함으로써 이러한 의존관계를 생성하는 make 파일을 작성할 수 있으며, GNU 프로젝트에서 제공하는 Automake 툴체인과 같은 일부 make 파일 생성기는 자동으로 작성할 수 있습니다.

각 의존관계 행 뒤에는 컴포넌트(일반적으로 소스 파일)를 타겟(일반적으로 "출력")으로 변환하는 방법을 정의하는 일련의 TAB 들여쓰기 명령줄이 있을 수 있습니다.전제 조건 중 하나라도 대상보다 최신 수정 시간을 가진 경우 명령줄이 실행됩니다.GNU Make 문서에서는 규칙과 관련된 명령어를 "레시피"라고 부릅니다.

첫 번째 명령어는 전제조건 뒤에 같은 행에 세미콜론으로 구분하여 표시할 수 있습니다.

targets : 전제조건; 명령어

예를들면,

hello: ; @hello "hello"

Make는 토폴로지 정렬을 통해 어디서 시작할지 결정할 수 있습니다.

각 명령줄은 탭 문자로 시작해야 명령으로 인식됩니다.탭은 공백 문자이지만 공백 문자는 특별한 의미가 없습니다.탭과 일련의 공백 문자 사이에 시각적인 차이가 없을 수 있기 때문에 문제가 있습니다.makefiles 구문의 이러한 측면은 종종 비판의 대상이 됩니다. Eric S에 의해 설명되었습니다. "[44]유닉스 역사상 최악의 디자인 봇 중 하나"인 레이먼드와 유닉스-해터스 핸드북은 "구문의 일부로 탭을 사용하는 것은 그린 베레모나오는 펀지 스틱 트랩 중 하나"라고 말했다.Feldman은 첫 번째 사용자와의 하위 호환성에 대한 욕구로 인해 초기 구현에 어려움을 겪기 위한 회피책으로 인해 이러한 선택이 이루어졌다고 설명합니다.

1열에 탭이 있는 이유는 무엇입니까?Yacc새로웠고 Lex는 새로웠다.저도 해보지 않았기 때문에, 이것이 배울 수 있는 좋은 핑계라고 생각했습니다.렉스에서의 첫 시도 후에, 나는 패턴 뉴라인 탭으로 간단한 것을 했다.효과가 있었고, 계속됐어요.그리고 몇 주 후에 사용자 수가 12명 정도 되었고, 그들 대부분은 친구였습니다. 그리고 저는 제 임베디드 기반을 망치고 싶지 않았습니다.나머지는, 슬프게도, 역사입니다.

--

단, 버전 3.82 이후 GNU Make에서는 를 사용하여 레시피 프리픽스로 임의의 기호(1글자)를 선택할 수 있습니다.RECIPERFIX 특수 변수. 예:

.RECEPREFIX := : all::@prefix " 접두사 기호가 '
                
()로 설정되었습니다.레시피 프리픽스'

각 명령어는 개별 셸 또는 명령줄 인터프리터 인스턴스에 의해 실행됩니다.운영체제는 다른 명령줄 인터프리터를 사용하기 때문에 makefile이 이동 불능이 될 수 있습니다.예를 들어 GNU Make(모든 POSIX Makes)는 기본적으로 /bin/sh를 사용하여 명령을 실행합니다.여기서는 보통 cp와 같은 Unix 명령어가 사용됩니다.이와는 대조적으로 Microsoft의 nmake는 cmd.exe를 사용하여 명령을 실행합니다.여기서 copy와 같은 배치명령어는 사용할 수 있지만 반드시 cp는 사용할 수 없습니다.

규칙에는 명령줄이 정의되어 있지 않을 수 있습니다.의존관계 행은 타깃을 참조하는 컴포넌트만으로 구성될 수 있습니다.다음은 예를 제시하겠습니다.

진짜 깨끗하다: 깨끗한 디스클리닝 

규칙의 명령줄은 일반적으로 대상을 생성하도록 배열됩니다.예: file.html이 최신 버전인 경우 텍스트로 변환됩니다.make 파일의 내용:

file.txt: file.file.filength lynx - filength file.file > filetxt

위의 규칙은 "file.txt" 업데이트를 만들 때 트리거됩니다.다음 호출에서 "file.html"이 최신인 경우 Make는 일반적으로 이 규칙을 사용하여 "file.txt" 대상을 업데이트합니다.

줄서다.txt

명령줄에는 다음 3개의 프레픽스 중1개 이상을 지정할 수 있습니다.

  • 에러가 무시됨을 나타내는 하이픈 기호(-)
  • 명령어가 실행되기 전에 표준 출력으로 인쇄되지 않음을 나타내는 기호(@)
  • 더하기 기호(+), Make가 "do not execute" 모드에서 호출된 경우에도 명령어가 실행됩니다.

오류 무시 및 소음 에코 대신 특수 대상을 통해 얻을 수 있습니다..IGNORE그리고..SILENT를 클릭합니다.[45]

Microsoft의 NMAKE에는 이러한 make 파일에서 생략할 수 있는 사전 정의된 규칙이 있습니다.c.obj $(CC)$(CFLAGS).

매크로

make 파일에는 매크로 정의를 포함할 수 있습니다.매크로는 보통 다음과 같은 단순한 문자열 정의를 보유할 때 변수라고 불립니다.CC=clangmake files 내의 매크로는 Make 유틸리티에 전달되는 명령줄 인수로 덮어쓸 수 있습니다.환경변수는 매크로로도 사용할 수 있습니다.

매크로를 사용하면 빌드 프로세스 중에 호출된 프로그램 및 기타 사용자 지정 동작을 지정할 수 있습니다.예를 들어 매크로가CC는 C 컴파일러의 위치를 나타내기 위해 makefile에서 자주 사용되며 사용자는 사용할 특정 컴파일러를 지정할 수 있습니다.

새로운 매크로(또는 단순한 「변수」)는, 종래에는 대문자를 사용해 정의되고 있습니다.

매크로 = 정의

매크로를 확장하여 사용합니다.전통적으로 이것은 그 이름을 안에 넣는 방식으로 수행되었습니다.$(). (괄호를 생략하면 Make the next letterpreturing interpretering with the next letter after after the$변수 이름 전체로 지정됩니다.동등한 형식은 괄호 대신 물결 괄호를 사용합니다.${}이것은 BSD에서 사용되는 스타일입니다.

NEW_MACRO = $(MACRO)-$(MACRO2)

매크로는 명령어 대체 연산자를 사용하여 셸 명령어로 구성할 수 있습니다(backticks).`).

YYYYMMDD = ' date '

정의의 내용은 "있는 그대로" 저장됩니다.느린 평가가 사용됩니다. 즉, 일반적으로 매크로의 확장이 규칙의 명령줄에서 사용되는 경우와 같이 실제로 필요한 경우에만 매크로가 확장됩니다.확장 예:

PARGE = package VERSION = ' date +"%Y.%m.%d" 'ARCHIVE.tar' = $(PACKAGE)-$(VERSION) dist: # # 이제 매크로가 셸에서 해석할 수 있도록 확장되어 있음: # tar -cf package - date - cf package - date - %%m . date . date . date . date . date .

명령줄에서 매크로를 덮어쓰기 위한 일반적인 구문은 다음과 같습니다.

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

Makefile은 사전 정의된 내부 매크로 중 하나에 액세스할 수 있습니다.?그리고.@가장 흔합니다.

대상: component1 component2 #에는 주의가 필요한 컴포넌트가 포함되어 있습니다(즉, 현재 대상보다 젊음).echo $? #는 콜론의 왼쪽 이름현재 TARGET 이름으로 평가됩니다.echo $@

일반적인 구문 확장으로는 등호 대신 +=, ?= 및 !=가 사용됩니다.BSD와 GNU에서 동일하게 [46]동작합니다.

서픽스 규칙

접미사 규칙에는 양식에 이름이 포함된 "타깃"이 있습니다..FROM.TO파일 확장자에 기반한 작업을 시작하는 데 사용됩니다.접미사 규칙의[47] 명령줄에서 POSIX는 내부 매크로가 다음과 같이 지정합니다.$$BODY$$lt;첫 번째 전제조건과$@타깃을 나타냅니다.이 예에서는 임의의 HTML 파일을 텍스트로 변환합니다.이 예에서는 셸 리다이렉션토큰이>는 명령줄의 일부입니다.$$BODY$$lt;는 HTML 파일을 참조하는 매크로입니다.

.SUFIXES: .txt .html # .html ~ .txt.txt : lynx - dump $ < > $@

명령줄에서 호출하면 위의 예가 확장됩니다.

$ make -n 파일.txt lynx - syslog file . syslogs > file.txt

패턴 규칙

접미사 규칙에는 자체 [48]필수 구성 요소를 포함할 수 없습니다.이러한 파일이 있는 경우 해당 파일은 접미사 규칙이 아닌 비정상적인 이름을 가진 일반 파일로 취급됩니다.GNU Make는 이전 make 파일과의 호환성을 위한 접미사 규칙을 지원하지만, 그렇지 않으면 패턴 [49]규칙 사용을 권장합니다.

패턴 규칙은 대상에 정확히 하나가 포함되어 있다는 점을 제외하고는 일반 규칙과 유사합니다.%문자열 내의 문자.타겟은 일치하는 파일 이름 패턴으로 간주됩니다.%는 0 [50]이상의 임의의 서브스트링과 일치할 수 있으며 다른 문자는 그 자체만 일치합니다.전제 조건도 마찬가지로 다음과 같습니다.%대상 이름과 이름이 어떻게 관련되어 있는지 보여줍니다.

위의 접미사 규칙 예는 다음과 같습니다.

# % . html ~% 。txt % . txt : %sys lynx - linx $ < > $@

기타 요소

줄 코멘트는 해시 기호(#)로 시작합니다.

makefile의 일부 지시문에는 다른 makefile이 포함될 수 있습니다.

라인 계속은 백슬래시로 표시됩니다.\행 끝에 있는 문자

target : component \ componentTab ↹ commandTab ↹ ; \ command \ pipedTab ↹ - c

샘플 make files

make 파일:

패키지 = 패키지 버전 = 날짜 "+%Y"입니다.%m%d%" 'RELEASE_DIR = ..RELEASE_FILE = $(PACKAGE)-$(VERSION) # 변수 LOGNAME은 # POSIX 쉘의 환경에서 온 입니다.# 타겟: 모두 - 기본 타겟. 아무것도 하지 않습니다.all : echo "Hello $(LOGNAME), nothing to do default" # echo "Hello ${LOGNAME}, noth to do do" echo "Try 'make help' # target: help - 호출 가능한 타겟 표시도움말: egrep "^# target:" [Mm]akefile # target: list - 소스 파일 목록: # 작동하지 않습니다. 각 명령어는 다른  cd src ls # 정답, 같은  cd src;\ls # target: dist - 출시합니다.dist: tar - cf $ (RELEASE_DIR) / $ (RELEASE_FILE) & \ gzip - 9 $ (RELEASE_DIR) / $ (RELEASE_FILE). tar

아래는 매우 간단한 make file입니다.기본적으로 ("모든" 규칙이 먼저 나열됨)는 시스템의 C 컴파일러를 사용하여 "hellowolld.c"라는 소스 파일을 컴파일하고 사용자가 다시 시작할 경우 생성된 파일을 삭제하는 "clean" 타겟을 제공합니다.$@그리고.$$BODY$$lt;는, 이른바 내부 매크로(자동 변수라고도 불린다)의 2개로, 각각 타겟명과 「유효」소스를 나타냅니다.다음 예에서는$^는 공백으로 구분된 전제조건 목록으로 전개됩니다.다른 내부 [47][51]매크로도 다수 있습니다.

CFLAGS ?= -g all : hellowolld : hellowolld . o #명령어는 공백이 아닌 Tab으로 시작합니다 $(CC) $(LDFLAGS) - o $@ hellowolld.c $(CC) - c - c $o $(CFLAGS) < FRC Clean : Clean : Clean ># 이것은 # 현재 디렉토리에 파일 FRC가 없다는 가정 하에 모든 make 구현에서 작동합니다.FRC:

대부분의 시스템에는 파일 접미사를 기반으로 컴파일 등의 일반적인 작업을 지정하기 위한 규칙 및 매크로가 미리 정의되어 있습니다.이를 통해 사용자는 소스로부터 대상을 생성하는 방법에 대한 실제(대부분 이식할 수 없는) 지침을 생략할 수 있습니다.이러한 시스템에서는 위의 makefile을 다음과 같이 변경할 수 있습니다.

all: hellowolld: hellowolld.o $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ clean: FRC $(RM) hellowolld.o # 이것은 명시적 서픽스 규칙입니다. 이러한 간단한 규칙을 자동으로 처리하는 시스템 번호에서는 생략할 수 있습니다. .c . o : $ ( CC ) $ ( CFLAGS ) - c $ < FRC :접미사: .c


"hellowolld.o"는 "hellowolld.c"에 의존하며 Make에 의해 자동으로 처리됩니다.여기에 나와 있는 것과 같은 간단한 예에서는 이는 거의 문제가 되지 않지만 소프트웨어 프로젝트의 소스 파일 수가 증가하기 시작하면 접미사 규칙의 실제 위력은 분명해집니다.링크 스텝의 규칙을 작성하고 오브젝트 파일을 전제조건으로 선언하기만 하면 됩니다.그런 다음 모든 개체 파일을 만드는 방법을 암묵적으로 결정하고 모든 소스 파일에서 변경 사항을 찾습니다.

소스 파일이 서로 또는 헤더 파일 등의 다른 파일에 의존하지 않는 한 단순 접미사 규칙이 제대로 작동합니다.빌드 프로세스를 단순화하는 또 다른 방법은 컴파일러 지원 의존관계 생성과 결합할 수 있는 이른바 패턴 매칭 규칙을 사용하는 것입니다.gcc 컴파일러와 GNU Make를 필요로 하는 마지막 예로서 폴더 내의 모든 C 파일을 대응하는 오브젝트 파일로 컴파일한 후 최종 실행 파일에 링크하는 일반적인 make 파일이 있습니다.컴파일이 실행되기 전에 의존관계는 makefile 친화적인 형식으로 숨겨진 파일 ".depend"로 수집되고 makefile에 포함됩니다.휴대용 프로그램은 아래에 사용되는 구성을 피해야 합니다.

# Generic GNUmake file # 다른 make (1) 명령어 #에서 실행을 중지하는 부분일 뿐 ifneq ( )를 이해하지 못합니다. make 파일에는 GNU Make가 필요합니다.Endif 프로그램)foo C_FILES:)달러(와일드 카드*)OBJS:)달러(patsubst% 떨어지,%.o달러(C_FILES))CC)시시 짜리 CFLAGS)-Wall-pedantic LDFLAGS)LDLIBS)-lm 모든:달러(프로그램)달러(프로그램):.depend달러(OBJS)달러(CC)달러(CFLAGS)달러(OBJS)달러(LDFLAGS)-o달러(프로그램)달러(LDLIBS)의존하다:.depend .depend:cmd)gcc -MM -MF 따라 달라지달러(초본), cat 의존하다>>.depend, .depend:@ 울린다."겐종속성을 지웁니다.." @$(foreach var, $(C_FILES), $(cmd) @rm -f 의존 - include . depend # 패턴 매칭 규칙입니다. 여기 사용되는 자동 # 변수더불어 #을 나타내는 변수 $*는 특별 경우에 유용합니다.%o: %c $(CC) $(CFLAGS) - c $$BODY$$lt; -o $@%: %o $(CC) $(CFLAGS) - o $@ < : rmF(JOB)가짜: 클린 의존

「 」를 참조해 주세요.

레퍼런스

  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. S2CID 33059412.
  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: 원래 URL 상태를 알 수 없습니다(링크).
  6. ^ "OpenSolaris at Two (Jim Grisanzio)". 12 December 2013. Archived from the original on 12 December 2013. Retrieved 18 March 2018.
  7. ^ 그리산지오, 짐OpenSolaris 스토리
  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 "Bmake(1)".
  12. ^ https://manpages.debian.org/jessie/freebsd-buildutils/fmake.1[베어 URL 플레인텍스트 파일]
  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. ^ Mölder, Felix; Jablonski, Kim Philipp; Letcher, Brice; Hall, Michael B.; Tomkins-Tinch, Christopher H.; Sochat, Vanessa; Forster, Jan; Lee, Soohyun; Twardziok, Sven O.; Kanitz, Alexander; Wilm, Andreas (2021-04-19). "Sustainable data analysis with Snakemake". F1000Research. 10: 33. doi:10.12688/f1000research.29032.2. ISSN 2046-1402. PMC 8114187. PMID 34035898.
  35. ^ "GNU 'make'". Free Software Foundation.
  36. ^ "Makepp".
  37. ^ "Free BSD make".
  38. ^ Linux ls 명령 파일 출력정렬하는 방법 2016년 9월 13일 Wayback Machine에서 보관
  39. ^ 2007년 10월 23일 Wayback Machine, 2007/02/27, Phoenix Wiki에서의 dsls 아카이브 개요
  40. ^ 참조: 안무REST 아카이브 2016년 9월 12일 웨이백 머신에서 2002-08-09년 크리스토퍼 B 페리스에서 작성
  41. ^ 타겟 주니어 메이크업 파일 2010년 1월 7일, Wayback Machine에서 Andrew W. Fitzigbon과 William A.호프만
  42. ^ 3.1 Makefiles 내용, GNU make, Free Software Foundation
  43. ^ "Prerequisite Types (GNU make)". GNU.org. GNU Project. Retrieved 15 December 2020.
  44. ^ a b 15장.도구: 제조:레시피 자동화」, The Art of Unix Programming, Eric S. 레이먼드 2003
  45. ^ make – 셸 및 유틸리티 레퍼런스, 단일 UNIX 사양, The Open Group 버전 4
  46. ^ make(1)FreeBSD 일반 명령어 매뉴얼
  47. ^ a b "make". www.opengroup.org. Retrieved 18 March 2018.
  48. ^ "GNU make manual: suffix rules". Free Software Foundation.
  49. ^ "GNU make manual: pattern rules". Free Software Foundation.
  50. ^ 2014년 5월 29일 Wayback Machine에서 보관된 SunPro man 페이지패턴 일치 규칙 섹션을 참조하십시오.
  51. ^ Wayback Machine GNU 'make'에서 2016년 4월 25일 자동 변수 아카이브

외부 링크