Unfuck Windows build
This commit is contained in:
@@ -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
@@ -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)
|
||||
|
||||
@@ -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].
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,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
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -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
@@ -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)
|
||||
|
||||
Executable
+173
@@ -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
+1
Submodule submodules/liberty added at 4cfaf9e2b3
Reference in New Issue
Block a user