[makefile] 탭 문자없이 유효한 Makefile을 만들 수 있습니까?

target: dependencies
    command1
    command2

내 시스템 (Mac OS X)에서 makeMakefile의 각 command줄 내용 앞에 탭 문자가 있어야 하거나 구문 오류가 발생합니다.

내 편집기가 항상 모든 공간으로 설정되어 있기 때문에 Makefile을 만들거나 편집 할 때 불편합니다.

탭 문자없이 유효한 Makefile을 만들 수 있습니까?



답변

이것은의 구문 이상 / 요구 사항이며 makeMac OS X와는 관련이 없습니다. 불행히도을 사용하려는 경우 할 수있는 작업이 없습니다 make.

편집 : GNU Make는 이제 사용자 정의 레시피 접두사를 지원합니다. 이 답변을 참조하십시오 .

의이 측면을 싫어하는 첫 번째 사람이 아닙니다 make. Unix Haters의 핸드북 을 인용하려면 :

Dennis의 Makefile의 문제점은 그가 주석 행을 추가 할 때 2 행의 시작 부분에있는 탭 문자 앞에 실수로 공백을 삽입했다는 것입니다. 탭 문자는 Makefile의 구문에서 매우 중요한 부분입니다. 모든 명령 줄 (이 예에서 cc로 시작하는 줄)은 탭으로 시작해야합니다. 그가 변경 한 후 2 행은 변경되지 않았으므로 오류가 발생했습니다.

“그래서 뭐?” “그게 뭐가 잘못 됐나요?”

그 자체로는 문제가 없습니다. Unix에서 다른 프로그래밍 도구가 작동하는 방식을 고려할 때 구문의 일부로 탭을 사용하는 것은 The Green Berets의 펀지 스틱 트랩 중 하나와 같습니다. Kansas의 불쌍한 아이가 John Wayne 앞에 걸어 가고 있습니다. t 트립 와이어를 참조하십시오. 결국 캔자스 옥수수 밭에서는 조심해야 할 전선이 없습니다. 왬!


답변

이 질문이 처음에 제기 된 이후 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

지저분하지만 작동합니다.


답변

프로필에 vimrc가있는 경우 다음 줄을 추가하여 vim이 공백으로 변경되지 않도록 할 수 있습니다.

autocmd FileType make setlocal noexpandtab

나도 이것으로 어려움을 겪고 있었고 이것은 나를 위해 고쳤습니다. 좋은 소식을 전하세요!


답변

공백을 사용하고 싶다면이 작업을 수행합니다.

.RECIPEPREFIX +=


답변

vim의 삽입 모드에서는 Ctrl-v <TAB>공백을 삽입하도록 탭 키를 설정 한 경우에도 리터럴 탭을 삽입하는 데 사용할 수 있습니다 . 물론 이것은 귀하의 질문에 대한 답변은 아니지만 리터럴 탭이 필요하지 않도록 사용 가능한 방법의 대안이 될 수 있습니다.


답변

EditorConfig 를 사용하는 경우 .editorconfig파일에 다음 행을 추가 하여 IDE에서 공백 대신 탭을 사용하도록 강제 할 수 있습니다 Makefile.

[Makefile]
indent_style = tab