Unfuck Windows build

This commit is contained in:
2026-08-21 22:21:54 +02:00
parent e3836282f3
commit bfe7589675
12 changed files with 257 additions and 462 deletions
+3
View File
@@ -1,3 +1,6 @@
[submodule "submodules/wuffs-mirror-release-c"]
path = submodules/wuffs-mirror-release-c
url = https://github.com/google/wuffs-mirror-release-c
[submodule "submodules/liberty"]
path = submodules/liberty
url = https://git.janouch.name/p/liberty.git
+72 -39
View File
@@ -15,51 +15,43 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
if(APPLE)
# Build tree: bin/dn.app/Contents/MacOS vs bin/libdn.dylib.
# Install: MacOS/dn, Frameworks/libdn.dylib (macdeployqt leaves
# @rpath/libdn.dylib; Homebrew dylibs become @executable_path).
set(CMAKE_BUILD_WITH_INSTALL_RPATH OFF)
set(CMAKE_INSTALL_RPATH "@loader_path;@loader_path/../Frameworks")
else()
# Executables find libdn beside themselves.
# TODO(p): This is only for development purposes, clean it up.
set(CMAKE_BUILD_WITH_INSTALL_RPATH ON)
set(CMAKE_BUILD_RPATH_USE_ORIGIN ON)
set(CMAKE_INSTALL_RPATH "$ORIGIN")
endif()
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
add_compile_options(-Wall -Wextra -Wpedantic
-Wno-unused-parameter -Wno-missing-field-initializers)
endif()
if(MSVC)
message(FATAL_ERROR "MSVC is not supported; use MinGW-w64")
endif()
# MSYS2 ucrt64 prefix from Win64Depends.sh (cross) so host .pc files cannot leak.
if(WIN32 AND CMAKE_CROSSCOMPILING)
set(DN_MINGW_PREFIX "${CMAKE_BINARY_DIR}/ucrt64")
if(NOT EXISTS "${DN_MINGW_PREFIX}/lib/pkgconfig")
message(FATAL_ERROR
"MSYS2 prefix missing at ${DN_MINGW_PREFIX}\n"
"Run: sh cmake/Win64Depends.sh ${CMAKE_BINARY_DIR}")
endif()
set(DN_MINGW_PREFIX "${PROJECT_SOURCE_DIR}/ucrt64")
list(APPEND CMAKE_PREFIX_PATH "${DN_MINGW_PREFIX}")
list(APPEND CMAKE_FIND_ROOT_PATH "${DN_MINGW_PREFIX}")
set(ENV{PKG_CONFIG_SYSROOT_DIR} "${CMAKE_BINARY_DIR}")
# Relativize prefixes, and bar pkg-config from looking up host libraries
set(ENV{PKG_CONFIG_SYSROOT_DIR} "${PROJECT_SOURCE_DIR}")
set(DN_MINGW_PCPATH
"${DN_MINGW_PREFIX}/share/pkgconfig:${DN_MINGW_PREFIX}/lib/pkgconfig")
set(ENV{PKG_CONFIG_PATH} "${DN_MINGW_PCPATH}")
set(ENV{PKG_CONFIG_LIBDIR} "${DN_MINGW_PCPATH}")
if(NOT QT_HOST_PATH)
set(QT_HOST_PATH "/usr" CACHE PATH "Host Qt for moc/rcc when cross-compiling")
endif()
# Qt tries to find qtpaths without an .exe file extension
# (see Qt6CoreMacros.cmake). This ultimately means broken windeployqt.
set(QT_NO_QTPATHS_DEPLOYMENT_WARNING ON)
# You may need to set WINEPATH because the MSYS2 rcc.exe may be executed.
# Potentially set AUTORCC_EXECUTABLE manually to something usable.
endif()
if(APPLE)
# Build tree: bin/dn.app/Contents/MacOS vs bin/libdn.dylib.
# Install: MacOS/dn, Frameworks/libdn.dylib (macdeployqt leaves
# @rpath/libdn.dylib; Homebrew dylibs become @executable_path).
set(CMAKE_INSTALL_RPATH "@loader_path;@loader_path/../Frameworks")
else()
set(CMAKE_BUILD_RPATH_USE_ORIGIN ON)
endif()
# Dependency fetching is centralised here in the root CMakeLists.txt.
set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/submodules/liberty/cmake")
find_package(PkgConfig REQUIRED)
find_package(Vulkan REQUIRED)
find_package(Qt6 6.11 REQUIRED COMPONENTS Gui OPTIONAL_COMPONENTS WaylandClient)
@@ -145,10 +137,6 @@ else()
EXCLUDE_FROM_ALL
)
FetchContent_MakeAvailable(lcms2)
if(NOT TARGET lcms2 OR NOT TARGET lcms2_fast_float OR NOT TARGET lcms2_threaded)
message(FATAL_ERROR
"Bundled lcms2 must provide targets 'lcms2', 'lcms2_fast_float' and 'lcms2_threaded'")
endif()
set(DN_WITH_LCMS2_FAST_FLOAT TRUE)
set(DN_WITH_LCMS2_THREADED TRUE)
@@ -171,11 +159,11 @@ if(DN_WITH_JPEG_QS)
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
PATCH_COMMAND
${CMAKE_COMMAND} -E copy
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/jpegqs/CMakeLists.txt"
"${PROJECT_SOURCE_DIR}/cmake/jpegqs/CMakeLists.txt"
<SOURCE_DIR>/CMakeLists.txt
COMMAND
${CMAKE_COMMAND} -E copy_directory
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/jpegqs/include"
"${PROJECT_SOURCE_DIR}/cmake/jpegqs/include"
<SOURCE_DIR>/include
)
FetchContent_MakeAvailable(jpegqs)
@@ -184,20 +172,21 @@ if(DN_WITH_JPEG_QS)
endif()
endif()
# TODO(p): This will want to be single instance everywhere.
if(UNIX AND NOT APPLE)
set(DN_WITH_SINGLE_INSTANCE TRUE)
else()
set(DN_WITH_SINGLE_INSTANCE FALSE)
endif()
file(SHA256 "${CMAKE_SOURCE_DIR}/ipc/common.lxdr" DN_IPC_LXDR_H1)
file(SHA256 "${CMAKE_SOURCE_DIR}/ipc/instance.lxdr" DN_IPC_LXDR_H2)
file(SHA256 "${PROJECT_SOURCE_DIR}/ipc/common.lxdr" DN_IPC_LXDR_H1)
file(SHA256 "${PROJECT_SOURCE_DIR}/ipc/instance.lxdr" DN_IPC_LXDR_H2)
string(SHA256 DN_IPC_LXDR_COMBINED "${DN_IPC_LXDR_H1}${DN_IPC_LXDR_H2}")
string(SUBSTRING "${DN_IPC_LXDR_COMBINED}" 0 12 DN_IPC_LXDR_PREFIX)
set(DN_IPC_BUILD_ID "dawn ${PROJECT_VERSION} ${DN_IPC_LXDR_PREFIX}")
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/dn-config.h.in"
"${PROJECT_SOURCE_DIR}/dn-config.h.in"
"${PROJECT_BINARY_DIR}/dn-config.h"
)
@@ -206,7 +195,43 @@ add_subdirectory(dnthumbd)
add_subdirectory(dn)
if(WIN32)
include(cmake/Win32Install.cmake)
install(TARGETS dn libdn dnthumbd
RUNTIME DESTINATION .)
install(DIRECTORY "${DN_MINGW_PREFIX}/bin/"
DESTINATION .
FILES_MATCHING
PATTERN "*.dll"
PATTERN "vulkan-1.dll" EXCLUDE)
install(FILES
"${DN_MINGW_PREFIX}/bin/wperl.exe"
"${DN_MINGW_PREFIX}/bin/exiftool"
DESTINATION .)
install(DIRECTORY
"${DN_MINGW_PREFIX}/lib/perl5/"
DESTINATION lib/perl5)
# TODO(p): Does this need to be branched?
if(TARGET Qt6::QWindowsIntegrationPlugin)
install(IMPORTED_RUNTIME_ARTIFACTS Qt6::QWindowsIntegrationPlugin
RUNTIME DESTINATION platforms
LIBRARY DESTINATION platforms)
else()
install(FILES
"${QT6_INSTALL_PREFIX}/${QT6_INSTALL_PLUGINS}/platforms/qwindows.dll"
DESTINATION platforms)
endif()
install(FILES
"${DN_MINGW_PREFIX}/bin/vk_swiftshader_icd.json"
DESTINATION .)
install(FILES
"${DN_MINGW_PREFIX}/share/mime/globs2"
"${DN_MINGW_PREFIX}/share/mime/subclasses"
DESTINATION share/mime)
# Prune unused libraries.
install(SCRIPT "${PROJECT_SOURCE_DIR}/cmake/Win32Cleanup.cmake")
endif()
if(APPLE)
include(cmake/DarwinInstall.cmake)
@@ -216,3 +241,11 @@ include(CTest)
if(BUILD_TESTING)
add_subdirectory(tests)
endif()
set(CPACK_PACKAGE_VENDOR "dawn")
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE")
set(CPACK_GENERATOR ZIP)
set(CPACK_PACKAGE_DIRECTORY "${CMAKE_BINARY_DIR}")
set(CPACK_PACKAGE_FILE_NAME
"${PROJECT_NAME}-${PROJECT_VERSION}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
include(CPack)
+7
View File
@@ -70,6 +70,13 @@ Optional dependencies: librsvg-2.0, xcursor, libheif, libtiff-4, libraw,
$ cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DDN_BUNDLED_LCMS2=ON
$ cmake --build build
Windows cross-compile:
$ sh -e msys2-configure.sh
$ cmake -DCMAKE_TOOLCHAIN_FILE=submodules/liberty/cmake/toolchains/MinGW-w64-x64.cmake \
-DCMAKE_BUILD_TYPE=Release -B build
$ WINEPATH=$PWD/ucrt64/bin cmake --build build -- package
Configuration
-------------
See link:doc/configuring-your-system.adoc[Configuring your system].
-19
View File
@@ -21,17 +21,10 @@ if(NOT _dn_mime_dir)
endif()
endforeach()
endif()
if(NOT _dn_mime_dir)
message(FATAL_ERROR
"share/mime/globs2 or subclasses missing (install shared-mime-info)")
endif()
install(FILES
"${_dn_mime_dir}/globs2"
"${_dn_mime_dir}/subclasses"
DESTINATION "${_dn_bundle}/Contents/Resources/share/mime")
unset(_dn_mime_dir)
unset(_dn_smi_datadir)
unset(_dn_root)
# macdeployqt otherwise copies imageformats/virtualkeyboard/styles and
# pulls QtSvg, QtPdf, QtQuick, QtWidgets, QtNetwork with them.
@@ -42,9 +35,6 @@ if(TARGET Qt6::QCocoaIntegrationPlugin)
else()
set(_dn_qcocoa
"${QT6_INSTALL_PREFIX}/${QT6_INSTALL_PLUGINS}/platforms/libqcocoa.dylib")
if(NOT EXISTS "${_dn_qcocoa}")
message(FATAL_ERROR "libqcocoa.dylib not found at ${_dn_qcocoa}")
endif()
install(FILES "${_dn_qcocoa}"
DESTINATION "${_dn_bundle}/Contents/PlugIns/platforms")
unset(_dn_qcocoa)
@@ -76,12 +66,3 @@ qt_generate_deploy_app_script(TARGET dn OUTPUT_SCRIPT _dn_deploy_dn
install(SCRIPT "${_dn_deploy_dn}")
# Homebrew Qt QTBUG-127075: run macdeployqt twice.
install(SCRIPT "${_dn_deploy_dn}")
unset(_dn_deploy_dn)
set(CPACK_PACKAGE_VENDOR "dawn")
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE")
set(CPACK_GENERATOR "TGZ;ZIP")
set(CPACK_PACKAGE_DIRECTORY "${CMAKE_BINARY_DIR}")
set(CPACK_PACKAGE_FILE_NAME
"${PROJECT_NAME}-${PROJECT_VERSION}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
include(CPack)
-40
View File
@@ -1,40 +0,0 @@
# Public Domain
function (icon_to_png name svg size output_dir output)
set (_dimensions "${size}x${size}")
set (_png_path "${output_dir}/hicolor/${_dimensions}/apps")
set (_png "${_png_path}/${name}.png")
set (${output} "${_png}" PARENT_SCOPE)
set (_find_program_REQUIRE)
if (NOT ${CMAKE_VERSION} VERSION_LESS 3.18.0)
set (_find_program_REQUIRE REQUIRED)
endif ()
find_program (rsvg_convert_EXECUTABLE rsvg-convert ${_find_program_REQUIRE})
add_custom_command (OUTPUT "${_png}"
COMMAND ${CMAKE_COMMAND} -E make_directory "${_png_path}"
COMMAND ${rsvg_convert_EXECUTABLE} "--output=${_png}"
"--width=${size}" "--height=${size}" -- "${svg}"
DEPENDS "${svg}"
COMMENT "Generating ${name} ${_dimensions} application icon" VERBATIM)
endfunction ()
# You should include a 256x256 icon--which takes less space as raw PNG.
function (icon_for_win32 ico pngs pngs_raw)
set (_raws)
foreach (png ${pngs_raw})
list (APPEND _raws "--raw=${png}")
endforeach ()
set (_find_program_REQUIRE)
if (NOT ${CMAKE_VERSION} VERSION_LESS 3.18.0)
set (_find_program_REQUIRE REQUIRED)
endif ()
find_program (icotool_EXECUTABLE icotool ${_find_program_REQUIRE})
add_custom_command (OUTPUT "${ico}"
COMMAND ${icotool_EXECUTABLE} -c -o "${ico}" ${_raws} -- ${pngs}
DEPENDS ${pngs} ${pngs_raw}
COMMENT "Generating Windows program icon" VERBATIM)
endfunction ()
-11
View File
@@ -11,8 +11,6 @@
# .lxdr files. Does not attach the header to any compile target.
#
find_program(DN_CLANG_FORMAT NAMES clang-format)
function(dn_lxdr_generate out_header namespace prefix_camel)
if(NOT AWK)
message(FATAL_ERROR "dn_lxdr_generate requires AWK")
@@ -36,14 +34,6 @@ function(dn_lxdr_generate out_header namespace prefix_camel)
get_filename_component(out_name "${out_header}" NAME)
string(MAKE_C_IDENTIFIER "${out_name}" out_ident)
set(format_cmd)
if(DN_CLANG_FORMAT)
set(format_cmd
COMMAND "${DN_CLANG_FORMAT}"
"--style=file:${PROJECT_SOURCE_DIR}/.clang-format"
-i "${out_header}")
endif()
add_custom_command(
OUTPUT "${out_header}"
COMMAND ${CMAKE_COMMAND} -E make_directory "${out_dir}"
@@ -53,7 +43,6 @@ function(dn_lxdr_generate out_header namespace prefix_camel)
-v "Namespace=${namespace}"
${lxdr_abs}
> "${out_header}"
${format_cmd}
DEPENDS ${lxdr_abs} "${lxdrgen}" "${lxdrgen_cpp}"
COMMENT "Generating ${out_name}"
VERBATIM
-72
View File
@@ -1,72 +0,0 @@
# Windows ZIP: copy MinGW prefix DLLs, then prune. The C++ runtime is the
# MSYS2 ucrt64 one; do not overlay the host toolchain's copies.
install(TARGETS dn libdn dnthumbd
RUNTIME DESTINATION .)
install(DIRECTORY "${DN_MINGW_PREFIX}/bin/"
DESTINATION .
FILES_MATCHING
PATTERN "*.dll"
PATTERN "vulkan-1.dll" EXCLUDE)
if(NOT EXISTS "${DN_MINGW_PREFIX}/bin/wperl.exe"
OR NOT EXISTS "${DN_MINGW_PREFIX}/bin/exiftool"
OR NOT EXISTS "${DN_MINGW_PREFIX}/lib/perl5")
message(FATAL_ERROR
"Bundled Perl or ExifTool missing at ${DN_MINGW_PREFIX}\n"
"Run: sh cmake/Win64Depends.sh ${CMAKE_BINARY_DIR}")
endif()
install(FILES
"${DN_MINGW_PREFIX}/bin/wperl.exe"
"${DN_MINGW_PREFIX}/bin/exiftool"
DESTINATION .)
install(DIRECTORY "${DN_MINGW_PREFIX}/lib/perl5/"
DESTINATION lib/perl5)
# QPA is dlopend; the cleanup walker will not see it from the exe.
if(TARGET Qt6::QWindowsIntegrationPlugin)
install(IMPORTED_RUNTIME_ARTIFACTS Qt6::QWindowsIntegrationPlugin
RUNTIME DESTINATION platforms
LIBRARY DESTINATION platforms)
else()
set(_dn_qwindows
"${QT6_INSTALL_PREFIX}/${QT6_INSTALL_PLUGINS}/platforms/qwindows.dll")
if(NOT EXISTS "${_dn_qwindows}")
message(FATAL_ERROR "qwindows.dll not found at ${_dn_qwindows}")
endif()
install(FILES "${_dn_qwindows}"
DESTINATION platforms)
unset(_dn_qwindows)
endif()
# Not a DLL; dump above does not copy it. SwiftShader + MSVC CRT come from
# ucrt64/bin via Win64Depends.sh and the directory install.
if(NOT EXISTS "${DN_MINGW_PREFIX}/bin/vk_swiftshader_icd.json")
message(FATAL_ERROR
"vk_swiftshader_icd.json missing at ${DN_MINGW_PREFIX}/bin\n"
"Run: sh cmake/Win64Depends.sh ${CMAKE_BINARY_DIR}")
endif()
install(FILES "${DN_MINGW_PREFIX}/bin/vk_swiftshader_icd.json"
DESTINATION .)
if(NOT EXISTS "${DN_MINGW_PREFIX}/share/mime/globs2"
OR NOT EXISTS "${DN_MINGW_PREFIX}/share/mime/subclasses")
message(FATAL_ERROR
"share/mime/globs2 or subclasses missing at ${DN_MINGW_PREFIX}\n"
"Run: sh cmake/Win64Depends.sh ${CMAKE_BINARY_DIR}")
endif()
install(FILES
"${DN_MINGW_PREFIX}/share/mime/globs2"
"${DN_MINGW_PREFIX}/share/mime/subclasses"
DESTINATION share/mime)
install(SCRIPT "${CMAKE_SOURCE_DIR}/cmake/Win32Cleanup.cmake")
set(CPACK_PACKAGE_VENDOR "dawn")
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE")
set(CPACK_GENERATOR ZIP)
set(CPACK_PACKAGE_DIRECTORY "${CMAKE_BINARY_DIR}")
set(CPACK_PACKAGE_FILE_NAME
"${PROJECT_NAME}-${PROJECT_VERSION}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
include(CPack)
-262
View File
@@ -1,262 +0,0 @@
#!/bin/sh -e
# Win64Depends.sh: MSYS2 ucrt64 prefix + resvg, SwiftShader, MSVC CRT,
# shared-mime-info for MinGW-w64 cross builds.
#
# Usage: sh cmake/Win64Depends.sh <build-dir>
# Example: sh dawn/cmake/Win64Depends.sh build-mingw
#
# Host: awk, curl, bsdtar, sha256sum, x86_64-w64-mingw32-gcc, 7z,
# update-mime-database (shared-mime-info).
# resvg uses a rustup toolchain in the build tree (Arch rustc cannot load
# upstream rust-std).
set -e
repository=https://repo.msys2.org/mingw/ucrt64/
pkg=mingw-w64-ucrt-x86_64
resvg_ver=0.48.1
resvg_url="https://github.com/linebender/resvg/archive/refs/tags/v${resvg_ver}.tar.gz"
resvg_sha256=40dafea6b4b9d01e9d28b6d49f1e912daf3e9055676ad9179a5a2db6e7386945
swiftshader_url=https://github.com/jakoch/rasterizers/releases/download/20260731/swiftshader-win64-5.0.0.1.zip
swiftshader_sha256=63e97af8b88c2c8cbc61495fc5ef4fad1ce60a874f2c19207cd072c46944065f
vcredist_url=https://aka.ms/vs/17/release/vc_redist.x64.exe
vcredist_sha256=cc0ff0eb1dc3f5188ae6300faef32bf5beeba4bdd6e8e445a9184072096b713b
exiftool_ver=13.59
exiftool_url="https://sourceforge.net/projects/exiftool/files/Image-ExifTool-${exiftool_ver}.tar.gz/download"
exiftool_sha256=668ea3acececb7235fbd0f4900e72d5f12c9b07e5c778fd36cb1e9b5828fd65a
status() {
echo "$(tput bold)-- $*$(tput sgr0)" >&2
}
if [ -z "$1" ]
then
echo "usage: $0 <build-dir>" >&2
exit 1
fi
builddir=$(realpath "$1")
msys2_root=$builddir/ucrt64
mkdir -p "$msys2_root"
cd "$msys2_root"
dbsync() {
status Fetching repository DB
[ -f db.tsv ] || curl -# "$repository/ucrt64.db" | bsdtar -xOf- | awk '
function flush() { print f["%NAME%"] f["%FILENAME%"] f["%DEPENDS%"] }
NR > 1 && $0 == "%FILENAME%" { flush(); for (i in f) delete f[i] }
!/^[^%]/ { field = $0; next } { f[field] = f[field] $0 "\t" }
field == "%SHA256SUM%" { path = "*packages/" f["%FILENAME%"]
sub(/\t$/, "", path); print $0, path > "db.sums" } END { flush() }
' > db.tsv
}
fetch() {
status Resolving "$@"
mkdir -p packages
awk -F'\t' 'function get(name, i, a) {
if (visited[name]++ || !(name in filenames)) return
print filenames[name]; split(deps[name], a); for (i in a) get(a[i])
} BEGIN { while ((getline < "db.tsv") > 0) {
filenames[$1] = $2; deps[$1] = ""; for (i = 3; i <= NF; i++) {
gsub(/[<=>].*/, "", $i); deps[$1] = deps[$1] $i FS }
} for (i = 0; i < ARGC; i++) get(ARGV[i]) }' "$@" | tee db.want | \
while IFS= read -r name
do
status Fetching "$name"
[ -f "packages/$name" ] || curl -#o "packages/$name" "$repository/$name"
done
}
verify() {
status Verifying checksums
sha256sum --ignore-missing --quiet -c db.sums
}
extract() {
status Extracting packages
for subdir in *
do [ -d "$subdir" -a "$subdir" != packages ] && rm -rf -- "$subdir"
done
while IFS= read -r name
do bsdtar -xf "packages/$name" --strip-components 1 \
--exclude '*/share/man' --exclude '*/share/doc'
done < db.want
}
setup_rustup() {
export RUSTUP_HOME=$builddir/rustup
export CARGO_HOME=$builddir/cargo
export PATH="$CARGO_HOME/bin:$PATH"
if [ -x "$CARGO_HOME/bin/rustc" ] && \
"$CARGO_HOME/bin/rustc" --print target-list >/dev/null 2>&1 && \
"$CARGO_HOME/bin/rustc" --print target-libdir \
--target x86_64-pc-windows-gnu >/dev/null 2>&1
then
return
fi
status rustup + x86_64-pc-windows-gnu
export RUSTUP_INIT_SKIP_PATH_CHECK=yes
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | \
sh -s -- -y --no-modify-path --profile minimal --default-toolchain stable
rustup target add x86_64-pc-windows-gnu
}
install_resvg() {
prefix=$msys2_root
if [ -f "$prefix/bin/resvg.dll" ]
then
status "resvg already in prefix"
return
fi
src=$builddir/resvg-$resvg_ver
tarball=$builddir/resvg-$resvg_ver.tar.gz
[ -f "$tarball" ] || curl -#L -o "$tarball" "$resvg_url"
echo "$resvg_sha256 $tarball" | sha256sum -c
[ -d "$src" ] || bsdtar -xf "$tarball" -C "$builddir"
setup_rustup
status Building resvg $resvg_ver C API
export CARGO_TARGET_X86_64_PC_WINDOWS_GNU_LINKER=x86_64-w64-mingw32-gcc
export CC_x86_64_pc_windows_gnu=x86_64-w64-mingw32-gcc
export AR_x86_64_pc_windows_gnu=x86_64-w64-mingw32-gcc-ar
unset RUSTC
export CARGO_TARGET_DIR=$src/target
( cd "$src/crates/c-api" && cargo build --release --target x86_64-pc-windows-gnu )
rel=$src/target/x86_64-pc-windows-gnu/release
mkdir -p "$prefix/include/resvg" "$prefix/lib/pkgconfig" "$prefix/bin"
cp "$src/crates/c-api/resvg.h" "$prefix/include/resvg/resvg.h"
cp "$rel/resvg.dll" "$prefix/bin/resvg.dll"
cp "$rel/libresvg.dll.a" "$prefix/lib/libresvg.dll.a"
cat >"$prefix/lib/pkgconfig/resvg.pc" <<-EOF
prefix=/ucrt64
exec_prefix=\${prefix}
libdir=\${prefix}/lib
includedir=\${prefix}/include
Name: resvg
Description: SVG rendering library (C API)
Version: $resvg_ver
Libs: -L\${libdir} -lresvg
Cflags: -I\${includedir}/resvg
EOF
}
install_swiftshader() {
mkdir -p "$msys2_root/bin"
if [ -f "$msys2_root/bin/vk_swiftshader.dll" ]
then
status "SwiftShader already in prefix"
else
zip=$builddir/swiftshader-win64-5.0.0.1.zip
[ -f "$zip" ] || curl -#L -o "$zip" "$swiftshader_url"
echo "$swiftshader_sha256 $zip" | sha256sum -c
status SwiftShader ICD
bsdtar -xf "$zip" -C "$msys2_root/bin" vk_swiftshader.dll
fi
cat >"$msys2_root/bin/vk_swiftshader_icd.json" <<'EOF'
{
"file_format_version": "1.0.0",
"ICD": {
"library_path": ".\\vk_swiftshader.dll",
"api_version": "1.1.0"
}
}
EOF
}
run7z() {
cmd=$1
shift
"$cmd" x "$@" || {
r=$?
[ "$r" -le 1 ] || exit "$r"
}
}
install_msvc_crt() {
if [ -f "$msys2_root/bin/msvcp140.dll" ]
then
status "MSVC CRT already in prefix"
return
fi
z=
for c in 7z 7za 7zz
do
if command -v "$c" >/dev/null
then
z=$c
break
fi
done
if [ -z "$z" ]
then
echo "7z required to peel vc_redist.x64.exe" >&2
exit 1
fi
exe=$builddir/vc_redist.x64.exe
[ -f "$exe" ] || curl -#L -o "$exe" "$vcredist_url"
echo "$vcredist_sha256 $exe" | sha256sum -c
work=$builddir/msvc-crt-work
rm -rf "$work"
mkdir -p "$work/s" "$work/c" "$work/a"
status "Peeling VC++ CRT"
run7z "$z" -t# -y "-o$work/s" "$exe"
run7z "$z" -y "-o$work/c" "$work/s/4.cab"
run7z "$z" -y "-o$work/a" "$work/c/a12"
mkdir -p "$msys2_root/bin"
for n in msvcp140 vcruntime140 vcruntime140_1
do cp "$work/a/${n}.dll_amd64" "$msys2_root/bin/${n}.dll"
done
rm -rf "$work"
}
install_exiftool() {
version_file=$msys2_root/.exiftool-version
installed_ver=
[ ! -f "$version_file" ] || installed_ver=$(cat "$version_file")
if [ -f "$msys2_root/bin/exiftool" ] && \
[ "$installed_ver" = "$exiftool_ver" ]
then
status "ExifTool already in prefix"
return
fi
tarball=$builddir/exiftool-$exiftool_ver.tar.gz
[ -f "$tarball" ] || curl -#L -o "$tarball" "$exiftool_url"
echo "$exiftool_sha256 $tarball" | sha256sum -c
work=$builddir/exiftool-$exiftool_ver
rm -rf "$work"
mkdir -p "$work" "$msys2_root/bin" "$msys2_root/lib/perl5/site_perl"
bsdtar -xf "$tarball" -C "$work" --strip-components 1
cp "$work/exiftool" "$msys2_root/bin/exiftool"
cp -R "$work/lib/." "$msys2_root/lib/perl5/site_perl/"
echo "$exiftool_ver" > "$version_file"
rm -rf "$work"
}
if [ -f "$msys2_root/bin/Qt6Gui.dll" ] && \
[ -f "$msys2_root/bin/wperl.exe" ] && \
[ -d "$msys2_root/lib/perl5" ]
then
status "MSYS2 prefix already extracted"
else
dbsync
fetch $pkg-qt6-base $pkg-vulkan-loader $pkg-vulkan-headers \
$pkg-libjpeg-turbo $pkg-libwebp $pkg-zlib \
$pkg-libheif $pkg-libraw \
$pkg-gcc-libs $pkg-perl $pkg-perl-win32-api
# XML only; do not follow MSYS2 glib/python deps. Host u-m-d compiles it.
mime=$(awk -F'\t' -v n="$pkg-shared-mime-info" \
'$1 == n { print $2; exit }' db.tsv)
echo "$mime" >> db.want
status Fetching "$mime"
[ -f "packages/$mime" ] || curl -#o "packages/$mime" "$repository/$mime"
verify
extract
fi
install_resvg
install_swiftshader
install_msvc_crt
install_exiftool
status Compiling MIME database
update-mime-database "$msys2_root/share/mime"
status Success
-18
View File
@@ -1,18 +0,0 @@
# Linux-hosted MinGW-w64 toolchain. The MSYS2 prefix lives in the CMake
# build tree (ucrt64/) and is appended to CMAKE_FIND_ROOT_PATH from the
# root CMakeLists.txt.
set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_SYSTEM_PROCESSOR x86_64)
set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc)
set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++)
set(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres)
set(CMAKE_OBJDUMP x86_64-w64-mingw32-objdump)
set(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH)
+1 -1
View File
@@ -121,7 +121,7 @@ if(APPLE)
set_target_properties(dn PROPERTIES
MACOSX_BUNDLE_ICON_FILE "${MACOSX_BUNDLE_ICON_FILE}")
else()
include("${CMAKE_SOURCE_DIR}/cmake/IconUtils.cmake")
include(IconUtils)
set(DN_ICON_BASE "${CMAKE_CURRENT_BINARY_DIR}/icons")
set(DN_ICON_PNG_LIST)
foreach(DN_ICON_SIZE 16 32 48 256)
+173
View File
@@ -0,0 +1,173 @@
#!/bin/sh -e
# msys2-configure.sh: set up an MSYS2-based build
#
# Dependencies: AWK, cURL, sha256sum (coreutils), bsdtar (libarchive), jq,
# cabextract, wine
repository=https://repo.msys2.org/mingw/ucrt64/
pkg=mingw-w64-ucrt-x86_64
# Wine 11 has removed wine64, so this is only backwards compatibility.
if command -v wine64 >/dev/null
then wine() { command wine64 "$@"; }
fi
status() {
echo "$(tput bold)-- $*$(tput sgr0)" >&2
}
dbsync() {
status Fetching repository DB
[ -f db.tsv ] || curl -# "$repository/ucrt64.db" | bsdtar -xOf- | awk '
function flush() { print f["%NAME%"] f["%FILENAME%"] f["%DEPENDS%"] }
NR > 1 && $0 == "%FILENAME%" { flush(); for (i in f) delete f[i] }
!/^[^%]/ { field = $0; next } { f[field] = f[field] $0 "\t" }
field == "%SHA256SUM%" { path = "*packages/" f["%FILENAME%"]
sub(/\t$/, "", path); print $0, path > "db.sums" } END { flush() }
' > db.tsv
}
fetch() {
status Resolving "$@"
mkdir -p packages
awk -F'\t' 'function get(name, i, a) {
if (visited[name]++ || !(name in filenames)) return
print filenames[name]; split(deps[name], a); for (i in a) get(a[i])
} BEGIN { while ((getline < "db.tsv") > 0) {
filenames[$1] = $2; deps[$1] = ""; for (i = 3; i <= NF; i++) {
gsub(/[<=>].*/, "", $i); deps[$1] = deps[$1] $i FS }
} for (i = 0; i < ARGC; i++) get(ARGV[i]) }' "$@" | tee db.want | \
while IFS= read -r name
do
status Fetching "$name"
[ -f "packages/$name" ] || curl -#o "packages/$name" "$repository/$name"
done
# SwiftShader
url=$(curl -L# https://github.com/jakoch/rasterizers/releases/latest/download/versions.json \
| jq -r ".latest[\"swiftshader-win64\"].url")
name=$(basename "$url")
status Fetching "$name"
[ -f "$name" ] || curl -#Lo "$name" "$url"
ln -sf "$name" swiftshader.zip
# Visual Studio runtime for SwiftShader
url=https://aka.ms/vs/17/release/vc_redist.x64.exe
sha256=cc0ff0eb1dc3f5188ae6300faef32bf5beeba4bdd6e8e445a9184072096b713b
name=$(basename "$url")
echo "$sha256 *packages/$name" >> db.sums
status Fetching "$name"
[ -f "$name" ] || curl -#Lo "$name" "$url"
# ExifTool
version=$(curl -# https://exiftool.org/ver.txt)
name=exiftool-$version.tar.gz remotename=Image-ExifTool-$version.tar.gz
status Fetching "$remotename"
[ -f "$name" ] || curl -#Lo "$name" \
"https://sourceforge.net/projects/exiftool/files/$remotename/download"
ln -sf "$name" exiftool.tar.gz
# resvg (unstable API, so pinning isn't a bad idea)
url=https://github.com/linebender/resvg/releases/download/v0.48.1/resvg-0.48.1.tar.xz
sha256=13ed5a2bae7a01156288ecae5bf944cf7d1c572742c19fc68027947a4d87294c
name=$(basename "$url")
echo "$sha256 *packages/$name" >> db.sums
status Fetching "$name"
[ -f "$name" ] || curl -#Lo "$name" "$url"
ln -sf "$name" resvg.tar.xz
}
verify() {
status Verifying checksums
sha256sum --ignore-missing --quiet -c db.sums
}
extract() {
status Extracting packages
for subdir in *
do [ -d "$subdir" -a "$subdir" != packages ] && rm -rf -- "$subdir"
done
while IFS= read -r name
do bsdtar -xf "packages/$name" --strip-components 1 \
--exclude '*/share/man' --exclude '*/share/doc'
done < db.want
# SwiftShader
bsdtar -C bin -xf swiftshader.zip vk_swiftshader.dll vk_swiftshader_icd.json
# Visual Studio runtime for SwiftShader
mkdir -p tmp
cabextract -d tmp -F a12 vc_redist.x64.exe
cabextract -d tmp tmp/a12
for n in msvcp140 vcruntime140 vcruntime140_1
do mv tmp/$n.dll_amd64 bin/$n.dll
done
# ExifTool
bsdtar -xf exiftool.tar.gz
mv Image-ExifTool-*/exiftool bin
mv Image-ExifTool-*/lib/* lib/perl5/site_perl
rm -rf Image-ExifTool-*
}
# Reason for building: "Native rustc cannot load upstream rust-std."
# TODO(p): Try to push this bullshit directly to MSYS2.
resvg() {
status rustup x86_64-pc-windows-gnu + resvg
mkdir -p tmp/resvg include/resvg bin lib/pkgconfig
export RUSTUP_HOME=$PWD/tmp/rustup
export CARGO_HOME=$PWD/tmp/cargo
export PATH=$CARGO_HOME/bin:$PATH
export RUSTUP_INIT_SKIP_PATH_CHECK=yes
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- \
-y --no-modify-path --profile minimal --default-toolchain stable
rustup target add x86_64-pc-windows-gnu
src=$PWD/tmp/resvg
bsdtar -C $src -xf resvg.tar.xz --strip-components 1
unset RUSTC
(cd "$src/crates/c-api" && \
CARGO_TARGET_DIR=$src \
CARGO_TARGET_X86_64_PC_WINDOWS_GNU_LINKER=x86_64-w64-mingw32-gcc \
CC_x86_64_pc_windows_gnu=x86_64-w64-mingw32-gcc \
AR_x86_64_pc_windows_gnu=x86_64-w64-mingw32-gcc-ar \
cargo build --release --target x86_64-pc-windows-gnu)
cp $src/crates/c-api/resvg.h include/resvg/resvg.h
mv $src/x86_64-pc-windows-gnu/release/resvg.dll bin/resvg.dll
mv $src/x86_64-pc-windows-gnu/release/libresvg.dll.a lib/libresvg.dll.a
cat >lib/pkgconfig/resvg.pc <<-'EOF'
prefix=/ucrt64
exec_prefix=${prefix}
libdir=${prefix}/lib
includedir=${prefix}/include
Name: resvg
Description: SVG rendering library (C API)
Version: 0
Libs: -L${libdir} -lresvg
Cflags: -I${includedir}/resvg
EOF
}
configure() {
status Configuring packages
wine bin/update-mime-database.exe share/mime
}
# This directory name matches the prefix in .pc files, so we don't need to
# modify them (pkgconf has --prefix-variable, but CMake can't pass that option).
mkdir -p ucrt64
cd ucrt64
dbsync
fetch $pkg-qt6-base $pkg-vulkan-loader $pkg-vulkan-headers $pkg-libwebp \
$pkg-libjpeg-turbo $pkg-libheif $pkg-libraw $pkg-zlib \
$pkg-shared-mime-info $pkg-gcc-libs $pkg-perl $pkg-perl-win32-api
verify
extract
resvg
configure
status Success
Submodule submodules/liberty added at 4cfaf9e2b3