From 64ae8ff6da7b1c9a388f6f2806708ab8c39459d1 Mon Sep 17 00:00:00 2001 From: liberodark Date: Sat, 9 May 2026 01:31:08 +0200 Subject: [PATCH] bambu-studio: 02.05.00.67 -> 02.08.00.50 --- pkgs/by-name/ba/bambu-studio/package.nix | 37 ++- .../dont-link-opencv-world-bambu.patch | 8 +- .../ba/bambu-studio/patches/no-cereal.patch | 32 +-- .../patches/no-device-web-node-download.patch | 235 ++++++++++++++++++ 4 files changed, 284 insertions(+), 28 deletions(-) create mode 100644 pkgs/by-name/ba/bambu-studio/patches/no-device-web-node-download.patch diff --git a/pkgs/by-name/ba/bambu-studio/package.nix b/pkgs/by-name/ba/bambu-studio/package.nix index de5cdb840016..a1ecd28f0552 100644 --- a/pkgs/by-name/ba/bambu-studio/package.nix +++ b/pkgs/by-name/ba/bambu-studio/package.nix @@ -6,6 +6,7 @@ ninja, pkg-config, wrapGAppsHook3, + assimp, boost183, cacert, cereal, @@ -27,6 +28,7 @@ libpng, libsecret, makeFontsConf, + libnoise, mpfr, nanum, nlopt, @@ -39,6 +41,7 @@ webkitgtk_4_1, wxwidgets_3_1, libx11, + libharu, withSystemd ? stdenv.hostPlatform.isLinux, # 3D viewport blank on NVIDIA proprietary GL; routes through Mesa + zink. # https://github.com/NixOS/nixpkgs/issues/498311 @@ -66,13 +69,13 @@ let in stdenv.mkDerivation (finalAttrs: { pname = "bambu-studio"; - version = "02.05.00.67"; + version = "02.08.00.50"; src = fetchFromGitHub { owner = "bambulab"; repo = "BambuStudio"; tag = "v${finalAttrs.version}"; - hash = "sha256-jLaSUs6OmoD0yw1hOcJarYKfr1rbhB2TwRiBBU0utEI="; + hash = "sha256-zIizozfZkaXo5wymuBFBCUu/lu+FyYTpa4+3SoC2x7k="; }; nativeBuildInputs = [ @@ -83,6 +86,7 @@ stdenv.mkDerivation (finalAttrs: { ]; buildInputs = [ + assimp boost183 cereal cgal_5 @@ -104,6 +108,7 @@ stdenv.mkDerivation (finalAttrs: { hicolor-icon-theme libpng libsecret + libnoise mpfr nlopt opencascade-occt_7_6 @@ -113,6 +118,7 @@ stdenv.mkDerivation (finalAttrs: { webkitgtk_4_1 wxGTK' libx11 + libharu opencv ] ++ lib.optionals withSystemd [ systemd ] @@ -129,8 +135,25 @@ stdenv.mkDerivation (finalAttrs: { ./patches/no-cereal.patch # Cmake 4 support ./patches/cmake.patch + # Disable nodejs + ./patches/no-device-web-node-download.patch ]; + postPatch = + # Since version 2.5.0 of nlopt we need to link to libnlopt, as libnlopt_cxx + # now seems to be integrated into the main lib. + '' + substituteInPlace cmake/modules/FindNLopt.cmake \ + --replace-fail "nlopt_cxx" "nlopt" + '' + # Fix libharu include + + '' + substituteInPlace src/slic3r/GUI/Overview/AssemblyStepsUtils.cpp \ + --replace-fail \ + "#include " \ + "#include " + ''; + doCheck = true; checkInputs = [ gtest ]; @@ -156,13 +179,6 @@ stdenv.mkDerivation (finalAttrs: { NIX_LDFLAGS = lib.optionalString withSystemd "-ludev" + " -L${opencv}/lib -lopencv_imgcodecs"; }; - # TODO: macOS - prePatch = '' - # Since version 2.5.0 of nlopt we need to link to libnlopt, as libnlopt_cxx - # now seems to be integrated into the main lib. - sed -i 's|nlopt_cxx|nlopt|g' cmake/modules/FindNLopt.cmake - ''; - cmakeFlags = [ (lib.cmakeBool "SLIC3R_STATIC" false) (lib.cmakeBool "SLIC3R_FHS" true) @@ -177,6 +193,9 @@ stdenv.mkDerivation (finalAttrs: { (lib.cmakeBool "DEP_WX_GTK3" true) (lib.cmakeBool "SLIC3R_BUILD_TESTS" false) (lib.cmakeFeature "CMAKE_CXX_FLAGS" "-DBOOST_LOG_DYN_LINK") + + (lib.cmakeFeature "LIBNOISE_INCLUDE_DIR" "${lib.getInclude libnoise}/include/noise") + (lib.cmakeFeature "LIBNOISE_LIBRARY" "${lib.getLib libnoise}/lib/libnoise-static.a") ]; preFixup = '' diff --git a/pkgs/by-name/ba/bambu-studio/patches/dont-link-opencv-world-bambu.patch b/pkgs/by-name/ba/bambu-studio/patches/dont-link-opencv-world-bambu.patch index cb7e212144ac..39325d7bfbf1 100644 --- a/pkgs/by-name/ba/bambu-studio/patches/dont-link-opencv-world-bambu.patch +++ b/pkgs/by-name/ba/bambu-studio/patches/dont-link-opencv-world-bambu.patch @@ -1,14 +1,14 @@ diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt -index 2cdc525..44e6602 100644 +index 2315928..55a2f1b 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt -@@ -533,7 +533,8 @@ target_link_libraries(libslic3r +@@ -627,7 +627,8 @@ target_link_libraries(libslic3r ${OCCT_LIBS} Clipper2 mcut - opencv_world + opencv_core + opencv_imgproc + ${_cgal_tgt} + assimp::assimp ) - - if(NOT WIN32) \ No newline at end of file diff --git a/pkgs/by-name/ba/bambu-studio/patches/no-cereal.patch b/pkgs/by-name/ba/bambu-studio/patches/no-cereal.patch index b1c591a58d0e..38cd16047b52 100644 --- a/pkgs/by-name/ba/bambu-studio/patches/no-cereal.patch +++ b/pkgs/by-name/ba/bambu-studio/patches/no-cereal.patch @@ -1,22 +1,22 @@ diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt -index 0b4b9a8..8c22f60 100644 +index 1f12e26..ffd7888 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt -@@ -125,7 +125,7 @@ if (NOT WIN32 AND NOT APPLE) +@@ -128,7 +128,7 @@ if (NOT WIN32 AND NOT APPLE) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/platform/unix/BuildLinuxImage.sh.in ${CMAKE_CURRENT_BINARY_DIR}/BuildLinuxImage.sh @ONLY) endif () - + -target_link_libraries(BambuStudio libslic3r cereal) +target_link_libraries(BambuStudio libslic3r) if (APPLE) # add_compile_options(-stdlib=libc++) # add_definitions(-DBOOST_THREAD_DONT_USE_CHRONO -DBOOST_NO_CXX11_RVALUE_REFERENCES -DBOOST_THREAD_USES_MOVE) diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt -index 4481362..7d41af3 100644 +index 2315928..f89b770 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt -@@ -574,7 +574,6 @@ set(OCCT_LIBS - target_link_libraries(libslic3r +@@ -608,7 +608,6 @@ target_link_libraries(libslic3r + noise::noise libnest2d admesh - cereal @@ -24,17 +24,19 @@ index 4481362..7d41af3 100644 miniz boost_libs diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt -index 0a852a4..2da0533 100644 +index 63671a0..0b77a9f 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt -@@ -671,8 +671,8 @@ source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${SLIC3R_GUI_SOURCES}) - - encoding_check(libslic3r_gui) - --target_link_libraries(libslic3r_gui libslic3r cereal imgui imguizmo minilzo GLEW::GLEW OpenGL::GL hidapi ${wxWidgets_LIBRARIES} glfw libcurl OpenSSL::SSL OpenSSL::Crypto) +@@ -743,10 +743,10 @@ else () + find_library(HPDF_LIBRARY NAMES hpdf) + endif () + +-target_link_libraries(libslic3r_gui libslic3r cereal imgui imguizmo minilzo GLEW::GLEW OpenGL::GL hidapi ++target_link_libraries(libslic3r_gui libslic3r imgui imguizmo minilzo GLEW::GLEW OpenGL::GL hidapi + ${HPDF_LIBRARY} + ${wxWidgets_LIBRARIES} glfw libcurl OpenSSL::SSL OpenSSL::Crypto) -#target_link_libraries(libslic3r_gui libslic3r cereal imgui imguizmo minilzo GLEW::GLEW OpenGL::GL hidapi libcurl OpenSSL::SSL OpenSSL::Crypto ${wxWidgets_LIBRARIES} glfw) -+target_link_libraries(libslic3r_gui libslic3r imgui imguizmo minilzo GLEW::GLEW OpenGL::GL hidapi ${wxWidgets_LIBRARIES} glfw libcurl OpenSSL::SSL OpenSSL::Crypto) +#target_link_libraries(libslic3r_gui libslic3r imgui imguizmo minilzo GLEW::GLEW OpenGL::GL hidapi libcurl OpenSSL::SSL OpenSSL::Crypto ${wxWidgets_LIBRARIES} glfw) - + if (MSVC) - target_link_libraries(libslic3r_gui Setupapi.lib) + target_link_libraries(libslic3r_gui Setupapi.lib dwmapi.lib) \ No newline at end of file diff --git a/pkgs/by-name/ba/bambu-studio/patches/no-device-web-node-download.patch b/pkgs/by-name/ba/bambu-studio/patches/no-device-web-node-download.patch new file mode 100644 index 000000000000..78c2976b0125 --- /dev/null +++ b/pkgs/by-name/ba/bambu-studio/patches/no-device-web-node-download.patch @@ -0,0 +1,235 @@ +diff --git a/src/slic3r/GUI/DeviceWeb/CMakeLists.txt b/src/slic3r/GUI/DeviceWeb/CMakeLists.txt +index bb65ab0..06684d4 100644 +--- a/src/slic3r/GUI/DeviceWeb/CMakeLists.txt ++++ b/src/slic3r/GUI/DeviceWeb/CMakeLists.txt +@@ -3,225 +3,11 @@ + # date -- 2025.01.01 + # status -- Building + +-# ==================== Node.js/pnpm 环境准备(仅用于 deviceweb 构建)==================== +- +-function(prepare_node_env) +- # 定义版本号 +- set(NODE_VERSION "22.22.2") +- set(PNPM_VERSION "10.12.1") +- +- # 定义本地缓存目录(放在项目同级目录,clean build 后不会丢失) +- set(NODE_CACHE_DIR "${CMAKE_SOURCE_DIR}/../node-cache") +- +- # 根据平台确定下载 URL、文件名和 hash 值 +- if(WIN32) +- set(NODE_URL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-win-x64.zip") +- set(NODE_ARCHIVE_NAME "node-v${NODE_VERSION}-win-x64.zip") +- set(NODE_BIN_DIR "node-v${NODE_VERSION}-win-x64") +- set(NODE_EXEC "node.exe") +- set(NODE_HASH "7c93e9d92bf68c07182b471aa187e35ee6cd08ef0f24ab060dfff605fcc1c57c") +- set(PNPM_URL "https://github.com/pnpm/pnpm/releases/download/v${PNPM_VERSION}/pnpm-win-x64.exe") +- set(PNPM_EXEC_NAME "pnpm.exe") +- set(PNPM_HASH "9b802759436b3bccfe0a78cb0b86e937ac44902ec16597260f59d5394602f092") +- elseif(APPLE) +- if(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") +- set(NODE_URL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-darwin-arm64.tar.gz") +- set(NODE_ARCHIVE_NAME "node-v${NODE_VERSION}-darwin-arm64.tar.gz") +- set(NODE_BIN_DIR "node-v${NODE_VERSION}-darwin-arm64/bin") +- set(NODE_HASH "db4b275b83736df67533529a18cc55de2549a8329ace6c7bcc68f8d22d3c9000") +- +- set(PNPM_URL "https://github.com/pnpm/pnpm/releases/download/v${PNPM_VERSION}/pnpm-macos-arm64") +- set(PNPM_HASH "8b39b2129a19eeec9511eb7cdde2450b604e389551d59ad738167f7495b56d52") +- else() +- set(NODE_URL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-darwin-x64.tar.gz") +- set(NODE_ARCHIVE_NAME "node-v${NODE_VERSION}-darwin-x64.tar.gz") +- set(NODE_BIN_DIR "node-v${NODE_VERSION}-darwin-x64/bin") +- set(NODE_HASH "12a6abb9c2902cf48a21120da13f87fde1ed1b71a13330712949e8db818708ba") +- +- set(PNPM_URL "https://github.com/pnpm/pnpm/releases/download/v${PNPM_VERSION}/pnpm-macos-x64") +- set(PNPM_HASH "4c78e34022bfecfae60c041148a8022858b80b50e3b31c8fa8ba7b2b6259dd4a") +- endif() +- set(NODE_EXEC "node") +- set(PNPM_EXEC_NAME "pnpm") +- else() +- set(NODE_URL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.xz") +- set(NODE_ARCHIVE_NAME "node-v${NODE_VERSION}-linux-x64.tar.xz") +- set(NODE_BIN_DIR "node-v${NODE_VERSION}-linux-x64/bin") +- set(NODE_EXEC "node") +- set(NODE_HASH "88fd1ce767091fd8d4a99fdb2356e98c819f93f3b1f8663853a2dee9b438068a") +- +- set(PNPM_URL "https://github.com/pnpm/pnpm/releases/download/v${PNPM_VERSION}/pnpm-linux-x64") +- set(PNPM_EXEC_NAME "pnpm") +- set(PNPM_HASH "eb2dc1f109bca046ce734d062c8dd8f34db2b58a115992f9b086456efd7b2305") +- endif() +- +- # 定义最终的可执行文件路径 +- set(NODE_EXECUTABLE "${NODE_CACHE_DIR}/${NODE_BIN_DIR}/${NODE_EXEC}") +- # pnpm 放到 node 同目录,这样执行 pnpm 时 PATH 中天然能找到 node +- set(PNPM_EXECUTABLE "${NODE_CACHE_DIR}/${NODE_BIN_DIR}/${PNPM_EXEC_NAME}") +- +- # ============ Node.js 下载 + 解压 ============ +- if(NOT EXISTS "${NODE_EXECUTABLE}") +- message(STATUS "Downloading Node.js v${NODE_VERSION} from ${NODE_URL}") +- file(MAKE_DIRECTORY "${NODE_CACHE_DIR}") +- +- file(DOWNLOAD +- ${NODE_URL} +- "${NODE_CACHE_DIR}/${NODE_ARCHIVE_NAME}" +- SHOW_PROGRESS +- STATUS node_dl_status +- EXPECTED_HASH SHA256=${NODE_HASH} +- TLS_VERIFY OFF +- ) +- list(GET node_dl_status 0 node_dl_code) +- list(GET node_dl_status 1 node_dl_msg) +- if(NOT node_dl_code EQUAL 0) +- file(REMOVE "${NODE_CACHE_DIR}/${NODE_ARCHIVE_NAME}") +- message(FATAL_ERROR "Failed to download Node.js: ${node_dl_msg}") +- endif() +- +- message(STATUS "Extracting Node.js...") +- if(WIN32) +- execute_process( +- COMMAND powershell -NoProfile -Command +- "Expand-Archive -Path '${NODE_CACHE_DIR}/${NODE_ARCHIVE_NAME}' -DestinationPath '${NODE_CACHE_DIR}' -Force" +- WORKING_DIRECTORY "${NODE_CACHE_DIR}" +- RESULT_VARIABLE extract_result +- OUTPUT_VARIABLE extract_output +- ERROR_VARIABLE extract_error +- ) +- else() +- execute_process( +- COMMAND tar -xf "${NODE_ARCHIVE_NAME}" +- WORKING_DIRECTORY "${NODE_CACHE_DIR}" +- RESULT_VARIABLE extract_result +- OUTPUT_VARIABLE extract_output +- ERROR_VARIABLE extract_error +- ) +- endif() +- +- if(NOT extract_result EQUAL 0) +- message(FATAL_ERROR "Failed to extract Node.js archive: ${extract_error}") +- endif() +- +- # 清理压缩包(节省空间) +- file(REMOVE "${NODE_CACHE_DIR}/${NODE_ARCHIVE_NAME}") +- +- if(NOT EXISTS "${NODE_EXECUTABLE}") +- message(FATAL_ERROR "Node.js extraction finished but executable not found: ${NODE_EXECUTABLE}") +- endif() +- +- message(STATUS "Node.js extracted to: ${NODE_EXECUTABLE}") +- else() +- message(STATUS "Found cached Node.js: ${NODE_EXECUTABLE}") +- endif() +- +- # ============ pnpm 独立二进制下载 ============ +- if(NOT EXISTS "${PNPM_EXECUTABLE}") +- message(STATUS "Downloading pnpm v${PNPM_VERSION} from ${PNPM_URL}") +- +- file(DOWNLOAD +- ${PNPM_URL} +- "${PNPM_EXECUTABLE}" +- SHOW_PROGRESS +- STATUS pnpm_dl_status +- EXPECTED_HASH SHA256=${PNPM_HASH} +- TLS_VERIFY OFF +- ) +- list(GET pnpm_dl_status 0 pnpm_dl_code) +- list(GET pnpm_dl_status 1 pnpm_dl_msg) +- if(NOT pnpm_dl_code EQUAL 0) +- file(REMOVE "${PNPM_EXECUTABLE}") +- message(FATAL_ERROR "Failed to download pnpm: ${pnpm_dl_msg}") +- endif() +- +- if(NOT WIN32) +- execute_process( +- COMMAND chmod +x "${PNPM_EXECUTABLE}" +- RESULT_VARIABLE chmod_result +- ERROR_VARIABLE chmod_error +- ) +- if(NOT chmod_result EQUAL 0) +- message(FATAL_ERROR "Failed to chmod +x pnpm: ${chmod_error}") +- endif() +- endif() +- +- message(STATUS "pnpm installed: ${PNPM_EXECUTABLE}") +- else() +- message(STATUS "Found cached pnpm: ${PNPM_EXECUTABLE}") +- endif() +- +- # 设置输出变量(使用绝对路径) +- set(NODE_EXECUTABLE "${NODE_EXECUTABLE}" PARENT_SCOPE) +- set(PNPM_EXECUTABLE "${PNPM_EXECUTABLE}" PARENT_SCOPE) +-endfunction() +- +-# 执行环境准备(在 config 阶段执行) +-prepare_node_env() +- +-# ==================== 前端工程构建 ==================== +- +-set(DEVICE_PAGE_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/device_page") +-set(DEVICE_PAGE_DIST_DIR "${DEVICE_PAGE_SRC_DIR}/dist") +-set(DEVICE_PAGE_TARGET_DIR "${CMAKE_SOURCE_DIR}/resources/web/device_page/dist") +- +-get_filename_component(NODE_BIN_PATH "${NODE_EXECUTABLE}" DIRECTORY) +- +-if(WIN32) +- # 原本PATH末尾的\会影响后续的分隔符,需要处理 +- set(DEVICE_PAGE_PATH_UNESCAPED "${NODE_BIN_PATH};$ENV{PATH}") +- string(REPLACE "\;" ";" DEVICE_PAGE_PATH "${DEVICE_PAGE_PATH_UNESCAPED}") +-else() +- # Unix PATH 分隔符是 : +- set(DEVICE_PAGE_PATH "${NODE_BIN_PATH}:$ENV{PATH}") +-endif() +- +-set(PNPM_STORE_DIR "${CMAKE_CURRENT_BINARY_DIR}/.pnpm-store") +-file(MAKE_DIRECTORY "${PNPM_STORE_DIR}") +- +-set(DEVICE_PAGE_BUILD_STAMP "${CMAKE_CURRENT_BINARY_DIR}/device_page.stamp") +- +-file(GLOB_RECURSE DEVICE_PAGE_SRC_FILES CONFIGURE_DEPENDS +- "${DEVICE_PAGE_SRC_DIR}/src/*" +-) +-file(GLOB_RECURSE DEVICE_PAGE_LOCALE_FILES CONFIGURE_DEPENDS +- "${DEVICE_PAGE_SRC_DIR}/locales/*" +-) +-file(GLOB_RECURSE DEVICE_PAGE_PUBLIC_FILES CONFIGURE_DEPENDS +- "${DEVICE_PAGE_SRC_DIR}/public/*" +-) +- +-set(DEVICE_PAGE_BUILD_INPUTS +- ${DEVICE_PAGE_SRC_FILES} +- ${DEVICE_PAGE_LOCALE_FILES} +- ${DEVICE_PAGE_PUBLIC_FILES} +- "${DEVICE_PAGE_SRC_DIR}/index.html" +- "${DEVICE_PAGE_SRC_DIR}/package.json" +- "${DEVICE_PAGE_SRC_DIR}/pnpm-lock.yaml" +- "${DEVICE_PAGE_SRC_DIR}/vite.config.ts" +- "${DEVICE_PAGE_SRC_DIR}/tsconfig.json" +- "${DEVICE_PAGE_SRC_DIR}/tsconfig.app.json" +- "${DEVICE_PAGE_SRC_DIR}/tsconfig.node.json" +- "${DEVICE_PAGE_SRC_DIR}/eslint.config.js" +- "${DEVICE_PAGE_SRC_DIR}/i18next-parser.config.js" +-) +- +-add_custom_command( +- OUTPUT "${DEVICE_PAGE_BUILD_STAMP}" +- COMMAND ${CMAKE_COMMAND} -E env "PATH=${DEVICE_PAGE_PATH}" "PNPM_STORE_DIR=${PNPM_STORE_DIR}" ${PNPM_EXECUTABLE} install +- COMMAND ${CMAKE_COMMAND} -E env "PATH=${DEVICE_PAGE_PATH}" "PNPM_STORE_DIR=${PNPM_STORE_DIR}" ${PNPM_EXECUTABLE} run build +- COMMAND ${CMAKE_COMMAND} -E remove_directory "${DEVICE_PAGE_TARGET_DIR}" +- COMMAND ${CMAKE_COMMAND} -E make_directory "${DEVICE_PAGE_TARGET_DIR}" +- COMMAND ${CMAKE_COMMAND} -E copy_directory "${DEVICE_PAGE_DIST_DIR}" "${DEVICE_PAGE_TARGET_DIR}" +- COMMAND ${CMAKE_COMMAND} -E touch "${DEVICE_PAGE_BUILD_STAMP}" +- DEPENDS ${DEVICE_PAGE_BUILD_INPUTS} +- WORKING_DIRECTORY ${DEVICE_PAGE_SRC_DIR} +- COMMENT "Building device_page web bundle when sources change..." +- VERBATIM +-) +- +-# Not ALL: rebuilt only when a dependent target (libslic3r_gui / BambuStudio) is built. +-add_custom_target(device_page_build DEPENDS "${DEVICE_PAGE_BUILD_STAMP}") ++# NOTE (nixpkgs): the device_page frontend build has been removed. ++# Upstream downloads Node.js + pnpm at configure time and runs `pnpm install` ++# and `pnpm run build` at build time, none of which works in the offline Nix ++# sandbox. The C++ GUI sources below are still compiled; only the web resource ++# bundle (resources/web/device_page/dist) is not produced. + + list(APPEND SLIC3R_GUI_SOURCES + GUI/DeviceWeb/DeviceHttpServer.cpp