제조(소프트웨어)
Make (software)패러다임 | 매크로, 선언적 |
---|---|
설계자 | 스튜어트 펠드먼 |
처음 등장한 | 4월, 전( |
구현 언어 | C |
OS | Unix 라이크, 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는 동일한 파일 형식과 기본 알고리즘 원리를 사용하고 자체 비표준 기능 확장을 제공하는 스크래치 변형 등 여러 번 다시 쓰기를 거쳤습니다.그 중 몇 가지는 다음과 같습니다.
- 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]종류가 있습니다.
- 명시적 규칙은 규칙의 대상이라고 하는 하나 이상의 파일을 다시 만드는 시기와 방법을 나타냅니다.타깃이 의존하는 다른 파일(타깃의 전제조건)을 나열하고 타깃을 작성 또는 갱신하기 위한 레시피를 제공할 수도 있습니다.
- 암묵적인 규칙은 파일 클래스를 이름을 기반으로 다시 만드는 시기와 방법을 나타냅니다.대상과 이름이 유사한 파일에 대상이 종속되는 방법을 설명하고 이러한 대상을 만들거나 업데이트할 수 있는 방법을 제공합니다.
- 변수 정의는 나중에 텍스트로 대체할 수 있는 변수의 텍스트 문자열 값을 지정하는 행입니다.
- 지시문은 다른 makefile을 읽는 등 makefile을 읽는 동안 특별한 작업을 하도록 지시하는 것입니다.
- 다음 행으로 시작하는 행
#
코멘트에 사용됩니다.
규칙.
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 " 접두사 기호가 '