linuxfromscratch:auto-lfs

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
linuxfromscratch:auto-lfs [2026/01/15 03:28] baecylinuxfromscratch:auto-lfs [2026/04/15 17:58] (현재) baecy
줄 1: 줄 1:
-=== --docdir 입력하기 귀찮음 ===+=== 디렉터리/한줄에 하나/버전번호 제거 === 
 +<codeprism bash> 
 +ls -d1 * | sed  's/-[^-]*$//' 
 +find . -maxdepth 1 -type d -not -path '.' | sed 's@./@@;s@-.*@@' 
 +</codeprism> 
 +=== LC_COLLATE 문제로 빌드 터지기 음 ===
 <codeprism lang=bash> <codeprism lang=bash>
-docdir () { +### Toggle LANG C.UTF-8 <-> ko_KR.UTF-8 
-    local PATH_PREFIX_FOR_DOCDIR="/usr/share/doc+function tg-lang() { 
-    echo "${PATH_PREFIX_FOR_DOCDIR}/$(basename $(pwd))"+# 현재 LANG 확인 
 +    case "$LANG" in 
 +        ko_KR*) 
 +            export LANG=C.UTF-8 
 +            ;; 
 +        *) 
 +            export LANG=ko_KR.UTF-8 
 +            ;; 
 +    esac 
 +    # LC_ALL 로 인한 우선순위 변경 방지 
 +    unset LC_ALL 
 + 
 +    # PS1 재설정 
 +    if [ -f "/etc/profile.d/_ps1]; then 
 +        source /etc/profile.d/_ps1 
 +    fi 
 + 
 +    echo -e "Locale toggled to: \033[1;32m$LANG\033[0m"
 } }
 +## alias 별도 관리
 +# alias tl='tg-lang' -> /etc/profile.d/10-alias.sh
 +</codeprism>
 +
 +=== 파이썬 모듈 빌드하고 설치하기 귀찮음 ===
 +<codeprism lang=bash>
 +#!/usr/bin/env bash
 +
 +## Get Package Name
 +if [[ -r $PWD/PKG-INFO ]]; then
 +        PKG_NAME=$(grep -i '^Name:' PKG-INFO | sed 's/[nN]ame:[[:space:]]* //' | tr -d '\r')
 +else
 +        echo "PKG-INFO not found. Need package name for install"
 +        read -p "Enter Package Name: " PKG_NAME
 +fi
 +
 +## Permission Check
 +PERM_ELEV=""
 +[[ $UID -ne 0 ]] && PERM_ELEV="sudo"
 +
 +## Clean Previous Build
 +rm -rf dist 
 +
 +## Build and Install
 +pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD
 +
 +${PERM_ELEV} pip3 install --no-index --find-links dist "${PKG_NAME}"
 +</codeprism>
 +=== ./configure --docdir= 입력하기 귀찮음 개선판 ===
 +<codeprism lang=bash>
 +#!/usr/bin/env bash
 +
 +## 기본값은 현재 디렉터리를 선택하도록 0 지정
 +DEPTH=${1:-0}
 +
 +## 인자가 숫자인지 확인
 +if ! [[ "$DEPTH" =~ ^[0-9]+$ ]]; then
 +    echo "Usage: $0 [number]"
 +    exit 1
 +fi
 +
 +## 기본 디렉터리 및 대상 디렉터리 초기값 설정
 +ORIGINAL_PWD=$(pwd)
 +TARGET_PATH=$ORIGINAL_PWD
 +
 +# 주어진 인자(숫자) 만큼 상위 디렉터리 이름 반환
 +for (( i=0; i<$DEPTH; i++ )); do
 +    # Stop when reach the top directory
 +    if [ "$TARGET_PATH" = "/" ]; then
 +        break
 +    fi
 +    TARGET_PATH=$(dirname "$TARGET_PATH")
 +done
 +
 +## 실제 반환할 값
 +DOCDIR_VALUE=$(basename "$TARGET_PATH")
 +
 +## 인자(숫자)만큼 이동한 결과가 "/"인 경우 
 +## 최종 반환값이 "/usr/share/doc//" 이 되는 상황 방지
 +## 현재 디렉터리에서 한단계 상위 디렉터리 이름 반환
 +if [ "$DOCDIR_VALUE" = "/" ] || [ -z "$DOCDIR_VALUE" ]; then
 +    TARGET_PATH=$ORIGINAL_PWD
 +    RECOVER_DEPTH=$(( DEPTH > 0 ? 1 : 0 ))
 +
 +    for (( i=0; i<$RECOVER_DEPTH; i++ )); do
 +        TARGET_PATH=$(dirname "$TARGET_PATH")
 +    done
 +    DOCDIR_VALUE=$(basename "$TARGET_PATH")
 +fi
 +
 +## 최종 반환값
 +echo "/usr/share/doc/${DOCDIR_VALUE}"
 +
 +unset DEPTH ORIGINAL_PWD TARGET_PATH RECOVER_DEPTH DOCDIR_VALUE
 +</codeprism>
 +
 +=== ./confiugre --docdir= 입력하기 귀찮음 ===
 +<codeprism lang=bash>
 +#!/usr/bin/env bash
 +
 +## 별도의 빌드 디렉터리를 사용하는 경우
 +## 아무 인자나 입력하면 이전 디렉터리명 사용
 +## 예: ./configure --prefux=usr --docdir=$(docdir 1)
 +if [ -z $1 ]; then
 +        DOCDIR_VALUE=$(basename $(pwd))
 +else
 +        DOCDIR_VALUE=$(basename $(dirname $(pwd)))
 +fi
 +
 +echo "/usr/share/doc/${DOCDIR_VALUE}"
 +unset DOCDIR_VALUE
  
-export -f docdir 
 </codeprism> </codeprism>
 ----- -----
-=== Host에서 LFS 디렉토리로 chroot ===+=== LFS mount and chroot script v.0.2 === 
 +아직도 쓸데없이 길고 함수로 정리할 필요 있음. 
 +갈길이 멀었음. 
 + 
 +lfs-dive.sh 
 +<codeprism lang=bash> 
 +#!/usr/bin/env bash 
 +# if [[ -z ${LFS} ]]; then  echo "Enter the LFS 13.0" | is same follow 
 +: ${LFS:=/mnt/LFS}  
 +echo "Base path - ${LFS}" 
 +export LFS 
 + 
 + 
 +if [[ $UID == 0 ]]; then USER_ELEV=""; else USER_ELEV="sudo"; fi 
 + 
 +# Source code packages Repo. mount 
 +mountpoint -q $LFS/sources || ${USER_ELEV} mount n40l:/SOURCES/LFS-13.0 /mnt/LFS/sources 
 + 
 +# 1. If already mounted virtural kernel file system then execute chroot script. 
 +# 2. if need mount virtual kernel file system. 
 + 
 +if mountpoint -q $LFS/dev; then 
 +        lfs-redive.sh 
 +        exit 0 
 +else 
 +        ${USER_ELEV} mount -v --bind /dev $LFS/dev 
 +        ${USER_ELEV} mount -vt devpts devpts -o gid=5,mode=0620 $LFS/dev/pts 
 +        ${USER_ELEV} mount -vt proc proc $LFS/proc 
 +        ${USER_ELEV} mount -vt sysfs sysfs $LFS/sys 
 +        ${USER_ELEV} mount -vt tmpfs tmpfs $LFS/run 
 +        if [ -h $LFS/dev/shm ]; then 
 +          ${USER_ELEV} install -v -d -m 1777 $LFS$(realpath /dev/shm) 
 +        else 
 +          ${USER_ELEV} mount -vt tmpfs -o nosuid,nodev tmpfs $LFS/dev/shm 
 +        fi 
 +        lfs-redive.sh 
 +fi 
 +</codeprism> 
 +lfs-redive.sh 
 +<codeprism lang=bash> 
 +if [[ ! -f "${LFS}"/stage.3 ]]; then echo "Not stage 3, no need chroot"; exit 0; fi 
 +if [[ $UID == 0 ]]; then USER_ELEV=""; else USER_ELEV="sudo"; fi 
 + 
 +${USER_ELEV} chroot "$LFS" /usr/bin/env -i   \ 
 +    HOME=/root                  \ 
 +    TERM="$TERM"                \ 
 +    PS1='(lfs chroot) \u:\w\$ ' \ 
 +    PATH=/usr/local/bin:/usr/bin:/usr/sbin     \ 
 +    MAKEFLAGS="-j$(nproc)"      \ 
 +    TESTSUITEFLAGS="-j$(nproc)"
 +    /bin/bash --login 
 +</codeprism> 
 +=== Host에서 LFS 디렉토리로 chroot v.01 === 
 +다시 보니 별 의미없이 장황하고 가독성 떨어짐.
 6장 완료후 책의 끝까지 유용하게 사용하는 스크립트 6장 완료후 책의 끝까지 유용하게 사용하는 스크립트
  
줄 116: 줄 281:
 ---- ----
 === 파일 다운로드 링크 처리 === === 파일 다운로드 링크 처리 ===
 +<wrap hi>편하기는 한데 이제 와서 보니 굳이 필요한가 싶어짐</wrap>
  
 다음과 같이 등록하고 사용해야 ''cd'' 가 작동을 합니다. 다음과 같이 등록하고 사용해야 ''cd'' 가 작동을 합니다.
줄 139: 줄 305:
   - git clone 사용 할 때 작업 디렉터리에 먼저 받고 source 디렉터리에 복사하는 방식으로 변경 필요.   - git clone 사용 할 때 작업 디렉터리에 먼저 받고 source 디렉터리에 복사하는 방식으로 변경 필요.
  
 +== 작성 ==
 <code user=user host=host lang=bash> <code user=user host=host lang=bash>
 user@host:[ ~ ] $ pre-stage  https://xorg.freedesktop.org/archive/individual/proto/xcb-proto-1.17.0.tar.xz user@host:[ ~ ] $ pre-stage  https://xorg.freedesktop.org/archive/individual/proto/xcb-proto-1.17.0.tar.xz
줄 233: 줄 399:
 </code>  </code> 
  
 +== 구글 AI 모드로 정리: 미확인 상태 ==
 +<codeprism lang=bash>
 +# 쉬뱅(#! /bin/bash)은 source용이라면 생략 가능
 +
 +# 1. tput을 이용한 색상 정의
 +BOLD=$(tput bold)
 +BLUE=$(tput setaf 4)
 +GREEN=$(tput setaf 2)
 +BIGREEN="${BOLD}${GREEN}"
 +RED=$(tput setaf 1)
 +YELLOW=$(tput setaf 3)
 +RESET=$(tput sgr0)
 +
 +# OpenRC 스타일 상태 출력 함수
 +print_status() {
 +    local msg="$1"
 +    local status=$2
 +    local col=$(tput cols)
 +    printf " ${BLUE}${BOLD}*${RESET} %s" "$msg"
 +    tput hpa $((col - 7))
 +    [ $status -eq 0 ] && printf " ${GREEN}OK${RESET}  ]\n" || printf " ${RED}!!${RESET}  ]\n"
 +}
 +
 +# 2. 초기 체크 (p4c 별칭 확인)
 +if [ "$(type -t p4c)" != 'alias' ]; then
 +    echo -e "p4c is not ${YELLOW}alias registered${RESET}, so functionality is unavailable."
 +    # source 시에만 동작하도록
 +    [ -f "${HOME}/.bash_aliases" ] && . "${HOME}/.bash_aliases"
 +    return 2 2>/dev/null
 +fi
 +
 +# 3. 변수 설정
 +if [ -z "$1" ]; then 
 +    echo -e "${GREEN}An appropriate factor (file name or download link) is required.${RESET}"
 +    return
 +fi
 +
 +# 기본 경로 설정 (LFS 환경 변수 활용)
 +BuildBase="${LFS}/workbench"
 +SourceBase="${LFS}/sources"
 +TargetFile=$(basename "$1")
 +TargetDir=$(echo "$TargetFile" | sed -r 's/\.tar(\..*)?$|\.tgz$|\.src$|\.zip$//;s/\.git$//')
 +InputScheme=$(echo "$1" | grep -oP '^[^:]+(?=:)') # http, https, ftp 추출
 +
 +# 4. 권한 체크
 +if [ ! -w "$BuildBase" ]; then 
 +    echo -e "Check ${RED}$BuildBase${RESET} Ownership/Write Permission"
 +    return
 +fi
 +
 +# 5. 디렉토리 이동 함수 (가장 최근 디렉토리 이동 로직 포함)
 +chg_dir() {
 +    if [ -d "$1" ]; then
 +        cd "$1"
 +    else
 +        local latest=$(ls -tcA -w1 | head -n1)
 +        cd "$latest"
 +        echo -e "Derived: ${BIGREEN}$1${RESET} (Not found)"
 +        echo -e "Moved to latest: ${YELLOW}$latest${RESET}"
 +    fi
 +}
 +
 +# 작업 시작
 +[ "$PWD" != "$BuildBase" ] && cd "$BuildBase"
 +
 +# 6. 원격 파일 다운로드 (http, https, ftp)
 +case "$InputScheme" in
 +    http|https|ftp)
 +        wget --no-verbose -nc -P "$SourceBase" "$1"
 +        print_status "Downloading $TargetFile" $?
 +        ;;
 +esac
 +
 +# 7. 소스 처리 (Git vs Archive)
 +if [[ "$1" == *.git ]] || [ "$InputScheme" == "git" ]; then
 +    # Git 처리
 +    GitName=$(basename -s .git "$1")
 +    if [ -d "$GitName" ]; then
 +        chg_dir "$GitName"
 +    else
 +        pushd "$SourceBase" >/dev/null
 +        [ -d "$GitName" ] && rm -rf "$GitName"
 +        git clone "$1" && cp -R "$GitName" "$BuildBase/"
 +        popd >/dev/null
 +        chg_dir "$GitName"
 +        print_status "Git Clone: $GitName" $?
 +    fi
 +else
 +    # 압축 파일 처리
 +    if [[ "$TargetFile" == *.zip ]]; then
 +        mkdir -p "$TargetDir" && cd "$TargetDir"
 +        unzip -q "$SourceBase/$TargetFile"
 +        print_status "Unzip: $TargetFile" $?
 +    else
 +        if [ ! -d "$TargetDir" ]; then
 +            tar -xf "$SourceBase/$TargetFile" 2>/dev/null
 +            print_status "Extract: $TargetFile" $?
 +        fi
 +        chg_dir "$TargetDir"
 +    fi
 +fi
 +
 +# 변수 정리 (local을 쓰지 못하는 source 환경이므로 직접 unset)
 +unset BOLD BLUE GREEN BIGREEN RED YELLOW RESET BuildBase SourceBase TargetFile TargetDir InputScheme GitName
 +</codeprism>
  • linuxfromscratch/auto-lfs.1768447714.txt.gz
  • 마지막으로 수정됨: 2026/01/15 03:28
  • 저자 baecy