add context for continuing chat in a different session
analogy to a stochastic snapshot!
This commit is contained in:
257
cplusplus/learning/README.md
Normal file
257
cplusplus/learning/README.md
Normal file
@@ -0,0 +1,257 @@
|
|||||||
|
Absolutely! I can create a **comprehensive `README.md`** summarizing our session so far. This file can serve as both **documentation and a reference** if you continue later.
|
||||||
|
|
||||||
|
Here’s a fully structured version:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# C++ Learning Project Setup with VS Code, CMake, clang-format, clang-tidy, and vcpkg
|
||||||
|
|
||||||
|
This repository demonstrates a fully featured C++ learning setup using:
|
||||||
|
|
||||||
|
- **VS Code** as the IDE
|
||||||
|
- **CMake** as the build system
|
||||||
|
- **vcpkg** as the package manager
|
||||||
|
- **clang-format** for code formatting
|
||||||
|
- **clang-tidy** for static analysis
|
||||||
|
- **Run/Debug configurations** for interactive debugging
|
||||||
|
|
||||||
|
The project structure is designed to host multiple tutorials (`tut1`, `tut2`, ...) as **separate executables**, and optionally share code via **shared libraries**.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Project Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
learning/
|
||||||
|
│
|
||||||
|
├─ tut1/
|
||||||
|
│ ├─ main.cpp
|
||||||
|
│ └─ CMakeLists.txt
|
||||||
|
├─ tut2/
|
||||||
|
│ ├─ main.cpp
|
||||||
|
│ └─ CMakeLists.txt
|
||||||
|
├─ libcommon/
|
||||||
|
│ ├─ common.cpp
|
||||||
|
│ ├─ common.h
|
||||||
|
│ └─ CMakeLists.txt
|
||||||
|
├─ CMakeLists.txt # Root CMake file
|
||||||
|
├─ .clang-format # Code formatting rules
|
||||||
|
├─ .clang-tidy # Static analysis configuration
|
||||||
|
└─ .vscode/
|
||||||
|
└─ launch.json # Optional debug/run configurations
|
||||||
|
|
||||||
|
````
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. clang-format
|
||||||
|
|
||||||
|
**Purpose:** Enforces consistent code style.
|
||||||
|
|
||||||
|
### Setup
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt install clang-format
|
||||||
|
````
|
||||||
|
|
||||||
|
**.clang-format example:**
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
BasedOnStyle: Google
|
||||||
|
IndentWidth: 4
|
||||||
|
ColumnLimit: 100
|
||||||
|
```
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
|
||||||
|
* Format a single file:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
clang-format -i tut1/main.cpp
|
||||||
|
```
|
||||||
|
|
||||||
|
* Format all source files:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
find . -name "*.cpp" -o -name "*.h" | xargs clang-format -i
|
||||||
|
```
|
||||||
|
|
||||||
|
* VS Code integration:
|
||||||
|
|
||||||
|
```json
|
||||||
|
"C_Cpp.clang_format_style": "file",
|
||||||
|
"editor.formatOnSave": true
|
||||||
|
```
|
||||||
|
|
||||||
|
**Clarifications:**
|
||||||
|
|
||||||
|
* All tutorials share the same style using a project-wide `.clang-format`.
|
||||||
|
* Optional: create a CMake target to auto-format all files.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. clang-tidy
|
||||||
|
|
||||||
|
**Purpose:** Static analysis, bug detection, and enforcing modern C++ practices.
|
||||||
|
|
||||||
|
### Setup
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt install clang-tidy
|
||||||
|
```
|
||||||
|
|
||||||
|
**.clang-tidy example:**
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
Checks: >
|
||||||
|
bugprone-*,
|
||||||
|
performance-*,
|
||||||
|
readability-*,
|
||||||
|
modernize-*,
|
||||||
|
clang-analyzer-*
|
||||||
|
WarningsAsErrors: ""
|
||||||
|
HeaderFilterRegex: '.*'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
|
||||||
|
1. Generate compile commands with CMake:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cmake -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Run clang-tidy on a file:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
clang-tidy tut1/main.cpp -p build -header-filter='^/home/ys/family-repo/code/cplusplus/learning/.*' -quiet
|
||||||
|
```
|
||||||
|
|
||||||
|
**Testing example:**
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
double x; // triggers readability-identifier-length warning
|
||||||
|
```
|
||||||
|
|
||||||
|
**Clarifications:**
|
||||||
|
|
||||||
|
* Thousands of warnings initially are normal; non-user headers are suppressed.
|
||||||
|
* Use `-header-filter` and `-quiet` to see **only your tutorial code**.
|
||||||
|
* Specific checks can be run using `-checks=`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. VS Code Run/Debug Configurations
|
||||||
|
|
||||||
|
**Purpose:** Run and debug executables built with CMake, with arguments and environment variables.
|
||||||
|
|
||||||
|
### Example `launch.json`
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "Run tut1",
|
||||||
|
"type": "cppdbg",
|
||||||
|
"request": "launch",
|
||||||
|
"program": "${workspaceFolder}/build/tut1/tut1",
|
||||||
|
"args": ["arg1"],
|
||||||
|
"cwd": "${workspaceFolder}",
|
||||||
|
"stopAtEntry": false,
|
||||||
|
"MIMode": "gdb",
|
||||||
|
"setupCommands": [
|
||||||
|
{
|
||||||
|
"description": "Enable pretty-printing",
|
||||||
|
"text": "-enable-pretty-printing",
|
||||||
|
"ignoreFailures": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Notes
|
||||||
|
|
||||||
|
* CMake Tools extension can **auto-generate temporary launch configurations**, which is why you can debug without `launch.json`.
|
||||||
|
* Use `launch.json` for:
|
||||||
|
|
||||||
|
* Custom arguments
|
||||||
|
* Environment variables
|
||||||
|
* Named configurations
|
||||||
|
* Stop-at-entry or other debugger options
|
||||||
|
* Compiler options are controlled via CMake:
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
target_compile_options(tut1 PRIVATE -Wall -Wextra $<$<CONFIG:DEBUG>:-g>)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. CMake Multi-Executable Setup
|
||||||
|
|
||||||
|
### Root CMakeLists.txt
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
cmake_minimum_required(VERSION 3.25)
|
||||||
|
project(LearningCPP LANGUAGES CXX)
|
||||||
|
|
||||||
|
set(CMAKE_CXX_STANDARD 23)
|
||||||
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
|
# vcpkg integration
|
||||||
|
if(DEFINED ENV{VCPKG_ROOT})
|
||||||
|
set(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" CACHE STRING "")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Add tutorial subdirectories automatically
|
||||||
|
file(GLOB SUBDIRS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/tut*)
|
||||||
|
foreach(subdir ${SUBDIRS})
|
||||||
|
if(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${subdir})
|
||||||
|
add_subdirectory(${subdir})
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
```
|
||||||
|
|
||||||
|
### Per-Tutorial CMakeLists.txt (e.g., `tut1`)
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
add_executable(tut1 main.cpp)
|
||||||
|
# Link libraries if needed
|
||||||
|
# target_link_libraries(tut1 PRIVATE common)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Shared Library Example (`libcommon`)
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
add_library(common SHARED common.cpp)
|
||||||
|
target_include_directories(common PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
```
|
||||||
|
|
||||||
|
**Linking in tutorial:**
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
target_link_libraries(tut1 PRIVATE common)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Key Takeaways
|
||||||
|
|
||||||
|
* **clang-format:** automatic code style enforcement
|
||||||
|
* **clang-tidy:** static analysis, bug detection, and modern C++ checks
|
||||||
|
* **CMake:** builds multiple tutorials and shared libraries
|
||||||
|
* **vcpkg:** manages dependencies
|
||||||
|
* **VS Code launch configurations:** optional but useful for debugging with arguments/env
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. Next Steps
|
||||||
|
|
||||||
|
* Run tutorials with debugger stepping into shared library code
|
||||||
|
* Add CMake targets for **format** and **tidy**
|
||||||
|
* Explore modernize checks in clang-tidy
|
||||||
|
* Manage multiple tutorials efficiently with shared utilities
|
||||||
|
|
||||||
|
|
||||||
93
cplusplus/learning/commands.md
Normal file
93
cplusplus/learning/commands.md
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
Perfect! Let’s extend the `README.md` with a **“Quick Commands” section** so that you have a ready reference for all the main tasks. I’ll integrate it cleanly at the end of the existing README.
|
||||||
|
|
||||||
|
## 7. Quick Commands
|
||||||
|
These commands are handy for **building, formatting, analyzing, and running tutorials**.
|
||||||
|
|
||||||
|
### Build Project
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Configure and generate build system
|
||||||
|
cmake -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
|
||||||
|
|
||||||
|
# Build all tutorials
|
||||||
|
cmake --build build
|
||||||
|
|
||||||
|
# Build a specific tutorial (e.g., tut1)
|
||||||
|
cmake --build build --target tut1
|
||||||
|
````
|
||||||
|
|
||||||
|
### Run Executables
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Run tut1 manually
|
||||||
|
./build/tut1/tut1 arg1 arg2
|
||||||
|
|
||||||
|
# Run tut2 manually
|
||||||
|
./build/tut2/tut2
|
||||||
|
```
|
||||||
|
|
||||||
|
> Or use **VS Code debug/run panel** (CMake Tools can auto-generate temporary launch configs).
|
||||||
|
|
||||||
|
### Format Code
|
||||||
|
```bash
|
||||||
|
# Format a single file
|
||||||
|
clang-format -i tut1/main.cpp
|
||||||
|
|
||||||
|
# Format all cpp/h files in the project
|
||||||
|
find . -name "*.cpp" -o -name "*.h" | xargs clang-format -i
|
||||||
|
```
|
||||||
|
|
||||||
|
### Static Analysis with clang-tidy
|
||||||
|
```bash
|
||||||
|
# Analyze a single file
|
||||||
|
clang-tidy tut1/main.cpp -p build -header-filter='^/home/ys/family-repo/code/cplusplus/learning/.*' -quiet
|
||||||
|
|
||||||
|
# Example: test warning by introducing a short variable name
|
||||||
|
# double x; // triggers readability-identifier-length
|
||||||
|
```
|
||||||
|
|
||||||
|
### Debugging in VS Code
|
||||||
|
|
||||||
|
1. Use **CMake Tools panel → Debug target**
|
||||||
|
|
||||||
|
* Automatically sets up GDB for the executable
|
||||||
|
* Supports breakpoints, stepping, and inspecting variables
|
||||||
|
|
||||||
|
2. Optional: Create `.vscode/launch.json` for:
|
||||||
|
|
||||||
|
* Custom arguments
|
||||||
|
* Environment variables
|
||||||
|
* Stop-at-entry behavior
|
||||||
|
|
||||||
|
```json
|
||||||
|
"args": ["arg1", "arg2"],
|
||||||
|
"stopAtEntry": false,
|
||||||
|
"environment": [{"name": "MY_FLAG", "value": "1"}]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Shared Libraries
|
||||||
|
```bash
|
||||||
|
# Build shared library and tutorials
|
||||||
|
cmake --build build
|
||||||
|
|
||||||
|
# Ensure runtime can find .so files
|
||||||
|
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/family-repo/code/cplusplus/learning/build/libcommon
|
||||||
|
```
|
||||||
|
|
||||||
|
* Tutorials link against `libcommon` or other shared libraries.
|
||||||
|
* Step into shared library code in VS Code debugger.
|
||||||
|
|
||||||
|
|
||||||
|
### Notes
|
||||||
|
|
||||||
|
* Always run `cmake -B build` if you add new tutorials or change CMake files.
|
||||||
|
* Run `clang-format` regularly to maintain consistent code style.
|
||||||
|
* Run `clang-tidy` to catch bugs or style issues early.
|
||||||
|
* Debugging works even without `launch.json` due to CMake Tools auto-config.
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
✅ With this section, your **README.md** now becomes a **single-page guide** for building, formatting, analyzing, debugging, and managing multiple tutorials with shared libraries.
|
||||||
|
|
||||||
|
It will serve as a **perfect context** for continuing the session later.
|
||||||
Reference in New Issue
Block a user