나는 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
.RECIPEPREFIX
set expandtab
autocmd FileType make set tabstop=8 shiftwidth=8 softtabstop=0 noexpandtab
.
이는 expandtab
makefile을 편집할 때만 비활성화됩니다.