Make 파일 규칙 레시피를 들여쓰기하는 데 사용되는 문자는 무엇입니까?

Make 파일 규칙 레시피를 들여쓰기하는 데 사용되는 문자는 무엇입니까?

나는 gnu make를 사용하고 있고 내가 가지고 있는 Makefile에는 아래 규칙이 표시됩니다. 레시피에 비슷한 규칙을 추가하고 싶은데, 레시피에 탭이나 공백을 주어 다음 줄에 규칙과 해당 레시피를 추가하면 오류가 발생합니다.

dummy :
    @echo $(OBJS)

vim 명령 :set list 를 켜면 다음이 표시됩니다.

dummy :$
^I@echo $(OBJS)$

줄 시작 부분부터 들여쓰기하는 레시피 줄(두 번째 줄) 앞의 문자는 정확히 무엇입니까?

기존 규칙을 복사하여 붙여넣은 다음 수정하지 않고 키보드를 사용하여 어떻게 입력합니까?

Makefile을 처음부터 직접 생성하는 데 사용되는 다양한 공백/들여쓰기에 대한 정보는 어디에서 찾을 수 있습니까(automake/또는 다른 도구로 생성된 makefile이 아님)?

답변1

makefile의 레시피~ 해야 하다앞에는 단일 표준 tab문자가 와야 하며 다른 문자는 없습니다.

^I탭 문자를 표현한 것입니다(Wikipedia의 표 참조).아스키페이지) 따라서 이것이 정확해야 합니다.

Tab따라서 또는 Ctrl+ 를 사용하여 입력할 수 있어야 합니다 I.
(소프트웨어에 의해 다시 매핑되지 않는다고 가정)


편집하다

추가 조사 결과 당신처럼 보입니다.~할 수 있다탭에서 모든 레시피 라인 앞에 오는 데 필요한 문자를 설정하여 변경합니다..RECIPEPREFIX 특수 변수.

이 값이 makefile에 정의되어 있으면 모든 레시피~ 후에정의에서는 탭 대신 해당 문자를 사용해야 합니다.

답변2

위의 DMA57361에서 제공한 답변에서 몇 가지 포인터를 선택하고 좀 더 조작한 후 오랫동안 내 .vimrc에 이 명령 set expandtab(탭을 공백으로 확장)이 있었고 vim을 사용한다는 것을 알았습니다.

이로 인해 Makefile 규칙에 입력한 탭 문자가 손상되었습니다. .vimrc에서 해당 줄을 주석 처리하는 것이 도움이 되었고 저에게도 도움이 되었습니다.

답변3

허용되는 답변에 비추어 볼 때 레시피 앞에는 문자가 와야 하며 에서 활성화된 tab경우 자동으로 대체됩니다 . 덮어쓰는 것은 다운로드한 코드베이스의 makefile을 손상시키므로 권장되지 않습니다. 순진한 접근 방식은 단순히 구성에서 제거하는 것이지만 다음 행을 추가하여 이 문제를 해결할 수 있습니다.set expandtab.vimrc.RECIPEPREFIXset expandtab

autocmd FileType make set tabstop=8 shiftwidth=8 softtabstop=0 noexpandtab.

이는 expandtabmakefile을 편집할 때만 비활성화됩니다.

관련 정보