blob: 3a9ff8c933ccca1314268b17d5089c63a89d9b39 [file] [log] [blame] [view] [edit]
# nsmd - Nvidia System Management Daemon
## How to build
### Install dependencies
```bash
sudo apt install build-essential gcc-13 g++-13 python3-dev nlohmann-json3-dev
pip install --user meson ninja
```
#### Install Boost
> sudo apt install libboost1.83-all-dev # for Ubuntu 22.04
or
> sudo apt install libboost1.84-all-dev # for Ubuntu 24.04
or if it not installed, download and install it from source.
```bash
wget https://downloads.sourceforge.net/project/boost/boost/1.84.0/boost_1_84_0.tar.gz
tar -xzf boost_1_84_0.tar.gz
cd boost_1_84_0
./bootstrap.sh --prefix=/usr/local
./b2 install
```
#### Copy libmctp header for local development
> git archive --remote=ssh://git@gitlab-master.nvidia.com:12051/dgx/bmc/libmctp.git develop libmctp-externals.h | tar -x -C common/
### Configure and build with Meson
```bash
# Configure Meson build with debug options and compiler flags (copied from openbmc-build-scripts repo)
meson setup --reconfigure -Db_sanitize=address,undefined -Db_lundef=true -Dwerror=true -Dwarning_level=3 -Db_colorout=never --buildtype=debug -Dcpp_args="-Wno-error=invalid-constexpr -Wno-invalid-constexpr -Werror=uninitialized -Werror=strict-aliasing" builddir
# Build all targets
ninja -C builddir
```
### Build and run unit tests
```bash
# Run all unit tests
meson test -C builddir
# Run specific unit test
meson test -C builddir nsmChassis_test
```
### Troubleshooting Build Issues
#### sdbusplus Version Mismatch
If you encounter `sdbusplus` build errors, verify that the revision in `subprojects/sdbusplus.wrap` matches the version specified in the [openbmc-build-scripts](https://gitlab-master.nvidia.com/dgx/bmc/openbmc-build-scripts/-/blob/develop/scripts/build-unit-test-docker#L273) repository. Version mismatches can cause build failures.
#### Updating Subproject Dependencies
For other subproject-related errors, you can update all subproject repositories to their latest commits using:
```
cd subprojects
find -L . -type d -name ".git" | while read gitdir; do
repo=$(dirname "$gitdir")
echo "Pulling updates in $repo"
cd "$repo"
git pull
cd - > /dev/null
done
```
## Unit Tests Debugging
### Debugging with GDB in console
```bash
# Debug all tests
meson test -C builddir --gdb
# Debug specific test
meson test -C builddir nsmChassis_test --gdb
```
### Debugging with GDB in VSCode/Cursor
1. Configure launch.json
```json
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug file with Meson",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/builddir/${relativeFileDirname}/${fileBasenameNoExtension}",
"cwd": "${workspaceFolder}/builddir/${relativeFileDirname}",
"preLaunchTask": "Compile meson test"
}
]
}
```
2. Configure tasks.json
```json
{
"version": "2.0.0",
"tasks": [
{
"label": "Compile meson test",
"type": "shell",
"command": "meson compile -C builddir ${fileBasenameNoExtension}",
"group": "build",
}
]
}
```
3. Open the unit test file you want to debug in VSCode/Cursor
4. Set breakpoints in the code where needed
5. Press F5 to start debugging the test
## Installing clang-format-19 for CI Usage
To ensure code consistency and formatting standards in the CI pipeline, `clang-format-19` needs to be installed. Follow the steps below to install `clang-format-19` on your system:
```bash
# Update the package list
sudo apt update
# Install clang-format-19
sudo apt install clang-format-19
```
This will install `clang-format-19` on your system, enabling it for use in the CI pipeline.
### Using clang-format-19 for all changed files before commit
To automatically format your code before each commit, create a pre-commit hook with the following steps:
```
cat > .git/hooks/pre-commit << EOL
#!/bin/sh
# Get list of staged files that are C/C++ source files
files=$(git diff --cached --name-only --diff-filter=ACMR | grep ".*\.[ch]\(pp\)\?$")
if [ -n "$files" ]; then
# Format the files
clang-format-19 -i $files
# Add the formatted files back to staging
git add $files
# Check if any files were modified after formatting
if ! git diff --cached --quiet; then
echo "Formatted C/C++ files were automatically fixed up"
fi
fi
exit 0
EOL
chmod +x .git/hooks/pre-commit
```
## Artifacts
Successful build should generate three binary artifacts.
1. nsmd (NSM Daemon)
2. nsmtool (NSM Requester utility)
3. nsmMockupResponder (NSM Endpoint Mockup Responder)
### nsmd
A Daemon that can discover NSM endpoint, gather telemetry data from the
endpoints, and can publish them to D-Bus or similar IPC services, for consumer
services like bmcweb.
### nsmtool
nsmtool is a client tool that acts as a NSM requester which can be invoked from
the BMC. nsmtool sends the request message and parse the response message &
display it in readable format.
### nsmMockupResponder
A mockup NSM responder that can be used for development purpose. Its primary
usage is to test nsmd and nsmtool features on an emulator like QEMU. The mockup
NSM responder includes modified MCTP control and demux daemon, user can create
a emulated MCTP endpoint by providing a json file to modified MCTP control
daemon to expose the emulated MCTP Endpoint to D-Bus.
The mockup NSM responder listens to demux unix socket for the request from
nsmd/nsmtool and returns the respond through modified MCTP demux daemon.