Skip to content

Commit 024c63c

Browse files
committed
ci: add native Windows ARM64 build. Fix #506
1 parent d2df2e9 commit 024c63c

36 files changed

Lines changed: 2492 additions & 10 deletions

.github/workflows/build.windows.workflow.yml

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ concurrency:
1818
jobs:
1919
build:
2020
name: "Build: Windows ${{ matrix.arch }}-${{ matrix.config }}"
21-
runs-on: windows-latest
21+
runs-on: ${{ matrix.os }}
2222
env:
2323
VCPKG_FEATURE_FLAGS: manifests,binarycaching
2424
VCPKG_BINARY_SOURCES: ${{ format('clear;nuget,https://nuget.pkg.github.com/{0}/index.json,{1}', github.repository_owner, github.event_name == 'pull_request' && 'read' || 'readwrite') }}
@@ -29,17 +29,26 @@ jobs:
2929
strategy:
3030
fail-fast: false
3131
matrix:
32-
arch: [x64]
33-
config: [Release]
3432
include:
3533
- arch: x64
34+
os: windows-latest
35+
config: Release
3636
arch_name: 64-bit
3737
arch_suffix: "64"
38+
target_triplet: x64-windows
39+
host_triplet: x64-windows-static-release
40+
- arch: arm64
41+
os: windows-11-arm
42+
config: Release
43+
arch_name: ARM64
44+
arch_suffix: arm64
45+
target_triplet: arm64-windows
46+
host_triplet: arm64-windows-static-release
3847
steps:
3948
- name: Remove Perl Strawberry installation
4049
# Removes conflicting headers from include paths
4150
run: |
42-
Remove-Item -Recurse -Force C:/Strawberry
51+
Remove-Item -Recurse -Force C:/Strawberry -ErrorAction SilentlyContinue
4352
4453
- name: Checkout Git Repo
4554
uses: actions/checkout@v5
@@ -86,8 +95,8 @@ jobs:
8695
configurePresetAdditionalArgs: "['-DDEPS_RELEASE_ONLY=ON', '-DSHORT_VERSION=v3.0', '-DCMAKE_C_COMPILER_LAUNCHER=sccache', '-DCMAKE_CXX_COMPILER_LAUNCHER=sccache']"
8796
buildPreset: 'Win-${{ matrix.arch }}-${{ matrix.config }}'
8897
env:
89-
VCPKG_DEFAULT_TRIPLET: ${{ matrix.arch }}-windows
90-
VCPKG_DEFAULT_HOST_TRIPLET: x64-windows-static-release
98+
VCPKG_DEFAULT_TRIPLET: ${{ matrix.target_triplet }}
99+
VCPKG_DEFAULT_HOST_TRIPLET: ${{ matrix.host_triplet }}
91100
VCPKG_FORCE_SYSTEM_BINARIES: 1
92101

93102
- name: Upload ${{ matrix.arch_name }} ${{ matrix.config }} EXE

gui/qt/CMakePresets.json

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@
2222
"type": "BOOL",
2323
"value": "True"
2424
},
25+
"VCPKG_OVERLAY_PORTS": {
26+
"type": "STRING",
27+
"value": "${sourceDir}/ports"
28+
},
2529
"VCPKG_OVERLAY_TRIPLETS": {
2630
"type": "STRING",
2731
"value": "${sourceDir}/triplets"
@@ -87,6 +91,16 @@
8791
}
8892
}
8993
},
94+
{
95+
"name": "Win-arm64",
96+
"inherits": [ "ninja-vcpkg-arm64", "win-only" ],
97+
"cacheVariables": {
98+
"VCPKG_TARGET_TRIPLET": {
99+
"type": "STRING",
100+
"value": "arm64-windows-static"
101+
}
102+
}
103+
},
90104
{
91105
"name": "Mac-x64",
92106
"inherits": [ "ninja-vcpkg-x64", "mac-only" ],
@@ -144,6 +158,21 @@
144158
"configurePreset": "Win-x64",
145159
"configuration": "Release"
146160
},
161+
{
162+
"name": "Win-arm64-Debug",
163+
"configurePreset": "Win-arm64",
164+
"configuration": "Debug"
165+
},
166+
{
167+
"name": "Win-arm64-RelWithDebInfo",
168+
"configurePreset": "Win-arm64",
169+
"configuration": "RelWithDebInfo"
170+
},
171+
{
172+
"name": "Win-arm64-Release",
173+
"configurePreset": "Win-arm64",
174+
"configuration": "Release"
175+
},
147176
{
148177
"name": "Mac-x64-Debug",
149178
"configurePreset": "Mac-x64",
@@ -205,4 +234,4 @@
205234
"configuration": "Release"
206235
}
207236
]
208-
}
237+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
diff --git a/cmake/3rdparty/extra-cmake-modules/find-modules/FindGLIB2.cmake b/cmake/3rdparty/extra-cmake-modules/find-modules/FindGLIB2.cmake
2+
index 24a194c..91c8e41 100644
3+
--- a/cmake/3rdparty/extra-cmake-modules/find-modules/FindGLIB2.cmake
4+
+++ b/cmake/3rdparty/extra-cmake-modules/find-modules/FindGLIB2.cmake
5+
@@ -95,6 +95,18 @@ find_library(GLIB2_GIO_LIBRARIES
6+
HINTS ${PC_GIO_LIBDIR}
7+
)
8+
9+
+pkg_check_modules(PC_GMODULE QUIET gmodule-2.0)
10+
+
11+
+find_path(GLIB2_GMODULE_INCLUDE_DIRS
12+
+ NAMES gmodule.h
13+
+ HINTS ${PC_GMODULE}
14+
+ PATH_SUFFIXES glib-2.0)
15+
+
16+
+find_library(GLIB2_GMODULE_LIBRARIES
17+
+ NAMES gmodule-2.0
18+
+ HINTS ${PC_GMODULE}
19+
+)
20+
+
21+
# search the glibconfig.h include dir under the same root where the library is found
22+
get_filename_component(glib2LibDir "${GLIB2_LIBRARIES}" PATH)
23+
24+
@@ -126,6 +138,11 @@ if(GLIB2_GIO_LIBRARIES AND GLIB2_GIO_INCLUDE_DIRS)
25+
set(GLIB2_GIO_FOUND TRUE)
26+
endif()
27+
28+
+if(GLIB2_GMODULE_LIBRARIES AND GLIB2_GMODULE_INCLUDE_DIRS)
29+
+ set(GLIB2_GMODULE_FOUND TRUE)
30+
+endif()
31+
+
32+
+
33+
include(FindPackageHandleStandardArgs)
34+
find_package_handle_standard_args(GLIB2
35+
REQUIRED_VARS GLIB2_LIBRARIES GTHREAD2_LIBRARIES GLIB2_INCLUDE_DIRS
36+
@@ -137,6 +154,16 @@ if(GLIB2_FOUND AND NOT TARGET GLIB2::GLIB2)
37+
IMPORTED_LOCATION "${GLIB2_LIBRARIES}"
38+
INTERFACE_LINK_LIBRARIES "${GTHREAD2_LIBRARIES}"
39+
INTERFACE_INCLUDE_DIRECTORIES "${GLIB2_INCLUDE_DIRS}")
40+
+ #vcpkg specific
41+
+ pkg_check_modules(PC_PCRE2_8BIT QUIET libpcre2-8)
42+
+ find_library(PCRE2_8BIT_LIBRARIES
43+
+ NAMES pcre2-8
44+
+ HINTS ${PC_PCRE2_8BIT}
45+
+ )
46+
+ target_link_libraries(GLIB2::GLIB2 INTERFACE ${PCRE2_8BIT_LIBRARIES})
47+
+ find_package(Iconv)
48+
+ find_package(Intl)
49+
+ target_link_libraries(GLIB2::GLIB2 INTERFACE Intl::Intl Iconv::Iconv)
50+
endif()
51+
52+
if(GLIB2_GOBJECT_FOUND AND NOT TARGET GLIB2::GOBJECT)
53+
@@ -153,12 +180,21 @@ if(GLIB2_GIO_FOUND AND NOT TARGET GLIB2::GIO)
54+
INTERFACE_INCLUDE_DIRECTORIES "${GLIB2_GIO_INCLUDE_DIRS}")
55+
endif()
56+
57+
+if(GLIB2_GMODULE_FOUND AND NOT TARGET GLIB2::GMODULE)
58+
+ add_library(GLIB2::GMODULE UNKNOWN IMPORTED)
59+
+ set_target_properties(GLIB2::GMODULE PROPERTIES
60+
+ IMPORTED_LOCATION "${GLIB2_GMODULE_LIBRARIES}"
61+
+ INTERFACE_INCLUDE_DIRECTORIES "${GLIB2_GMODULE_INCLUDE_DIRS}")
62+
+endif()
63+
+
64+
+
65+
mark_as_advanced(GLIB2_INCLUDE_DIRS GLIB2_INCLUDE_DIR
66+
GLIB2_LIBRARIES GLIB2_LIBRARY
67+
GLIB2_GOBJECT_INCLUDE_DIRS GLIB2_GOBJECT_INCLUDE_DIR
68+
GLIB2_GOBJECT_LIBRARIES GLIB2_GOBJECT_LIBRARY
69+
GLIB2_GIO_INCLUDE_DIRS GLIB2_GIO_INCLUDE_DIR
70+
- GLIB2_GIO_LIBRARIES GLIB2_GIO_LIBRARY)
71+
+ GLIB2_GIO_LIBRARIES GLIB2_GIO_LIBRARY
72+
+ GLIB2_GMODULE_LIBRARIES GLIB2_GMODULE_INCLUDE_DIRS)
73+
74+
include(FeatureSummary)
75+
set_package_properties(GLIB2 PROPERTIES
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
diff --git a/cmake/QtBuildPathsHelpers.cmake b/cmake/QtBuildPathsHelpers.cmake
2+
index bd186c28b..2c1994d2e 100644
3+
--- a/cmake/QtBuildPathsHelpers.cmake
4+
+++ b/cmake/QtBuildPathsHelpers.cmake
5+
@@ -141,11 +141,9 @@ function(qt_configure_process_path name default docstring)
6+
elseif(rel_path MATCHES "^\.\./")
7+
# INSTALL_SYSCONFDIR is allowed to be outside the prefix.
8+
if(NOT name STREQUAL "INSTALL_SYSCONFDIR")
9+
- message(FATAL_ERROR
10+
- "Path component '${name}' is outside computed install prefix: ${rel_path} ")
11+
endif()
12+
# Keep the absolute path.
13+
set(new_value "${${name}}")
14+
else()
15+
# Use the canonicalized path.
16+
set(new_value "${rel_path}")
17+
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h
2+
index e40cd85..ba68a01 100644
3+
--- a/src/corelib/kernel/qmetatype.h
4+
+++ b/src/corelib/kernel/qmetatype.h
5+
@@ -18,6 +18,7 @@
6+
#include <QtCore/qscopeguard.h>
7+
#include <QtCore/qttypetraits.h>
8+
9+
+#include <type_traits>
10+
#include <array>
11+
#include <new>
12+
#include <vector>
13+
@@ -826,7 +829,13 @@
14+
struct IsGadgetHelper { enum { IsRealGadget = false, IsGadgetOrDerivedFrom = false }; };
15+
16+
template<typename T>
17+
+#if defined(__clang__) && (__clang_major__ > 11)
18+
+ // Clang does not reject T::QtGadgetHelper as ambiguous if a class inherits from two QGADGETS
19+
+ // but is not a QGADGET itself
20+
+ struct IsGadgetHelper<T, std::void_t<typename T::QtGadgetHelper, decltype(&T::qt_check_for_QGADGET_macro)>>
21+
+#else
22+
struct IsGadgetHelper<T, typename T::QtGadgetHelper>
23+
+#endif
24+
{
25+
template <typename X>
26+
static char checkType(void (X::*)());
27+
@@ -841,7 +850,11 @@
28+
struct IsPointerToGadgetHelper { enum { IsRealGadget = false, IsGadgetOrDerivedFrom = false }; };
29+
30+
template<typename T>
31+
+#if defined(__clang__) && (__clang_major__ > 11)
32+
+ struct IsPointerToGadgetHelper<T*, std::void_t<typename T::QtGadgetHelper, decltype(&T::qt_check_for_QGADGET_macro)>>
33+
+#else
34+
struct IsPointerToGadgetHelper<T*, typename T::QtGadgetHelper>
35+
+#endif
36+
{
37+
using BaseType = T;
38+
template <typename X>
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
diff --git a/src/corelib/kernel/qproperty.h b/src/corelib/kernel/qproperty.h
2+
index 823b2057b..4a8cd4fa8 100644
3+
--- a/src/corelib/kernel/qproperty.h
4+
+++ b/src/corelib/kernel/qproperty.h
5+
@@ -16,8 +16,8 @@
6+
7+
#include <QtCore/qpropertyprivate.h>
8+
9+
-#if __has_include(<source_location>) && __cplusplus >= 202002L && !defined(Q_QDOC)
10+
+#if __has_include(<source_location>) && __cplusplus >= 202002L && !defined(Q_QDOC) && ( (defined(__cpp_consteval) && defined(_MSC_VER)) || !defined(_MSC_VER) )
11+
#include <source_location>
12+
#if defined(__cpp_lib_source_location)
13+
#define QT_SOURCE_LOCATION_NAMESPACE std
14+
#define QT_PROPERTY_COLLECT_BINDING_LOCATION
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
include_guard(GLOBAL)
2+
3+
#Could probably be the beginning of a vcpkg_install_copyright?
4+
function(qt_install_copyright SOURCE_PATH)
5+
#Find the relevant license file and install it
6+
if(EXISTS "${SOURCE_PATH}/LICENSE.LGPLv3")
7+
set(LICENSE_PATH "${SOURCE_PATH}/LICENSE.LGPLv3")
8+
elseif(EXISTS "${SOURCE_PATH}/LICENSE.LGPL3")
9+
set(LICENSE_PATH "${SOURCE_PATH}/LICENSE.LGPL3")
10+
elseif(EXISTS "${SOURCE_PATH}/LICENSE.GPLv3")
11+
set(LICENSE_PATH "${SOURCE_PATH}/LICENSE.GPLv3")
12+
elseif(EXISTS "${SOURCE_PATH}/LICENSE.GPL3")
13+
set(LICENSE_PATH "${SOURCE_PATH}/LICENSE.GPL3")
14+
elseif(EXISTS "${SOURCE_PATH}/LICENSE.GPL3-EXCEPT")
15+
set(LICENSE_PATH "${SOURCE_PATH}/LICENSE.GPL3-EXCEPT")
16+
elseif(EXISTS "${SOURCE_PATH}/LICENSE.FDL")
17+
set(LICENSE_PATH "${SOURCE_PATH}/LICENSE.FDL")
18+
endif()
19+
if(LICENSE_PATH)
20+
file(INSTALL "${LICENSE_PATH}" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}" RENAME copyright)
21+
elseif(EXISTS "${SOURCE_PATH}/LICENSES")
22+
file(GLOB LICENSES "${SOURCE_PATH}/LICENSES/*")
23+
vcpkg_install_copyright(FILE_LIST ${LICENSES})
24+
else()
25+
message(WARNING "No license/copyright file found!")
26+
endif()
27+
endfunction()

0 commit comments

Comments
 (0)