From 0017991a5512939ca823287dd4d0e0d3ddb97b8e Mon Sep 17 00:00:00 2001 From: "ryan.kuba" Date: Tue, 11 Feb 2025 09:51:18 -0500 Subject: [PATCH 01/12] KASM-6788 use thread and future instead of openmp for image encoding --- common/rfb/EncodeManager.cxx | 41 ++++++++++++++++++++++++++++-------- common/rfb/EncodeManager.h | 3 ++- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/common/rfb/EncodeManager.cxx b/common/rfb/EncodeManager.cxx index 1cbd32d..5730352 100644 --- a/common/rfb/EncodeManager.cxx +++ b/common/rfb/EncodeManager.cxx @@ -22,6 +22,12 @@ #include #include +#include +#include +#include +#include + + #include #include #include @@ -210,6 +216,7 @@ EncodeManager::EncodeManager(SConnection* conn_, EncCache *encCache_) : conn(con dynamicQualityMin = Server::dynamicQualityMin; dynamicQualityOff = Server::dynamicQualityMax - Server::dynamicQualityMin; } + std::atomic webpTookTooLong{false}; } EncodeManager::~EncodeManager() @@ -886,8 +893,7 @@ void EncodeManager::checkWebpFallback(const struct timeval *start) { unsigned us; us = msSince(start) * 1024; if (us > webpFallbackUs) - #pragma omp atomic - webpTookTooLong |= true; + webpTookTooLong = true; } } @@ -1130,8 +1136,10 @@ void EncodeManager::writeRects(const Region& changed, const PixelBuffer* pb, std::vector ms; uint32_t i; - if (rfb::Server::rectThreads > 0) - omp_set_num_threads(rfb::Server::rectThreads); + int num_threads = std::thread::hardware_concurrency(); + if (rfb::Server::rectThreads > 0) { + num_threads = rfb::Server::rectThreads; + } webpTookTooLong = false; changed.get_rects(&rects); @@ -1249,12 +1257,27 @@ void EncodeManager::writeRects(const Region& changed, const PixelBuffer* pb, } scalingTime = msSince(&scalestart); - #pragma omp parallel for schedule(dynamic, 1) + std::vector> futures; + futures.reserve(subrects.size()); for (i = 0; i < subrects.size(); ++i) { - encoderTypes[i] = getEncoderType(subrects[i], pb, &palettes[i], compresseds[i], - &isWebp[i], &fromCache[i], - scaledpb, scaledrects[i], ms[i]); - checkWebpFallback(start); + Rect subrect = subrects[i]; + const PixelBuffer* current_pb = pb; + uint8_t* current_encoderTypes = &encoderTypes[i]; + uint8_t* current_fromCache = &fromCache[i]; + const PixelBuffer* current_scaledpb = scaledpb; + Rect current_scaledrect = scaledrects[i]; + uint32_t* current_ms = &ms[i]; + const struct timeval* current_start = start; + auto task = [this, subrect, current_pb, &palettes, &compresseds, &isWebp, current_encoderTypes, current_fromCache, current_scaledpb, current_scaledrect, current_ms, current_start, i]() { + *current_encoderTypes = getEncoderType(subrect, current_pb, &palettes[i], compresseds[i], + &isWebp[i], current_fromCache, + current_scaledpb, current_scaledrect, *current_ms); + checkWebpFallback(current_start); + }; + futures.push_back(std::async(std::launch::async, task)); + } + for (auto& future : futures) { + future.get(); } for (i = 0; i < subrects.size(); ++i) { diff --git a/common/rfb/EncodeManager.h b/common/rfb/EncodeManager.h index 20ba837..7ff24bf 100644 --- a/common/rfb/EncodeManager.h +++ b/common/rfb/EncodeManager.h @@ -32,6 +32,7 @@ #include #include +#include #include namespace rfb { @@ -199,7 +200,7 @@ namespace rfb { size_t curMaxUpdateSize; unsigned webpFallbackUs; unsigned webpBenchResult; - bool webpTookTooLong; + std::atomic webpTookTooLong; unsigned encodingTime; unsigned maxEncodingTime, framesSinceEncPrint; unsigned scalingTime; From 84aa133511ccaf3c71df30b9f988980757e87263 Mon Sep 17 00:00:00 2001 From: El Date: Fri, 7 Mar 2025 01:04:46 +0500 Subject: [PATCH 02/12] KASM-6788 Refactor EncodeManager to use std::execution with parallel algorithms. Removes OpenMP dependency, improves atomic usage, and fixes various minor code quality issues including initialization and memory management --- common/rfb/EncodeManager.cxx | 117 ++++++++++++++--------------------- common/rfb/EncodeManager.h | 18 +++--- 2 files changed, 55 insertions(+), 80 deletions(-) diff --git a/common/rfb/EncodeManager.cxx b/common/rfb/EncodeManager.cxx index 5730352..5e94cdc 100644 --- a/common/rfb/EncodeManager.cxx +++ b/common/rfb/EncodeManager.cxx @@ -19,14 +19,7 @@ * USA. */ -#include -#include - -#include -#include -#include -#include - +#include #include #include @@ -50,6 +43,7 @@ #include #include #include +#include using namespace rfb; @@ -99,9 +93,9 @@ struct RectInfo { }; struct QualityInfo { - struct timeval lastUpdate; + struct timeval lastUpdate{}; Rect rect; - unsigned score; + unsigned score{}; }; }; @@ -216,7 +210,6 @@ EncodeManager::EncodeManager(SConnection* conn_, EncCache *encCache_) : conn(con dynamicQualityMin = Server::dynamicQualityMin; dynamicQualityOff = Server::dynamicQualityMax - Server::dynamicQualityMin; } - std::atomic webpTookTooLong{false}; } EncodeManager::~EncodeManager() @@ -887,13 +880,12 @@ void EncodeManager::findSolidRect(const Rect& rect, Region *changed, } } -void EncodeManager::checkWebpFallback(const struct timeval *start) { +void EncodeManager::checkWebpFallback(const timeval *start) { // Have we taken too long for the frame? If so, drop from WEBP to JPEG - if (start && activeEncoders[encoderFullColour] == encoderTightWEBP && !webpTookTooLong) { - unsigned us; - us = msSince(start) * 1024; + if (start && activeEncoders[encoderFullColour] == encoderTightWEBP && !webpTookTooLong.load(std::memory_order_relaxed)) { + const auto us = msSince(start) * 1024; if (us > webpFallbackUs) - webpTookTooLong = true; + webpTookTooLong.store(true, std::memory_order_relaxed); } } @@ -1128,20 +1120,13 @@ void EncodeManager::writeRects(const Region& changed, const PixelBuffer* pb, const bool mainScreen) { std::vector rects, subrects, scaledrects; - std::vector::const_iterator rect; std::vector encoderTypes; std::vector isWebp, fromCache; std::vector palettes; std::vector > compresseds; std::vector ms; - uint32_t i; - int num_threads = std::thread::hardware_concurrency(); - if (rfb::Server::rectThreads > 0) { - num_threads = rfb::Server::rectThreads; - } - - webpTookTooLong = false; + webpTookTooLong.store(false, std::memory_order_relaxed); changed.get_rects(&rects); // Update stats @@ -1156,18 +1141,18 @@ void EncodeManager::writeRects(const Region& changed, const PixelBuffer* pb, subrects.reserve(rects.size() * 1.5f); - for (rect = rects.begin(); rect != rects.end(); ++rect) { - int w, h, sw, sh; + for (const auto& rect : rects) { + int sw, sh; Rect sr; - w = rect->width(); - h = rect->height(); + const auto w = rect.width(); + const auto h = rect.height(); // No split necessary? if ((((w*h) < SubRectMaxArea) && (w < SubRectMaxWidth)) || (videoDetected && !encoders[encoderTightWEBP]->isSupported())) { - subrects.push_back(*rect); - trackRectQuality(*rect); + subrects.push_back(rect); + trackRectQuality(rect); continue; } @@ -1178,15 +1163,15 @@ void EncodeManager::writeRects(const Region& changed, const PixelBuffer* pb, sh = SubRectMaxArea / sw; - for (sr.tl.y = rect->tl.y; sr.tl.y < rect->br.y; sr.tl.y += sh) { + for (sr.tl.y = rect.tl.y; sr.tl.y < rect.br.y; sr.tl.y += sh) { sr.br.y = sr.tl.y + sh; - if (sr.br.y > rect->br.y) - sr.br.y = rect->br.y; + if (sr.br.y > rect.br.y) + sr.br.y = rect.br.y; - for (sr.tl.x = rect->tl.x; sr.tl.x < rect->br.x; sr.tl.x += sw) { + for (sr.tl.x = rect.tl.x; sr.tl.x < rect.br.x; sr.tl.x += sw) { sr.br.x = sr.tl.x + sw; - if (sr.br.x > rect->br.x) - sr.br.x = rect->br.x; + if (sr.br.x > rect.br.x) + sr.br.x = rect.br.x; subrects.push_back(sr); trackRectQuality(sr); @@ -1194,13 +1179,18 @@ void EncodeManager::writeRects(const Region& changed, const PixelBuffer* pb, } } - encoderTypes.resize(subrects.size()); - isWebp.resize(subrects.size()); - fromCache.resize(subrects.size()); - palettes.resize(subrects.size()); - compresseds.resize(subrects.size()); - scaledrects.resize(subrects.size()); - ms.resize(subrects.size()); + const size_t subrects_size = subrects.size(); + + std::vector indices(subrects_size); + std::iota(std::begin(indices), std::end(indices), 0); + + encoderTypes.resize(subrects_size); + isWebp.resize(subrects_size); + fromCache.resize(subrects_size); + palettes.resize(subrects_size); + compresseds.resize(subrects_size); + scaledrects.resize(subrects_size); + ms.resize(subrects_size); // In case the current resolution is above the max video res, and video was detected, // scale to that res, keeping aspect ratio @@ -1232,7 +1222,7 @@ void EncodeManager::writeRects(const Region& changed, const PixelBuffer* pb, break; } - for (i = 0; i < subrects.size(); ++i) { + for (uint32_t i = 0; i < subrects_size; ++i) { const Rect old = scaledrects[i] = subrects[i]; scaledrects[i].br.x *= diff; scaledrects[i].br.y *= diff; @@ -1257,30 +1247,15 @@ void EncodeManager::writeRects(const Region& changed, const PixelBuffer* pb, } scalingTime = msSince(&scalestart); - std::vector> futures; - futures.reserve(subrects.size()); - for (i = 0; i < subrects.size(); ++i) { - Rect subrect = subrects[i]; - const PixelBuffer* current_pb = pb; - uint8_t* current_encoderTypes = &encoderTypes[i]; - uint8_t* current_fromCache = &fromCache[i]; - const PixelBuffer* current_scaledpb = scaledpb; - Rect current_scaledrect = scaledrects[i]; - uint32_t* current_ms = &ms[i]; - const struct timeval* current_start = start; - auto task = [this, subrect, current_pb, &palettes, &compresseds, &isWebp, current_encoderTypes, current_fromCache, current_scaledpb, current_scaledrect, current_ms, current_start, i]() { - *current_encoderTypes = getEncoderType(subrect, current_pb, &palettes[i], compresseds[i], - &isWebp[i], current_fromCache, - current_scaledpb, current_scaledrect, *current_ms); - checkWebpFallback(current_start); - }; - futures.push_back(std::async(std::launch::async, task)); - } - for (auto& future : futures) { - future.get(); - } + std::for_each(std::execution::par_unseq, std::begin(indices), std::end(indices), [&](size_t i) + { + encoderTypes[i] = getEncoderType(subrects[i], pb, &palettes[i], compresseds[i], + &isWebp[i], &fromCache[i], + scaledpb, scaledrects[i], ms[i]); + checkWebpFallback(start); + }); - for (i = 0; i < subrects.size(); ++i) { + for (uint32_t i = 0; i < subrects_size; ++i) { if (encoderTypes[i] == encoderFullColour) { if (isWebp[i]) webpstats.ms += ms[i]; @@ -1292,7 +1267,7 @@ void EncodeManager::writeRects(const Region& changed, const PixelBuffer* pb, if (start) { encodingTime = msSince(start); - if (vlog.getLevel() >= vlog.LEVEL_DEBUG) { + if (vlog.getLevel() >= rfb::LogWriter::LEVEL_DEBUG) { framesSinceEncPrint++; if (maxEncodingTime < encodingTime) maxEncodingTime = encodingTime; @@ -1307,11 +1282,11 @@ void EncodeManager::writeRects(const Region& changed, const PixelBuffer* pb, } } - if (webpTookTooLong) + if (webpTookTooLong.load(std::memory_order_relaxed)) activeEncoders[encoderFullColour] = encoderTightJPEG; - for (i = 0; i < subrects.size(); ++i) { - if (encCache->enabled && compresseds[i].size() && !fromCache[i] && + for (uint32_t i = 0; i < subrects_size; ++i) { + if (encCache->enabled && !compresseds[i].empty() && !fromCache[i] && !encoders[encoderTightQOI]->isSupported()) { void *tmp = malloc(compresseds[i].size()); memcpy(tmp, &compresseds[i][0], compresseds[i].size()); diff --git a/common/rfb/EncodeManager.h b/common/rfb/EncodeManager.h index 7ff24bf..7844faa 100644 --- a/common/rfb/EncodeManager.h +++ b/common/rfb/EncodeManager.h @@ -29,7 +29,6 @@ #include #include #include -#include #include #include @@ -51,7 +50,7 @@ namespace rfb { class EncodeManager: public Timer::Callback { public: EncodeManager(SConnection* conn, EncCache *encCache); - ~EncodeManager(); + ~EncodeManager() override; void logStats(); @@ -73,10 +72,10 @@ namespace rfb { encodingTime = 0; }; - unsigned getEncodingTime() const { + [[nodiscard]] unsigned getEncodingTime() const { return encodingTime; }; - unsigned getScalingTime() const { + [[nodiscard]] unsigned getScalingTime() const { return scalingTime; }; @@ -125,7 +124,8 @@ namespace rfb { uint8_t *fromCache, const PixelBuffer *scaledpb, const Rect& scaledrect, uint32_t &ms) const; - virtual bool handleTimeout(Timer* t); + + bool handleTimeout(Timer* t) override; bool checkSolidTile(const Rect& r, const rdr::U8* colourValue, const PixelBuffer *pb); @@ -200,7 +200,7 @@ namespace rfb { size_t curMaxUpdateSize; unsigned webpFallbackUs; unsigned webpBenchResult; - std::atomic webpTookTooLong; + std::atomic webpTookTooLong{false}; unsigned encodingTime; unsigned maxEncodingTime, framesSinceEncPrint; unsigned scalingTime; @@ -209,14 +209,14 @@ namespace rfb { class OffsetPixelBuffer : public FullFramePixelBuffer { public: - OffsetPixelBuffer() {} - virtual ~OffsetPixelBuffer() {} + OffsetPixelBuffer() = default; + ~OffsetPixelBuffer() override = default; void update(const PixelFormat& pf, int width, int height, const rdr::U8* data_, int stride); private: - virtual rdr::U8* getBufferRW(const Rect& r, int* stride); + rdr::U8* getBufferRW(const Rect& r, int* stride) override; }; }; From 59792ee93c674a6dbddbf17531c2661a7e3c7afb Mon Sep 17 00:00:00 2001 From: El Date: Fri, 7 Mar 2025 01:05:32 +0500 Subject: [PATCH 03/12] KASM-6788 Updates CMake configuration to use C++20 standard --- CMakeLists.txt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1c3bded..96c566e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -74,13 +74,10 @@ set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} -UNDEBUG") # Make sure we get a sane C version set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99") +set(CMAKE_CXX_STANDARD 20) # Enable OpenMP set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp") - -# Enable C++ 11 -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11") # Tell the compiler to be stringent set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wformat=2") From f54ec77e440f7334af0506840f8e620eac3d0a26 Mon Sep 17 00:00:00 2001 From: El Date: Thu, 20 Mar 2025 05:51:18 +0500 Subject: [PATCH 04/12] KASM-6788 Specify C and CXX languages in the project() definition for better clarity and compatibility. Additionally, link the TBB library for builds using GCC versions earlier than 10 to address dependency requirements --- CMakeLists.txt | 2 +- common/rfb/CMakeLists.txt | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 96c566e..22f21dc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,7 +21,7 @@ include(CheckCSourceRuns) include(CMakeMacroLibtoolFile) -project(kasmvnc) +project(kasmvnc LANGUAGES C CXX) set(VERSION 0.9) # The RC version must always be four comma-separated numbers diff --git a/common/rfb/CMakeLists.txt b/common/rfb/CMakeLists.txt index 905e76e..88936bc 100644 --- a/common/rfb/CMakeLists.txt +++ b/common/rfb/CMakeLists.txt @@ -82,6 +82,12 @@ endif(WIN32) set(RFB_LIBRARIES ${JPEG_LIBRARIES} ${PNG_LIBRARIES} os rdr Xregion) +if (CMAKE_CXX_COMPILER_ID MATCHES "GNU") + if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10) + set(RFB_LIBRARIES ${RFB_LIBRARIES} tbb) + endif () +endif () + if(HAVE_PAM) set(RFB_SOURCES ${RFB_SOURCES} UnixPasswordValidator.cxx UnixPasswordValidator.h pam.c pam.h) From 4ea5f734ec4a36db1c16858759e1207ee92e0161 Mon Sep 17 00:00:00 2001 From: El Date: Thu, 20 Mar 2025 14:58:29 +0500 Subject: [PATCH 05/12] KASM-6788 Switch to gcc14-c++ on openSUSE and add libtbb-dev for Ubuntu Focal --- builder/dockerfile.opensuse_15.build | 4 +++- builder/dockerfile.ubuntu_focal.build | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/builder/dockerfile.opensuse_15.build b/builder/dockerfile.opensuse_15.build index db2f130..3d4cfe3 100644 --- a/builder/dockerfile.opensuse_15.build +++ b/builder/dockerfile.opensuse_15.build @@ -14,7 +14,7 @@ RUN zypper install -ny \ fonttosfnt \ font-util \ gcc \ - gcc-c++ \ + gcc14-c++ \ giflib-devel \ git \ gzip \ @@ -45,6 +45,8 @@ RUN zypper install -ny \ xorg-x11-util-devel \ zlib-devel +RUN update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++-14 100 + ENV SCRIPTS_DIR=/tmp/scripts COPY builder/scripts $SCRIPTS_DIR RUN $SCRIPTS_DIR/build-webp diff --git a/builder/dockerfile.ubuntu_focal.build b/builder/dockerfile.ubuntu_focal.build index c734715..1e356b0 100644 --- a/builder/dockerfile.ubuntu_focal.build +++ b/builder/dockerfile.ubuntu_focal.build @@ -13,7 +13,7 @@ RUN apt-get update && \ RUN apt-get update && apt-get install -y --no-install-recommends tzdata RUN apt-get update && apt-get -y build-dep xorg-server libxfont-dev RUN apt-get update && apt-get -y install cmake git vim wget curl -RUN apt-get update && apt-get -y install libpng-dev libtiff-dev libgif-dev libavcodec-dev libssl-dev libxrandr-dev libxcursor-dev +RUN apt-get update && apt-get -y install libtbb-dev libpng-dev libtiff-dev libgif-dev libavcodec-dev libssl-dev libxrandr-dev libxcursor-dev ENV SCRIPTS_DIR=/tmp/scripts COPY builder/scripts $SCRIPTS_DIR From b3f2dd1196dbd87f4ec07283b317b48e2d6fa4b5 Mon Sep 17 00:00:00 2001 From: El Date: Thu, 20 Mar 2025 18:46:33 +0500 Subject: [PATCH 06/12] KASM-6788 Update Dockerfiles to use GCC Toolset 14 and add libSM-devel --- builder/dockerfile.opensuse_15.build | 2 +- builder/dockerfile.oracle_8.build | 6 +++++- builder/dockerfile.oracle_9.build | 6 +++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/builder/dockerfile.opensuse_15.build b/builder/dockerfile.opensuse_15.build index 3d4cfe3..2a4b5ec 100644 --- a/builder/dockerfile.opensuse_15.build +++ b/builder/dockerfile.opensuse_15.build @@ -13,7 +13,7 @@ RUN zypper install -ny \ ffmpeg-4-libavcodec-devel \ fonttosfnt \ font-util \ - gcc \ + gcc14 \ gcc14-c++ \ giflib-devel \ git \ diff --git a/builder/dockerfile.oracle_8.build b/builder/dockerfile.oracle_8.build index 4a98a19..4aa7e5b 100644 --- a/builder/dockerfile.oracle_8.build +++ b/builder/dockerfile.oracle_8.build @@ -15,6 +15,7 @@ RUN \ dnf-plugins-core \ gcc \ gcc-c++ \ + gcc-toolset-14 \ git \ gnutls-devel \ libjpeg-turbo-devel \ @@ -48,7 +49,10 @@ RUN dnf install -y \ xorg-x11-xtrans-devel \ libXrandr-devel \ libXtst-devel \ - libXcursor-devel + libXcursor-devel \ + libSM-devel + +RUN scl enable gcc-toolset-14 bash ENV SCRIPTS_DIR=/tmp/scripts COPY builder/scripts $SCRIPTS_DIR diff --git a/builder/dockerfile.oracle_9.build b/builder/dockerfile.oracle_9.build index ca94b69..41f5830 100644 --- a/builder/dockerfile.oracle_9.build +++ b/builder/dockerfile.oracle_9.build @@ -15,6 +15,7 @@ RUN \ dnf-plugins-core \ gcc \ gcc-c++ \ + gcc-toolset-14 \ git \ gnutls-devel \ libjpeg-turbo-devel \ @@ -47,7 +48,10 @@ RUN dnf install -y \ xorg-x11-xtrans-devel \ libXrandr-devel \ libXtst-devel \ - libXcursor-devel + libXcursor-devel \ + libSM-devel + +RUN scl enable gcc-toolset-14 bash ENV SCRIPTS_DIR=/tmp/scripts From aa40f59af52d6b9e21788e3670e7607ffc302574 Mon Sep 17 00:00:00 2001 From: El Date: Sat, 22 Mar 2025 23:22:16 +0500 Subject: [PATCH 07/12] KASM-6788 Add TBB dependency for EL8 platform and older GCC versions --- common/rfb/CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/common/rfb/CMakeLists.txt b/common/rfb/CMakeLists.txt index 88936bc..70217fe 100644 --- a/common/rfb/CMakeLists.txt +++ b/common/rfb/CMakeLists.txt @@ -82,10 +82,10 @@ endif(WIN32) set(RFB_LIBRARIES ${JPEG_LIBRARIES} ${PNG_LIBRARIES} os rdr Xregion) -if (CMAKE_CXX_COMPILER_ID MATCHES "GNU") - if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10) - set(RFB_LIBRARIES ${RFB_LIBRARIES} tbb) - endif () +cmake_host_system_information(RESULT DISTRO QUERY DISTRIB_INFO) +if ((CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10) OR +(DISTRO_PLATFORM_ID MATCHES "platform:el8")) + set(RFB_LIBRARIES ${RFB_LIBRARIES} tbb) endif () if(HAVE_PAM) From 7eddf5fd65b3cc48a165258117f0a1139bbacd09 Mon Sep 17 00:00:00 2001 From: El Date: Sun, 23 Mar 2025 15:11:24 +0500 Subject: [PATCH 08/12] KASM-6788 Update Dockerfile to install CMake from source --- builder/dockerfile.debian_bullseye.build | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/builder/dockerfile.debian_bullseye.build b/builder/dockerfile.debian_bullseye.build index f626bb7..077a2e5 100644 --- a/builder/dockerfile.debian_bullseye.build +++ b/builder/dockerfile.debian_bullseye.build @@ -12,9 +12,22 @@ RUN apt-get update && \ RUN DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends tzdata RUN apt-get update && apt-get -y build-dep xorg-server libxfont-dev -RUN apt-get update && apt-get -y install cmake git libgnutls28-dev vim wget tightvncserver curl +RUN apt-get update && apt-get -y install git libgnutls28-dev vim wget tightvncserver curl RUN apt-get update && apt-get -y install libpng-dev libtiff-dev libgif-dev libavcodec-dev libssl-dev libxrandr-dev libxcursor-dev +RUN CMAKE_URL="https://cmake.org/files/v3.22/cmake-3.22.0" && \ + ARCH=$(arch) && \ + if [ "$ARCH" = "x86_64" ]; then \ + CMAKE_URL="${CMAKE_URL}-linux-x86_64.sh"; \ + elif [ "$ARCH" = "aarch64" ]; then \ + CMAKE_URL="${CMAKE_URL}-linux-aarch64.sh"; \ + else \ + echo "Unsupported architecture: $ARCH" && exit 1; \ + fi && \ + curl -fsSL $CMAKE_URL -o cmake.sh && \ + (echo y; echo n) | bash cmake.sh --prefix=/usr/local --skip-license && \ + rm cmake.sh + ENV SCRIPTS_DIR=/tmp/scripts COPY builder/scripts $SCRIPTS_DIR RUN $SCRIPTS_DIR/build-webp From 130c7fef9346826f0ec608f5b3aeb18f3a9f733a Mon Sep 17 00:00:00 2001 From: El Date: Sun, 23 Mar 2025 15:44:20 +0500 Subject: [PATCH 09/12] KASM-6788 Update Dockerfile to install CMake from source --- builder/dockerfile.opensuse_15.build | 13 +++++++++++++ builder/dockerfile.ubuntu_focal.build | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/builder/dockerfile.opensuse_15.build b/builder/dockerfile.opensuse_15.build index 2a4b5ec..4bbb558 100644 --- a/builder/dockerfile.opensuse_15.build +++ b/builder/dockerfile.opensuse_15.build @@ -56,6 +56,19 @@ RUN useradd -u 1000 docker && \ groupadd -g 1000 docker && \ usermod -a -G docker docker +RUN ARCH=$(arch) && \ + CMAKE_URL="https://cmake.org/files/v3.22/cmake-3.22.0" && \ + if [ "$ARCH" = "x86_64" ]; then \ + CMAKE_URL="${CMAKE_URL}-linux-x86_64.sh"; \ + elif [ "$ARCH" = "aarch64" ]; then \ + CMAKE_URL="${CMAKE_URL}-linux-aarch64.sh"; \ + else \ + echo "Unsupported architecture: $ARCH" && exit 1; \ + fi && \ + curl -fsSL $CMAKE_URL -o cmake.sh && \ + (echo y; echo n) | bash cmake.sh --prefix=/usr/local --skip-license && \ + rm cmake.sh + COPY --chown=docker:docker . /src/ diff --git a/builder/dockerfile.ubuntu_focal.build b/builder/dockerfile.ubuntu_focal.build index 1e356b0..bdfad4c 100644 --- a/builder/dockerfile.ubuntu_focal.build +++ b/builder/dockerfile.ubuntu_focal.build @@ -22,6 +22,19 @@ RUN $SCRIPTS_DIR/build-libjpeg-turbo RUN useradd -m docker && echo "docker:docker" | chpasswd && adduser docker sudo +RUN ARCH=$(arch) && \ + CMAKE_URL="https://cmake.org/files/v3.22/cmake-3.22.0" && \ + if [ "$ARCH" = "x86_64" ]; then \ + CMAKE_URL="${CMAKE_URL}-linux-x86_64.sh"; \ + elif [ "$ARCH" = "aarch64" ]; then \ + CMAKE_URL="${CMAKE_URL}-linux-aarch64.sh"; \ + else \ + echo "Unsupported architecture: $ARCH" && exit 1; \ + fi && \ + curl -fsSL $CMAKE_URL -o cmake.sh && \ + (echo y; echo n) | bash cmake.sh --prefix=/usr/local --skip-license && \ + rm cmake.sh + COPY --chown=docker:docker . /src/ USER docker From 4284f8f8a6937b6813c5920a7cf22e0e28f4a4fe Mon Sep 17 00:00:00 2001 From: El Date: Sun, 23 Mar 2025 16:37:28 +0500 Subject: [PATCH 10/12] KASM-6788 Refactor Dockerfile to streamline build process --- builder/dockerfile.oracle_8.build | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/builder/dockerfile.oracle_8.build b/builder/dockerfile.oracle_8.build index 4aa7e5b..f28c1df 100644 --- a/builder/dockerfile.oracle_8.build +++ b/builder/dockerfile.oracle_8.build @@ -39,6 +39,7 @@ RUN dnf install -y --nogpgcheck https://mirrors.rpmfusion.org/free/el/rpmfusion- # Install from new repos RUN dnf install -y \ + tbb-devel \ ffmpeg-devel \ giflib-devel \ lbzip2 \ @@ -52,16 +53,13 @@ RUN dnf install -y \ libXcursor-devel \ libSM-devel -RUN scl enable gcc-toolset-14 bash - ENV SCRIPTS_DIR=/tmp/scripts COPY builder/scripts $SCRIPTS_DIR -RUN $SCRIPTS_DIR/build-webp -RUN $SCRIPTS_DIR/build-libjpeg-turbo - -RUN useradd -m docker && echo "docker:docker" | chpasswd +RUN echo "source /opt/rh/gcc-toolset-14/enable" > /etc/profile.d/gcc-toolset.sh && \ + $SCRIPTS_DIR/build-webp && $SCRIPTS_DIR/build-libjpeg-turbo && \ + useradd -m docker && echo "docker:docker" | chpasswd COPY --chown=docker:docker . /src/ USER docker -ENTRYPOINT ["/src/builder/build.sh"] +ENTRYPOINT ["bash", "-l", "-c", "/src/builder/build.sh"] From 4091cc3ae6e83b3b6b6175b3962be8c802c8e65d Mon Sep 17 00:00:00 2001 From: El Date: Sun, 23 Mar 2025 19:24:59 +0500 Subject: [PATCH 11/12] KASM-6788 Refactor Dockerfile to streamline build process --- builder/dockerfile.ubuntu_focal.deb.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/builder/dockerfile.ubuntu_focal.deb.build b/builder/dockerfile.ubuntu_focal.deb.build index 8a4db12..ffe6402 100644 --- a/builder/dockerfile.ubuntu_focal.deb.build +++ b/builder/dockerfile.ubuntu_focal.deb.build @@ -3,7 +3,7 @@ FROM ubuntu:focal ENV DEBIAN_FRONTEND noninteractive RUN apt-get update && \ - apt-get -y install vim build-essential devscripts equivs + apt-get -y install vim build-essential devscripts equivs libtbb-dev # Install build-deps for the package. COPY ./debian/control /tmp From 90c38a0da8ac5ce861ee3fec639996e723417e12 Mon Sep 17 00:00:00 2001 From: El Date: Mon, 24 Mar 2025 16:07:18 +0500 Subject: [PATCH 12/12] KASM-6788 Refactor Dockerfile to streamline build process --- builder/dockerfile.opensuse_15.build | 12 +++++------- builder/dockerfile.oracle_9.build | 12 ++++-------- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/builder/dockerfile.opensuse_15.build b/builder/dockerfile.opensuse_15.build index 4bbb558..954ada8 100644 --- a/builder/dockerfile.opensuse_15.build +++ b/builder/dockerfile.opensuse_15.build @@ -47,11 +47,6 @@ RUN zypper install -ny \ RUN update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++-14 100 -ENV SCRIPTS_DIR=/tmp/scripts -COPY builder/scripts $SCRIPTS_DIR -RUN $SCRIPTS_DIR/build-webp -RUN $SCRIPTS_DIR/build-libjpeg-turbo - RUN useradd -u 1000 docker && \ groupadd -g 1000 docker && \ usermod -a -G docker docker @@ -69,8 +64,11 @@ RUN ARCH=$(arch) && \ (echo y; echo n) | bash cmake.sh --prefix=/usr/local --skip-license && \ rm cmake.sh +ENV SCRIPTS_DIR=/tmp/scripts +COPY builder/scripts $SCRIPTS_DIR +RUN $SCRIPTS_DIR/build-webp && $SCRIPTS_DIR/build-libjpeg-turbo + COPY --chown=docker:docker . /src/ - USER docker -ENTRYPOINT ["/src/builder/build.sh"] +ENTRYPOINT ["bash", "-l", "-c", "/src/builder/build.sh"] diff --git a/builder/dockerfile.oracle_9.build b/builder/dockerfile.oracle_9.build index 41f5830..ca6e705 100644 --- a/builder/dockerfile.oracle_9.build +++ b/builder/dockerfile.oracle_9.build @@ -51,17 +51,13 @@ RUN dnf install -y \ libXcursor-devel \ libSM-devel -RUN scl enable gcc-toolset-14 bash - - ENV SCRIPTS_DIR=/tmp/scripts COPY builder/scripts $SCRIPTS_DIR -RUN $SCRIPTS_DIR/build-webp -RUN $SCRIPTS_DIR/build-libjpeg-turbo - -RUN useradd -m docker && echo "docker:docker" | chpasswd +RUN echo "source /opt/rh/gcc-toolset-14/enable" > /etc/profile.d/gcc-toolset.sh && \ + $SCRIPTS_DIR/build-webp && $SCRIPTS_DIR/build-libjpeg-turbo && \ + useradd -m docker && echo "docker:docker" | chpasswd COPY --chown=docker:docker . /src/ USER docker -ENTRYPOINT ["/src/builder/build.sh"] +ENTRYPOINT ["bash", "-l", "-c", "/src/builder/build.sh"]