이 저장소에는 다음 슬라이드 데크와 관련된 모든 코드 예제가 포함되어 있습니다.
슬라이드 데크는 다음에서 다운로드 할 수 있습니다.
저장소는 다음과 같이 구성됩니다.
각 코드 예제 또는 코드 예제 그룹은 별도의 CMAKE 프로젝트로 구성됩니다. 이를 통해 사용자는 모든 코드 예제를 빌드하지 않고도 개별 코드 예제를 실험 할 수 있습니다. 편의를 위해 모든 부하 프로젝트를 구축하는 두 개의 cmakelists.txt 파일이 제공됩니다. 모든 프로젝트는 제공된 빌드 스크립트 (이 두 Cmake Superbuilds를 호출 함)를 사용하여 구축 할 수 있습니다.
이 저장소는 GitHub 동작을 기반으로 CI 워크 플로를 사용합니다. 새로운 커밋이 추진 될 때마다 저장소의 코드 예제는 기본적인 Sanity Test로 구축되어 실행됩니다. 이 CI 워크 플로우는 LLVM 프로젝트 (https://apt.llvm.org/)에서 제공하는 LLVM/Clang Ubuntu APT 패키지가 GitHub-Hosted Linux 러너에 사용될 수있는 방법을 보여주는 예입니다. CI 워크 플로우는 현재 다음의 몇 가지 조합을 위해 구축됩니다.
코드 예제에는 다음과 같은 소프트웨어 종속성이 있습니다.
코드 예제를 작성하기 전에 이러한 종속성을 설치해야합니다.
C ++ 표준 라이브러리가 STD :: 형식을 지원하지 않으면이 지원을 제공하기 위해 FMT 라이브러리의 사용자 정의 버전을 (빌드 프로세스의 일부로) 자동으로 설치할 수 있습니다. (이 FMT 라이브러리 의이 사용자 정의 버전은 "형식"이라는 표준 라이브러리 헤더를 제공하고 해당 헤더의 STD 네임 스페이스에 몇 가지 주요 선언을 배치합니다.) GCC의 버전 13 이상에 포함 된 C ++ 표준 라이브러리에는 STD :: 형식을 지원합니다.
편의를 위해 필요한 모든 소프트웨어 종속성을 포함하는 컨테이너화 된 환경을 구축하기 위해 Dockerfile이 제공됩니다. 이 dockerfile에 대한 자세한 내용은 이후 섹션에 제공됩니다.
코드 예제는 CMAKE 기반 빌드 프로세스를 사용합니다. 각 코드 예제 또는 관련 예제 그룹은 별도의 CMAKE 프로젝트로 구성됩니다. 편의상 모든 코드 예제를 한 단계로 구축하기위한 스크립트가 제공됩니다.
일부 코드 예제에는 std :: 형식이 필요합니다 (C ++ 20으로 소개 됨). 사용중인 C ++ 표준 라이브러리 구현이 STD :: 형식을 지원하지 않으면 FMT 라이브러리의 사용자 정의 버전을 (빌드 프로세스의 일부로) 자동으로 설치 하여이 지원을 제공 할 수 있습니다.
모든 코드 예제를 구축하고 (선택적으로 관련된 모든 데모를 실행하려면) 다음을 수행하십시오.
필요한 소프트웨어 종속성 (예 : 실행 파일, 헤더 또는 라이브러리)이 빌드 시간에 성공적으로 발견되도록 환경을 초기화합니다. 이 단계는 일반적으로 일부 소프트웨어 종속성이 빌드 프로세스에서 일반적으로 찾을 수없는 위치에 설치된 경우에만 필요합니다. 이 단계가 필요한 경우 다음과 같은 것처럼 보일 수 있습니다.
# Initialize the following variables used to configure the
# environment:
# cmake_dir
# - The directory under which CMake has been installed
# (e.g., /usr, /usr/local).
# clang_dir
# - The directory under which LLVM/Clang has been installed
# (e.g., /usr, /usr/local).
# gcc_dir
# - The directory under which GCC has been installed
# (e.g., /usr, /usr/local).
# boost_dir
# - The directory under which Boost has been installed
# (e.g., /usr, /usr/local).
# Use the preceding variables to configure the environment by
# setting several key environment variables:
export BOOST_INCLUDEDIR=$boost_dir/include
export BOOST_LIBRARYDIR=$boost_dir/lib
export PATH=$cmake_dir/bin:$clang_dir/bin:$gcc_dir/bin:$PATH
export LD_LIBRARY_PATH=$BOOST_LIBRARYDIR:$LD_LIBRARY_PATH
export CPATH=$boost_dir/include:$CPATH
현재 작업 디렉토리를 복제 된 GIT 저장소의 작업 트리의 최상위 디렉토리로 설정하십시오.
적절한 옵션으로 빌드 스크립트를 호출하십시오. 명목상, 스크립트는 다음과 같이 호출됩니다.
./build --defaults
사용중인 C ++ 표준 라이브러리가 std :: 형식을 지원하기 위해 사용되면 위의 빌드 스크립트의 호출에 "-no-fmt"옵션을 추가 할 수 있습니다 (FMT 라이브러리의 사용자 정의 버전이 사용되지 않도록). 즉, 다음 명령을 사용할 수 있습니다.
./build --defaults --no-fmt
빌드 스크립트는 다양한 옵션을 지원합니다. 자세한 사용 정보는 "-h"또는 "-help"옵션으로 스크립트를 호출하십시오. 명령 줄 인수는 왼쪽에서 오른쪽으로 처리됩니다. 따라서 하나 이상의 명령 줄 옵션으로 설정이 설정되는 경우 가장 오른쪽 옵션의 설정이 적용됩니다.
원하는 경우 명령과 함께 데모 스크립트 (기본적인 사전 테스트)를 실행하십시오.
./build --demo
빌드 프로세스의 출력은 디렉토리에 배치됩니다.
각 CMAKE 프로젝트의 출력은 해당 프로젝트와 동일한 이름을 가진 디렉토리에 배치됩니다. 예를 들어, 슬라이드 덱 예제에서 Cyclomatic_complexity라는 프로젝트의 빌드 출력은 디렉토리에 배치됩니다.
slides/examples/tmp_build/cyclomatic_complexity
대부분의 프로젝트에는 데모 스크립트가 있습니다 ( "데모"라고하거나 "데모"가 포함 된 이름이 있습니다). 예를 들어, cyclomatic_complexity 프로젝트의 데모 스크립트를 실행하려면 다음 명령을 사용하십시오.
slides/examples/tmp_build/cyclomatic_complexity/demo
이 저장소에서 코드 예제를 구축하고 실행하는 데 필요한 모든 소프트웨어 종속성을 갖춘 Podman/Docker 컨테이너를 만드는 데 사용될 수있는 dockerfile이 제공됩니다. 이 컨테이너화 된 환경 사용 방법에 대한 지침은 다음과 같습니다. 이러한 지침은 (루트가없는) Podman을 사용하지만 Podman 및 Docker 프로그램에는 거의 동일한 명령 줄 인터페이스가 있습니다. 따라서 지침에서 "Podman"으로 "Docker"를 대체 할 수 있어야합니다.
$ top_dir가 복제 된 Git 저장소의 작업 트리의 최상위 디렉토리 (예 : 현재 읽고있는 readme.md라는 파일을 포함하는 디렉토리)를 나타냅니다. $ top_dir는 절대 경로 여야합니다.
작업 디렉토리를 명령을 사용하여 작업 트리의 최상위 디렉토리로 설정하십시오.
cd $TOP_DIR
명령을 사용하여 컨테이너를 작성하십시오.
podman build --tag cl-demo - < podman/Dockerfile
컨테이너의 임시 인스턴스를 작성하고 명령을 사용하여 컨테이너에서 배쉬 쉘을 실행하십시오.
podman run -i -t --rm -v $TOP_DIR:$TOP_DIR:rw -w $TOP_DIR
--cap-add=SYS_PTRACE --security-opt label=disable
cl-demo /bin/bash
"-cap-add"및 "--security-opt"옵션이 필요하지 않을 수 있습니다.
배쉬 쉘이 종료 된 후 컨테이너를 삭제하지 않으려면 "-rm"옵션을 생략하십시오.
이전 섹션에 설명 된대로 데모 스크립트를 구축하고 실행하십시오. 예를 들어, 컨테이너에서 실행되는 배쉬 쉘에서 다음 명령을 호출 할 수 있습니다.
./build --defaults
때때로 주소 소독제 (ASAN)의 사용은 예를 들어 코드가 실행되는 플랫폼에서 기발하기 때문에 문제가 될 수 있습니다. ASAN의 런타임 동작은 환경 변수 ASAN_OPTIONS를 통해 제어 할 수 있으며, 값은 콜론으로 구분 된 키 값 쌍 목록입니다 (예 : "Verbosity = 1 : Detect_Leaks = 0").
일부 플랫폼에서는 코드 예제에서 사용되는 일부 라이브러리가 메모리 누출이있는 것으로 관찰되었습니다. ASAN이 메모리 누출이있는 일부 라이브러리에 대해 불평하면 ASAN_OPTIONS 환경 변수의 ASAN 옵션 목록에 "Detect_Leaks = 0"을 추가하여 메모리 누출 감지를 비활성화 할 수 있습니다. 예를 들어 ASAN_OPTIONS는 다음과 같이 설정할 수 있습니다.
ASAN_OPTIONS=detect_leaks=0
메모리의 사용자 중독은 때때로 LLVM/Clang이 구축 된 방식에 따라 ASAN (즉, 사용 중독 오류)의 잘못된 양성을 초래할 수 있습니다. 이는 LLVM/Clang 라이브러리에서 사용자 중독이 처리되는 방식과 이러한 라이브러리를 사용하는 응용 프로그램의 불일치 때문일 수 있습니다. 이 문제가 발생하면 ASAN_OPTIONS 환경 변수의 ASAN 옵션 목록에 "allow_user_poisoning = 0"을 추가하여 사용자 중독을 비활성화 할 수 있습니다. 예를 들어 ASAN_OPTIONS는 다음과 같이 설정할 수 있습니다.
ASAN_OPTIONS=allow_user_poisoning=0
이 소프트웨어는 대부분의 UNIX 기반 시스템에서 작동해야합니다 (필요한 소프트웨어 종속성이 설치된 경우). GitHub CI 워크 플로우 (위에서 논의 된)는 소프트웨어가 Ubuntu Linux 및 MacOS에서 합리적으로 안정적으로 빌드 및 실행해야합니다. 저자의 주요 개발 플랫폼은 Fedora Linux입니다. 따라서 소프트웨어는이 플랫폼에서도 상당히 확실하게 작동해야합니다.