mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-09-01 06:16:58 +00:00
* fix(deps): build the dependencies from scratch with clang-cl Six dependencies fail once the superbuild compiles them with clang-cl instead of cl: - OpenSSL never goes through CMake. Its VC-WIN64A makefile only works with cl, and an unquoted clang-cl path with spaces produces no .obj files at all, so the lib step dies with LNK1181. Pin the upstream toolchain. - Boost.Container's bundled dlmalloc passes int* to the Interlocked API. cl warns, clang rejects it. - curl 7.75's configure probes rely on C laxness clang rejects. The results flip and nonblock.c ends up in the AmigaOS IoctlSocket branch. - OCCT installs RelWithDebInfo into bini/libi while find_package looks in lib. It also prepends -Wl,-s to the shared linker flags for every Clang build, which the MSVC-style linker gets as an argument it does not know. Both patched hunks sit inside if (MSVC) in the OCCT sources. - wxWidgets lands in lib/clang_x64_lib, so wxWidgetsConfig.cmake falls back to the layout that exists instead of assuming vc_x64_lib. It tries the derived path first, so a cl-built tree consumed by clang-cl keeps resolving the way it does today. The patch step also resets the one file it touches, so it can run again after an interrupted build or after the patch itself changed. - wxInspector goes through FindwxWidgets, which only searches lib/vc*_lib because _WX_TOOL is hardcoded to vc. It now gets the root and lib dir derived the same way wxWidgetsConfig.cmake derives them. Eigen is the seventh, and it breaks on the generator rather than the compiler. Its test, lapack and blas/testing subdirectories all call enable_language(Fortran), and they default to ON because the dependency configures as its own top-level project. Whether that hurts depends on what CMake finds: the Visual Studio generator supports no Fortran and finds nothing, clang-cl sits next to the LLVM toolset's flang and works, while MSVC with Ninja finds Strawberry Perl's MinGW gfortran, which this build already requires for OpenSSL, and hands it the MSVC-style /machine:x64 that MinGW's ld reads as a missing input file. The configure dies there and takes every dependency still in flight with it. Only the headers are consumed here, so the three subprojects are off. * fix(deps): honor the superbuild's generator and compiler in sub-builds orcaslicer_add_cmake_project pinned every dependency sub-build to the Visual Studio generator whenever MSVC was true, which is also true for clang-cl. That generator selects its compiler by toolset and ignores the CMAKE_C_COMPILER and CMAKE_CXX_COMPILER this file already forwards, so the dependencies were built with cl.exe no matter which generator or compiler the superbuild was given. Key the three affected decisions on the generator instead: which generator the sub-builds use, whether CMAKE_BUILD_TYPE is forwarded, and /m versus -j. A Visual Studio superbuild is unchanged, so the default path and CI behave exactly as they do today. build_release_vs.bat now accepts -l to select clang-cl, alongside the existing -x for Ninja, so the generator and the compiler can be chosen independently. On the Visual Studio generator -l reaches the slicer only, through the ClangCL toolset, because the dependency sub-builds have no toolset to inherit; a deps build in that combination says so rather than quietly using MSVC. * fix(deps): use upstream wxWidgets compiler layout fix The compiler-prefix layout fix now comes from SoftFever/Orca-deps-wxWidgets#7, so remove the duplicated local patch and apply step. * fix(deps): stop Assimp enabling ccache on the RC rule ASSIMP_BUILD_USE_CCACHE defaults on and applies the launcher through the global RULE_LAUNCH_COMPILE property, so it wraps the resource-compiler rule as well. Under Ninja that rule goes through cmcldeps, which does not survive being launched by ccache, and the build fails with clang-cl reporting /fo as a missing file. The superbuild already forwards CMAKE_<LANG>_COMPILER_LAUNCHER, which CMake applies per language and so keeps clear of the RC rule. --------- Co-authored-by: SoftFever <103989404+SoftFever@users.noreply.github.com> Co-authored-by: raistlin7447 <kris.austin@gmail.com>
191 lines
5.9 KiB
Batchfile
191 lines
5.9 KiB
Batchfile
@REM OrcaSlicer build script for Windows with VS auto-detect
|
|
@echo off
|
|
set WP=%CD%
|
|
set _START_TIME=%TIME%
|
|
|
|
@REM Default target architecture to the host CPU arch; override by passing
|
|
@REM "x64" or "arm64" as an argument. PROCESSOR_ARCHITEW6432 covers a 32-bit
|
|
@REM shell running on a 64-bit OS, where PROCESSOR_ARCHITECTURE reads "x86".
|
|
set arch=x64
|
|
if /I "%PROCESSOR_ARCHITECTURE%"=="ARM64" set arch=ARM64
|
|
if /I "%PROCESSOR_ARCHITEW6432%"=="ARM64" set arch=ARM64
|
|
if /I "%1"=="arm64" set arch=ARM64
|
|
if /I "%2"=="arm64" set arch=ARM64
|
|
if /I "%1"=="x64" set arch=x64
|
|
if /I "%2"=="x64" set arch=x64
|
|
|
|
@REM Check for Ninja Multi-Config option (-x)
|
|
set USE_NINJA=0
|
|
for %%a in (%*) do (
|
|
if "%%a"=="-x" set USE_NINJA=1
|
|
)
|
|
|
|
@REM Check for clang-cl option (-l). Combined with -x it also builds the deps with
|
|
@REM clang-cl; on the Visual Studio generator it applies to the slicer only, because
|
|
@REM the dependency sub-builds have no toolset to inherit and stay on MSVC.
|
|
set CLANG_ARG=
|
|
set TOOLSET_ARG=
|
|
for %%a in (%*) do (
|
|
if "%%a"=="-l" (
|
|
set CLANG_ARG=-DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COMPILER=clang-cl
|
|
set TOOLSET_ARG=-T ClangCL
|
|
)
|
|
)
|
|
|
|
@REM Check for unit-tests option ("tests")
|
|
set BUILD_TESTS=OFF
|
|
for %%a in (%*) do (
|
|
if /I "%%a"=="tests" set BUILD_TESTS=ON
|
|
)
|
|
|
|
if "%USE_NINJA%"=="1" (
|
|
echo Using Ninja Multi-Config generator
|
|
set CMAKE_GENERATOR="Ninja Multi-Config"
|
|
set VS_VERSION=Ninja
|
|
goto :generator_ready
|
|
)
|
|
|
|
@REM Detect Visual Studio version using msbuild
|
|
echo Detecting Visual Studio version using msbuild...
|
|
|
|
@REM Try to get MSBuild version - the output format varies by VS version
|
|
set VS_MAJOR=
|
|
for /f "tokens=*" %%i in ('msbuild -version 2^>^&1 ^| findstr /r "^[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*"') do (
|
|
for /f "tokens=1 delims=." %%a in ("%%i") do set VS_MAJOR=%%a
|
|
set MSBUILD_OUTPUT=%%i
|
|
goto :version_found
|
|
)
|
|
|
|
@REM Alternative method for newer MSBuild versions
|
|
if "%VS_MAJOR%"=="" (
|
|
for /f "tokens=*" %%i in ('msbuild -version 2^>^&1 ^| findstr /r "[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*"') do (
|
|
for /f "tokens=1 delims=." %%a in ("%%i") do set VS_MAJOR=%%a
|
|
set MSBUILD_OUTPUT=%%i
|
|
goto :version_found
|
|
)
|
|
)
|
|
|
|
:version_found
|
|
echo MSBuild version detected: %MSBUILD_OUTPUT%
|
|
echo Major version: %VS_MAJOR%
|
|
|
|
if "%VS_MAJOR%"=="" (
|
|
echo Error: Could not determine Visual Studio version from msbuild
|
|
echo Please ensure Visual Studio and MSBuild are properly installed
|
|
exit /b 1
|
|
)
|
|
|
|
if "%VS_MAJOR%"=="16" (
|
|
set VS_VERSION=2019
|
|
set CMAKE_GENERATOR="Visual Studio 16 2019"
|
|
) else if "%VS_MAJOR%"=="17" (
|
|
set VS_VERSION=2022
|
|
set CMAKE_GENERATOR="Visual Studio 17 2022"
|
|
) else if "%VS_MAJOR%"=="18" (
|
|
set VS_VERSION=2026
|
|
set CMAKE_GENERATOR="Visual Studio 18 2026"
|
|
) else (
|
|
echo Error: Unsupported Visual Studio version: %VS_MAJOR%
|
|
echo Supported versions: VS2019 (16.x^), VS2022 (17.x^), VS2026 (18.x^)
|
|
exit /b 1
|
|
)
|
|
|
|
echo Detected Visual Studio %VS_VERSION% (version %VS_MAJOR%)
|
|
echo Using CMake generator: %CMAKE_GENERATOR%
|
|
|
|
:generator_ready
|
|
|
|
@REM Pack deps
|
|
if "%1"=="pack" (
|
|
setlocal ENABLEDELAYEDEXPANSION
|
|
cd %WP%/deps/build
|
|
if "%arch%"=="ARM64" cd %WP%/deps/build-arm64
|
|
for /f "tokens=2-4 delims=/ " %%a in ('date /t') do set build_date=%%c%%b%%a
|
|
echo packing deps: OrcaSlicer_dep_win-!arch!_!build_date!_vs!VS_VERSION!.zip
|
|
|
|
%WP%/tools/7z.exe a OrcaSlicer_dep_win-!arch!_!build_date!_vs!VS_VERSION!.zip OrcaSlicer_dep
|
|
goto :done
|
|
)
|
|
|
|
set debug=OFF
|
|
set debuginfo=OFF
|
|
if "%1"=="debug" set debug=ON
|
|
if "%2"=="debug" set debug=ON
|
|
if "%1"=="debuginfo" set debuginfo=ON
|
|
if "%2"=="debuginfo" set debuginfo=ON
|
|
if "%debug%"=="ON" (
|
|
set build_type=Debug
|
|
set build_dir=build-dbg
|
|
) else (
|
|
if "%debuginfo%"=="ON" (
|
|
set build_type=RelWithDebInfo
|
|
set build_dir=build-dbginfo
|
|
) else (
|
|
set build_type=Release
|
|
set build_dir=build
|
|
)
|
|
)
|
|
if "%arch%"=="ARM64" set build_dir=%build_dir%-arm64
|
|
echo build type set to %build_type%, arch=%arch%
|
|
|
|
setlocal DISABLEDELAYEDEXPANSION
|
|
cd deps
|
|
mkdir %build_dir%
|
|
cd %build_dir%
|
|
set "SIG_FLAG="
|
|
if defined ORCA_UPDATER_SIG_KEY set "SIG_FLAG=-DORCA_UPDATER_SIG_KEY=%ORCA_UPDATER_SIG_KEY%"
|
|
|
|
if "%1"=="slicer" (
|
|
GOTO :slicer
|
|
)
|
|
echo "building deps.."
|
|
if defined CLANG_ARG if "%USE_NINJA%"=="0" echo Note: -l needs -x for the dependencies; building them with MSVC.
|
|
|
|
echo on
|
|
REM Set minimum CMake policy to avoid <3.5 errors
|
|
set CMAKE_POLICY_VERSION_MINIMUM=3.5
|
|
if "%USE_NINJA%"=="1" (
|
|
cmake ../ -G %CMAKE_GENERATOR% %CLANG_ARG% -DCMAKE_BUILD_TYPE=%build_type%
|
|
cmake --build . --config %build_type% --target deps
|
|
) else (
|
|
cmake ../ -G %CMAKE_GENERATOR% -A %arch% -DCMAKE_BUILD_TYPE=%build_type%
|
|
cmake --build . --config %build_type% --target deps -- -m
|
|
)
|
|
@echo off
|
|
|
|
if "%1"=="deps" goto :done
|
|
|
|
:slicer
|
|
echo "building Orca Slicer..."
|
|
cd %WP%
|
|
mkdir %build_dir%
|
|
cd %build_dir%
|
|
|
|
echo on
|
|
set CMAKE_POLICY_VERSION_MINIMUM=3.5
|
|
if "%USE_NINJA%"=="1" (
|
|
cmake .. -G %CMAKE_GENERATOR% %CLANG_ARG% -DORCA_TOOLS=ON %SIG_FLAG% -DBUILD_TESTS=%BUILD_TESTS% -DCMAKE_BUILD_TYPE=%build_type%
|
|
cmake --build . --config %build_type% --target all
|
|
) else (
|
|
cmake .. -G %CMAKE_GENERATOR% -A %arch% %TOOLSET_ARG% -DORCA_TOOLS=ON %SIG_FLAG% -DBUILD_TESTS=%BUILD_TESTS% -DCMAKE_BUILD_TYPE=%build_type%
|
|
cmake --build . --config %build_type% --target ALL_BUILD -- -m
|
|
)
|
|
@echo off
|
|
cd ..
|
|
call scripts/run_gettext.bat
|
|
cd %build_dir%
|
|
cmake --build . --target install --config %build_type%
|
|
|
|
:done
|
|
@echo off
|
|
for /f "tokens=1-3 delims=:.," %%a in ("%_START_TIME: =0%") do set /a "_start_s=%%a*3600+%%b*60+%%c"
|
|
for /f "tokens=1-3 delims=:.," %%a in ("%TIME: =0%") do set /a "_end_s=%%a*3600+%%b*60+%%c"
|
|
set /a "_elapsed=_end_s - _start_s"
|
|
if %_elapsed% lss 0 set /a "_elapsed+=86400"
|
|
set /a "_hours=_elapsed / 3600"
|
|
set /a "_remainder=_elapsed - _hours * 3600"
|
|
set /a "_mins=_remainder / 60"
|
|
set /a "_secs=_remainder - _mins * 60"
|
|
echo.
|
|
echo Build completed in %_hours%h %_mins%m %_secs%s
|