Repositori ini berisi semua contoh kode yang terkait dengan dek geser berikut:
Dek slide tersedia untuk diunduh di:
Repositori disusun sebagai berikut:
Setiap contoh kode atau kelompok contoh kode disusun sebagai proyek CMAKE yang terpisah. Ini memungkinkan pengguna untuk bereksperimen dengan contoh kode individual tanpa harus membangun semua contoh kode. Untuk kenyamanan, dua file cmakelists.txt disediakan yang membangun semua proyek bawahan mereka. Semua proyek dapat dibangun menggunakan skrip build yang disediakan (yang memohon kedua cmake superbuild ini).
Repositori ini menggunakan alur kerja CI berdasarkan tindakan GitHub. Setiap kali komit baru didorong, contoh kode dalam repositori dibangun dan dijalankan sebagai tes kewarasan dasar. Alur kerja CI ini berfungsi sebagai contoh untuk menunjukkan bagaimana paket APT LLVM/Clang Ubuntu yang disediakan oleh proyek LLVM (di https://apt.llvm.org/) dapat digunakan dalam pelari Linux yang diselenggarakan oleh Github. Alur kerja CI saat ini dibangun untuk beberapa kombinasi berikut ini:
Contoh kode memiliki dependensi perangkat lunak berikut:
Ketergantungan ini harus diinstal sebelum membangun contoh kode.
Jika pustaka standar C ++ tidak mendukung format STD ::, versi khusus dari pustaka FMT dapat diinstal secara otomatis (sebagai bagian dari proses pembuatan) untuk memberikan dukungan ini. (Versi kustom perpustakaan FMT ini menyediakan tajuk perpustakaan standar yang disebut "format" dan menempatkan beberapa deklarasi kunci dalam namespace STD di header itu.) Perpustakaan standar C ++ yang disertakan dengan versi 13 dan di atas GCC memiliki dukungan untuk format STD ::.
Untuk kenyamanan, DockerFile disediakan untuk membangun lingkungan yang dimasukkan yang mencakup semua dependensi perangkat lunak yang diperlukan. Informasi lebih lanjut tentang DockerFile ini disediakan di bagian selanjutnya.
Contoh kode menggunakan proses pembuatan berbasis CMake. Setiap contoh kode atau kelompok contoh terkait disusun sebagai proyek CMAKE terpisah. Untuk kenyamanan, skrip disediakan untuk membangun semua contoh kode dalam satu langkah.
Beberapa contoh kode memerlukan format STD :: (diperkenalkan dalam C ++ 20). Jika implementasi perpustakaan standar C ++ yang digunakan tidak mendukung format STD ::, versi khusus dari pustaka FMT dapat diinstal secara otomatis (sebagai bagian dari proses pembuatan) untuk memberikan dukungan ini.
Untuk membangun semua contoh kode (dan secara opsional menjalankan semua demo yang terkait), lakukan hal berikut:
Inisialisasi lingkungan sehingga dependensi perangkat lunak yang diperlukan (misalnya, executable, header, atau perpustakaan) akan ditemukan dengan sukses pada waktu pembangunan. Langkah ini biasanya hanya diperlukan jika beberapa dependensi perangkat lunak diinstal di lokasi di mana mereka biasanya tidak ditemukan oleh proses pembangunan. Ketika langkah ini diperlukan, itu mungkin terlihat seperti berikut:
# 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
Atur direktori kerja saat ini ke direktori tingkat atas dari pohon kerja repositori git yang dikloning.
Memohon skrip build dengan opsi yang sesuai. Secara nominal, skrip dipanggil sebagai berikut:
./build --defaults
Jika pustaka standar C ++ yang digunakan terjadi untuk mendukung format std ::, opsi "---no-fmt" dapat ditambahkan ke doa skrip build di atas (sehingga versi kustom perpustakaan FMT tidak digunakan). Artinya, perintah berikut dapat digunakan:
./build --defaults --no-fmt
Skrip Build mendukung banyak opsi. Untuk informasi penggunaan yang terperinci, adahkan skrip dengan opsi "-h" atau "--help". Argumen baris perintah diproses dalam urutan kiri-ke-kanan. Jadi, dalam kasus di mana pengaturan ditetapkan oleh lebih dari satu opsi baris perintah, pengaturan dari opsi paling kanan berlaku.
Jika diinginkan, jalankan skrip demo (sebagai tes kewarasan dasar) dengan perintah:
./build --demo
Output dari proses pembangunan ditempatkan di direktori:
Output untuk setiap proyek CMake ditempatkan di direktori yang memiliki nama yang sama dengan proyek itu. Misalnya, output build untuk proyek yang disebut cyclomatic_complexity dari contoh slide-deck ditempatkan di direktori:
slides/examples/tmp_build/cyclomatic_complexity
Sebagian besar proyek memiliki skrip demo (baik disebut "demo" atau dengan nama yang berisi "demo"). Misalnya, untuk menjalankan skrip demo untuk proyek cyclomatic_complexity, gunakan perintah:
slides/examples/tmp_build/cyclomatic_complexity/demo
DockerFile disediakan yang dapat digunakan untuk membuat wadah Podman/Docker dengan semua dependensi perangkat lunak yang diperlukan untuk membangun dan menjalankan contoh kode dalam repositori ini. Instruksi diberikan di bawah ini tentang cara menggunakan lingkungan yang dimasukkan ini. Meskipun instruksi ini menggunakan Podman (tanpa akar), program Podman dan Docker memiliki antarmuka baris perintah yang hampir identik. Jadi, harus dimungkinkan untuk mengganti "Docker" dengan "podman" dalam instruksi.
Biarkan $ top_dir menunjukkan direktori tingkat atas dari pohon kerja repositori git yang dikloning (yaitu, direktori yang berisi file bernama readme.md yang sedang Anda baca). Perhatikan bahwa $ top_dir harus menjadi jalur absolut.
Atur direktori kerja ke direktori tingkat atas dari pohon yang berfungsi menggunakan perintah:
cd $TOP_DIR
Bangun wadah menggunakan perintah:
podman build --tag cl-demo - < podman/Dockerfile
Buat contoh sementara wadah dan jalankan shell bash di wadah menggunakan perintah:
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
Perhatikan bahwa opsi "--cap-add" dan "--security-opt" mungkin tidak diperlukan.
Jika Anda tidak ingin wadah dihapus setelah shell bash keluar, hilangkan opsi "--rm".
Lanjutkan untuk membangun dan menjalankan skrip demo seperti yang dijelaskan secara rinci di bagian sebelumnya. Misalnya, orang dapat memohon perintah berikut dari shell bash yang berjalan di dalam wadah:
./build --defaults
Kadang -kadang penggunaan sanitizer alamat (asan) dapat menjadi masalah, karena, misalnya, untuk keanehan di platform di mana kode dijalankan. Perilaku runtime asan dapat dikontrol melalui variabel lingkungan asan_options, yang nilainya merupakan daftar pasangan nilai kunci yang dipisahkan usus besar (misalnya, "verbositas = 1: detect_leaks = 0").
Pada beberapa platform, beberapa perpustakaan yang digunakan oleh contoh kode telah diamati memiliki kebocoran memori. Jika Asan mengeluh tentang beberapa perpustakaan yang memiliki kebocoran memori, deteksi kebocoran memori dapat dinonaktifkan dengan menambahkan "Detect_Leaks = 0" ke daftar opsi ASAN dalam variabel lingkungan asan_options. Misalnya, asan_options dapat ditetapkan sebagai berikut:
ASAN_OPTIONS=detect_leaks=0
Tampaknya keracunan pengguna memori kadang-kadang dapat mengakibatkan positif palsu dari Asan (yaitu, kesalahan penggunaan-kerapuhan), tergantung pada bagaimana LLVM/dentang dibangun. Ini kemungkinan karena ketidakkonsistenan dalam bagaimana keracunan pengguna ditangani di pustaka LLVM/Clang dan aplikasi menggunakan pustaka ini. Jika masalah ini ditemui, keracunan pengguna dapat dinonaktifkan dengan menambahkan "allow_user_poisoning = 0" ke daftar opsi asan dalam variabel lingkungan asan_options. Misalnya, asan_options dapat ditetapkan sebagai berikut:
ASAN_OPTIONS=allow_user_poisoning=0
Perangkat lunak ini harus bekerja dengan sebagian besar sistem berbasis UNIX (asalkan dependensi perangkat lunak yang diperlukan diinstal). Alur kerja GitHub CI (dibahas di atas) memastikan bahwa perangkat lunak harus membangun dan berjalan cukup andal di Ubuntu Linux dan MacOS. Platform pengembangan utama penulis adalah Fedora Linux. Jadi, perangkat lunak juga harus bekerja cukup andal di platform ini juga.