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
49 changes: 44 additions & 5 deletions .github/workflows/topology.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ jobs:
sudo apt-get update
sudo apt-get -y install ninja-build cmake m4 \
automake autoconf libtool gettext libasound2-dev \
pkg-config python3-construct
pkg-config python3-construct rpm cpio fakeroot

- name: Install autoconf 2.72
run: |
Expand All @@ -48,14 +48,53 @@ jobs:
run: |
./sof-topologies/scripts/build-topology.sh -T -t

- name: Run Topology Validation Suite
- name: Build RPM, DEB & TGZ Packages
run: |
ctest --test-dir "${GITHUB_WORKSPACE}/sof-topologies/build" --output-on-failure
make -C "${GITHUB_WORKSPACE}/sof-topologies" deb
make -C "${GITHUB_WORKSPACE}/sof-topologies" rpm
make -C "${GITHUB_WORKSPACE}/sof-topologies" tgz

- name: Validate Install & Package Targets
- name: Run Topology & Package Validation Suite
run: |
ctest --test-dir "${GITHUB_WORKSPACE}/sof-topologies/build" --output-on-failure -V

- name: Validate DEB Package System Install & Removal
run: |
sudo rm -rf /lib/firmware/intel/sof-tplg \
/lib/firmware/intel/sof-ipc4-tplg \
/lib/firmware/intel/sof-ace-tplg
sudo dpkg -i --force-overwrite "${GITHUB_WORKSPACE}/sof-topologies/build/"sof-topology_*_all.deb
dpkg -s sof-topology
sudo dpkg -V sof-topology
./sof-topologies/tools/validate-package.py \
--validate-installed-root / \
--build-dir "${GITHUB_WORKSPACE}/sof-topologies/build" \
--abi-header "${GITHUB_WORKSPACE}/sof-topologies/include/kernel/abi.h"
sudo dpkg -r sof-topology
test ! -e /lib/firmware/intel/sof-tplg
test ! -e /lib/firmware/intel/sof-ipc4-tplg
test ! -L /lib/firmware/intel/sof-ace-tplg

- name: Validate RPM Package System Install & Removal
run: |
sudo rm -rf /lib/firmware/intel/sof-tplg \
/lib/firmware/intel/sof-ipc4-tplg \
/lib/firmware/intel/sof-ace-tplg
sudo rpm --dbpath /var/lib/rpm -ivh --nodeps --replacefiles "${GITHUB_WORKSPACE}/sof-topologies/build/"sof-topology-*.noarch.rpm
sudo rpm --dbpath /var/lib/rpm -qi sof-topology
sudo rpm --dbpath /var/lib/rpm -V sof-topology
./sof-topologies/tools/validate-package.py \
--validate-installed-root / \
--build-dir "${GITHUB_WORKSPACE}/sof-topologies/build" \
--abi-header "${GITHUB_WORKSPACE}/sof-topologies/include/kernel/abi.h"
sudo rpm --dbpath /var/lib/rpm -e sof-topology
test ! -e /lib/firmware/intel/sof-tplg
test ! -e /lib/firmware/intel/sof-ipc4-tplg
test ! -L /lib/firmware/intel/sof-ace-tplg

- name: Validate Install Script
run: |
./sof-topologies/scripts/install-topology.sh --dest "${GITHUB_WORKSPACE}/stage/lib/firmware"
test -d "${GITHUB_WORKSPACE}/stage/lib/firmware/intel/sof-tplg"
test -d "${GITHUB_WORKSPACE}/stage/lib/firmware/intel/sof-ipc4-tplg"
test -L "${GITHUB_WORKSPACE}/stage/lib/firmware/intel/sof-ace-tplg"
./sof-topologies/scripts/build-topology.sh -p
141 changes: 124 additions & 17 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,17 @@ set(SOF_ABI_PATCH "${CMAKE_MATCH_1}")
set(SOF_ABI_VERSION_STRING "${SOF_ABI_MAJOR}.${SOF_ABI_MINOR}.${SOF_ABI_PATCH}")
message(STATUS "SOF Topology ABI version: ${SOF_ABI_VERSION_STRING}")

set(SOF_PACKAGE_VERSION "${SOF_ABI_VERSION_STRING}" CACHE STRING "Package version for RPM/DEB/TGZ artifacts")
if(SOF_PACKAGE_VERSION MATCHES "^([0-9]+)\\.([0-9]+)\\.([0-9]+)")
set(SOF_PKG_VERSION_MAJOR "${CMAKE_MATCH_1}")
set(SOF_PKG_VERSION_MINOR "${CMAKE_MATCH_2}")
set(SOF_PKG_VERSION_PATCH "${CMAKE_MATCH_3}")
else()
set(SOF_PKG_VERSION_MAJOR "${SOF_ABI_MAJOR}")
set(SOF_PKG_VERSION_MINOR "${SOF_ABI_MINOR}")
set(SOF_PKG_VERSION_PATCH "${SOF_ABI_PATCH}")
endif()

set(SOF_TOPOLOGY_BINARY_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
set(SOF_TOPOLOGY1_SOURCE_DIR "${PROJECT_SOURCE_DIR}/topology1")
set(SOF_TOPOLOGY2_SOURCE_DIR "${PROJECT_SOURCE_DIR}/topology2")
Expand Down Expand Up @@ -89,12 +100,20 @@ set(_ipc4_dest "${_install_base}/sof-ipc4-tplg${SOF_TPLG_VERSION_SUFFIX}")
set(_ace_link_name "sof-ace-tplg${SOF_TPLG_VERSION_SUFFIX}")
set(_ipc4_dir_name "sof-ipc4-tplg${SOF_TPLG_VERSION_SUFFIX}")

set(_tplg_file_perms OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ)
set(_tplg_dir_perms OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
set(CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS ${_tplg_dir_perms})

if(BUILD_TOPOLOGY1)
install(
DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/topology1/production/"
DESTINATION "${_ipc3_dest}"
COMPONENT ipc3-prod
FILES_MATCHING PATTERN "*.tplg"
FILE_PERMISSIONS ${_tplg_file_perms}
DIRECTORY_PERMISSIONS ${_tplg_dir_perms}
FILES_MATCHING
PATTERN "CMakeFiles" EXCLUDE
PATTERN "*.tplg"
)
endif()

Expand All @@ -103,32 +122,44 @@ if(BUILD_TOPOLOGY2)
DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/topology2/production/ipc3/"
DESTINATION "${_ipc3_dest}"
COMPONENT ipc3-prod
FILES_MATCHING PATTERN "*.tplg"
FILE_PERMISSIONS ${_tplg_file_perms}
DIRECTORY_PERMISSIONS ${_tplg_dir_perms}
FILES_MATCHING
PATTERN "CMakeFiles" EXCLUDE
PATTERN "*.tplg"
)
install(
DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/topology2/production/"
DESTINATION "${_ipc4_dest}"
COMPONENT ipc4-prod
FILE_PERMISSIONS ${_tplg_file_perms}
DIRECTORY_PERMISSIONS ${_tplg_dir_perms}
FILES_MATCHING
PATTERN "CMakeFiles" EXCLUDE
PATTERN "ipc3" EXCLUDE
PATTERN "*.tplg"
)
# Create sof-ace-tplg -> sof-ipc4-tplg symlink on install
install(CODE "
set(_dest_dir \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${_install_base}\")
file(MAKE_DIRECTORY \"\${_dest_dir}\")
execute_process(
COMMAND \"${CMAKE_COMMAND}\" -E create_symlink \"${_ipc4_dir_name}\" \"\${_dest_dir}/${_ace_link_name}\"
)
" COMPONENT ipc4-prod)
# Create sof-ace-tplg -> sof-ipc4-tplg symlink in build dir and install it
execute_process(
COMMAND "${CMAKE_COMMAND}" -E create_symlink "${_ipc4_dir_name}" "${CMAKE_CURRENT_BINARY_DIR}/${_ace_link_name}"
)
install(
FILES "${CMAKE_CURRENT_BINARY_DIR}/${_ace_link_name}"
DESTINATION "${_install_base}"
COMPONENT ipc4-prod
)

if(BUILD_DEV_TOPOLOGIES)
install(
DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/topology2/development/"
DESTINATION "${_install_base}/sof-ipc4-tplg-dev${SOF_TPLG_VERSION_SUFFIX}"
COMPONENT dev
EXCLUDE_FROM_ALL
FILES_MATCHING PATTERN "*.tplg"
FILE_PERMISSIONS ${_tplg_file_perms}
DIRECTORY_PERMISSIONS ${_tplg_dir_perms}
FILES_MATCHING
PATTERN "CMakeFiles" EXCLUDE
PATTERN "*.tplg"
)
endif()
endif()
Expand Down Expand Up @@ -166,16 +197,92 @@ if(Python3_Interpreter_FOUND)
)
endif()
endif()
add_test(
NAME validate_packages
COMMAND ${Python3_EXECUTABLE} "${PROJECT_SOURCE_DIR}/tools/validate-package.py"
--build-dir "${CMAKE_CURRENT_BINARY_DIR}"
--abi-header "${SOF_ABI_HEADER}"
--expected-version "${SOF_PACKAGE_VERSION}"
--install-prefix "${CMAKE_INSTALL_PREFIX}"
--vendor-dir "${SOF_TPLG_INSTALL_VENDOR_DIR}"
--version-suffix "${SOF_TPLG_VERSION_SUFFIX}"
)
endif()

# ---------------------------------------------------------------------------
# Packaging Support (cpack / ninja package)
# Packaging Support (cpack / make deb / make rpm / make packages)
# ---------------------------------------------------------------------------
set(CPACK_PACKAGE_NAME "sof-topology")
set(CPACK_PACKAGE_VENDOR "Sound Open Firmware Project")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "SOF ALSA Topology Binaries (IPC3 & IPC4)")
set(CPACK_PACKAGE_VERSION_MAJOR "${SOF_ABI_MAJOR}")
set(CPACK_PACKAGE_VERSION_MINOR "${SOF_ABI_MINOR}")
set(CPACK_PACKAGE_VERSION_PATCH "${SOF_ABI_PATCH}")
set(CPACK_GENERATOR "TGZ")
set(CPACK_PACKAGE_CONTACT "Sound Open Firmware Project <sof-devel@alsa-project.org>")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "SOF ALSA Topology Binaries (IPC3 & IPC4) - ABI ${SOF_ABI_VERSION_STRING}")
set(CPACK_PACKAGE_DESCRIPTION "Sound Open Firmware (SOF) pre-compiled ALSA topology binaries for IPC3 and IPC4 platforms (SOF ABI ${SOF_ABI_VERSION_STRING}).")
set(CPACK_PACKAGE_VERSION "${SOF_PACKAGE_VERSION}")
set(CPACK_PACKAGE_VERSION_MAJOR "${SOF_PKG_VERSION_MAJOR}")
set(CPACK_PACKAGE_VERSION_MINOR "${SOF_PKG_VERSION_MINOR}")
set(CPACK_PACKAGE_VERSION_PATCH "${SOF_PKG_VERSION_PATCH}")
set(CPACK_PACKAGE_RELEASE "1")
set(CPACK_PACKAGING_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")

# Debian (.deb) package settings
set(CPACK_DEBIAN_PACKAGE_NAME "sof-topology")
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "all")
set(CPACK_DEBIAN_PACKAGE_SECTION "kernel")
set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional")
set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://github.com/thesofproject/sof-topologies")
set(CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION TRUE)
set(CPACK_DEBIAN_FILE_NAME "DEB-DEFAULT")

# RPM (.rpm) package settings
set(CPACK_RPM_PACKAGE_NAME "sof-topology")
set(CPACK_RPM_PACKAGE_ARCHITECTURE "noarch")
set(CPACK_RPM_PACKAGE_RELEASE "${CPACK_PACKAGE_RELEASE}")
set(CPACK_RPM_PACKAGE_LICENSE "BSD-3-Clause")
set(CPACK_RPM_PACKAGE_GROUP "System Environment/Kernel")
set(CPACK_RPM_PACKAGE_URL "https://github.com/thesofproject/sof-topologies")
set(CPACK_RPM_PACKAGE_DESCRIPTION "${CPACK_PACKAGE_DESCRIPTION}")
set(CPACK_RPM_DEFAULT_DIR_PERMISSIONS ${_tplg_dir_perms})
set(CPACK_RPM_DEFAULT_FILE_PERMISSIONS ${_tplg_file_perms})
set(CPACK_RPM_PACKAGE_AUTOREQ "no")
set(CPACK_RPM_PACKAGE_AUTOPROV "no")
set(CPACK_RPM_FILE_NAME "RPM-DEFAULT")
list(APPEND CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION
"/lib"
"/lib/firmware"
"${CMAKE_INSTALL_PREFIX}"
)

set(CPACK_GENERATOR "TGZ;DEB;RPM" CACHE STRING "Default CPack package generators")
include(CPack)

add_custom_target(package-deb
COMMAND "${CMAKE_CPACK_COMMAND}" -G DEB
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
DEPENDS topologies
COMMENT "Building DEB package with pre-compiled SOF topologies"
)

add_custom_target(package-rpm
COMMAND "${CMAKE_CPACK_COMMAND}" -G RPM
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
DEPENDS topologies
COMMENT "Building RPM package with pre-compiled SOF topologies"
)

add_custom_target(package-tgz
COMMAND "${CMAKE_CPACK_COMMAND}" -G TGZ
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
DEPENDS topologies
COMMENT "Building TGZ archive with pre-compiled SOF topologies"
)

add_custom_target(deb DEPENDS package-deb)
add_custom_target(rpm DEPENDS package-rpm)
add_custom_target(packages
COMMAND "${CMAKE_CPACK_COMMAND}" -G "DEB;RPM;TGZ"
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
DEPENDS topologies
VERBATIM
COMMENT "Building DEB, RPM, and TGZ packages with pre-compiled SOF topologies"
)
71 changes: 71 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# SPDX-License-Identifier: BSD-3-Clause
# Copyright(c) 2026 Intel Corporation. All rights reserved.
#
# Top-level Makefile for building, testing, installing, and packaging
# SOF topologies into RPM, DEB, and TGZ archives.

BUILD_DIR ?= $(CURDIR)/build
PREFIX ?= /lib/firmware
CMAKE_GENERATOR ?= Ninja
JOBS ?= $(shell nproc 2>/dev/null || echo 4)
CMAKE_ARGS ?=

.PHONY: all build configure topology1 topology2 tests \
package packages rpm deb tgz package-rpm package-deb package-tgz \
test check test-packages validate-packages install clean distclean help

all: build

configure:
@if [ ! -f "$(BUILD_DIR)/CMakeCache.txt" ]; then \
cmake -G "$(CMAKE_GENERATOR)" -S "$(CURDIR)" -B "$(BUILD_DIR)" \
-DCMAKE_INSTALL_PREFIX="$(PREFIX)" $(CMAKE_ARGS); \
fi

build: configure
cmake --build "$(BUILD_DIR)" -j "$(JOBS)"

topology1: configure
cmake --build "$(BUILD_DIR)" --target topologies1 -j "$(JOBS)"

topology2: configure
cmake --build "$(BUILD_DIR)" --target topologies2 -j "$(JOBS)"

tests: configure
cmake --build "$(BUILD_DIR)" --target tests -j "$(JOBS)"

rpm package-rpm: configure
cmake --build "$(BUILD_DIR)" --target package-rpm -j "$(JOBS)"

deb package-deb: configure
cmake --build "$(BUILD_DIR)" --target package-deb -j "$(JOBS)"

tgz package-tgz: configure
cmake --build "$(BUILD_DIR)" --target package-tgz -j "$(JOBS)"

package packages: configure
cmake --build "$(BUILD_DIR)" --target packages -j "$(JOBS)"

test-packages validate-packages: packages
ctest --test-dir "$(BUILD_DIR)" --output-on-failure -V -R validate_packages

test check: packages
ctest --test-dir "$(BUILD_DIR)" --output-on-failure

install: build
DESTDIR="$(DESTDIR)" cmake --install "$(BUILD_DIR)" --prefix "$(PREFIX)"

clean distclean:
$(RM) -r "$(BUILD_DIR)"

help:
@echo "SOF Topologies Make Targets:"
@echo " make [all|build] - Configure and build all production/dev topologies"
@echo " make package[s] - Build RPM, DEB, and TGZ packages with pre-compiled topologies"
@echo " make rpm - Build RPM (.noarch.rpm) package with pre-compiled topologies"
@echo " make deb - Build Debian (.deb) package with pre-compiled topologies"
@echo " make tgz - Build tarball (.tar.gz) package with pre-compiled topologies"
@echo " make test / make check - Build packages and run all topology & package validation tests"
@echo " make validate-packages - Build and validate RPM/DEB/TGZ paths, permissions, versions, and symlinks"
@echo " make install - Install topologies to [DESTDIR=...] [PREFIX=/lib/firmware]"
@echo " make clean - Remove $(BUILD_DIR)"
17 changes: 14 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,21 @@ Or using standard CMake install:
sudo cmake --install build --prefix /lib/firmware
```

### 4. Package Release Tarball
### 4. Build & Validate RPM, DEB, and TGZ Packages
```bash
./scripts/build-topology.sh -p
# Generates build/sof-topology-<abi_version>.tar.gz
# Build DEB, RPM, and TGZ packages with pre-compiled topologies:
make packages

# Or build individual package formats:
make deb # Generates build/sof-topology_<version>_all.deb
make rpm # Generates build/sof-topology-<version>-1.noarch.rpm
make tgz # Generates build/sof-topology-<version>-Linux.tar.gz

# Validate package file paths, permissions, version data, and symlinks:
make validate-packages

# Run the full topology and package test suite:
make test
```

---
Expand Down
2 changes: 1 addition & 1 deletion scripts/build-topology.sh
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ usage: $0 [-T|-X|-1|-Y|-2|-t|-s|-A|-C|-L|-p|-i <dir>|-h]
-C No build, only clean CMake re-configuration
-L Mirror/symlink built outputs into ../sof/tools/build_tools/topology
for backward compatibility with legacy CI/testbench scripts
-p Package built topologies into a .tar.gz archive via CPack
-p Package built topologies into RPM, DEB, and TGZ archives via CPack
-i <dir> Install built topologies into <dir> (e.g. /lib/firmware)
EOFUSAGE
}
Expand Down
Loading
Loading