← Documents Documentation/features/scripts/features-refresh.sh GitHub 원문 ↗

Linux 6.18.37 · Features

커널 기능 지원 상태 표 갱신 스크립트

각 기능의 Kconfig 표현식을 긍정형 또는 부정형 `(O,K)`로 해석하고 모든 아키텍처의 Kconfig를 검사해 `arch-support.txt` 상태 표를 주석·기존 상태 보존 규칙과 함께 재생성합니다.

Source pathDocumentation/features/scripts/features-refresh.sh
Source versionLinux v6.18.37
TranslationDUJINLABS 전문 번역 + 해설

요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.

1. 요약·해설

원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.

요약·해설

features-refresh.sh:1-98

각 기능의 Kconfig 표현식을 긍정형 또는 부정형 `(O,K)`로 해석하고 모든 아키텍처의 Kconfig를 검사해 `arch-support.txt` 상태 표를 주석·기존 상태 보존 규칙과 함께 재생성합니다.

K가 어디에도 없으면 이름 변경·오타 가능성을 포함한 경고를 내지만 표 갱신은 계속합니다. 명확한 지원 조건은 `ok`, 나머지는 기존 상태를 보존하고 기존 행이 없을 때만 `TODO`를 기록합니다.

갱신 요약
F 추출(O,K) 분해Kconfig 전체 검사arch별 ok/기존/TODO원본 교체

기능 파일마다 유효성 검사와 상태 표 생성을 차례로 수행합니다.

2. 영어 원문 전체

번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.

원문 전체 펼치기
1 #
2 # Small script that refreshes the kernel feature support status in place.
3 #
4
5 for F_FILE in Documentation/features/*/*/arch-support.txt; do
6 F=$(grep "^# Kconfig:" "$F_FILE" | cut -c26-)
7
8 #
9 # Each feature F is identified by a pair (O, K), where 'O' can
10 # be either the empty string (for 'nop') or "not" (the logical
11 # negation operator '!'); other operators are not supported.
12 #
13 O=""
14 K=$F
15 if [[ "$F" == !* ]]; then
16 O="not"
17 K=$(echo $F | sed -e 's/^!//g')
18 fi
19
20 #
21 # F := (O, K) is 'valid' iff there is a Kconfig file (for some
22 # arch) which contains K.
23 #
24 # Notice that this definition entails an 'asymmetry' between
25 # the case 'O = ""' and the case 'O = "not"'. E.g., F may be
26 # _invalid_ if:
27 #
28 # [case 'O = ""']
29 # 1) no arch provides support for F,
30 # 2) K does not exist (e.g., it was renamed/mis-typed);
31 #
32 # [case 'O = "not"']
33 # 3) all archs provide support for F,
34 # 4) as in (2).
35 #
36 # The rationale for adopting this definition (and, thus, for
37 # keeping the asymmetry) is:
38 #
39 # We want to be able to 'detect' (2) (or (4)).
40 #
41 # (1) and (3) may further warn the developers about the fact
42 # that K can be removed.
43 #
44 F_VALID="false"
45 for ARCH_DIR in arch/*/; do
46 K_FILES=$(find $ARCH_DIR -name "Kconfig*")
47 K_GREP=$(grep "$K" $K_FILES)
48 if [ ! -z "$K_GREP" ]; then
49 F_VALID="true"
50 break
51 fi
52 done
53 if [ "$F_VALID" = "false" ]; then
54 printf "WARNING: '%s' is not a valid Kconfig\n" "$F"
55 fi
56
57 T_FILE="$F_FILE.tmp"
58 grep "^#" $F_FILE > $T_FILE
59 echo " -----------------------" >> $T_FILE
60 echo " | arch |status|" >> $T_FILE
61 echo " -----------------------" >> $T_FILE
62 for ARCH_DIR in arch/*/; do
63 ARCH=$(echo $ARCH_DIR | sed -e 's/^arch//g' | sed -e 's/\///g')
64 K_FILES=$(find $ARCH_DIR -name "Kconfig*")
65 K_GREP=$(grep "$K" $K_FILES)
66 #
67 # Arch support status values for (O, K) are updated according
68 # to the following rules.
69 #
70 # - ("", K) is 'supported by a given arch', if there is a
71 # Kconfig file for that arch which contains K;
72 #
73 # - ("not", K) is 'supported by a given arch', if there is
74 # no Kconfig file for that arch which contains K;
75 #
76 # - otherwise: preserve the previous status value (if any),
77 # default to 'not yet supported'.
78 #
79 # Notice that, according these rules, invalid features may be
80 # updated/modified.
81 #
82 if [ "$O" = "" ] && [ ! -z "$K_GREP" ]; then
83 printf " |%12s: | ok |\n" "$ARCH" >> $T_FILE
84 elif [ "$O" = "not" ] && [ -z "$K_GREP" ]; then
85 printf " |%12s: | ok |\n" "$ARCH" >> $T_FILE
86 else
87 S=$(grep -v "^#" "$F_FILE" | grep " $ARCH:")
88 if [ ! -z "$S" ]; then
89 echo "$S" >> $T_FILE
90 else
91 printf " |%12s: | TODO |\n" "$ARCH" \
92 >> $T_FILE
93 fi
94 fi
95 done
96 echo " -----------------------" >> $T_FILE
97 mv $T_FILE $F_FILE
98 done
99

3. 한국어 전문 번역

영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.

Kconfig 존재 여부로 arch-support.txt를 제자리 재생성

1-98

`features-refresh.sh`는 `Documentation/features/*/*/arch-support.txt`의 아키텍처별 지원 상태 표를 현재 커널 소스의 Kconfig 내용과 대조해 제자리에서 다시 만드는 셸 스크립트입니다. 각 기능 파일의 `# Kconfig:` 헤더에서 표현식 `F`를 추출하고, 이를 연산자 `O`와 Kconfig 심볼 `K`의 쌍으로 해석합니다.

지원하는 연산자는 두 가지뿐입니다. 긍정형은 `O`가 빈 문자열이고 `K=F`이며, 표현식이 `!`로 시작하면 `O=not`으로 두고 선두 `!`를 제거한 나머지를 `K`로 사용합니다. 다른 논리 연산자는 지원하지 않습니다.

스크립트는 먼저 어느 아키텍처의 `Kconfig*` 파일에라도 `K`가 있는지 검사해 기능 표현식의 유효성을 판단합니다. 그 뒤 원래 파일의 주석 행만 임시 파일에 복사하고 새 표 머리글을 쓴 다음, 각 아키텍처를 다시 순회해 `ok`, 기존 상태 또는 `TODO` 행을 선택합니다. 마지막에 임시 파일을 원래 `arch-support.txt`로 이동합니다.

기능 상태 새로 고침 전체 흐름
arch-support.txt 순회Kconfig 표현식 F 추출(O,K) 분리전체 arch에서 K 유효성 검사주석+새 표 머리 생성arch별 상태 판정임시 파일을 원본으로 이동

기능 파일 하나마다 표현식을 해석하고 유효성을 검사한 뒤 아키텍처 표를 재구성합니다.

F를 (O, K)로 분해하는 규칙
입력 FOK처리
일반 심볼빈 문자열F 전체논리 연산 없는 긍정형 기능
`!SYMBOL``not``SYMBOL``[[ "$F" == !* ]]`이면 `sed 's/^!//g'`로 선두 느낌표 제거
그 밖의 복합 연산지원하지 않음지원하지 않음주석이 빈 연산과 논리 부정만 지원한다고 명시

원문 5-18줄에서 헤더 문자열과 부정 연산자를 처리합니다.

기능 표현식 유효성의 비대칭
형태유효 조건무효가 될 수 있는 경우의도
`O=""`어느 아키텍처 Kconfig에라도 K가 존재어느 아키텍처도 F를 지원하지 않거나 K가 이름 변경·오타로 사라짐사라진 심볼과 완전 미지원 기능을 경고
`O=not`어느 아키텍처 Kconfig에라도 K가 존재모든 아키텍처가 부정 기능을 지원하거나 K가 이름 변경·오타로 사라짐부정형에서도 사라진 K를 감지
공통 근거K 자체의 존재를 기준으로 함지원 결과만으로 두 원인을 구분하지 않음원문은 특히 이름 변경·오타인 사례 (2)/(4)를 탐지하려고 이 정의를 유지

원문 20-43줄의 정의와 네 가지 경고 가능 상황을 그대로 풀어 씁니다.

유효성 검사 루프
단계명령·변수결과
초기값`F_VALID=false`아직 K를 찾지 못한 상태
파일 수집`find $ARCH_DIR -name "Kconfig*"`현재 아키텍처 아래 Kconfig 파일 목록
심볼 검색`grep "$K" $K_FILES`K 문자열이 나타나는 모든 행
발견`F_VALID=true; break`한 아키텍처에서라도 찾으면 전체 유효성 검사 종료
미발견`WARNING: 'F' is not a valid Kconfig`모든 아키텍처를 검사한 뒤 경고 출력

원문 44-55줄은 모든 `arch/*/Kconfig*`에서 K 문자열을 찾습니다.

임시 상태 표 초기화
명령대상효과
`T_FILE=$F_FILE.tmp`기능 파일 옆 임시 파일재생성 결과 경로 결정
`grep ^# $F_FILE > $T_FILE`기존 주석 행Kconfig 메타데이터와 설명 주석 보존
세 echo구분선·`arch | status`·구분선고정 폭 reStructuredText 표 머리 생성

원문 57-61줄은 기존 데이터 행을 버리고 주석과 새 머리글만 남깁니다.

아키텍처별 지원 상태 갱신 규칙
조건새 상태동작
`O`가 비어 있고 K 검색 결과가 있음`ok`긍정형 기능을 해당 아키텍처가 지원
`O=not`이고 K 검색 결과가 없음`ok`K가 없으므로 부정형 기능을 해당 아키텍처가 지원
그 밖이며 기존 비주석 ARCH 행이 있음기존 행 보존이전 상태 문자열을 임시 파일에 그대로 복사
그 밖이며 기존 ARCH 행도 없음`TODO`아직 지원되지 않은 기본 상태 행 생성

원문 62-95줄에서 `(O,K)`와 K 검색 결과를 상태 행으로 바꿉니다.

아키텍처 이름과 표 행 형식
구성원문 표현결과 예
ARCH 추출`s/^arch//g` 뒤 `s/\///g``arch/x86/`을 `x86`으로 변환
지원 행`|%12s: | ok |`12칸 오른쪽 정렬 아키텍처와 `ok`
기본 미지원 행`|%12s: | TODO |`12칸 오른쪽 정렬 아키텍처와 `TODO`
기존 행 검색비주석 행 중 ` ARCH:` grep수동 또는 이전 상태를 행 전체로 보존

반복 중 경로를 이름으로 바꾸고 고정 폭 행을 출력하는 세부입니다.

원문 줄 좌표
원문 줄구성한국어 해설
1-4목적 주석기능 지원 상태를 제자리에서 새로 고치는 작은 스크립트라고 설명합니다.
5-18기능 파일 순회와 F 분해헤더에서 표현식을 추출해 긍정형 또는 `not` 연산과 K 심볼로 나눕니다.
20-43유효성 정의 주석긍정·부정형의 비대칭과 이름 변경·오타 탐지 목적을 설명합니다.
44-55K 전체 유효성 검사모든 아키텍처 Kconfig에서 K를 찾고 없으면 경고합니다.
57-61임시 표 머리 생성기존 주석을 보존하고 새 구분선과 열 제목을 씁니다.
62-65아키텍처 순회 준비ARCH 이름, Kconfig 파일 목록과 grep 결과를 계산합니다.
66-81지원 규칙 주석긍정형·부정형 `ok` 조건과 기존 상태/TODO 폴백을 정의합니다.
82-94상태 행 선택두 `ok` 조건 또는 기존 행 보존/TODO 생성을 실행합니다.
95-98표·파일 마무리마지막 구분선을 쓰고 임시 파일을 원본으로 이동한 뒤 바깥 루프를 끝냅니다.

98줄 전체의 주석·판정·파일 교체 범위입니다.

아래 코드는 Linux v6.18.37 원문 1-98줄 전체입니다. 표시 안정성을 위해 탭만 여덟 칸으로 정규화했으며 변수명, glob, grep·find·sed 표현식, 주석의 사례 번호, 표 문자와 파일 교체 순서를 변경하지 않았습니다.

#
# Small script that refreshes the kernel feature support status in place.
#

for F_FILE in Documentation/features/*/*/arch-support.txt; do
        F=$(grep "^#         Kconfig:" "$F_FILE" | cut -c26-)

        #
        # Each feature F is identified by a pair (O, K), where 'O' can
        # be either the empty string (for 'nop') or "not" (the logical
        # negation operator '!'); other operators are not supported.
        #
        O=""
        K=$F
        if [[ "$F" == !* ]]; then
                O="not"
                K=$(echo $F | sed -e 's/^!//g')
        fi

        #
        # F := (O, K) is 'valid' iff there is a Kconfig file (for some
        # arch) which contains K.
        #
        # Notice that this definition entails an 'asymmetry' between
        # the case 'O = ""' and the case 'O = "not"'. E.g., F may be
        # _invalid_ if:
        #
        # [case 'O = ""']
        #   1) no arch provides support for F,
        #   2) K does not exist (e.g., it was renamed/mis-typed);
        #
        # [case 'O = "not"']
        #   3) all archs provide support for F,
        #   4) as in (2).
        #
        # The rationale for adopting this definition (and, thus, for
        # keeping the asymmetry) is:
        #
        #       We want to be able to 'detect' (2) (or (4)).
        #
        # (1) and (3) may further warn the developers about the fact
        # that K can be removed.
        #
        F_VALID="false"
        for ARCH_DIR in arch/*/; do
                K_FILES=$(find $ARCH_DIR -name "Kconfig*")
                K_GREP=$(grep "$K" $K_FILES)
                if [ ! -z "$K_GREP" ]; then
                        F_VALID="true"
                        break
                fi
        done
        if [ "$F_VALID" = "false" ]; then
                printf "WARNING: '%s' is not a valid Kconfig\n" "$F"
        fi

        T_FILE="$F_FILE.tmp"
        grep "^#" $F_FILE > $T_FILE
        echo "    -----------------------" >> $T_FILE
        echo "    |         arch |status|" >> $T_FILE
        echo "    -----------------------" >> $T_FILE
        for ARCH_DIR in arch/*/; do
                ARCH=$(echo $ARCH_DIR | sed -e 's/^arch//g' | sed -e 's/\///g')
                K_FILES=$(find $ARCH_DIR -name "Kconfig*")
                K_GREP=$(grep "$K" $K_FILES)
                #
                # Arch support status values for (O, K) are updated according
                # to the following rules.
                #
                #   - ("", K) is 'supported by a given arch', if there is a
                #     Kconfig file for that arch which contains K;
                #
                #   - ("not", K) is 'supported by a given arch', if there is
                #     no Kconfig file for that arch which contains K;
                #
                #   - otherwise: preserve the previous status value (if any),
                #                default to 'not yet supported'.
                #
                # Notice that, according these rules, invalid features may be
                # updated/modified.
                #
                if [ "$O" = "" ] && [ ! -z "$K_GREP" ]; then
                        printf "    |%12s: |  ok  |\n" "$ARCH" >> $T_FILE
                elif [ "$O" = "not" ] && [ -z "$K_GREP" ]; then
                        printf "    |%12s: |  ok  |\n" "$ARCH" >> $T_FILE
                else
                        S=$(grep -v "^#" "$F_FILE" | grep " $ARCH:")
                        if [ ! -z "$S" ]; then
                                echo "$S" >> $T_FILE
                        else
                                printf "    |%12s: | TODO |\n" "$ARCH" \
                                        >> $T_FILE
                        fi
                fi
        done
        echo "    -----------------------" >> $T_FILE
        mv $T_FILE $F_FILE
done