Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 72 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ env:
CONTAINER_CMD: docker
CONTAINER_NON_INTERACTIVE: true

# Required for pushing to ghcr.io
# Required for pushing to ghcr.io and creating releases
permissions:
contents: read
contents: write
packages: write

jobs:
Expand Down Expand Up @@ -88,3 +88,73 @@ jobs:

- name: Package Validate
run: ./scripts/container.sh ./scripts/ci-cd/step_package_validate.sh --skip-srpm-rebuild

- name: Upload SRPM artifact
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
uses: actions/upload-artifact@v4
with:
name: srpm
path: build/packages/*.src.rpm
retention-days: 1

# ============================================
# Release (only on push to main)
# ============================================
release:
runs-on: ubuntu-latest
needs: package
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Download SRPM artifact
uses: actions/download-artifact@v4
with:
name: srpm
path: packages

- name: Get version and generate release info
id: release_info
env:
COMMIT_SHA: ${{ github.sha }}
run: |
VERSION=$(head -n1 VERSION.md)
echo "version=$VERSION" >> $GITHUB_OUTPUT

# Create a unique tag using version + short commit hash
SHORT_SHA=$(echo "$COMMIT_SHA" | cut -c1-7)
echo "tag=v${VERSION}+${SHORT_SHA}" >> $GITHUB_OUTPUT

# Generate checksums
cd packages
sha256sum *.src.rpm > SHA256SUMS

# Build release body with checksums embedded
cd ..
cat > release_body.md << EOF
Release of Common Low Level Tracing Kit

**Commit:** ${COMMIT_SHA}

## Install from SRPM
\`\`\`bash
rpmbuild --rebuild clltk-${VERSION}-*.src.rpm
sudo dnf install ~/rpmbuild/RPMS/x86_64/clltk-*.rpm
\`\`\`

## Checksums (SHA256)
\`\`\`
$(cat packages/SHA256SUMS)
\`\`\`
EOF

- name: Create Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ steps.release_info.outputs.tag }}
name: ${{ steps.release_info.outputs.version }}
body_path: release_body.md
files: |
packages/*.src.rpm
packages/SHA256SUMS
4 changes: 4 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,10 @@ if(CLLTK_TESTS AND EXISTS ./tests/)
add_subdirectory(./tests/)
endif()

# Generate build info header (for command line tool)
# Note: Must be after all CLLTK_* options are defined since build_info uses them
include(cmake/CreateBuildInfo.cmake)

# --- CMake package config for find_package(CLLTK) ---
include(CMakePackageConfigHelpers)
include(GNUInstallDirs)
Expand Down
5 changes: 4 additions & 1 deletion VERSION.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
1.2.57
1.2.58

# Change log
## 1.2.58
- cli: show features, git hash, license, and URL in --version output
- ci: auto-publish SRPM to GitHub releases when PRs are merged
## 1.2.57
- refactor: move linux userspace abstraction to unix userspace abstraction
- fix: prevent complex_cpp to run if encounter known bad compiler
Expand Down
79 changes: 79 additions & 0 deletions cmake/CreateBuildInfo.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
# Copyright (c) 2024, International Business Machines
# SPDX-License-Identifier: BSD-2-Clause-Patent

# ============================================================================
# Build info generation (for command line tool)
# ============================================================================
# This generates build_info.gen.h which contains:
# - Version string
# - Git commit hash and dirty flag
# - Project metadata (maintainer, license, URL)
# - Feature flags (which components are enabled)
#
# Note: This is separate from version.gen.h because:
# - version.gen.h is used by the tracing library (including kernel module)
# - build_info.gen.h is only used by the command line tool
# - The kernel build doesn't use CMake, so it can't determine feature flags
#
# This file must be included AFTER all CLLTK_* options are defined.
# ============================================================================

# Convert CMake options to 1/0 for the shell script
# These need to be evaluated at build time, but since options don't change
# after configure, we can set them here
if(CLLTK_TRACING)
set(CLLTK_HAS_TRACING_FLAG 1)
else()
set(CLLTK_HAS_TRACING_FLAG 0)
endif()

if(CLLTK_SNAPSHOT)
set(CLLTK_HAS_SNAPSHOT_FLAG 1)
else()
set(CLLTK_HAS_SNAPSHOT_FLAG 0)
endif()

if(CLLTK_CPP_DECODER)
set(CLLTK_HAS_CPP_DECODER_FLAG 1)
else()
set(CLLTK_HAS_CPP_DECODER_FLAG 0)
endif()

if(CLLTK_PYTHON_DECODER)
set(CLLTK_HAS_PYTHON_DECODER_FLAG 1)
else()
set(CLLTK_HAS_PYTHON_DECODER_FLAG 0)
endif()

if(CLLTK_KERNEL_TRACING)
set(CLLTK_HAS_KERNEL_TRACING_FLAG 1)
else()
set(CLLTK_HAS_KERNEL_TRACING_FLAG 0)
endif()

add_custom_target(clltk-build-info-file
COMMAND ${CMAKE_COMMAND} -E env
CLLTK_HAS_TRACING=${CLLTK_HAS_TRACING_FLAG}
CLLTK_HAS_SNAPSHOT=${CLLTK_HAS_SNAPSHOT_FLAG}
CLLTK_HAS_CPP_DECODER=${CLLTK_HAS_CPP_DECODER_FLAG}
CLLTK_HAS_PYTHON_DECODER=${CLLTK_HAS_PYTHON_DECODER_FLAG}
CLLTK_HAS_KERNEL_TRACING=${CLLTK_HAS_KERNEL_TRACING_FLAG}
${CMAKE_CURRENT_LIST_DIR}/gen_version_header.sh
-b ${CMAKE_CURRENT_LIST_DIR}/build_info.h.template
-B ${CLLTK_VERSION_INCLUDE_PATH}/CommonLowLevelTracingKit/build_info.gen.h
BYPRODUCTS
${CLLTK_VERSION_INCLUDE_PATH}/CommonLowLevelTracingKit/build_info.gen.h
DEPENDS
clltk-version-file
${CMAKE_CURRENT_LIST_DIR}/gen_version_header.sh
${CMAKE_CURRENT_LIST_DIR}/build_info.h.template
${CMAKE_CURRENT_LIST_DIR}/../VERSION.md
)

add_library(clltk-build-info INTERFACE)
target_include_directories(clltk-build-info
INTERFACE
$<BUILD_INTERFACE:${CLLTK_VERSION_INCLUDE_PATH}>
)

add_dependencies(clltk-build-info clltk-build-info-file)
7 changes: 6 additions & 1 deletion cmake/CreateVersion.cmake
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
# Copyright (c) 2024, International Business Machines
# SPDX-License-Identifier: BSD-2-Clause-Patent

# Parse version from VERSION.md - this must happen early so that
# CLLTK_VERSION_STRING, CLLTK_VERSION_MAJOR, etc. are available
# when library subdirectories are processed (for SOVERSION)

file(READ "${CMAKE_CURRENT_LIST_DIR}/../VERSION.md" VERSION_CONTENTS)
string(REGEX MATCH "^[0-9]+\\.[0-9]+\\.[0-9]+" CLLTK_VERSION_STRING "${VERSION_CONTENTS}")
Expand Down Expand Up @@ -31,4 +36,4 @@ target_include_directories(clltk-version
$<BUILD_INTERFACE:${CLLTK_VERSION_INCLUDE_PATH}>
)

add_dependencies(clltk-version clltk-version-file)
add_dependencies(clltk-version clltk-version-file)
31 changes: 31 additions & 0 deletions cmake/build_info.h.template
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// Copyright (c) 2024, International Business Machines
// SPDX-License-Identifier: BSD-2-Clause-Patent
//
// Auto-generated file - do not edit manually

#ifndef _CLLTK_BUILD_INFO_GEN_H_
#define _CLLTK_BUILD_INFO_GEN_H_

// Version information (also available in version.gen.h)
#define CLLTK_BUILD_VERSION_STR "$CLLTK_VERSION_MAJOR.$CLLTK_VERSION_MINOR.$CLLTK_VERSION_PATCH"

// Git information
#define CLLTK_BUILD_GIT_HASH "$CLLTK_GIT_HASH"
#define CLLTK_BUILD_GIT_DIRTY $CLLTK_GIT_DIRTY

// Project information
#define CLLTK_BUILD_TOOL_NAME "clltk"
#define CLLTK_BUILD_FULL_NAME "Common Low Level Tracing Kit"
#define CLLTK_BUILD_MAINTAINER "International Business Machines"
#define CLLTK_BUILD_LICENSE "BSD-2-Clause-Patent"
#define CLLTK_BUILD_URL "https://github.com/IBM/CommonLowLevelTracingKit"

// Feature flags (1 = enabled, 0 = disabled)
#define CLLTK_HAS_TRACING $CLLTK_HAS_TRACING
#define CLLTK_HAS_SNAPSHOT $CLLTK_HAS_SNAPSHOT
#define CLLTK_HAS_CPP_DECODER $CLLTK_HAS_CPP_DECODER
#define CLLTK_HAS_PYTHON_DECODER $CLLTK_HAS_PYTHON_DECODER
#define CLLTK_HAS_KERNEL_TRACING $CLLTK_HAS_KERNEL_TRACING

#endif // _CLLTK_BUILD_INFO_GEN_H_

112 changes: 95 additions & 17 deletions cmake/gen_version_header.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,43 @@
# Copyright (c) 2024, International Business Machines
# SPDX-License-Identifier: BSD-2-Clause-Patent

SRC_TOPLEVEL="$(dirname $0)/.."
TEMPLATE="$SRC_TOPLEVEL/cmake/version.h.template"
OUTPUT="$SRC_TOPLEVEL/tracing_library/include/CommonLowLevelTracingKit/version.gen.h"
set -e

SRC_TOPLEVEL="$(dirname "$0")/.."

# Version header generation (optional if only generating build_info)
TEMPLATE=""
OUTPUT=""

# Build info generation (optional, for command line tool)
BUILD_INFO_TEMPLATE=""
BUILD_INFO_OUTPUT=""

# Feature flags (default to 0/unknown when not specified)
CLLTK_HAS_TRACING="${CLLTK_HAS_TRACING:-0}"
CLLTK_HAS_SNAPSHOT="${CLLTK_HAS_SNAPSHOT:-0}"
CLLTK_HAS_CPP_DECODER="${CLLTK_HAS_CPP_DECODER:-0}"
CLLTK_HAS_PYTHON_DECODER="${CLLTK_HAS_PYTHON_DECODER:-0}"
CLLTK_HAS_KERNEL_TRACING="${CLLTK_HAS_KERNEL_TRACING:-0}"

print_help() {
echo "$0 [-t TEMPLATE_FILE] [-o OUTPUT_FILE]"
echo "$0 [-t TEMPLATE_FILE] [-o OUTPUT_FILE] [-b BUILD_INFO_TEMPLATE] [-B BUILD_INFO_OUTPUT]"
echo "\
Generate version.gen.h and/or build_info.gen.h from templates.
At least one of (-t and -o) or (-b and -B) must be specified.

args:
-t | --template TEMPLAE_FILE (default $TEMPLATE)
-o | --output OUTPUT_FILE (default $OUTPUT)
-t | --template TEMPLATE_FILE version.h template
-o | --output OUTPUT_FILE version.h output
-b | --build-info-template TEMPLATE build_info.h template
-B | --build-info-output OUTPUT build_info.h output

environment variables for build_info (feature flags):
CLLTK_HAS_TRACING (0 or 1, default 0)
CLLTK_HAS_SNAPSHOT (0 or 1, default 0)
CLLTK_HAS_CPP_DECODER (0 or 1, default 0)
CLLTK_HAS_PYTHON_DECODER (0 or 1, default 0)
CLLTK_HAS_KERNEL_TRACING (0 or 1, default 0)

other:
-h | --help this help
Expand All @@ -28,6 +55,14 @@ while (($#)) ; do
OUTPUT="$2"
shift 2
;;
-b | --build-info-template)
BUILD_INFO_TEMPLATE="$2"
shift 2
;;
-B | --build-info-output)
BUILD_INFO_OUTPUT="$2"
shift 2
;;
-h | --help)
print_help
exit
Expand All @@ -40,16 +75,59 @@ while (($#)) ; do
esac
done

CLLTK_VERSION=$(cat "$SRC_TOPLEVEL/VERSION.md" | head -n1 )
CLLTK_VERSION_MAJOR=$(echo $CLLTK_VERSION | cut -d . -f 1 )
CLLTK_VERSION_MINOR=$(echo $CLLTK_VERSION | cut -d . -f 2 )
CLLTK_VERSION_PATCH=$(echo $CLLTK_VERSION | cut -d . -f 3 )
# Validate that at least one output is requested
if [[ -z "$TEMPLATE" && -z "$BUILD_INFO_TEMPLATE" ]]; then
echo "Error: At least one of -t/-o or -b/-B must be specified"
print_help
exit 1
fi

# Parse version from VERSION.md
CLLTK_VERSION=$(head -n1 "$SRC_TOPLEVEL/VERSION.md")
CLLTK_VERSION_MAJOR=$(echo "$CLLTK_VERSION" | cut -d . -f 1)
CLLTK_VERSION_MINOR=$(echo "$CLLTK_VERSION" | cut -d . -f 2)
CLLTK_VERSION_PATCH=$(echo "$CLLTK_VERSION" | cut -d . -f 3)

temp_file=$(mktemp)
env CLLTK_VERSION_MAJOR=$CLLTK_VERSION_MAJOR \
CLLTK_VERSION_MINOR=$CLLTK_VERSION_MINOR \
CLLTK_VERSION_PATCH=$CLLTK_VERSION_PATCH \
envsubst < "$TEMPLATE" > "$temp_file"
# Get git information
if git -C "$SRC_TOPLEVEL" rev-parse --git-dir > /dev/null 2>&1; then
CLLTK_GIT_HASH=$(git -C "$SRC_TOPLEVEL" rev-parse --short HEAD 2>/dev/null || echo "unknown")
if git -C "$SRC_TOPLEVEL" diff --quiet 2>/dev/null; then
CLLTK_GIT_DIRTY=0
else
CLLTK_GIT_DIRTY=1
fi
else
CLLTK_GIT_HASH="unknown"
CLLTK_GIT_DIRTY=0
fi

rsync --checksum $temp_file $OUTPUT
rm -f "$temp_file"
# Generate version.gen.h (if templates provided)
if [[ -n "$TEMPLATE" && -n "$OUTPUT" ]]; then
temp_file=$(mktemp)
env CLLTK_VERSION_MAJOR="$CLLTK_VERSION_MAJOR" \
CLLTK_VERSION_MINOR="$CLLTK_VERSION_MINOR" \
CLLTK_VERSION_PATCH="$CLLTK_VERSION_PATCH" \
envsubst < "$TEMPLATE" > "$temp_file"

rsync --checksum "$temp_file" "$OUTPUT"
rm -f "$temp_file"
fi

# Generate build_info.gen.h (if templates provided)
if [[ -n "$BUILD_INFO_TEMPLATE" && -n "$BUILD_INFO_OUTPUT" ]]; then
temp_file=$(mktemp)
env CLLTK_VERSION_MAJOR="$CLLTK_VERSION_MAJOR" \
CLLTK_VERSION_MINOR="$CLLTK_VERSION_MINOR" \
CLLTK_VERSION_PATCH="$CLLTK_VERSION_PATCH" \
CLLTK_GIT_HASH="$CLLTK_GIT_HASH" \
CLLTK_GIT_DIRTY="$CLLTK_GIT_DIRTY" \
CLLTK_HAS_TRACING="$CLLTK_HAS_TRACING" \
CLLTK_HAS_SNAPSHOT="$CLLTK_HAS_SNAPSHOT" \
CLLTK_HAS_CPP_DECODER="$CLLTK_HAS_CPP_DECODER" \
CLLTK_HAS_PYTHON_DECODER="$CLLTK_HAS_PYTHON_DECODER" \
CLLTK_HAS_KERNEL_TRACING="$CLLTK_HAS_KERNEL_TRACING" \
envsubst < "$BUILD_INFO_TEMPLATE" > "$temp_file"

rsync --checksum "$temp_file" "$BUILD_INFO_OUTPUT"
rm -f "$temp_file"
fi
1 change: 1 addition & 0 deletions command_line_tool/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ target_link_libraries(clltk-cmd
PRIVATE
clltk-cmd-interface
clltk-version
clltk-build-info
)

# Check that all commands are OBJECT or SHARED libraries
Expand Down
Loading