목차

Beyond Linux® From Scratch (systemd Edition) - Version 12.1
Chapter 13. Programming
이전 위로 / 처음으로 다음
Guile-3.0.9 Lua-5.4.6

LLVM-17.0.6

LLVM 소개

LLVM 패키지에는 재사용 가능한 모듈식 컴파일러 및 툴체인 모음이 포함되어 있습니다. 저수준 가상 머신(LLVM: Low Level Virtual Machine) 코어 라이브러리는 최신 소스 및 대상 독립적 옵티마이저와 함께 많은 인기 CPU(일부 덜 인기 있는 CPU도 포함!)에 대한 코드 생성 지원을 제공합니다. 이러한 라이브러리는 LLVM 중간 표현(“LLVM IR”)으로 알려진 잘 지정된 코드 표현을 중심으로 구축됩니다.

Clang은 LLVM을 위한 새로운 C, C++, Objective C 및 Objective C++ 프론트엔드를 제공하며, 시스템 LLVM을 사용하여 빌드된 경우 Firefox와 같은 일부 데스크톱 패키지와 Rust에 필요합니다.

컴파일러 RT 패키지는 Clang 및 LLVM을 사용하는 개발자를 위한 런타임 Sanitizer 및 프로파일링 라이브러리를 제공합니다.

이 패키지는 LFS 12.1 플랫폼을 사용하여 빌드하고 제대로 작동하는 것으로 알려져 있습니다.

패키지 정보

추가 다운로드

LLVM용 Cmake 모듈
LLVM 빌드 시스템을 위한 타사 종속성

권장 다운로드

Clang

옵션 다운로드

Compiler RT

LLVM 종속성

필수
옵션

LLVM 설치

LLVM 빌드 시스템에는 두 개의 추가 타르볼 llvm-cmake-17.src.tar.xzllvm-third-party-17.src.tar.xz가 필요합니다. 이 두 타르볼을 llvm-17.0.6.src.tar.xz 타르볼과 동일한 디렉토리에 추출하고 디렉터리의 이름을 cmakethird-party로 변경합니다. 이 디렉터리를 추출하고 빌드 시스템을 수정하여 llvm-17.0.6.src 계층 구조 외부에 모호한 이름의 디렉터리가 생성되지 않도록 합니다.

tar -xf ../llvm-cmake-17.src.tar.xz                                   &&
tar -xf ../llvm-third-party-17.src.tar.xz                             &&
sed '/LLVM_COMMON_CMAKE_UTILS/s@../cmake@llvm-cmake-17.src@'          \
    -i CMakeLists.txt                                                 &&
sed '/LLVM_THIRD_PARTY_DIR/s@../third-party@llvm-third-party-17.src@' \
    -i cmake/modules/HandleLLVMOptions.cmake

다음과 같이 clang을 소스트리에 추가합니다.

tar -xf ../clang-17.0.6.src.tar.xz -C tools &&
mv tools/clang-17.0.6.src tools/clang

compiler-rt를 다운로드 받았다면, 다음과 같이 소스트리에 추가하고 빌드 시스템을 수정하여 llvm-cmake-17.src 디렉토리를 적절한 위치에서 찾을 수 있도록 합니다.

tar -xf ../compiler-rt-17.0.6.src.tar.xz -C projects    &&
mv projects/compiler-rt-17.0.6.src projects/compiler-rt &&
sed '/^set(LLVM_COMMON_CMAKE_UTILS/d'                   \
    -i projects/compiler-rt/CMakeLists.txt

이 패키지에는 LFS의 시스템 파이썬인 Python-3.12.2에 액세스하기 위해 /usr/bin/env python을 사용하는 많은 파이썬 스크립트가 있습니다. 이러한 스크립트를 다음과 수정합니다.

grep -rl '#!.*python' | xargs sed -i '1s/python$/python3/'

clang를 다운로드 받았다면 SSP1)를 기본적으로 활성화 하는 패치를 적용합니다.

patch -Np2 -d tools/clang <../clang-17-enable_default_ssp-1.patch

compiler-rt를 다운로드한 경우 clang에서 기본 SSP 활성화로 인해 영향받은 테스트를 수정하세요.

sed 's/clang_dfsan/& -fno-stack-protector/' \
    -i projects/compiler-rt/test/dfsan/origin_unaligned_memtrans.c

다음과 같이 LLVM을 컴파일 합니다.

mkdir -v build &&
cd       build &&

CC=gcc CXX=g++                              \
cmake -DCMAKE_INSTALL_PREFIX=/usr           \
      -DLLVM_ENABLE_FFI=ON                  \
      -DCMAKE_BUILD_TYPE=Release            \
      -DLLVM_BUILD_LLVM_DYLIB=ON            \
      -DLLVM_LINK_LLVM_DYLIB=ON             \
      -DLLVM_ENABLE_RTTI=ON                 \
      -DLLVM_TARGETS_TO_BUILD="host;AMDGPU" \
      -DLLVM_BINUTILS_INCDIR=/usr/include   \
      -DLLVM_INCLUDE_BENCHMARKS=OFF         \
      -DCLANG_DEFAULT_PIE_ON_LINUX=ON       \
      -Wno-dev -G Ninja ..                  &&
ninja

Recommonmark-0.7.1 및 해당 종속 요소를 설치한 경우 다음과 같이 HTML 문서 및 매뉴얼 페이지를 생성할 수 있습니다.

cmake -DLLVM_BUILD_DOCS=ON            \
      -DLLVM_ENABLE_SPHINX=ON         \
      -DSPHINX_WARNINGS_AS_ERRORS=OFF \
      -Wno-dev -G Ninja ..            &&
ninja docs-llvm-html  docs-llvm-man

clang 문서도 생성합니다.

ninja docs-clang-html docs-clang-man

테스트를 수행하려면 일부 시스템에서 종료되지 않는 문제가 발생하는 테스트를 제거합니다.

rm -f ../projects/compiler-rt/test/tsan/getline_nohang.cpp

LLVM 테스트 스위트는 많은 코어 덤프 파일을 생성할 수 있습니다. 이러한 파일은 많은 양의 디스크 공간을 차지하며 코어 덤프 프로세스로 인해 테스트 속도가 상당히 느려질 수 있습니다. 코어 덤프를 비활성화한 상태에서 결과를 테스트하려면 Systemd-255Shadow-4.14.5Linux-PAM-1.6.0를 지원하도록 다시 빌드되었는지 확인하고(SSH 또는 그래픽 세션을 통해 상호작용하는 경우 OpenSSH-9.6p1 서버 또는 데스크톱 관리자도 Linux-PAM-1.6.0을 지원하도록 으로 빌드되었는지 확인) 현재 로그인 세션이 /etc/pam.d/system-session 파일을 업데이트하여 pam_systemd.so를 포함하도록 시작한 후 실행합니다

systemctl --user start dbus &&
systemd-run --user --pty -d -G -p LimitCORE=0 ninja check-all

ninja에 -jN(N이 숫자로 대체됨)을 전달하면 테스트는 N개의 논리 코어로 빌드되지만 사용 가능한 모든 논리 코어를 사용하여 실행됩니다. 테스트 실행을 위한 논리적 코어 수를 제한하려면 cgroup에서 테스트 명령을 실행합니다(systemd-run 명령에 -p AllowedCPUs=… 옵션을 전달하고, 자세한 내용은 "Linux 제어 그룹을 사용하여 리소스 사용량 제한하기" 섹션을 참조하세요). 커널 구성에서 CONFIG_USER_NS가 활성화되지 않은 경우 Linux/clone_setns.cpp라는 이름의 테스트가 실패합니다.

이제 root 사용자로

ninja install &&
cp bin/FileCheck /usr/bin

위의 명령으로 llvm 문서를 빌드했다면 이미 설치되었지만 적절한 위치로 이동해야 합니다. root 사용자로

install -v -d -m755 /usr/share/doc/llvm-17.0.6            &&
mv -v /usr/share/doc/LLVM/llvm /usr/share/doc/llvm-17.0.6 &&
rmdir -v --ignore-fail-on-non-empty /usr/share/doc/LLVM

clang 문서를 빌드했다면 설치가 완료되었지만 적절한 위치로 이동해야 합니다. 다시 root 사용자로 실행합니다.

install -v -d -m755 /usr/share/doc/llvm-17.0.6             &&
mv -v /usr/share/doc/LLVM/clang /usr/share/doc/llvm-17.0.6 &&
rmdir -v --ignore-fail-on-non-empty /usr/share/doc/LLVM

명령 설명

내용

간략한 설명

1)
Stack Smash Protection
2)
Address Space Layout Randomization
3)
Unified Symbol Resolution