요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.
1. 요약·해설
원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.
2. 영어 원문 전체
번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.
원문 전체 펼치기
# SPDX-License-Identifier: GPL-2.0-only
INSTALL ?= install
RM ?= rm -f
RMDIR ?= rmdir --ignore-fail-on-non-empty
PREFIX ?= /usr/share
MANDIR ?= $(PREFIX)/man
MAN1DIR = $(MANDIR)/man1
MAN1_RST = $(wildcard rv*.rst)
_DOC_MAN1 = $(patsubst %.rst,%.1,$(MAN1_RST))
DOC_MAN1 = $(addprefix $(OUTPUT),$(_DOC_MAN1))
RST2MAN_DEP := $(shell command -v rst2man 2>/dev/null)
RST2MAN_OPTS += --verbose
TEST_RST2MAN = $(shell sh -c "rst2man --version > /dev/null 2>&1 || echo n")
$(OUTPUT)%.1: %.rst
ifndef RST2MAN_DEP
$(info ********************************************)
$(info ** NOTICE: rst2man not found)
$(info **)
$(info ** Consider installing the latest rst2man from your)
$(info ** distribution, e.g., 'dnf install python3-docutils' on Fedora,)
$(info ** or from source:)
$(info **)
$(info ** https://docutils.sourceforge.io/docs/dev/repository.html )
$(info **)
$(info ********************************************)
$(error NOTICE: rst2man required to generate man pages)
endif
rst2man $(RST2MAN_OPTS) $< > $@
man1: $(DOC_MAN1)
man: man1
clean:
$(RM) $(DOC_MAN1)
install: man
$(INSTALL) -d -m 755 $(DESTDIR)$(MAN1DIR)
$(INSTALL) -m 644 $(DOC_MAN1) $(DESTDIR)$(MAN1DIR)
uninstall:
$(RM) $(addprefix $(DESTDIR)$(MAN1DIR)/,$(_DOC_MAN1))
$(RMDIR) $(DESTDIR)$(MAN1DIR)
.PHONY: man man1 clean install uninstall
.DEFAULT_GOAL := man
3. 한국어 전문 번역
영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.
도구·설치 경로와 입력 문서
1-17이 Makefile은 `GPL-2.0-only` 라이선스 식별자를 사용한다. `INSTALL`, `RM`, `RMDIR`은 외부에서 덮어쓸 수 있고 기본값은 각각 `install`, `rm -f`, `rmdir --ignore-fail-on-non-empty`다.
기본 설치 prefix는 `/usr/share`, 매뉴얼 루트는 `$(PREFIX)/man`, 섹션 1 경로는 `$(MANDIR)/man1`이다. `rv*.rst`를 입력으로 찾아 확장자를 `.1`로 바꾸고 `$(OUTPUT)` 접두어를 붙여 생성 대상 `DOC_MAN1`을 구성한다.
입력 RST에서 설치할 man1 파일까지의 경로를 만든다.
# SPDX-License-Identifier: GPL-2.0-only
INSTALL ?= install
RM ?= rm -f
RMDIR ?= rmdir --ignore-fail-on-non-empty
PREFIX ?= /usr/share
MANDIR ?= $(PREFIX)/man
MAN1DIR = $(MANDIR)/man1
MAN1_RST = $(wildcard rv*.rst)
_DOC_MAN1 = $(patsubst %.rst,%.1,$(MAN1_RST))
DOC_MAN1 = $(addprefix $(OUTPUT),$(_DOC_MAN1))
RST2MAN_DEP := $(shell command -v rst2man 2>/dev/null)
RST2MAN_OPTS += --verbose
rst2man 확인과 패턴 규칙
18-36`RST2MAN_DEP`는 `command -v rst2man`으로 변환기 존재 여부를 확인하고 `RST2MAN_OPTS`에는 `--verbose`를 추가한다. `TEST_RST2MAN`은 `rst2man --version` 실행이 실패하면 `n`을 돌려준다.
`$(OUTPUT)%.1: %.rst` 패턴 규칙은 `rst2man`이 없으면 설치 안내를 출력하고 오류로 빌드를 중단한다. Fedora 예시는 `dnf install python3-docutils`이며, 소스 저장소 URL도 제시한다. 도구가 있으면 `rst2man $(RST2MAN_OPTS) $< > $@`로 RST 입력을 man 페이지 출력으로 변환한다.
의존성 검사에 성공한 뒤 패턴 규칙이 변환을 수행한다.
변환 명령에서 Make 자동 변수가 가리키는 대상이다.
TEST_RST2MAN = $(shell sh -c "rst2man --version > /dev/null 2>&1 || echo n")
$(OUTPUT)%.1: %.rst
ifndef RST2MAN_DEP
$(info ********************************************)
$(info ** NOTICE: rst2man not found)
$(info **)
$(info ** Consider installing the latest rst2man from your)
$(info ** distribution, e.g., 'dnf install python3-docutils' on Fedora,)
$(info ** or from source:)
$(info **)
$(info ** https://docutils.sourceforge.io/docs/dev/repository.html )
$(info **)
$(info ********************************************)
$(error NOTICE: rst2man required to generate man pages)
endif
rst2man $(RST2MAN_OPTS) $< > $@
생성·정리·설치·제거 목표
37-52`man1`은 모든 `DOC_MAN1` 파일에 의존하고 `man`은 `man1`을 호출한다. `clean`은 생성된 매뉴얼을 삭제한다.
`install`은 먼저 man 페이지를 만든 뒤 `$(DESTDIR)$(MAN1DIR)`을 mode 755로 생성하고 문서를 mode 644로 설치한다. `uninstall`은 설치된 파일을 지우고 비어 있으면 man1 디렉터리를 제거한다. 다섯 목표는 `.PHONY`이며 기본 목표는 `man`이다.
빌드와 배포 생명주기를 정리한다.
man1: $(DOC_MAN1)
man: man1
clean:
$(RM) $(DOC_MAN1)
install: man
$(INSTALL) -d -m 755 $(DESTDIR)$(MAN1DIR)
$(INSTALL) -m 644 $(DOC_MAN1) $(DESTDIR)$(MAN1DIR)
uninstall:
$(RM) $(addprefix $(DESTDIR)$(MAN1DIR)/,$(_DOC_MAN1))
$(RMDIR) $(DESTDIR)$(MAN1DIR)
.PHONY: man man1 clean install uninstall
.DEFAULT_GOAL := man
요약·해설
Makefile:1-52RV RST 문서를 rst2man으로 변환하고 정리·설치·제거하는 Makefile 전체 흐름을 설명합니다.