DEB: build the Release 2 scope instead of the impossible full tree
A full-tree build (ninja all) is not possible on the Release 2 tree: out-of-scope modules reference modules excluded from the scope (e.g. TopicEditorBase -> LtsScriptTimeline; 100+ CMakeLists references), and cmake --install hard-fails on targets that were never built. Align the DEB pipeline with its own description (binaries and libraries from release scope S): - make_rpm_ubuntu26_release2.py: new --build_targets option (space-separated CMake/Ninja targets; empty = legacy full tree). Step 1 builds only those targets; the runtime DEB is staged from the scoped build artifacts (bin/ + lib/) and packaged with build_deb nobuild, replacing the full-tree debuild/cmake-buildsystem path. - new_docker_build_release2.sh: pass the Release 2 group targets via --build_targets; exclude the driver build4* dirs from the staging tar (the DEB step builds its own tree; nothing consumes the driver build output). Fix two comments inside the single-quoted docker bash -c string that contained apostrophes, which broke word construction and failed bash -n. Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
1 parent
1646c5c71c
commit
646b1fc8ba
2 files changed
+58
-19
No files matched your search
@@ -586,9 +586,16 @@ if [[ "${RUN_JENKINS_BUILDER}" == "ON" ]]; then
|
|||||||
log_info "Staging workspace to ${STAGE_DIR}"
|
log_info "Staging workspace to ${STAGE_DIR}"
|
||||||
rm -rf "${STAGE_DIR}"
|
rm -rf "${STAGE_DIR}"
|
||||||
mkdir -p "${STAGE_DIR}"
|
mkdir -p "${STAGE_DIR}"
|
||||||
|
# Exclude build4* (the driver build dirs, e.g. build4_<timestamp>): the DEB
|
||||||
|
# pipeline builds its own tree in <staging>/build; nothing in the DEB step
|
||||||
|
# consumes the driver build output (the ctest DEB looks for a plain build4
|
||||||
|
# dir, which the driver never creates; it uses build4_<timestamp> instead).
|
||||||
|
# NOTE: no apostrophes allowed in comments here - this block lives inside
|
||||||
|
# the single-quoted docker bash -c string (see lines 477/653).
|
||||||
tar --exclude='./rpms' --exclude='./.git' --exclude='./build' \
|
tar --exclude='./rpms' --exclude='./.git' --exclude='./build' \
|
||||||
--exclude='./deb_build_tmp' --exclude='./deb_stage' --exclude='./packages-out' \
|
--exclude='./deb_build_tmp' --exclude='./deb_stage' --exclude='./packages-out' \
|
||||||
--exclude='./legatus-qt6_1.0.tar.gz' \
|
--exclude='./legatus-qt6_1.0.tar.gz' \
|
||||||
|
--exclude=./build4\* \
|
||||||
-cf - -C "${WORKSPACE_DIR}" . | tar -xf - -C "${STAGE_DIR}"
|
-cf - -C "${WORKSPACE_DIR}" . | tar -xf - -C "${STAGE_DIR}"
|
||||||
|
|
||||||
if [[ ! -f "${STAGED_SOURCE_DIR}/CMakeLists.txt" || ! -f "${STAGED_SOURCE_DIR}/rpmbuild/make_rpm_ubuntu26_release2.py" ]]; then
|
if [[ ! -f "${STAGED_SOURCE_DIR}/CMakeLists.txt" || ! -f "${STAGED_SOURCE_DIR}/rpmbuild/make_rpm_ubuntu26_release2.py" ]]; then
|
||||||
@@ -607,8 +614,8 @@ if [[ "${RUN_JENKINS_BUILDER}" == "ON" ]]; then
|
|||||||
# DEB cmake flags: -DBUILD_RTI=ON is required - the full-tree DEB build
|
# DEB cmake flags: -DBUILD_RTI=ON is required - the full-tree DEB build
|
||||||
# compiles RTI codegen consumers (e.g. svcPdmCommon -> pdm_enums.hpp)
|
# compiles RTI codegen consumers (e.g. svcPdmCommon -> pdm_enums.hpp)
|
||||||
# whose BUILD_RTI=OFF stubs were removed as "forbidden OFF variants".
|
# whose BUILD_RTI=OFF stubs were removed as "forbidden OFF variants".
|
||||||
# (A '#' line inside a backslash-continued command breaks the continuation
|
# (A lone hash line inside a backslash-continued command breaks the
|
||||||
# and drops the remaining arguments - keep comments outside it.)
|
# continuation and drops the remaining arguments - keep comments outside it.)
|
||||||
cd "${STAGED_SOURCE_DIR}/rpmbuild"
|
cd "${STAGED_SOURCE_DIR}/rpmbuild"
|
||||||
if python3 make_rpm_ubuntu26_release2.py -c LTS \
|
if python3 make_rpm_ubuntu26_release2.py -c LTS \
|
||||||
--project_name "${PROJECT}" \
|
--project_name "${PROJECT}" \
|
||||||
@@ -616,6 +623,7 @@ if [[ "${RUN_JENKINS_BUILDER}" == "ON" ]]; then
|
|||||||
--output_dir "${DOCKER_MOUNT_ROOT}/rpms/${PROJECT}/${OS_VERSION}/" \
|
--output_dir "${DOCKER_MOUNT_ROOT}/rpms/${PROJECT}/${OS_VERSION}/" \
|
||||||
--source_dir "${STAGED_SOURCE_DIR}" \
|
--source_dir "${STAGED_SOURCE_DIR}" \
|
||||||
--cmake_build_flags "-DUSE_IPO=ON -DUSE_UNITY_BUILD=ON -DGUEZ_MODE=${GUEZ_MODE} -DBUILD_WLS=ON -DPostgreSQL_TYPE_INCLUDE_DIR=/usr/include/postgresql/ -DBUILD_RTI=ON -DRELEASE_BUILD=ON" \
|
--cmake_build_flags "-DUSE_IPO=ON -DUSE_UNITY_BUILD=ON -DGUEZ_MODE=${GUEZ_MODE} -DBUILD_WLS=ON -DPostgreSQL_TYPE_INCLUDE_DIR=/usr/include/postgresql/ -DBUILD_RTI=ON -DRELEASE_BUILD=ON" \
|
||||||
|
--build_targets "${GROUP1_TARGETS[*]} ${GROUP3_TARGETS[*]} ${GROUP5_TARGETS[*]} ${GROUP6_TARGETS[*]}" \
|
||||||
--build_number "${BUILD_NUMBER}" \
|
--build_number "${BUILD_NUMBER}" \
|
||||||
--release_scope; then
|
--release_scope; then
|
||||||
log_info "Package build completed successfully"
|
log_info "Package build completed successfully"
|
||||||
|
|||||||
@@ -408,8 +408,14 @@ def build_nobuild_package(name, source_dir, build_base, output_dir, version, bui
|
|||||||
validate_package_contents(name, manifest, allowed_patterns, forbidden_patterns)
|
validate_package_contents(name, manifest, allowed_patterns, forbidden_patterns)
|
||||||
|
|
||||||
|
|
||||||
def build_all_debs(source_dir, output_dir, version, build_number, cmake_flags):
|
def build_all_debs(source_dir, output_dir, version, build_number, cmake_flags,
|
||||||
"""Build the 5 DEB packages: build once from the source tree, then package."""
|
build_targets=""):
|
||||||
|
"""Build the 5 DEB packages: build once from the source tree, then package.
|
||||||
|
|
||||||
|
build_targets: space-separated CMake/Ninja target list (the Release 2
|
||||||
|
scope). When non-empty, only these targets are built; when empty, the
|
||||||
|
legacy full-tree build is used.
|
||||||
|
"""
|
||||||
info("========================================")
|
info("========================================")
|
||||||
info("Building 5 DEB packages for Qt6 Release")
|
info("Building 5 DEB packages for Qt6 Release")
|
||||||
info("========================================")
|
info("========================================")
|
||||||
@@ -420,8 +426,16 @@ def build_all_debs(source_dir, output_dir, version, build_number, cmake_flags):
|
|||||||
os.makedirs(build_base)
|
os.makedirs(build_base)
|
||||||
release_dirs = ["TetraIF", "Z/src", "Lts/Common"]
|
release_dirs = ["TetraIF", "Z/src", "Lts/Common"]
|
||||||
|
|
||||||
# Step 1: build once from the full source tree
|
# Step 1: build the release scope from the source tree.
|
||||||
info("\n=== Step 1: Building from full source tree ===")
|
# A full-tree build (ninja all) is NOT possible on the Release 2 tree:
|
||||||
|
# out-of-scope modules reference modules excluded from the scope
|
||||||
|
# (e.g. TopicEditorBase -> LtsScriptTimeline, 100+ CMakeLists files), so
|
||||||
|
# their link rules fail. The release scope is built instead.
|
||||||
|
info("\n=== Step 1: Building release scope ===")
|
||||||
|
if build_targets:
|
||||||
|
info(f"Targets: {build_targets}")
|
||||||
|
else:
|
||||||
|
warning("No target list given - building the full tree (legacy behavior)")
|
||||||
build_dir = os.path.join(source_dir, "build")
|
build_dir = os.path.join(source_dir, "build")
|
||||||
os.makedirs(build_dir, exist_ok=True)
|
os.makedirs(build_dir, exist_ok=True)
|
||||||
os.chdir(build_dir)
|
os.chdir(build_dir)
|
||||||
@@ -432,27 +446,40 @@ def build_all_debs(source_dir, output_dir, version, build_number, cmake_flags):
|
|||||||
# breaks every Qt target. Ninja handles automoc correctly.
|
# breaks every Qt target. Ninja handles automoc correctly.
|
||||||
run(f"cmake -G Ninja -DCMAKE_BUILD_TYPE=Release {cmake_flags} ..", "CMake configuration failed")
|
run(f"cmake -G Ninja -DCMAKE_BUILD_TYPE=Release {cmake_flags} ..", "CMake configuration failed")
|
||||||
info("Running build...")
|
info("Running build...")
|
||||||
run(f"ninja -j$(nproc)", "Build failed")
|
run(f"ninja -j$(nproc) {build_targets}".rstrip(), "Build failed")
|
||||||
info("Build completed successfully")
|
info("Build completed successfully")
|
||||||
|
|
||||||
# Package 1: qt6-release-runtime (binaries and libraries, built via debuild)
|
# Package 1: qt6-release-runtime (binaries and libraries from release scope S)
|
||||||
|
#
|
||||||
|
# The artifacts are taken from the step-1 scoped build above. A debuild
|
||||||
|
# with the cmake buildsystem is not an option here: dh_auto_install runs
|
||||||
|
# 'cmake --install', which fails hard on every target that has an install
|
||||||
|
# rule but was not built (file INSTALL cannot find), and a full build is
|
||||||
|
# not possible on the Release 2 tree (see step 1).
|
||||||
info("\n=== Building qt6-release-runtime ===")
|
info("\n=== Building qt6-release-runtime ===")
|
||||||
pkg1_dir = os.path.join(build_base, f"qt6-release-runtime-{version}")
|
pkg1_dir = os.path.join(build_base, f"qt6-release-runtime-{version}")
|
||||||
os.makedirs(pkg1_dir)
|
os.makedirs(pkg1_dir)
|
||||||
# FULL source tree (needed for debian/rules cmake reference)
|
staged = 0
|
||||||
copy_src_dir_to_dest_dir(source_dir, pkg1_dir)
|
for src_root, dst_root in ((os.path.join(build_dir, "bin"), "usr/bin"),
|
||||||
# Install from all component install paths: ALL -> bin/, lib/ ; SV/ ; WS/
|
(os.path.join(build_dir, "lib"), "usr/lib")):
|
||||||
|
if not os.path.isdir(src_root):
|
||||||
|
continue
|
||||||
|
for entry in sorted(os.listdir(src_root)):
|
||||||
|
src_path = os.path.join(src_root, entry)
|
||||||
|
if not os.path.isfile(src_path):
|
||||||
|
continue
|
||||||
|
dst_dir = os.path.join(pkg1_dir, dst_root)
|
||||||
|
os.makedirs(dst_dir, exist_ok=True)
|
||||||
|
shutil.copy2(src_path, os.path.join(dst_dir, entry))
|
||||||
|
staged += 1
|
||||||
|
info(f"Staged {staged} artifacts from {build_dir}")
|
||||||
install_lines_1 = [
|
install_lines_1 = [
|
||||||
"usr/bin/* usr/bin/",
|
"usr/bin/* usr/bin/",
|
||||||
"usr/lib/*.so* usr/lib/",
|
"usr/lib/* usr/lib/",
|
||||||
"usr/SV/bin/* usr/bin/",
|
|
||||||
"usr/SV/lib/*.so* usr/lib/",
|
|
||||||
"usr/WS/bin/* usr/bin/",
|
|
||||||
"usr/WS/lib/*.so* usr/lib/",
|
|
||||||
]
|
]
|
||||||
build_deb(pkg_name="qt6-release-runtime", pkg_dir=pkg1_dir, output_dir=output_dir,
|
build_deb(pkg_name="qt6-release-runtime", pkg_dir=pkg1_dir, output_dir=output_dir,
|
||||||
version=version, build_number=build_number, cmake_flags=cmake_flags,
|
version=version, build_number=build_number, nobuild=True,
|
||||||
skip_tests=True, install_lines=install_lines_1,
|
skip_shlibdeps=True, install_lines=install_lines_1,
|
||||||
description="Qt6 Release Runtime - binaries and libraries from release scope S",
|
description="Qt6 Release Runtime - binaries and libraries from release scope S",
|
||||||
section="libs")
|
section="libs")
|
||||||
manifest_1 = create_manifest(output_dir, "qt6-release-runtime", pkg1_dir)
|
manifest_1 = create_manifest(output_dir, "qt6-release-runtime", pkg1_dir)
|
||||||
@@ -517,6 +544,9 @@ def main():
|
|||||||
parser.add_argument("--cmake_build_flags", default="", help="CMake build flags")
|
parser.add_argument("--cmake_build_flags", default="", help="CMake build flags")
|
||||||
parser.add_argument("--build_number", default="1", help="Build number")
|
parser.add_argument("--build_number", default="1", help="Build number")
|
||||||
parser.add_argument("--release_scope", action="store_true", help="Only include release scope files")
|
parser.add_argument("--release_scope", action="store_true", help="Only include release scope files")
|
||||||
|
parser.add_argument("--build_targets", default="",
|
||||||
|
help="Space-separated CMake/Ninja targets to build "
|
||||||
|
"(release scope); empty = full tree (legacy)")
|
||||||
|
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
info(f"Building {args.config} package for {args.project_name} v{args.version}")
|
info(f"Building {args.config} package for {args.project_name} v{args.version}")
|
||||||
@@ -526,7 +556,8 @@ def main():
|
|||||||
info(f"Release scope: {args.release_scope}")
|
info(f"Release scope: {args.release_scope}")
|
||||||
build_all_debs(source_dir=args.source_dir, output_dir=args.output_dir,
|
build_all_debs(source_dir=args.source_dir, output_dir=args.output_dir,
|
||||||
version=args.version, build_number=args.build_number,
|
version=args.version, build_number=args.build_number,
|
||||||
cmake_flags=args.cmake_build_flags)
|
cmake_flags=args.cmake_build_flags,
|
||||||
|
build_targets=args.build_targets)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
Reference in new issue
Block a user