target: dependencies
command1
command2
내 시스템 (Mac OS X)에서 make
Makefile의 각 command
줄 내용 앞에 탭 문자가 있어야 하거나 구문 오류가 발생합니다.
내 편집기가 항상 모든 공간으로 설정되어 있기 때문에 Makefile을 만들거나 편집 할 때 불편합니다.
탭 문자없이 유효한 Makefile을 만들 수 있습니까?
target: dependencies
command1
command2
내 시스템 (Mac OS X)에서 make
Makefile의 각 command
줄 내용 앞에 탭 문자가 있어야 하거나 구문 오류가 발생합니다.
내 편집기가 항상 모든 공간으로 설정되어 있기 때문에 Makefile을 만들거나 편집 할 때 불편합니다.
탭 문자없이 유효한 Makefile을 만들 수 있습니까?
답변:
이것은의 구문 이상 / 요구 사항이며 make
Mac OS X와는 관련이 없습니다. 불행히도을 사용하려는 경우 할 수있는 작업이 없습니다 make
.
편집 : GNU Make는 이제 사용자 정의 레시피 접두사를 지원합니다. 이 답변을 참조하십시오 .
의이 측면을 싫어하는 첫 번째 사람이 아닙니다 make
. Unix Haters의 핸드북 을 인용하려면 :
Dennis의 Makefile의 문제점은 그가 주석 행을 추가 할 때 2 행의 시작 부분에있는 탭 문자 앞에 실수로 공백을 삽입했다는 것입니다. 탭 문자는 Makefile의 구문에서 매우 중요한 부분입니다. 모든 명령 줄 (이 예에서 cc로 시작하는 줄)은 탭으로 시작해야합니다. 그가 변경 한 후 2 행은 변경되지 않았으므로 오류가 발생했습니다.
"그래서 뭐?" "그게 뭐가 잘못 됐나요?"
그 자체로는 문제가 없습니다. Unix에서 다른 프로그래밍 도구가 작동하는 방식을 고려할 때 구문의 일부로 탭을 사용하는 것은 The Green Berets의 펀지 스틱 트랩 중 하나와 같습니다. Kansas의 불쌍한 아이가 John Wayne 앞에 걸어 가고 있습니다. t 트립 와이어를 참조하십시오. 결국 캔자스 옥수수 밭에서는 조심해야 할 전선이 없습니다. 왬!
.RECIPEPREFIX
). 아래 답변 중 하나도 이에 대해 언급하며 내 대신 "올바른"것으로 표시해야합니다. stackoverflow.com/a/21920142
이 질문이 처음에 제기 된 이후 Tab로 접두사 문자 이외의 것을 사용할 수있는 GNU Make 버전이 출시되었습니다 . 메일 링리스트 공지에서 :
새로운 특수 변수 : .RECIPEPREFIX를 사용하면 레시피 소개 문자를 기본값 (TAB)에서 다른 것으로 재설정 할 수 있습니다. 이 변수 값의 첫 번째 문자는 새로운 레시피 소개 문자입니다. 변수가 빈 문자열로 설정되면 TAB이 다시 사용됩니다. 마음대로 설정하고 재설정 할 수 있습니다. 레시피는 처음 구문 분석되었을 때 활성 값을 사용합니다. 이 기능을 감지하려면 $ (. RECIPEPREFIX) 값을 확인하십시오.
이 기능은 2010 년 7 월에 출시 된 GNU Make 3.82에 추가되었습니다 (이 질문의 원래 요청 날짜로부터 6 개월 후). 3 년이 지나고 그 이후로 바뀌었기 때문에 다른 Make 플레이버가 GNU Make를 따랐을 가능성이 높습니다.
탭없이 유효한 메이크 파일을 만드는 복잡한 방법이 있습니다.
makefile을 읽을 수 있도록 변경하는 경우 :
target: dependencies; command1; command2
작동한다면. 한 줄 이상에서 원하는 경우 다음을 수행 할 수 있습니다.
target: dependencies; \
command1; \
command2
지저분하지만 작동합니다.
.RECIPEPREFIX
하는 것이 가장 좋은 방법 일 것입니다. 하지만 그렇게하고 싶지 않았기 때문에 결국이 솔루션을 기반으로 한 솔루션을 사용하게되었습니다. 1 행 : target:\
, 2 행 : [네 공백 들여 쓰기] 다음에;command
EditorConfig 를 사용하는 경우 .editorconfig
파일에 다음 행을 추가 하여 IDE에서 공백 대신 탭을 사용하도록 강제 할 수 있습니다 Makefile
.
[Makefile]
indent_style = tab
GNU Make 4.2까지
Steven Penny의 답변이 작동합니다.
.RECIPEPREFIX +=
이것이 작동하는 이유는 내 의견에 설명되어 있습니다.
GNU Make 4.3 이후 (2020 년 1 월 19 일 출시)
+=
운영자의 행동은 이전 버전과 호환되지 않는 방식 변경 . 왼쪽 피연산자에 빈 값이 있으면 더 이상 공백이 추가 되지 않습니다 .
대신 사용할 수 있습니다.
.RECIPEPREFIX := $(.RECIPEPREFIX)<space>
, 여기서는 <space>
단일 공간입니다. $(.RECIPEPREFIX)
빈 값으로 확장 되지만 GNU Make가 무시하지 않도록해야 <space>
합니다. 이 코드는 버전 4.3 이전의 GNU Make에서도 작동합니다.
우분투에서 : vi Makefile은 공간을 탭 (또는 원하는 다른 것)으로 대체합니다.
:%s/<space chars>/^I/g
예를 들어 8 개의 공백을 탭으로 바꿉니다.
:%s/ /^I/g
주의 : ^ I는 ^ 및 I 문자가 아닌 탭 키로 삽입 합니다. : D
이식성이 없습니다. 특정 종류의 make에는 절대적으로 탭 문자가 필요합니다. 공백보다 탭을 선호하는 또 다른 이유 :-)