From 99d9d68e663b824e32f988c36fa0b81d524faa65 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Mon, 28 Jul 2025 21:59:27 +1000 Subject: [PATCH 01/59] Initial addition of arm64 configuration --- core/build.bat | 10 +- core/build.sh | 11 +- core/commands.inc.sh | 6 +- resources/build/meson/standard.meson.build | 2 +- windows/src/engine/engine.sln | 30 ++ .../src/engine/keyman32/keyman-engine.vcxproj | 265 ++++++++++++++++++ windows/src/engine/keyman32/keyman32.vcxproj | 171 +++++++++++ .../keyman-engine-tests.vcxproj | 53 +++- .../src/engine/keymanx64/keymanx64.vcxproj | 113 ++++++++ .../src/engine/kmrefresh/kmrefresh.vcxproj | 65 +++++ windows/src/engine/kmtip/kmtip.vcxproj | 179 ++++++++++++ windows/src/engine/mcompile/mcompile.vcxproj | 84 ++++++ windows/src/engine/testhost/testhost.vcxproj | 67 +++++ 13 files changed, 1047 insertions(+), 9 deletions(-) diff --git a/core/build.bat b/core/build.bat index 5dd219e9f2..790ca31ebe 100644 --- a/core/build.bat +++ b/core/build.bat @@ -8,6 +8,8 @@ if "%1"=="" goto help if "%1"=="all" goto all if "%1"=="x86" goto build if "%1"=="x64" goto build +if "%1"=="ARM64" goto build + echo "Invalid parameter." goto help @@ -15,9 +17,9 @@ goto help rem ---------------------------------- :help -echo Usage: %0 x86^|x64^|all debug^|release [configure] [build] [test] [additional params for meson/ninja] +echo Usage: %0 x86^|x64^|ARM64^|all debug^|release [configure] [build] [test] [additional params for meson/ninja] echo or -echo Usage: %0 x86^|x64 -c +echo Usage: %0 x86^|x64^|ARM64^ -c echo -c will leave your environment configured for Visual Studio for selected platform. echo. echo Otherwise, %0 is intended to be used by build.sh, not directly. @@ -35,6 +37,10 @@ cmd /c build.bat x86 %2 %3 %4 %5 %6 %7 %8 %9 || exit !errorlevel! cd %KEYMAN_ROOT%\core cmd /c build.bat x64 %2 %3 %4 %5 %6 %7 %8 %9 || exit !errorlevel! +cd %KEYMAN_ROOT%\core +echo cmd /c build.bat ARM64 %2 %3 %4 %5 %6 %7 %8 %9 || exit !errorlevel! +cmd /c build.bat ARM64 %2 %3 %4 %5 %6 %7 %8 %9 || exit !errorlevel! + goto :eof rem ---------------------------------- diff --git a/core/build.sh b/core/build.sh index 94e8ae4e38..5360d80c8e 100755 --- a/core/build.sh +++ b/core/build.sh @@ -32,6 +32,7 @@ case $BUILDER_OS in ":win Both x86 and x64" ":x86 32-bit Windows (x86) build" ":x64 64-bit Windows (x64) build" + ":arm64 64-bit Windows (arm64) build" ) ;; mac) @@ -96,12 +97,14 @@ builder_describe_internal_dependency \ build:mac build:mac-x86_64 \ build:mac build:mac-arm64 \ build:win build:x86 \ - build:win build:x64 + build:win build:x64 \ + build:arch build:arm64 \ builder_describe_outputs \ configure:win /core/build/win/$BUILDER_CONFIGURATION/ \ configure:x86 /core/build/x86/$BUILDER_CONFIGURATION/build.ninja \ configure:x64 /core/build/x64/$BUILDER_CONFIGURATION/build.ninja \ + configure:arm64 /core/build/arm64/$BUILDER_CONFIGURATION/build.ninja \ configure:mac /core/build/mac/$BUILDER_CONFIGURATION/ \ configure:mac-x86_64 /core/build/mac-x86_64/$BUILDER_CONFIGURATION/build.ninja \ configure:mac-arm64 /core/build/mac-arm64/$BUILDER_CONFIGURATION/build.ninja \ @@ -110,6 +113,7 @@ builder_describe_outputs \ build:win /core/build/win/$BUILDER_CONFIGURATION/BUILT \ build:x86 /core/build/x86/$BUILDER_CONFIGURATION/src/libkeymancore.a \ build:x64 /core/build/x64/$BUILDER_CONFIGURATION/src/libkeymancore.a \ + build:arm64 /core/build/arm64/$BUILDER_CONFIGURATION/src/libkeymancore.a \ build:mac /core/build/mac/$BUILDER_CONFIGURATION/libkeymancore.a \ build:mac-x86_64 /core/build/mac-x86_64/$BUILDER_CONFIGURATION/src/libkeymancore.a \ build:mac-arm64 /core/build/mac-arm64/$BUILDER_CONFIGURATION/src/libkeymancore.a \ @@ -130,7 +134,7 @@ fi # Iterate through all possible targets; note that targets that cannot be built # on the current platform have already been excluded through the archtargets # settings above -targets=(wasm x86 x64 mac-x86_64 mac-arm64 arch) +targets=(wasm x86 x64 arm64 mac-x86_64 mac-arm64 arch) do_action() { local action_function=do_$1 @@ -191,6 +195,9 @@ if builder_start_action test:win; then meson test -C "$MESON_PATH" $testparams MESON_PATH="$KEYMAN_ROOT/core/build/x64/$BUILDER_CONFIGURATION" meson test -C "$MESON_PATH" $testparams + MESON_PATH="$KEYMAN_ROOT/core/build/arm64/$BUILDER_CONFIGURATION" + meson test -C "$MESON_PATH" $testparams + builder_finish_action success test:win fi diff --git a/core/commands.inc.sh b/core/commands.inc.sh index 73ad033a8e..9672244c86 100644 --- a/core/commands.inc.sh +++ b/core/commands.inc.sh @@ -50,7 +50,7 @@ do_configure() { STANDARD_MESON_ARGS="$STANDARD_MESON_ARGS --cross-file wasm.defs.build --cross-file wasm.build --default-library static" fi - if [[ $target =~ ^(x86|x64)$ ]]; then + if [[ $target =~ ^(x86|x64|ARM64)$ ]]; then cmd //C build.bat $target $BUILDER_CONFIGURATION configure $BUILD_BAT_keyman_core_tests "${builder_extra_params[@]}" else pushd "$THIS_SCRIPT_PATH" > /dev/null @@ -69,7 +69,7 @@ do_configure() { do_build() { local target=$1 builder_start_action build:$target || return 0 - if [[ $target =~ ^(x86|x64)$ ]]; then + if [[ $target =~ ^(x86|x64|ARM64)$ ]]; then cmd //C build.bat $target $BUILDER_CONFIGURATION build "${builder_extra_params[@]}" elif $MESON_LOW_VERSION; then pushd "$MESON_PATH" > /dev/null @@ -88,7 +88,7 @@ do_build() { do_test() { local target=$1 builder_start_action test:$target || return 0 - if [[ $target =~ ^(x86|x64)$ ]]; then + if [[ $target =~ ^(x86|x64|ARM64)$ ]]; then cmd //C build.bat $target $BUILDER_CONFIGURATION test $testparams else if [[ $target == wasm ]] && builder_is_macos; then diff --git a/resources/build/meson/standard.meson.build b/resources/build/meson/standard.meson.build index 300a00d8e9..01360ac7fb 100644 --- a/resources/build/meson/standard.meson.build +++ b/resources/build/meson/standard.meson.build @@ -20,7 +20,7 @@ c_compiler = meson.get_compiler('c') # for language standard version instead of using "-std=c++17".' # But that is not possible to do after creating the project... # See also https://github.com/mesonbuild/meson/issues/10685 -add_project_arguments('-std=c++17', language: 'cpp') +add_project_arguments('/std:c++17', language: 'cpp') # # Standard informational messages for our builds diff --git a/windows/src/engine/engine.sln b/windows/src/engine/engine.sln index f45c0bcacc..8adf2e565e 100644 --- a/windows/src/engine/engine.sln +++ b/windows/src/engine/engine.sln @@ -21,66 +21,96 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testhost", "testhost\testho EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM64 = Debug|ARM64 Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 + Release|ARM64 = Release|ARM64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Debug|ARM64.Build.0 = Debug|ARM64 {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Debug|Win32.ActiveCfg = Debug|Win32 {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Debug|Win32.Build.0 = Debug|Win32 {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Debug|x64.ActiveCfg = Debug|x64 {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Debug|x64.Build.0 = Debug|x64 + {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Release|ARM64.ActiveCfg = Release|ARM64 + {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Release|ARM64.Build.0 = Release|ARM64 {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Release|Win32.ActiveCfg = Release|Win32 {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Release|Win32.Build.0 = Release|Win32 {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Release|x64.ActiveCfg = Release|x64 {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Release|x64.Build.0 = Release|x64 + {A34650EA-D6E8-4229-8091-6BF1443565B5}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {A34650EA-D6E8-4229-8091-6BF1443565B5}.Debug|ARM64.Build.0 = Debug|ARM64 {A34650EA-D6E8-4229-8091-6BF1443565B5}.Debug|Win32.ActiveCfg = Debug|x64 {A34650EA-D6E8-4229-8091-6BF1443565B5}.Debug|x64.ActiveCfg = Debug|x64 {A34650EA-D6E8-4229-8091-6BF1443565B5}.Debug|x64.Build.0 = Debug|x64 + {A34650EA-D6E8-4229-8091-6BF1443565B5}.Release|ARM64.ActiveCfg = Release|ARM64 + {A34650EA-D6E8-4229-8091-6BF1443565B5}.Release|ARM64.Build.0 = Release|ARM64 {A34650EA-D6E8-4229-8091-6BF1443565B5}.Release|Win32.ActiveCfg = Release|x64 {A34650EA-D6E8-4229-8091-6BF1443565B5}.Release|x64.ActiveCfg = Release|x64 {A34650EA-D6E8-4229-8091-6BF1443565B5}.Release|x64.Build.0 = Release|x64 + {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Debug|ARM64.Build.0 = Debug|ARM64 {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Debug|Win32.ActiveCfg = Debug|Win32 {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Debug|Win32.Build.0 = Debug|Win32 {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Debug|x64.ActiveCfg = Debug|x64 {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Debug|x64.Build.0 = Debug|x64 + {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Release|ARM64.ActiveCfg = Release|ARM64 + {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Release|ARM64.Build.0 = Release|ARM64 {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Release|Win32.ActiveCfg = Release|Win32 {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Release|Win32.Build.0 = Release|Win32 {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Release|x64.ActiveCfg = Release|x64 {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Release|x64.Build.0 = Release|x64 + {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Debug|ARM64.ActiveCfg = Debug|Win32 {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Debug|Win32.ActiveCfg = Debug|Win32 {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Debug|Win32.Build.0 = Debug|Win32 {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Debug|x64.ActiveCfg = Debug|Win32 + {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Release|ARM64.ActiveCfg = Release|ARM64 {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Release|Win32.ActiveCfg = Release|Win32 {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Release|Win32.Build.0 = Release|Win32 {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Release|x64.ActiveCfg = Release|Win32 + {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Debug|ARM64.Build.0 = Debug|ARM64 {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Debug|Win32.ActiveCfg = Debug|Win32 {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Debug|Win32.Build.0 = Debug|Win32 {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Debug|x64.ActiveCfg = Debug|x64 {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Debug|x64.Build.0 = Debug|x64 + {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Release|ARM64.ActiveCfg = Release|ARM64 + {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Release|ARM64.Build.0 = Release|ARM64 {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Release|Win32.ActiveCfg = Release|Win32 {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Release|Win32.Build.0 = Release|Win32 {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Release|x64.ActiveCfg = Release|x64 {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Release|x64.Build.0 = Release|x64 + {46399ED7-79A1-4E7E-BD96-4B1AEEC838AE}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {46399ED7-79A1-4E7E-BD96-4B1AEEC838AE}.Debug|ARM64.Build.0 = Debug|ARM64 {46399ED7-79A1-4E7E-BD96-4B1AEEC838AE}.Debug|Win32.ActiveCfg = Debug|Win32 {46399ED7-79A1-4E7E-BD96-4B1AEEC838AE}.Debug|Win32.Build.0 = Debug|Win32 {46399ED7-79A1-4E7E-BD96-4B1AEEC838AE}.Debug|x64.ActiveCfg = Debug|x64 {46399ED7-79A1-4E7E-BD96-4B1AEEC838AE}.Debug|x64.Build.0 = Debug|x64 + {46399ED7-79A1-4E7E-BD96-4B1AEEC838AE}.Release|ARM64.ActiveCfg = Release|ARM64 + {46399ED7-79A1-4E7E-BD96-4B1AEEC838AE}.Release|ARM64.Build.0 = Release|ARM64 {46399ED7-79A1-4E7E-BD96-4B1AEEC838AE}.Release|Win32.ActiveCfg = Release|Win32 {46399ED7-79A1-4E7E-BD96-4B1AEEC838AE}.Release|Win32.Build.0 = Release|Win32 {46399ED7-79A1-4E7E-BD96-4B1AEEC838AE}.Release|x64.ActiveCfg = Release|x64 {46399ED7-79A1-4E7E-BD96-4B1AEEC838AE}.Release|x64.Build.0 = Release|x64 + {A7069186-5AE7-4504-8926-861B7A34BA9E}.Debug|ARM64.ActiveCfg = Debug|Win32 {A7069186-5AE7-4504-8926-861B7A34BA9E}.Debug|Win32.ActiveCfg = Debug|Win32 {A7069186-5AE7-4504-8926-861B7A34BA9E}.Debug|Win32.Build.0 = Debug|Win32 {A7069186-5AE7-4504-8926-861B7A34BA9E}.Debug|x64.ActiveCfg = Debug|Win32 + {A7069186-5AE7-4504-8926-861B7A34BA9E}.Release|ARM64.ActiveCfg = Release|ARM64 {A7069186-5AE7-4504-8926-861B7A34BA9E}.Release|Win32.ActiveCfg = Release|Win32 {A7069186-5AE7-4504-8926-861B7A34BA9E}.Release|Win32.Build.0 = Release|Win32 {A7069186-5AE7-4504-8926-861B7A34BA9E}.Release|x64.ActiveCfg = Release|Win32 + {12818DA3-0472-49A5-96FC-A4808A1A77FA}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {12818DA3-0472-49A5-96FC-A4808A1A77FA}.Debug|ARM64.Build.0 = Debug|ARM64 {12818DA3-0472-49A5-96FC-A4808A1A77FA}.Debug|Win32.ActiveCfg = Debug|Win32 {12818DA3-0472-49A5-96FC-A4808A1A77FA}.Debug|Win32.Build.0 = Debug|Win32 {12818DA3-0472-49A5-96FC-A4808A1A77FA}.Debug|x64.ActiveCfg = Debug|x64 {12818DA3-0472-49A5-96FC-A4808A1A77FA}.Debug|x64.Build.0 = Debug|x64 + {12818DA3-0472-49A5-96FC-A4808A1A77FA}.Release|ARM64.ActiveCfg = Release|ARM64 + {12818DA3-0472-49A5-96FC-A4808A1A77FA}.Release|ARM64.Build.0 = Release|ARM64 {12818DA3-0472-49A5-96FC-A4808A1A77FA}.Release|Win32.ActiveCfg = Release|Win32 {12818DA3-0472-49A5-96FC-A4808A1A77FA}.Release|Win32.Build.0 = Release|Win32 {12818DA3-0472-49A5-96FC-A4808A1A77FA}.Release|x64.ActiveCfg = Release|x64 diff --git a/windows/src/engine/keyman32/keyman-engine.vcxproj b/windows/src/engine/keyman32/keyman-engine.vcxproj index f958f9a797..43b74d9880 100644 --- a/windows/src/engine/keyman32/keyman-engine.vcxproj +++ b/windows/src/engine/keyman32/keyman-engine.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug Win32 + + Release + ARM64 + Release Win32 @@ -21,11 +29,21 @@ false v142 + + StaticLibrary + false + v142 + StaticLibrary false v142 + + StaticLibrary + false + v142 + @@ -33,34 +51,62 @@ + + + + + + + + <_ProjectFileVersion>10.0.30319.1 $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ false + false $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ true + true AllRules.ruleset + AllRules.ruleset + + AllRules.ruleset + AllRules.ruleset + + $(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\x86\$(Configuration);$(LibraryPath) $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\include;$(ProjectDir)..\..\..\..\core\include;$(IncludePath) + + $(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\x86\$(Configuration);$(LibraryPath) + $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\include;$(ProjectDir)..\..\..\..\core\include;$(IncludePath) + $(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\rust\x86\$(Configuration);$(LibraryPath) $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\include;$(IncludePath) + + $(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\rust\x86\$(Configuration);$(LibraryPath) + $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\include;$(IncludePath) + NDEBUG;%(PreprocessorDefinitions) @@ -125,6 +171,68 @@ + + + NDEBUG;%(PreprocessorDefinitions) + true + true + ./Keyman32.tlb + + + + + MaxSpeed + OnlyExplicitInline + .\;..\..\global\inc;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + + + MultiThreaded + true + Use + pch.h + All + ./ + ./ + ./ + Level4 + true + true + ProgramDatabase + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + /verbose:lib /section:.SHARDATA,rws %(AdditionalOptions) + keymancore.lib;libicuuc.a;libicuin.a;psapi.lib;rpcrt4.lib;version.lib;setupapi.lib;iphlpapi.lib;imm32.lib;crypt32.lib;wintrust.lib;imagehlp.lib;ws2_32.lib;%(AdditionalDependencies) + ./Keyman32.dll + true + keyman32.def + true + ./Keyman32.pdb + true + ./Keyman32.map + false + Windows + true + true + 0x1c100000 + ./Keyman32.lib + true + true + + + true + ./Keyman32.bsc + + + + + + _DEBUG;%(PreprocessorDefinitions) @@ -184,66 +292,159 @@ + + + _DEBUG;%(PreprocessorDefinitions) + true + true + ./Keyman32.tlb + + + + + Disabled + .\;..\..\global\inc;.;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + + + MultiThreadedDebug + Use + pch.h + All + ./ + ./ + ./ + true + Level4 + true + true + EditAndContinue + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + /verbose:lib /section:.SHARDATA,rws %(AdditionalOptions) + keymancore.lib;psapi.lib;rpcrt4.lib;version.lib;setupapi.lib;iphlpapi.lib;imm32.lib;crypt32.lib;wintrust.lib;imagehlp.lib;ws2_32.lib;%(AdditionalDependencies) + ./Keyman32.dll + true + keyman32.def + true + ./Keyman32.pdb + true + ./Keyman32.map + Windows + 0x1C100000 + ./Keyman32.lib + true + true + + + true + ./Keyman32.bsc + + + + + + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) @@ -251,56 +452,90 @@ %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) Create + Create Create + Create @@ -310,47 +545,75 @@ %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) Document false + false false + false mc %(FullPath) + mc %(FullPath) Compiling keyman-debug-etw + Compiling keyman-debug-etw %(Filename).rc;%(Filename.h);MSG00001.bin + %(Filename).rc;%(Filename.h);MSG00001.bin mc %(FullPath) + mc %(FullPath) Compiling keyman-debug-etw + Compiling keyman-debug-etw %(Filename).rc;%(Filename.h);MSG00001.bin + %(Filename).rc;%(Filename.h);MSG00001.bin Designer @@ -361,7 +624,9 @@ %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) diff --git a/windows/src/engine/keyman32/keyman32.vcxproj b/windows/src/engine/keyman32/keyman32.vcxproj index 8f75aeb126..884eab9d74 100644 --- a/windows/src/engine/keyman32/keyman32.vcxproj +++ b/windows/src/engine/keyman32/keyman32.vcxproj @@ -1,6 +1,10 @@  + + Debug + ARM64 + Debug Win32 @@ -9,6 +13,10 @@ Debug x64 + + Release + ARM64 + Release Win32 @@ -35,6 +43,11 @@ false v142 + + DynamicLibrary + false + v142 + DynamicLibrary false @@ -45,6 +58,11 @@ false v142 + + DynamicLibrary + false + v142 + @@ -56,6 +74,10 @@ + + + + @@ -64,33 +86,49 @@ + + + + <_ProjectFileVersion>10.0.30319.1 $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ false false + false $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ true true + true AllRules.ruleset AllRules.ruleset + AllRules.ruleset + + AllRules.ruleset AllRules.ruleset + AllRules.ruleset + + $(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\x86\$(Configuration);$(LibraryPath) @@ -102,6 +140,11 @@ $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\include;$(IncludePath) keyman64 + + $(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\x64\$(Configuration);$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64) + $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\include;$(IncludePath) + keyman64 + $(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\x86\$(Configuration);$(LibraryPath) $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\include;$(IncludePath) @@ -112,6 +155,11 @@ $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\include;$(IncludePath) keyman64 + + $(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\x64\$(Configuration);$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64) + $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\include;$(IncludePath) + keyman64 + NDEBUG;%(PreprocessorDefinitions) @@ -226,6 +274,62 @@ + + + NDEBUG;%(PreprocessorDefinitions) + true + true + ./Keyman32.tlb + + + + + MaxSpeed + OnlyExplicitInline + .\;..\..\global\inc;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + + + MultiThreaded + true + Use + pch.h + All + Level4 + true + true + ProgramDatabase + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + /verbose:lib /section:.SHARDATA,rws %(AdditionalOptions) + libicuuc.a;libicuin.a;libkeymancore.a;psapi.lib;rpcrt4.lib;version.lib;setupapi.lib;iphlpapi.lib;imm32.lib;crypt32.lib;wintrust.lib;imagehlp.lib;ws2_32.lib;%(AdditionalDependencies) + true + keyman64.def + true + true + false + Windows + true + true + 0x1c100000 + true + true + ..\..\..\lib\keyman64.lib + + + true + ./Keyman64.bsc + + + + + + _DEBUG;%(PreprocessorDefinitions) @@ -330,6 +434,57 @@ + + + _DEBUG;%(PreprocessorDefinitions) + true + true + ./Keyman32.tlb + + + + + Disabled + .\;..\..\global\inc;.;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + + + MultiThreadedDebug + Use + pch.h + All + true + Level4 + true + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + /verbose:lib /section:.SHARDATA,rws %(AdditionalOptions) + libicuuc.a;libicuin.a;libkeymancore.a;psapi.lib;rpcrt4.lib;version.lib;setupapi.lib;iphlpapi.lib;imm32.lib;crypt32.lib;wintrust.lib;imagehlp.lib;ws2_32.lib;%(AdditionalDependencies) + true + keyman64.def + true + true + Windows + 0x1C100000 + true + true + ..\..\..\lib\keyman64.lib + + + true + ./Keyman32.bsc + + + + + + @@ -363,8 +518,10 @@ Create Create + Create Create Create + Create @@ -384,25 +541,35 @@ Document false false + false false false + false mc %(FullPath) mc %(FullPath) + mc %(FullPath) Compiling keyman-debug-etw Compiling keyman-debug-etw + Compiling keyman-debug-etw %(Filename).rc;%(Filename.h);MSG00001.bin %(Filename).rc;%(Filename.h);MSG00001.bin + %(Filename).rc;%(Filename.h);MSG00001.bin mc %(FullPath) mc %(FullPath) + mc %(FullPath) Compiling keyman-debug-etw Compiling keyman-debug-etw + Compiling keyman-debug-etw %(Filename).rc;%(Filename.h);MSG00001.bin %(Filename).rc;%(Filename.h);MSG00001.bin + %(Filename).rc;%(Filename.h);MSG00001.bin Designer true + true true + true @@ -416,10 +583,14 @@ %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) true + true true + true true diff --git a/windows/src/engine/keyman32/tests/keyman-engine-tests/keyman-engine-tests.vcxproj b/windows/src/engine/keyman32/tests/keyman-engine-tests/keyman-engine-tests.vcxproj index 48afed6fdd..c07c5a213c 100644 --- a/windows/src/engine/keyman32/tests/keyman-engine-tests/keyman-engine-tests.vcxproj +++ b/windows/src/engine/keyman32/tests/keyman-engine-tests/keyman-engine-tests.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug Win32 + + Release + ARM64 + Release Win32 @@ -50,11 +58,21 @@ $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + $(ProjectDir)..\..\..\..\..\..\common\include;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\include;$(ProjectDir)..\..\..\..\..\..\core\include;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\global\inc;$(ProjectDir)..\..;$(IncludePath) + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + $(ProjectDir)..\..\..\..\..\..\common\include;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\include;$(ProjectDir)..\..\..\..\..\..\core\include;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\global\inc;$(ProjectDir)..\..;$(IncludePath) $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + $(ProjectDir)..\..\..\..\..\..\common\include;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\include;$(ProjectDir)..\..\..\..\..\..\core\include;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\global\inc;$(ProjectDir)..\..;$(IncludePath) + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + @@ -68,7 +86,9 @@ Create Create Create + Create Create + Create @@ -119,6 +139,21 @@ Console + + + Use + pch.h + Disabled + X64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + Level3 + + + true + Console + + Use @@ -151,10 +186,26 @@ true + + + Use + pch.h + X64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreaded + Level3 + ProgramDatabase + + + true + Console + true + true + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - + \ No newline at end of file diff --git a/windows/src/engine/keymanx64/keymanx64.vcxproj b/windows/src/engine/keymanx64/keymanx64.vcxproj index 82b3bcb59f..584707bd96 100644 --- a/windows/src/engine/keymanx64/keymanx64.vcxproj +++ b/windows/src/engine/keymanx64/keymanx64.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug x64 + + Release + ARM64 + Release x64 @@ -23,39 +31,72 @@ true v142 + + Application + Unicode + true + v142 + Application Unicode v142 + + Application + Unicode + v142 + + + + + + + <_ProjectFileVersion>10.0.30319.1 $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ true + true false + false $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ false + false false + false AllRules.ruleset + AllRules.ruleset + + AllRules.ruleset + AllRules.ruleset + + *.cdf;*.cache;*.obj;*.ilk;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.metagen;*.bi + *.cdf;*.cache;*.obj;*.ilk;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.metagen;*.bi *.cdf;*.cache;*.obj;*.ilk;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.metagen;*.bi + *.cdf;*.cache;*.obj;*.ilk;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.metagen;*.bi @@ -97,6 +138,43 @@ + + + + Disabled + ..\..\global\inc;..\..\..\..\common\windows\delphi\ext\sentry;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + false + true + EnableFastChecks + MultiThreadedDebug + + + Level4 + true + ProgramDatabase + true + + + ..\..\..\..\common\windows\delphi\ext\sentry\sentry.x64.lib;keyman64.lib;libcmtd.lib;%(AdditionalDependencies) + ..\..\..\lib;%(AdditionalLibraryDirectories) + false + true + Windows + true + sentry.dll + + + + + + + + + + + + X64 @@ -135,6 +213,41 @@ + + + + ..\..\global\inc;..\..\..\..\common\windows\delphi\ext\sentry;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + false + MultiThreaded + + + Level4 + true + ProgramDatabase + true + + + ..\..\..\..\common\windows\delphi\ext\sentry\sentry.x64.lib;keyman64.lib;libcmt.lib;%(AdditionalDependencies) + ..\..\..\lib;%(AdditionalLibraryDirectories) + false + true + Windows + true + true + true + true + sentry.dll + + + + + + + + + + diff --git a/windows/src/engine/kmrefresh/kmrefresh.vcxproj b/windows/src/engine/kmrefresh/kmrefresh.vcxproj index a978cb947e..07042e98b2 100644 --- a/windows/src/engine/kmrefresh/kmrefresh.vcxproj +++ b/windows/src/engine/kmrefresh/kmrefresh.vcxproj @@ -1,10 +1,18 @@ + + Debug + ARM64 + Debug Win32 + + Release + ARM64 + Release Win32 @@ -44,6 +52,12 @@ Unicode v142 + + Application + true + Unicode + v142 + Application false @@ -51,6 +65,13 @@ Unicode v142 + + Application + false + true + Unicode + v142 + @@ -65,15 +86,26 @@ + + + + + + $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectName).x64 $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectName).x64 + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ @@ -89,6 +121,11 @@ $(ProjectName).x64 $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectName).x64 + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + Level3 @@ -113,6 +150,18 @@ Windows + + + Level3 + Disabled + true + true + MultiThreadedDebug + + + Windows + + Level3 @@ -145,6 +194,22 @@ true + + + Level3 + MaxSpeed + true + true + true + true + MultiThreaded + + + Windows + true + true + + diff --git a/windows/src/engine/kmtip/kmtip.vcxproj b/windows/src/engine/kmtip/kmtip.vcxproj index f3fb74116f..f9591f0053 100644 --- a/windows/src/engine/kmtip/kmtip.vcxproj +++ b/windows/src/engine/kmtip/kmtip.vcxproj @@ -1,6 +1,10 @@  + + Debug + ARM64 + Debug Win32 @@ -9,6 +13,10 @@ Debug x64 + + Release + ARM64 + Release Win32 @@ -35,6 +43,12 @@ MultiByte v142 + + DynamicLibrary + false + MultiByte + v142 + DynamicLibrary false @@ -47,6 +61,12 @@ MultiByte v142 + + DynamicLibrary + false + MultiByte + v142 + @@ -58,6 +78,10 @@ + + + + @@ -66,43 +90,65 @@ + + + + <_ProjectFileVersion>10.0.30319.1 $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ true true + true false false + false $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ true true + true true true + true AllRules.ruleset AllRules.ruleset + AllRules.ruleset + + AllRules.ruleset AllRules.ruleset + AllRules.ruleset + + .dll .dll + .dll .dll .dll + .dll kmtip64 + kmtip64 kmtip64 + kmtip64 @@ -190,6 +236,48 @@ ./kmtip.bsc + + + NDEBUG;%(PreprocessorDefinitions) + true + true + ./kmtip.tlb + + + + + MaxSpeed + OnlyExplicitInline + .\;..\..\global\inc;..\..\resellers;C:\Program Files\Microsoft Platform SDK\Include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;KMTIP_EXPORTS;%(PreprocessorDefinitions) + true + MultiThreaded + true + All + Level3 + true + true + Use + pch.h + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c09 + + + ..\..\..\lib\keyman64.lib;version.lib;wintrust.lib;crypt32.lib;imagehlp.lib;%(AdditionalDependencies) + true + .\kmtip64.def + true + 0x4C100000 + true + true + + + true + ./kmtip.bsc + + _DEBUG;%(PreprocessorDefinitions) @@ -274,6 +362,47 @@ ./kmtip.bsc + + + _DEBUG;%(PreprocessorDefinitions) + true + true + ./kmtip.tlb + + + + + Disabled + .\;..\..\global\inc;..\..\resellers;C:\Program Files\Microsoft Platform SDK\Include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;KMTIP_EXPORTS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + true + Level3 + true + ProgramDatabase + true + Use + pch.h + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c09 + + + ..\..\..\lib\keyman64.lib;version.lib;wintrust.lib;crypt32.lib;imagehlp.lib;%(AdditionalDependencies) + true + .\kmtip64.def + true + true + 0x4C100000 + true + + + true + ./kmtip.bsc + + @@ -282,125 +411,173 @@ %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) Create Create Create + Create Create + Create %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) true + true true + true true @@ -411,8 +588,10 @@ %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) diff --git a/windows/src/engine/mcompile/mcompile.vcxproj b/windows/src/engine/mcompile/mcompile.vcxproj index e9c426a330..4ec8e905d3 100644 --- a/windows/src/engine/mcompile/mcompile.vcxproj +++ b/windows/src/engine/mcompile/mcompile.vcxproj @@ -1,10 +1,18 @@  + + Debug + ARM64 + Debug Win32 + + Release + ARM64 + Release Win32 @@ -24,6 +32,12 @@ Unicode v142 + + Application + true + Unicode + v142 + Application false @@ -31,15 +45,28 @@ Unicode v142 + + Application + false + true + Unicode + v142 + + + + + + + true @@ -48,12 +75,25 @@ *.cdf;*.cache;*.obj;*.ilk;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.metagen;*.bi $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + true + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + false + *.cdf;*.cache;*.obj;*.ilk;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.metagen;*.bi + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + false $(ProjectDir)bin\$(Platform)\$(Configuration)\ false $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + false + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + false + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + Use @@ -71,6 +111,23 @@ sentry.dll + + + Use + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDebug + ..\..\..\..\common\windows\delphi\ext\sentry;..\..\global\inc + pch.h + + + Console + true + ..\..\..\..\common\windows\delphi\ext\sentry\sentry.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + sentry.dll + + Level3 @@ -92,6 +149,27 @@ sentry.dll + + + Level3 + Use + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreaded + ..\..\..\..\common\windows\delphi\ext\sentry;..\..\global\inc + pch.h + + + Console + true + true + true + ..\..\..\..\common\windows\delphi\ext\sentry\sentry.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + sentry.dll + + @@ -106,7 +184,9 @@ NotUsing + NotUsing NotUsing + NotUsing @@ -117,9 +197,13 @@ Create + Create Create + Create pch.h + pch.h pch.h + pch.h diff --git a/windows/src/engine/testhost/testhost.vcxproj b/windows/src/engine/testhost/testhost.vcxproj index 8b965e942c..14dd0df0ce 100644 --- a/windows/src/engine/testhost/testhost.vcxproj +++ b/windows/src/engine/testhost/testhost.vcxproj @@ -1,10 +1,18 @@ + + Debug + ARM64 + Debug Win32 + + Release + ARM64 + Release Win32 @@ -45,6 +53,12 @@ v142 Unicode + + Application + true + v142 + Unicode + Application false @@ -52,6 +66,13 @@ true Unicode + + Application + false + v142 + true + Unicode + @@ -66,9 +87,15 @@ + + + + + + true @@ -85,11 +112,21 @@ $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + true + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + false $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + false + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + Level3 @@ -133,6 +170,19 @@ true + + + Level3 + true + _DEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + stdcpp17 + + + Windows + true + + Level3 @@ -150,6 +200,23 @@ true + + + Level3 + true + true + true + NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + stdcpp17 + + + Windows + true + true + true + + From 1c41bdb669ec2aaac5f35db1b8dafbd17a9222d1 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Thu, 31 Jul 2025 17:45:54 +1000 Subject: [PATCH 02/59] modify dll base address for 64bit arm and x64 --- .../src/engine/keyman32/keyman-engine.vcxproj | 8 ++++---- windows/src/engine/keyman32/keyman32.vcxproj | 16 ++++++++-------- .../keyman-engine-tests.vcxproj | 4 ++-- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/windows/src/engine/keyman32/keyman-engine.vcxproj b/windows/src/engine/keyman32/keyman-engine.vcxproj index 43b74d9880..923e60fc8a 100644 --- a/windows/src/engine/keyman32/keyman-engine.vcxproj +++ b/windows/src/engine/keyman32/keyman-engine.vcxproj @@ -96,16 +96,16 @@ $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\include;$(ProjectDir)..\..\..\..\core\include;$(IncludePath) - $(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\x86\$(Configuration);$(LibraryPath) - $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\include;$(ProjectDir)..\..\..\..\core\include;$(IncludePath) + $(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\ARM64\$(Configuration);$(LibraryPath) + $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\include;$(ProjectDir)..\..\..\..\core\include;$(IncludePath) $(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\rust\x86\$(Configuration);$(LibraryPath) $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\include;$(IncludePath) - $(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\rust\x86\$(Configuration);$(LibraryPath) - $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\include;$(IncludePath) + $(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\rust\ARM64\$(Configuration);$(LibraryPath) + $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\include;$(IncludePath) diff --git a/windows/src/engine/keyman32/keyman32.vcxproj b/windows/src/engine/keyman32/keyman32.vcxproj index 884eab9d74..f959e00ccd 100644 --- a/windows/src/engine/keyman32/keyman32.vcxproj +++ b/windows/src/engine/keyman32/keyman32.vcxproj @@ -141,8 +141,8 @@ keyman64 - $(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\x64\$(Configuration);$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64) - $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\include;$(IncludePath) + $(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\ARM64\$(Configuration);$(VC_LibraryPath_ARM64);$(WindowsSDK_LibraryPath_ARM64) + $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\include;$(IncludePath) keyman64 @@ -156,8 +156,8 @@ keyman64 - $(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\x64\$(Configuration);$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64) - $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\include;$(IncludePath) + $(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\ARM64\$(Configuration);$(VC_LibraryPath_ARM64);$(WindowsSDK_LibraryPath_ARM64) + $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\include;$(IncludePath) keyman64 @@ -260,7 +260,7 @@ Windows true true - 0x1c100000 + 0x140000000 true true ..\..\..\lib\keyman64.lib @@ -316,7 +316,7 @@ Windows true true - 0x1c100000 + 0x140000000 true true ..\..\..\lib\keyman64.lib @@ -420,7 +420,7 @@ true true Windows - 0x1C100000 + 0x140000000 true true ..\..\..\lib\keyman64.lib @@ -471,7 +471,7 @@ true true Windows - 0x1C100000 + 0x140000000 true true ..\..\..\lib\keyman64.lib diff --git a/windows/src/engine/keyman32/tests/keyman-engine-tests/keyman-engine-tests.vcxproj b/windows/src/engine/keyman32/tests/keyman-engine-tests/keyman-engine-tests.vcxproj index c07c5a213c..2b7f8a8016 100644 --- a/windows/src/engine/keyman32/tests/keyman-engine-tests/keyman-engine-tests.vcxproj +++ b/windows/src/engine/keyman32/tests/keyman-engine-tests/keyman-engine-tests.vcxproj @@ -59,7 +59,7 @@ $(ProjectDir)obj\$(Platform)\$(Configuration)\ - $(ProjectDir)..\..\..\..\..\..\common\include;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\include;$(ProjectDir)..\..\..\..\..\..\core\include;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\global\inc;$(ProjectDir)..\..;$(IncludePath) + $(ProjectDir)..\..\..\..\..\..\common\include;$(ProjectDir)..\..\..\..\..\..\core\build\ARM64\$(Configuration)\include;$(ProjectDir)..\..\..\..\..\..\core\include;$(ProjectDir)..\..\..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\global\inc;$(ProjectDir)..\..;$(IncludePath) $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ @@ -69,7 +69,7 @@ $(ProjectDir)obj\$(Platform)\$(Configuration)\ - $(ProjectDir)..\..\..\..\..\..\common\include;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\include;$(ProjectDir)..\..\..\..\..\..\core\include;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\global\inc;$(ProjectDir)..\..;$(IncludePath) + $(ProjectDir)..\..\..\..\..\..\common\include;$(ProjectDir)..\..\..\..\..\..\core\build\ARM64\$(Configuration)\include;$(ProjectDir)..\..\..\..\..\..\core\include;$(ProjectDir)..\..\..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\global\inc;$(ProjectDir)..\..;$(IncludePath) $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ From 1a6cfe8ee19c727ffa563bebcd68abcba4dca0ca Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Thu, 28 Aug 2025 09:52:23 +0200 Subject: [PATCH 03/59] chore(windows): establish epic/win-arm Test-bot: skip Build-bot: skip --- windows/src/README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/windows/src/README.md b/windows/src/README.md index b18b626dc0..ee1f5c1da7 100644 --- a/windows/src/README.md +++ b/windows/src/README.md @@ -1,5 +1,11 @@ # Keyman for Windows +## Platforms + +* x86 (most host processes) +* x64 +* ARM + ## Build Prerequisites * See [Windows Build Environment Configuration](../../docs/build/windows.md). From ae441f16b500b8e0b6791bb38db6494968c13e27 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Tue, 30 Sep 2025 13:12:34 +1000 Subject: [PATCH 04/59] feat(windows): add sentry.arm64.dll and lib --- .../windows/delphi/ext/sentry/sentry.a64.exp | Bin 0 -> 48385 bytes .../windows/delphi/ext/sentry/sentry.a64.lib | Bin 0 -> 79954 bytes .../windows/delphi/ext/sentry/sentry.arm64.dll | Bin 0 -> 146944 bytes docs/build/windows.md | 2 +- windows/src/engine/keyman/icons.res | Bin 304020 -> 0 bytes windows/src/engine/keyman32/keyman32.vcxproj | 4 ++-- windows/src/engine/keymanx64/keymanx64.vcxproj | 2 +- 7 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 common/windows/delphi/ext/sentry/sentry.a64.exp create mode 100644 common/windows/delphi/ext/sentry/sentry.a64.lib create mode 100644 common/windows/delphi/ext/sentry/sentry.arm64.dll delete mode 100644 windows/src/engine/keyman/icons.res diff --git a/common/windows/delphi/ext/sentry/sentry.a64.exp b/common/windows/delphi/ext/sentry/sentry.a64.exp new file mode 100644 index 0000000000000000000000000000000000000000..efe6346cdcc10f63943536199ed2ab2c1fbbda90 GIT binary patch literal 48385 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 GvHt`4AwSmu literal 0 HcmV?d00001 diff --git a/common/windows/delphi/ext/sentry/sentry.a64.lib b/common/windows/delphi/ext/sentry/sentry.a64.lib new file mode 100644 index 0000000000000000000000000000000000000000..5c8616d5f594d36ca8d91fb0860df7e70858c432 GIT binary patch literal 79954 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%0D4xJR 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 Jcv036{|}x_)}jCa literal 0 HcmV?d00001 diff --git a/common/windows/delphi/ext/sentry/sentry.arm64.dll b/common/windows/delphi/ext/sentry/sentry.arm64.dll new file mode 100644 index 0000000000000000000000000000000000000000..0cb5924244af1047e14ea716a27a7008499e6356 GIT binary patch literal 146944 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 D**E%{ literal 0 HcmV?d00001 diff --git a/docs/build/windows.md b/docs/build/windows.md index ccf74be55d..bdba3273fb 100644 --- a/docs/build/windows.md +++ b/docs/build/windows.md @@ -276,7 +276,7 @@ of appropriate node versions during builds. * Verify required build tools are installed * Run `Visual Studio Installer` * Check the `Individual components` tab - * Verify `MSVC v142 - VS 2019 c++ x64/x86 build tools (Latest)` is installed. + * Verify `MSVC v142 - VS 2019 c++ x64/x86/arm64 build tools (Latest)` is installed. If not, install it. Recommended: configure Visual Studio to use two-space tab stops: diff --git a/windows/src/engine/keyman/icons.res b/windows/src/engine/keyman/icons.res deleted file mode 100644 index 6ff2762706353cc39c998d9ba744a7efedc7bfd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 304020 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 diff --git a/windows/src/engine/keyman32/keyman32.vcxproj b/windows/src/engine/keyman32/keyman32.vcxproj index f959e00ccd..972c7af7c1 100644 --- a/windows/src/engine/keyman32/keyman32.vcxproj +++ b/windows/src/engine/keyman32/keyman32.vcxproj @@ -143,7 +143,7 @@ $(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\ARM64\$(Configuration);$(VC_LibraryPath_ARM64);$(WindowsSDK_LibraryPath_ARM64) $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\include;$(IncludePath) - keyman64 + keymana64 $(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\x86\$(Configuration);$(LibraryPath) @@ -474,7 +474,7 @@ 0x140000000 true true - ..\..\..\lib\keyman64.lib + ..\..\..\lib\keymana64.lib true diff --git a/windows/src/engine/keymanx64/keymanx64.vcxproj b/windows/src/engine/keymanx64/keymanx64.vcxproj index 584707bd96..666feabaf5 100644 --- a/windows/src/engine/keymanx64/keymanx64.vcxproj +++ b/windows/src/engine/keymanx64/keymanx64.vcxproj @@ -156,7 +156,7 @@ true - ..\..\..\..\common\windows\delphi\ext\sentry\sentry.x64.lib;keyman64.lib;libcmtd.lib;%(AdditionalDependencies) + ..\..\..\..\common\windows\delphi\ext\sentry\sentry.a64.lib;keymana64.lib;libcmtd.lib;%(AdditionalDependencies) ..\..\..\lib;%(AdditionalLibraryDirectories) false true From d8dda66eaf0f9f6d120105a6b14de2cbc087c105 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Tue, 30 Sep 2025 15:33:16 +1000 Subject: [PATCH 05/59] refactor(windows): rename keymanx64 proj keymanhp Fixes:#11905 --- .gitignore | 4 ++-- windows/src/.gitignore | 2 +- windows/src/engine/build.sh | 2 +- windows/src/engine/engine.sln | 2 +- .../src/engine/{keymanx64 => keymanhp}/build.sh | 6 +++--- .../keymanx64.cpp => keymanhp/keymanhp.cpp} | 8 ++++---- .../keymanx64.h => keymanhp/keymanhp.h} | 2 +- .../keymanx64.rc => keymanhp/keymanhp.rc} | 0 .../keymanx64.sln => keymanhp/keymanhp.sln} | 2 +- .../keymanhp.vcxproj} | 15 +++++++++++---- .../keymanhp.vcxproj.filters} | 6 +++--- .../engine/{keymanx64 => keymanhp}/manifest.in | 2 +- .../engine/{keymanx64 => keymanhp}/manifest.rc | 0 .../src/engine/{keymanx64 => keymanhp}/resource.h | 0 .../src/engine/{keymanx64 => keymanhp}/version.rc | 0 15 files changed, 29 insertions(+), 22 deletions(-) rename windows/src/engine/{keymanx64 => keymanhp}/build.sh (92%) mode change 100755 => 100644 rename windows/src/engine/{keymanx64/keymanx64.cpp => keymanhp/keymanhp.cpp} (98%) rename windows/src/engine/{keymanx64/keymanx64.h => keymanhp/keymanhp.h} (97%) rename windows/src/engine/{keymanx64/keymanx64.rc => keymanhp/keymanhp.rc} (100%) rename windows/src/engine/{keymanx64/keymanx64.sln => keymanhp/keymanhp.sln} (84%) rename windows/src/engine/{keymanx64/keymanx64.vcxproj => keymanhp/keymanhp.vcxproj} (94%) rename windows/src/engine/{keymanx64/keymanx64.vcxproj.filters => keymanhp/keymanhp.vcxproj.filters} (92%) rename windows/src/engine/{keymanx64 => keymanhp}/manifest.in (94%) rename windows/src/engine/{keymanx64 => keymanhp}/manifest.rc (100%) rename windows/src/engine/{keymanx64 => keymanhp}/resource.h (100%) rename windows/src/engine/{keymanx64 => keymanhp}/version.rc (100%) diff --git a/.gitignore b/.gitignore index 97c28ac83b..7b87219588 100644 --- a/.gitignore +++ b/.gitignore @@ -103,8 +103,8 @@ /windows/src/engine/keyman32/*.cod /windows/src/engine/keyman32/*.pdb -# /engine/keymanx64/ -/windows/src/engine/keymanx64/x64 +# /engine/keymanhp/ +/windows/src/engine/keymanhp/x64 # /engine/kmcomapi/ /windows/src/engine/kmcomapi/kmcomapi.tlb diff --git a/windows/src/.gitignore b/windows/src/.gitignore index 065f4a07f3..b48915630c 100644 --- a/windows/src/.gitignore +++ b/windows/src/.gitignore @@ -17,7 +17,7 @@ # These files are generated during build engine/keyman32/KEYMAN32.res engine/keyman32/Keyman64.res -engine/keymanx64/keymanx64.res +engine/keymanhp/keymanx64.res engine/mcompile/Release/ tds_file.txt global/delphi/cust/MessageIdentifierConsts.pas diff --git a/windows/src/engine/build.sh b/windows/src/engine/build.sh index 524ad91437..1a8125b543 100755 --- a/windows/src/engine/build.sh +++ b/windows/src/engine/build.sh @@ -19,7 +19,7 @@ builder_describe \ ":keyman Main host process (32 bit)" \ ":keyman32 Keystroke processing engine (all archs)" \ ":keymanmc Message library" \ - ":keymanx64 Host process (64 bit)" \ + ":keymanhp Host process (64 bit)" \ ":kmcomapi COM API library" \ ":kmrefresh Helper app to refresh Windows language settings" \ ":kmtip Text Services Framework Text Input Processor" \ diff --git a/windows/src/engine/engine.sln b/windows/src/engine/engine.sln index f45c0bcacc..37038b17f1 100644 --- a/windows/src/engine/engine.sln +++ b/windows/src/engine/engine.sln @@ -5,7 +5,7 @@ VisualStudioVersion = 16.0.31313.79 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "keyman32", "keyman32\Keyman32.vcxproj", "{BD5564FB-35A5-4A3C-B96A-4A6578E2B593}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "keymanx64", "keymanx64\keymanx64.vcxproj", "{A34650EA-D6E8-4229-8091-6BF1443565B5}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "keymanhp", "keymanhp\keymanhp.vcxproj", "{A34650EA-D6E8-4229-8091-6BF1443565B5}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "kmtip", "kmtip\kmtip.vcxproj", "{93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}" EndProject diff --git a/windows/src/engine/keymanx64/build.sh b/windows/src/engine/keymanhp/build.sh old mode 100755 new mode 100644 similarity index 92% rename from windows/src/engine/keymanx64/build.sh rename to windows/src/engine/keymanhp/build.sh index b893b07b26..60846fe4e6 --- a/windows/src/engine/keymanx64/build.sh +++ b/windows/src/engine/keymanhp/build.sh @@ -18,12 +18,12 @@ X64_TARGET="$X64_TARGET_PATH/keymanx64.exe" builder_describe_outputs \ configure:project /resources/build/win/delphi_environment_generated.inc.sh \ - build:project /windows/src/engine/keymanx64/$X64_TARGET + build:project /windows/src/engine/keymanhp/$X64_TARGET #------------------------------------------------------------------------------------------------------------------- function do_clean() { - vs_msbuild keymanx64.vcxproj //t:Clean + vs_msbuild keymanhp.vcxproj //t:Clean clean_windows_project_files } @@ -31,7 +31,7 @@ function do_build() { create-windows-output-folders build_version.res build_manifest.res - vs_msbuild keymanx64.vcxproj //t:Build "//p:Platform=x64" + vs_msbuild keymanhp.vcxproj //t:Build "//p:Platform=x64" cp "$X64_TARGET" "$WINDOWS_PROGRAM_ENGINE" builder_if_release_build_level cp "$X64_TARGET_PATH/keymanx64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" } diff --git a/windows/src/engine/keymanx64/keymanx64.cpp b/windows/src/engine/keymanhp/keymanhp.cpp similarity index 98% rename from windows/src/engine/keymanx64/keymanx64.cpp rename to windows/src/engine/keymanhp/keymanhp.cpp index 2a551d3803..48217190e7 100644 --- a/windows/src/engine/keymanx64/keymanx64.cpp +++ b/windows/src/engine/keymanhp/keymanhp.cpp @@ -1,5 +1,5 @@ /* - Name: keymanx64 + Name: keymanhp Copyright: Copyright (C) SIL International. Documentation: Description: @@ -21,7 +21,7 @@ 17 Jan 2013 - mcdurdin - I3758 - V9.0 - keymanx64 can find incorrect window handle for keyman.exe 25 Oct 2016 - mcdurdin - I5136 - Remove additional product references from Keyman Engine */ -#include "keymanx64.h" // I5136 +#include "keymanhp.h" // I5136 #include "../../../../common/windows/cpp/include/keymansentry.h" // Forward declarations of functions included in this code module @@ -64,8 +64,8 @@ BOOL KeymanStarted = FALSE; // Global strings const PWSTR - szWindowClass = L"Keymanx64", // Do not localize - szWindowTitle = L"Keymanx64", // Do not localize + szWindowClass = L"Keymanhp", // Do not localize + szWindowTitle = L"Keymanhp", // Do not localize szTitle = L"Keyman Engine x64", szError_Keymanx86NotFound = L"Keyman Engine x86 is not running. Do not run keymanx64.exe -- it must be started by Keyman Engine x86", diff --git a/windows/src/engine/keymanx64/keymanx64.h b/windows/src/engine/keymanhp/keymanhp.h similarity index 97% rename from windows/src/engine/keymanx64/keymanx64.h rename to windows/src/engine/keymanhp/keymanhp.h index fcfb81faaf..28a1f391d5 100644 --- a/windows/src/engine/keymanx64/keymanx64.h +++ b/windows/src/engine/keymanhp/keymanhp.h @@ -1,5 +1,5 @@ /* - Name: keymanx64 + Name: keymanhp Copyright: Copyright (C) SIL International. Documentation: Description: diff --git a/windows/src/engine/keymanx64/keymanx64.rc b/windows/src/engine/keymanhp/keymanhp.rc similarity index 100% rename from windows/src/engine/keymanx64/keymanx64.rc rename to windows/src/engine/keymanhp/keymanhp.rc diff --git a/windows/src/engine/keymanx64/keymanx64.sln b/windows/src/engine/keymanhp/keymanhp.sln similarity index 84% rename from windows/src/engine/keymanx64/keymanx64.sln rename to windows/src/engine/keymanhp/keymanhp.sln index 053e713d7f..8cc3fdc129 100644 --- a/windows/src/engine/keymanx64/keymanx64.sln +++ b/windows/src/engine/keymanhp/keymanhp.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "keymanx64", "keymanx64.vcxproj", "{A34650EA-D6E8-4229-8091-6BF1443565B5}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "keymanhp", "keymanhp.vcxproj", "{A34650EA-D6E8-4229-8091-6BF1443565B5}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/windows/src/engine/keymanx64/keymanx64.vcxproj b/windows/src/engine/keymanhp/keymanhp.vcxproj similarity index 94% rename from windows/src/engine/keymanx64/keymanx64.vcxproj rename to windows/src/engine/keymanhp/keymanhp.vcxproj index 82b3bcb59f..5cda7ead85 100644 --- a/windows/src/engine/keymanx64/keymanx64.vcxproj +++ b/windows/src/engine/keymanhp/keymanhp.vcxproj @@ -12,9 +12,10 @@ {A34650EA-D6E8-4229-8091-6BF1443565B5} - keymanx64 + keymanhp Win32Proj 10.0 + keymanhp @@ -57,6 +58,12 @@ *.cdf;*.cache;*.obj;*.ilk;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.metagen;*.bi *.cdf;*.cache;*.obj;*.ilk;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.metagen;*.bi + + keymanx64 + + + keymanx64 + X64 @@ -137,15 +144,15 @@ - + - + - + diff --git a/windows/src/engine/keymanx64/keymanx64.vcxproj.filters b/windows/src/engine/keymanhp/keymanhp.vcxproj.filters similarity index 92% rename from windows/src/engine/keymanx64/keymanx64.vcxproj.filters rename to windows/src/engine/keymanhp/keymanhp.vcxproj.filters index dfdca2da64..116cf084a4 100644 --- a/windows/src/engine/keymanx64/keymanx64.vcxproj.filters +++ b/windows/src/engine/keymanhp/keymanhp.vcxproj.filters @@ -15,7 +15,7 @@ - + Source Files @@ -23,7 +23,7 @@ - + Header Files @@ -34,7 +34,7 @@ - + Resource Files diff --git a/windows/src/engine/keymanx64/manifest.in b/windows/src/engine/keymanhp/manifest.in similarity index 94% rename from windows/src/engine/keymanx64/manifest.in rename to windows/src/engine/keymanhp/manifest.in index 6b3306a54c..6b58d64c7d 100644 --- a/windows/src/engine/keymanx64/manifest.in +++ b/windows/src/engine/keymanhp/manifest.in @@ -1,6 +1,6 @@ - + Keyman Engine x64 diff --git a/windows/src/engine/keymanx64/manifest.rc b/windows/src/engine/keymanhp/manifest.rc similarity index 100% rename from windows/src/engine/keymanx64/manifest.rc rename to windows/src/engine/keymanhp/manifest.rc diff --git a/windows/src/engine/keymanx64/resource.h b/windows/src/engine/keymanhp/resource.h similarity index 100% rename from windows/src/engine/keymanx64/resource.h rename to windows/src/engine/keymanhp/resource.h diff --git a/windows/src/engine/keymanx64/version.rc b/windows/src/engine/keymanhp/version.rc similarity index 100% rename from windows/src/engine/keymanx64/version.rc rename to windows/src/engine/keymanhp/version.rc From 32e95fa44410e6d9b98b23a577daa98c8642a6ac Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Tue, 30 Sep 2025 15:33:16 +1000 Subject: [PATCH 06/59] refactor(windows): rename keymanx64 proj keymanhp Fixes:#11905 --- .gitignore | 4 ++-- windows/src/.gitignore | 2 +- windows/src/engine/build.sh | 2 +- windows/src/engine/engine.sln | 2 +- .../src/engine/{keymanx64 => keymanhp}/build.sh | 6 +++--- .../keymanx64.cpp => keymanhp/keymanhp.cpp} | 8 ++++---- .../keymanx64.h => keymanhp/keymanhp.h} | 2 +- .../keymanx64.rc => keymanhp/keymanhp.rc} | 0 .../keymanx64.sln => keymanhp/keymanhp.sln} | 2 +- .../keymanhp.vcxproj} | 15 +++++++++++---- .../keymanhp.vcxproj.filters} | 6 +++--- .../engine/{keymanx64 => keymanhp}/manifest.in | 2 +- .../engine/{keymanx64 => keymanhp}/manifest.rc | 0 .../src/engine/{keymanx64 => keymanhp}/resource.h | 0 .../src/engine/{keymanx64 => keymanhp}/version.rc | 0 15 files changed, 29 insertions(+), 22 deletions(-) rename windows/src/engine/{keymanx64 => keymanhp}/build.sh (92%) mode change 100755 => 100644 rename windows/src/engine/{keymanx64/keymanx64.cpp => keymanhp/keymanhp.cpp} (98%) rename windows/src/engine/{keymanx64/keymanx64.h => keymanhp/keymanhp.h} (97%) rename windows/src/engine/{keymanx64/keymanx64.rc => keymanhp/keymanhp.rc} (100%) rename windows/src/engine/{keymanx64/keymanx64.sln => keymanhp/keymanhp.sln} (84%) rename windows/src/engine/{keymanx64/keymanx64.vcxproj => keymanhp/keymanhp.vcxproj} (97%) rename windows/src/engine/{keymanx64/keymanx64.vcxproj.filters => keymanhp/keymanhp.vcxproj.filters} (92%) rename windows/src/engine/{keymanx64 => keymanhp}/manifest.in (94%) rename windows/src/engine/{keymanx64 => keymanhp}/manifest.rc (100%) rename windows/src/engine/{keymanx64 => keymanhp}/resource.h (100%) rename windows/src/engine/{keymanx64 => keymanhp}/version.rc (100%) diff --git a/.gitignore b/.gitignore index 6c8fbfbec8..57e542eb41 100644 --- a/.gitignore +++ b/.gitignore @@ -103,8 +103,8 @@ /windows/src/engine/keyman32/*.cod /windows/src/engine/keyman32/*.pdb -# /engine/keymanx64/ -/windows/src/engine/keymanx64/x64 +# /engine/keymanhp/ +/windows/src/engine/keymanhp/x64 # /engine/kmcomapi/ /windows/src/engine/kmcomapi/kmcomapi.tlb diff --git a/windows/src/.gitignore b/windows/src/.gitignore index 065f4a07f3..b48915630c 100644 --- a/windows/src/.gitignore +++ b/windows/src/.gitignore @@ -17,7 +17,7 @@ # These files are generated during build engine/keyman32/KEYMAN32.res engine/keyman32/Keyman64.res -engine/keymanx64/keymanx64.res +engine/keymanhp/keymanx64.res engine/mcompile/Release/ tds_file.txt global/delphi/cust/MessageIdentifierConsts.pas diff --git a/windows/src/engine/build.sh b/windows/src/engine/build.sh index 9c9a6d2d0f..fefdb4c4bc 100755 --- a/windows/src/engine/build.sh +++ b/windows/src/engine/build.sh @@ -19,7 +19,7 @@ builder_describe \ ":keyman Main host process (32 bit)" \ ":keyman32 Keystroke processing engine (all archs)" \ ":keymanmc Message library" \ - ":keymanx64 Host process (64 bit)" \ + ":keymanhp Host process (64 bit)" \ ":kmcomapi COM API library" \ ":kmrefresh Helper app to refresh Windows language settings" \ ":kmtip Text Services Framework Text Input Processor" \ diff --git a/windows/src/engine/engine.sln b/windows/src/engine/engine.sln index 8adf2e565e..d004e70f20 100644 --- a/windows/src/engine/engine.sln +++ b/windows/src/engine/engine.sln @@ -5,7 +5,7 @@ VisualStudioVersion = 16.0.31313.79 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "keyman32", "keyman32\Keyman32.vcxproj", "{BD5564FB-35A5-4A3C-B96A-4A6578E2B593}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "keymanx64", "keymanx64\keymanx64.vcxproj", "{A34650EA-D6E8-4229-8091-6BF1443565B5}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "keymanhp", "keymanhp\keymanhp.vcxproj", "{A34650EA-D6E8-4229-8091-6BF1443565B5}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "kmtip", "kmtip\kmtip.vcxproj", "{93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}" EndProject diff --git a/windows/src/engine/keymanx64/build.sh b/windows/src/engine/keymanhp/build.sh old mode 100755 new mode 100644 similarity index 92% rename from windows/src/engine/keymanx64/build.sh rename to windows/src/engine/keymanhp/build.sh index 4398c062fb..8ec6cf9061 --- a/windows/src/engine/keymanx64/build.sh +++ b/windows/src/engine/keymanhp/build.sh @@ -18,12 +18,12 @@ X64_TARGET="$X64_TARGET_PATH/keymanx64.exe" builder_describe_outputs \ configure:project /resources/build/win/delphi_environment_generated.inc.sh \ - build:project /windows/src/engine/keymanx64/$X64_TARGET + build:project /windows/src/engine/keymanhp/$X64_TARGET #------------------------------------------------------------------------------------------------------------------- function do_clean() { - vs_msbuild keymanx64.vcxproj //t:Clean + vs_msbuild keymanhp.vcxproj //t:Clean clean_windows_project_files } @@ -31,7 +31,7 @@ function do_build() { create-windows-output-folders build_version.res build_manifest.res - vs_msbuild keymanx64.vcxproj //t:Build "//p:Platform=x64" + vs_msbuild keymanhp.vcxproj //t:Build "//p:Platform=x64" cp "$X64_TARGET" "$WINDOWS_PROGRAM_ENGINE" builder_if_release_build_level cp "$X64_TARGET_PATH/keymanx64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" } diff --git a/windows/src/engine/keymanx64/keymanx64.cpp b/windows/src/engine/keymanhp/keymanhp.cpp similarity index 98% rename from windows/src/engine/keymanx64/keymanx64.cpp rename to windows/src/engine/keymanhp/keymanhp.cpp index 2a551d3803..48217190e7 100644 --- a/windows/src/engine/keymanx64/keymanx64.cpp +++ b/windows/src/engine/keymanhp/keymanhp.cpp @@ -1,5 +1,5 @@ /* - Name: keymanx64 + Name: keymanhp Copyright: Copyright (C) SIL International. Documentation: Description: @@ -21,7 +21,7 @@ 17 Jan 2013 - mcdurdin - I3758 - V9.0 - keymanx64 can find incorrect window handle for keyman.exe 25 Oct 2016 - mcdurdin - I5136 - Remove additional product references from Keyman Engine */ -#include "keymanx64.h" // I5136 +#include "keymanhp.h" // I5136 #include "../../../../common/windows/cpp/include/keymansentry.h" // Forward declarations of functions included in this code module @@ -64,8 +64,8 @@ BOOL KeymanStarted = FALSE; // Global strings const PWSTR - szWindowClass = L"Keymanx64", // Do not localize - szWindowTitle = L"Keymanx64", // Do not localize + szWindowClass = L"Keymanhp", // Do not localize + szWindowTitle = L"Keymanhp", // Do not localize szTitle = L"Keyman Engine x64", szError_Keymanx86NotFound = L"Keyman Engine x86 is not running. Do not run keymanx64.exe -- it must be started by Keyman Engine x86", diff --git a/windows/src/engine/keymanx64/keymanx64.h b/windows/src/engine/keymanhp/keymanhp.h similarity index 97% rename from windows/src/engine/keymanx64/keymanx64.h rename to windows/src/engine/keymanhp/keymanhp.h index fcfb81faaf..28a1f391d5 100644 --- a/windows/src/engine/keymanx64/keymanx64.h +++ b/windows/src/engine/keymanhp/keymanhp.h @@ -1,5 +1,5 @@ /* - Name: keymanx64 + Name: keymanhp Copyright: Copyright (C) SIL International. Documentation: Description: diff --git a/windows/src/engine/keymanx64/keymanx64.rc b/windows/src/engine/keymanhp/keymanhp.rc similarity index 100% rename from windows/src/engine/keymanx64/keymanx64.rc rename to windows/src/engine/keymanhp/keymanhp.rc diff --git a/windows/src/engine/keymanx64/keymanx64.sln b/windows/src/engine/keymanhp/keymanhp.sln similarity index 84% rename from windows/src/engine/keymanx64/keymanx64.sln rename to windows/src/engine/keymanhp/keymanhp.sln index 053e713d7f..8cc3fdc129 100644 --- a/windows/src/engine/keymanx64/keymanx64.sln +++ b/windows/src/engine/keymanhp/keymanhp.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "keymanx64", "keymanx64.vcxproj", "{A34650EA-D6E8-4229-8091-6BF1443565B5}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "keymanhp", "keymanhp.vcxproj", "{A34650EA-D6E8-4229-8091-6BF1443565B5}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/windows/src/engine/keymanx64/keymanx64.vcxproj b/windows/src/engine/keymanhp/keymanhp.vcxproj similarity index 97% rename from windows/src/engine/keymanx64/keymanx64.vcxproj rename to windows/src/engine/keymanhp/keymanhp.vcxproj index 666feabaf5..83644968f3 100644 --- a/windows/src/engine/keymanx64/keymanx64.vcxproj +++ b/windows/src/engine/keymanhp/keymanhp.vcxproj @@ -20,9 +20,10 @@ {A34650EA-D6E8-4229-8091-6BF1443565B5} - keymanx64 + keymanhp Win32Proj 10.0 + keymanhp @@ -98,6 +99,12 @@ *.cdf;*.cache;*.obj;*.ilk;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.metagen;*.bi *.cdf;*.cache;*.obj;*.ilk;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.metagen;*.bi + + keymanx64 + + + keymanx64 + X64 @@ -250,15 +257,15 @@ - + - + - + diff --git a/windows/src/engine/keymanx64/keymanx64.vcxproj.filters b/windows/src/engine/keymanhp/keymanhp.vcxproj.filters similarity index 92% rename from windows/src/engine/keymanx64/keymanx64.vcxproj.filters rename to windows/src/engine/keymanhp/keymanhp.vcxproj.filters index dfdca2da64..116cf084a4 100644 --- a/windows/src/engine/keymanx64/keymanx64.vcxproj.filters +++ b/windows/src/engine/keymanhp/keymanhp.vcxproj.filters @@ -15,7 +15,7 @@ - + Source Files @@ -23,7 +23,7 @@ - + Header Files @@ -34,7 +34,7 @@ - + Resource Files diff --git a/windows/src/engine/keymanx64/manifest.in b/windows/src/engine/keymanhp/manifest.in similarity index 94% rename from windows/src/engine/keymanx64/manifest.in rename to windows/src/engine/keymanhp/manifest.in index 6b3306a54c..6b58d64c7d 100644 --- a/windows/src/engine/keymanx64/manifest.in +++ b/windows/src/engine/keymanhp/manifest.in @@ -1,6 +1,6 @@ - + Keyman Engine x64 diff --git a/windows/src/engine/keymanx64/manifest.rc b/windows/src/engine/keymanhp/manifest.rc similarity index 100% rename from windows/src/engine/keymanx64/manifest.rc rename to windows/src/engine/keymanhp/manifest.rc diff --git a/windows/src/engine/keymanx64/resource.h b/windows/src/engine/keymanhp/resource.h similarity index 100% rename from windows/src/engine/keymanx64/resource.h rename to windows/src/engine/keymanhp/resource.h diff --git a/windows/src/engine/keymanx64/version.rc b/windows/src/engine/keymanhp/version.rc similarity index 100% rename from windows/src/engine/keymanx64/version.rc rename to windows/src/engine/keymanhp/version.rc From f73e16cfce8053ec5b811e0d327e911c9229e5bb Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Thu, 2 Oct 2025 16:45:36 +1000 Subject: [PATCH 07/59] feat(windows): update binary names and kmtip Update the binary arm names to match the spec. Also updated kmtip project to build arm64 dll --- .../ext/sentry/{sentry.a64.lib => sentry.arm64.lib} | Bin windows/src/engine/keyman32/keyman32.vcxproj | 4 ++-- windows/src/engine/keymanhp/keymanhp.vcxproj | 10 ++++++++-- windows/src/engine/kmtip/kmtip.vcxproj | 8 ++++---- 4 files changed, 14 insertions(+), 8 deletions(-) rename common/windows/delphi/ext/sentry/{sentry.a64.lib => sentry.arm64.lib} (100%) diff --git a/common/windows/delphi/ext/sentry/sentry.a64.lib b/common/windows/delphi/ext/sentry/sentry.arm64.lib similarity index 100% rename from common/windows/delphi/ext/sentry/sentry.a64.lib rename to common/windows/delphi/ext/sentry/sentry.arm64.lib diff --git a/windows/src/engine/keyman32/keyman32.vcxproj b/windows/src/engine/keyman32/keyman32.vcxproj index 972c7af7c1..7b41f45e1c 100644 --- a/windows/src/engine/keyman32/keyman32.vcxproj +++ b/windows/src/engine/keyman32/keyman32.vcxproj @@ -143,7 +143,7 @@ $(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\ARM64\$(Configuration);$(VC_LibraryPath_ARM64);$(WindowsSDK_LibraryPath_ARM64) $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\include;$(IncludePath) - keymana64 + keymanarm64 $(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\x86\$(Configuration);$(LibraryPath) @@ -474,7 +474,7 @@ 0x140000000 true true - ..\..\..\lib\keymana64.lib + ..\..\..\lib\keymanarm64.lib true diff --git a/windows/src/engine/keymanhp/keymanhp.vcxproj b/windows/src/engine/keymanhp/keymanhp.vcxproj index 83644968f3..34016eff41 100644 --- a/windows/src/engine/keymanhp/keymanhp.vcxproj +++ b/windows/src/engine/keymanhp/keymanhp.vcxproj @@ -105,6 +105,12 @@ keymanx64 + + keymanhp.arm64 + + + keymanhp.arm64 + X64 @@ -163,7 +169,7 @@ true - ..\..\..\..\common\windows\delphi\ext\sentry\sentry.a64.lib;keymana64.lib;libcmtd.lib;%(AdditionalDependencies) + ..\..\..\..\common\windows\delphi\ext\sentry\sentry.arm64.lib;keymanarm64.lib;libcmtd.lib;%(AdditionalDependencies) ..\..\..\lib;%(AdditionalLibraryDirectories) false true @@ -235,7 +241,7 @@ true - ..\..\..\..\common\windows\delphi\ext\sentry\sentry.x64.lib;keyman64.lib;libcmt.lib;%(AdditionalDependencies) + ..\..\..\..\common\windows\delphi\ext\sentry\sentry.arm64.lib;keymanarm64.lib;libcmt.lib;%(AdditionalDependencies) ..\..\..\lib;%(AdditionalLibraryDirectories) false true diff --git a/windows/src/engine/kmtip/kmtip.vcxproj b/windows/src/engine/kmtip/kmtip.vcxproj index f9591f0053..9a913c58af 100644 --- a/windows/src/engine/kmtip/kmtip.vcxproj +++ b/windows/src/engine/kmtip/kmtip.vcxproj @@ -146,9 +146,9 @@ .dll .dll kmtip64 - kmtip64 + kmtiparm64 kmtip64 - kmtip64 + kmtiparm64 @@ -390,12 +390,12 @@ 0x0c09 - ..\..\..\lib\keyman64.lib;version.lib;wintrust.lib;crypt32.lib;imagehlp.lib;%(AdditionalDependencies) + ..\..\..\lib\keymanarm64.lib;version.lib;wintrust.lib;crypt32.lib;imagehlp.lib;%(AdditionalDependencies) true .\kmtip64.def true true - 0x4C100000 + 0x140000000 true From 1340c4f9e59c74f581317ad6afd115399718d853 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Tue, 14 Oct 2025 16:00:40 +1000 Subject: [PATCH 08/59] feat(windows): add arm64 to wxs and core build Add cross-arm64 and cross-x64 build Add the arm64 binaries to the wxs installers with guids update build.sh files --- core/build.sh | 2 +- core/cross-arm64.build | 13 ++++ core/cross-x64.build | 13 ++++ resources/build/win/delphi_flags.inc.sh | 1 + windows/src/desktop/inst/keymandesktop.wxs | 3 + windows/src/engine/inst/components.wxs | 16 +++- windows/src/engine/keyman32/build.sh | 31 +++++++- windows/src/engine/keyman32/keyman32.vcxproj | 4 +- windows/src/engine/keymanhp/build.sh | 75 ++++++++++++++----- windows/src/engine/keymanhp/keymanhp.vcxproj | 4 +- windows/src/engine/kmtip/build.sh | 12 ++- windows/src/support/texteditor/Editor.sln | 6 ++ windows/src/support/texteditor/Editor.vcxproj | 67 +++++++++++++++++ windows/src/support/texteditor/build.sh | 4 + .../src/test/unit-tests/shared-data/build.sh | 1 + 15 files changed, 226 insertions(+), 26 deletions(-) create mode 100644 core/cross-arm64.build create mode 100644 core/cross-x64.build mode change 100644 => 100755 windows/src/engine/keymanhp/build.sh diff --git a/core/build.sh b/core/build.sh index 674001cc69..f002870a18 100755 --- a/core/build.sh +++ b/core/build.sh @@ -98,7 +98,7 @@ builder_describe_internal_dependency \ build:mac build:mac-arm64 \ build:win build:x86 \ build:win build:x64 \ - build:arch build:arm64 \ + build:win build:arm64 \ builder_describe_outputs \ configure:win /core/build/win/$BUILDER_CONFIGURATION/ \ diff --git a/core/cross-arm64.build b/core/cross-arm64.build new file mode 100644 index 0000000000..9fd7cc6d14 --- /dev/null +++ b/core/cross-arm64.build @@ -0,0 +1,13 @@ +[host_machine] +system = 'windows' +cpu_family = 'aarch64' +cpu = 'arm64' +endian = 'little' + +[binaries] +c = 'cl' +cpp = 'cl' +ar = 'lib' +ld = 'link' +strip = 'llvm-strip' # optional; MSVC doesn’t have a native strip +pkgconfig = 'pkg-config' # optional; used only if you have pkg-config installed diff --git a/core/cross-x64.build b/core/cross-x64.build new file mode 100644 index 0000000000..df3ab0b5dc --- /dev/null +++ b/core/cross-x64.build @@ -0,0 +1,13 @@ +[host_machine] +system = 'windows' +cpu_family = 'x86_64' +cpu = 'x86_64' +endian = 'little' + +[binaries] +c = 'cl' +cpp = 'cl' +ar = 'lib' +ld = 'link' +strip = 'llvm-strip' +pkgconfig = 'pkg-config' diff --git a/resources/build/win/delphi_flags.inc.sh b/resources/build/win/delphi_flags.inc.sh index 087e88c60f..d284fab040 100644 --- a/resources/build/win/delphi_flags.inc.sh +++ b/resources/build/win/delphi_flags.inc.sh @@ -18,6 +18,7 @@ DELPHI_MSBUILD_FLAG_DEBUG="//p:Config=$TARGET_PATH" # Visual C++ x86, x64; Delphi x86 WIN32_TARGET_PATH=bin/Win32/$TARGET_PATH X64_TARGET_PATH=bin/x64/$TARGET_PATH +ARM64_TARGET_PATH=bin/arm64/$TARGET_PATH # Delphi x86, x64 # WIN32_TARGET_PATH=... diff --git a/windows/src/desktop/inst/keymandesktop.wxs b/windows/src/desktop/inst/keymandesktop.wxs index 27e0a02e4d..b6329253e4 100644 --- a/windows/src/desktop/inst/keymandesktop.wxs +++ b/windows/src/desktop/inst/keymandesktop.wxs @@ -253,6 +253,9 @@ + + + diff --git a/windows/src/engine/inst/components.wxs b/windows/src/engine/inst/components.wxs index 22d383eb35..78e8fb4dd3 100644 --- a/windows/src/engine/inst/components.wxs +++ b/windows/src/engine/inst/components.wxs @@ -137,8 +137,12 @@ - - + + + + + + @@ -234,6 +238,11 @@ + + VersionNT64 AND NOT (ProcessorArchitecture="AMD64") + + + @@ -250,6 +259,9 @@ + + + diff --git a/windows/src/engine/keyman32/build.sh b/windows/src/engine/keyman32/build.sh index 1c52948921..8e82289ea6 100755 --- a/windows/src/engine/keyman32/build.sh +++ b/windows/src/engine/keyman32/build.sh @@ -9,7 +9,7 @@ builder_describe "Keystroke processing engine" \ @/common/include \ @/core:win \ clean configure build test publish install \ - :x86 :x64 + :x86 :x64 :arm64 builder_parse "$@" @@ -18,11 +18,13 @@ builder_parse "$@" source "$KEYMAN_ROOT/resources/build/win/environment.inc.sh" WIN32_TARGET="$WIN32_TARGET_PATH/keyman32.dll" X64_TARGET="$X64_TARGET_PATH/keyman64.dll" +ARM64_TARGET="$ARM64_TARGET_PATH/keymanarm64.dll" builder_describe_outputs \ configure /resources/build/win/delphi_environment_generated.inc.sh \ build:x86 /windows/src/engine/keyman32/$WIN32_TARGET \ build:x64 /windows/src/engine/keyman32/$X64_TARGET \ + build:arm64 /windows/src/engine/keyman32/$ARM64_TARGET \ #------------------------------------------------------------------------------------------------------------------- @@ -36,6 +38,11 @@ function do_clean_x64() { clean_windows_project_files } +function do_clean_arm64() { + vs_msbuild keyman32.vcxproj //t:Clean //p:Platform=arm64 + clean_windows_project_files +} + function do_build_x86() { create-windows-output-folders build_version.res @@ -52,6 +59,14 @@ function do_build_x64() { builder_if_release_build_level cp "$X64_TARGET_PATH/keyman64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" } +function do_build_arm64() { + create-windows-output-folders + run_in_vs_env rc version64.rc + vs_msbuild keyman32.vcxproj //t:Build "//p:Platform=arm64" + cp "$ARM64_TARGET" "$WINDOWS_PROGRAM_ENGINE" + builder_if_release_build_level cp "$ARM64_TARGET_PATH/keymanarm64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" +} + function do_publish_x86() { wrap-signcode //d "Keyman Engine for Windows" "$WINDOWS_PROGRAM_ENGINE/keyman32.dll" wrap-symstore "$WINDOWS_PROGRAM_ENGINE/keyman32.dll" //t keyman-engine-windows @@ -64,6 +79,12 @@ function do_publish_x64() { wrap-symstore "$WINDOWS_DEBUGPATH_ENGINE/keyman64.pdb" //t keyman-engine-windows } +function do_publish_arm64() { + wrap-signcode //d "Keyman Engine for Windows" "$WINDOWS_PROGRAM_ENGINE/keymanarm64.dll" + wrap-symstore "$WINDOWS_PROGRAM_ENGINE/keymanarm64.dll" //t keyman-engine-windows + wrap-symstore "$WINDOWS_DEBUGPATH_ENGINE/keymanarm64.pdb" //t keyman-engine-windows +} + function do_install_x86() { cp "$WINDOWS_PROGRAM_ENGINE/keyman32.dll" "$INSTALLPATH_KEYMANENGINE/keyman32.dll" echo "You may want to manually tweak keyman-debug-etw.man and fill in $INSTALLPATH_KEYMANENGINE/keyman32.dll" @@ -74,13 +95,21 @@ function do_install_x64() { cp "$WINDOWS_PROGRAM_ENGINE/keyman64.dll" "$INSTALLPATH_KEYMANENGINE/keyman64.dll" } +function do_install_x64() { + cp "$WINDOWS_PROGRAM_ENGINE/keymanarm64.dll" "$INSTALLPATH_KEYMANENGINE/keymanarm64.dll" +} + builder_run_action clean:x86 do_clean_x86 builder_run_action clean:x64 do_clean_x64 +builder_run_action clean:arm64 do_clean_arm64 builder_run_action configure configure_windows_build_environment builder_run_action build:x86 do_build_x86 builder_run_action build:x64 do_build_x64 +builder_run_action build:arm64 do_build_arm64 # builder_run_action test:project do_test builder_run_action publish:x86 do_publish_x86 builder_run_action publish:x64 do_publish_x64 +builder_run_action publish:arm64 do_publish_arm64 builder_run_action install:x86 do_install_x86 builder_run_action install:x64 do_install_x64 +builder_run_action install:arm64 do_install_arm64 diff --git a/windows/src/engine/keyman32/keyman32.vcxproj b/windows/src/engine/keyman32/keyman32.vcxproj index 7b41f45e1c..1a79793a75 100644 --- a/windows/src/engine/keyman32/keyman32.vcxproj +++ b/windows/src/engine/keyman32/keyman32.vcxproj @@ -142,7 +142,7 @@ $(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\ARM64\$(Configuration);$(VC_LibraryPath_ARM64);$(WindowsSDK_LibraryPath_ARM64) - $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\include;$(IncludePath) + $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\arm64\$(Configuration)\include;$(IncludePath) keymanarm64 @@ -158,7 +158,7 @@ $(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\ARM64\$(Configuration);$(VC_LibraryPath_ARM64);$(WindowsSDK_LibraryPath_ARM64) $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\include;$(IncludePath) - keyman64 + keymanarm64 diff --git a/windows/src/engine/keymanhp/build.sh b/windows/src/engine/keymanhp/build.sh old mode 100644 new mode 100755 index 60846fe4e6..156cdb5c3a --- a/windows/src/engine/keymanhp/build.sh +++ b/windows/src/engine/keymanhp/build.sh @@ -7,49 +7,90 @@ THIS_SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")" builder_describe "Keyman main host process (64-bit)" \ @/common/include \ - clean configure build test publish install + clean configure build test publish install \ + :x64 :arm64 builder_parse "$@" #------------------------------------------------------------------------------------------------------------------- source "$KEYMAN_ROOT/resources/build/win/environment.inc.sh" -X64_TARGET="$X64_TARGET_PATH/keymanx64.exe" +X64_TARGET="$X64_TARGET_PATH/keymanhp.x64.exe" +ARM64_TARGET="$ARM64_TARGET_PATH/keymanhp.arm64.exe" builder_describe_outputs \ - configure:project /resources/build/win/delphi_environment_generated.inc.sh \ - build:project /windows/src/engine/keymanhp/$X64_TARGET + configure /resources/build/win/delphi_environment_generated.inc.sh \ + build:x64 /windows/src/engine/keymanhp/$X64_TARGET \ + build:arm64 /windows/src/engine/keymanhp/$ARM64_TARGET #------------------------------------------------------------------------------------------------------------------- -function do_clean() { - vs_msbuild keymanhp.vcxproj //t:Clean +function do_clean_x64() { + vs_msbuild keymanhp.vcxproj //t:Clean //p:Platform=x64 clean_windows_project_files } -function do_build() { +function do_clean_arm64() { + vs_msbuild keymanhp.vcxproj //t:Clean //p:Platform=arm64 + clean_windows_project_files +} + +function do_build_x64() { create-windows-output-folders build_version.res build_manifest.res vs_msbuild keymanhp.vcxproj //t:Build "//p:Platform=x64" cp "$X64_TARGET" "$WINDOWS_PROGRAM_ENGINE" - builder_if_release_build_level cp "$X64_TARGET_PATH/keymanx64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" + builder_if_release_build_level cp "$X64_TARGET_PATH/keymanhp.x64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" } -function do_publish() { +function do_build_arm64() { + create-windows-output-folders + build_version.res + build_manifest.res + vs_msbuild keymanhp.vcxproj //t:Build "//p:Platform=arm64" + cp "$ARM64_TARGET" "$WINDOWS_PROGRAM_ENGINE" + builder_if_release_build_level cp "$ARM64_TARGET_PATH/keymanhp.arm64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" +} + +function do_publish_x64() { wrap-mt -nologo -inputresource:"$WINDOWS_PROGRAM_ENGINE/keyman.exe" -validate_manifest wrap-mt -nologo -inputresource:"$WINDOWS_PROGRAM_ENGINE/keyman.exe" -out:temp.manifest grep -q 'uiAccess="true"' temp.manifest || builder_die 'uiAccess must be set to true in manifest.xml' rm -f temp.manifest - wrap-signcode //d "Keyman Engine for Windows" "$WINDOWS_PROGRAM_ENGINE/keymanx64.exe" - wrap-symstore "$WINDOWS_PROGRAM_ENGINE/keymanx64.exe" //t keyman-engine-windows - wrap-symstore "$WINDOWS_DEBUGPATH_ENGINE/keymanx64.pdb" //t keyman-engine-windows + wrap-signcode //d "Keyman Engine for Windows" "$WINDOWS_PROGRAM_ENGINE/keymanhp.x64.exe" + wrap-symstore "$WINDOWS_PROGRAM_ENGINE/keymanhp.x64.exe" //t keyman-engine-windows + wrap-symstore "$WINDOWS_DEBUGPATH_ENGINE/keymanhp.x64.pdb" //t keyman-engine-windows } -builder_run_action clean:project do_clean -builder_run_action configure:project configure_windows_build_environment -builder_run_action build:project do_build +function do_publish_arm64() { + wrap-mt -nologo -inputresource:"$WINDOWS_PROGRAM_ENGINE/keyman.exe" -validate_manifest + wrap-mt -nologo -inputresource:"$WINDOWS_PROGRAM_ENGINE/keyman.exe" -out:temp.manifest + grep -q 'uiAccess="true"' temp.manifest || builder_die 'uiAccess must be set to true in manifest.xml' + rm -f temp.manifest + + wrap-signcode //d "Keyman Engine for Windows" "$WINDOWS_PROGRAM_ENGINE/keymanhp.arm64.exe" + wrap-symstore "$WINDOWS_PROGRAM_ENGINE/keymanhp.arm64.exe" //t keyman-engine-windows + wrap-symstore "$WINDOWS_DEBUGPATH_ENGINE/keymanhp.arm64.pdb" //t keyman-engine-windows +} + +function do_install_x64() { + cp "$WINDOWS_PROGRAM_ENGINE/keymanhp.x64.exe" "$INSTALLPATH_KEYMANENGINE/keymanx64.exe" +} + +function do_install_arm64() { + cp "$WINDOWS_PROGRAM_ENGINE/keymanhp.arm64.exe" "$INSTALLPATH_KEYMANENGINE/keymanhp.arm64.exe" +} + + +builder_run_action clean:x64 do_clean_x64 +builder_run_action clean:arm64 do_clean_arm64 +builder_run_action configure configure_windows_build_environment +builder_run_action build:x64 do_build_x64 +builder_run_action build:arm64 do_build_arm64 # builder_run_action test:project do_test -builder_run_action publish:project do_publish -builder_run_action install:project cp "$WINDOWS_PROGRAM_ENGINE/keymanx64.exe" "$INSTALLPATH_KEYMANENGINE/keymanx64.exe" +builder_run_action publish:x64 do_publish_x64 +builder_run_action publish:arm64 do_publish_arm64 +builder_run_action install:x64 do_install_x64 +builder_run_action install:arm64 do_install_arm64 diff --git a/windows/src/engine/keymanhp/keymanhp.vcxproj b/windows/src/engine/keymanhp/keymanhp.vcxproj index 34016eff41..d7b9c5b4c7 100644 --- a/windows/src/engine/keymanhp/keymanhp.vcxproj +++ b/windows/src/engine/keymanhp/keymanhp.vcxproj @@ -100,10 +100,10 @@ *.cdf;*.cache;*.obj;*.ilk;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.metagen;*.bi - keymanx64 + keymanhp.x64 - keymanx64 + keymanhp.x64 keymanhp.arm64 diff --git a/windows/src/engine/kmtip/build.sh b/windows/src/engine/kmtip/build.sh index 082125373e..ba283347b5 100755 --- a/windows/src/engine/kmtip/build.sh +++ b/windows/src/engine/kmtip/build.sh @@ -17,10 +17,13 @@ builder_parse "$@" source "$KEYMAN_ROOT/resources/build/win/environment.inc.sh" WIN32_TARGET="$WIN32_TARGET_PATH/kmtip.dll" X64_TARGET="$X64_TARGET_PATH/kmtip64.dll" +ARM64_TARGET="$ARM64_TARGET_PATH/kmtiparm64.dll" builder_describe_outputs \ configure:project /resources/build/win/delphi_environment_generated.inc.sh \ - build:project /windows/src/engine/kmtip/$X64_TARGET + build:x86 /windows/src/engine/kmtip/$WIN32_TARGET \ + build:x64 /windows/src/engine/kmtip/$X64_TARGET \ + build:arm64 /windows/src/engine/kmtip/$ARM64_TARGET \ #------------------------------------------------------------------------------------------------------------------- @@ -34,24 +37,31 @@ function do_build() { build_version.res vs_msbuild kmtip.vcxproj //t:Build "//p:Platform=Win32" vs_msbuild kmtip.vcxproj //t:Build "//p:Platform=x64" + vs_msbuild kmtip.vcxproj //t:Build "//p:Platform=arm64" cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_ENGINE" builder_if_release_build_level cp "$WIN32_TARGET_PATH/kmtip.pdb" "$WINDOWS_DEBUGPATH_ENGINE" cp "$X64_TARGET" "$WINDOWS_PROGRAM_ENGINE" builder_if_release_build_level cp "$X64_TARGET_PATH/kmtip64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" + cp "$ARM64_TARGET" "$WINDOWS_PROGRAM_ENGINE" + builder_if_release_build_level cp "$ARM64_TARGET_PATH/kmtiparm64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" } function do_publish() { wrap-signcode //d "Keyman Engine for Windows" "$WINDOWS_PROGRAM_ENGINE/kmtip.dll" wrap-signcode //d "Keyman Engine for Windows" "$WINDOWS_PROGRAM_ENGINE/kmtip64.dll" + wrap-signcode //d "Keyman Engine for Windows" "$WINDOWS_PROGRAM_ENGINE/kmtiparm64.dll" wrap-symstore "$WINDOWS_PROGRAM_ENGINE/kmtip.dll" //t keyman-engine-windows wrap-symstore "$WINDOWS_DEBUGPATH_ENGINE/kmtip.pdb" //t keyman-engine-windows wrap-symstore "$WINDOWS_PROGRAM_ENGINE/kmtip64.dll" //t keyman-engine-windows wrap-symstore "$WINDOWS_DEBUGPATH_ENGINE/kmtip64.pdb" //t keyman-engine-windows + wrap-symstore "$WINDOWS_PROGRAM_ENGINE/kmtiparm64.dll" //t keyman-engine-windows + wrap-symstore "$WINDOWS_DEBUGPATH_ENGINE/kmtiparm64.pdb" //t keyman-engine-windows } function do_install() { cp "$WINDOWS_PROGRAM_ENGINE/kmtip.dll" "$INSTALLPATH_KEYMANENGINE/kmtip.dll" cp "$WINDOWS_PROGRAM_ENGINE/kmtip64.dll" "$INSTALLPATH_KEYMANENGINE/kmtip64.dll" + cp "$WINDOWS_PROGRAM_ENGINE/kmtiparm64.dll" "$INSTALLPATH_KEYMANENGINE/kmtiparm64.dll" } builder_run_action clean:project do_clean diff --git a/windows/src/support/texteditor/Editor.sln b/windows/src/support/texteditor/Editor.sln index 779a4405f7..51408bdac6 100644 --- a/windows/src/support/texteditor/Editor.sln +++ b/windows/src/support/texteditor/Editor.sln @@ -7,16 +7,22 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Editor", "Editor.vcxproj", EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM64 = Debug|ARM64 Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 + Release|ARM64 = Release|ARM64 Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {6804767E-857F-48CC-B843-22BF357A668C}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {6804767E-857F-48CC-B843-22BF357A668C}.Debug|ARM64.Build.0 = Debug|ARM64 {6804767E-857F-48CC-B843-22BF357A668C}.Debug|x64.ActiveCfg = Debug|x64 {6804767E-857F-48CC-B843-22BF357A668C}.Debug|x64.Build.0 = Debug|x64 {6804767E-857F-48CC-B843-22BF357A668C}.Debug|x86.ActiveCfg = Debug|Win32 {6804767E-857F-48CC-B843-22BF357A668C}.Debug|x86.Build.0 = Debug|Win32 + {6804767E-857F-48CC-B843-22BF357A668C}.Release|ARM64.ActiveCfg = Release|ARM64 + {6804767E-857F-48CC-B843-22BF357A668C}.Release|ARM64.Build.0 = Release|ARM64 {6804767E-857F-48CC-B843-22BF357A668C}.Release|x64.ActiveCfg = Release|x64 {6804767E-857F-48CC-B843-22BF357A668C}.Release|x64.Build.0 = Release|x64 {6804767E-857F-48CC-B843-22BF357A668C}.Release|x86.ActiveCfg = Release|Win32 diff --git a/windows/src/support/texteditor/Editor.vcxproj b/windows/src/support/texteditor/Editor.vcxproj index 4b01793829..c12ac1063e 100644 --- a/windows/src/support/texteditor/Editor.vcxproj +++ b/windows/src/support/texteditor/Editor.vcxproj @@ -1,10 +1,18 @@ + + Debug + ARM64 + Debug Win32 + + Release + ARM64 + Release Win32 @@ -51,6 +59,14 @@ $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + Application + true + v142 + Unicode + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + Application false @@ -60,6 +76,15 @@ $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + Application + false + v142 + true + Unicode + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + @@ -74,9 +99,15 @@ + + + + + + true @@ -90,10 +121,18 @@ true $(ProjectName)64 + + true + $(ProjectName)arm64 + false $(ProjectName)64 + + false + $(ProjectName)arm64 + Level3 @@ -135,6 +174,18 @@ true + + + Level3 + true + _DEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + + + Windows + true + + Level3 @@ -151,6 +202,22 @@ true + + + Level3 + true + true + true + NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + + + Windows + true + true + true + + diff --git a/windows/src/support/texteditor/build.sh b/windows/src/support/texteditor/build.sh index 6d58124a5d..9066c854d6 100755 --- a/windows/src/support/texteditor/build.sh +++ b/windows/src/support/texteditor/build.sh @@ -15,6 +15,7 @@ builder_parse "$@" source "$KEYMAN_ROOT/resources/build/win/environment.inc.sh" WIN32_TARGET="$WIN32_TARGET_PATH/editor32.exe" X64_TARGET="$X64_TARGET_PATH/editor64.exe" +ARM64_TARGET="$ARM64_TARGET_PATH/editorarm64.exe" builder_describe_outputs \ configure:project /resources/build/win/delphi_environment_generated.inc.sh \ @@ -32,10 +33,13 @@ function do_build() { # build_version.res vs_msbuild Editor.vcxproj //t:Build "//p:Platform=Win32" vs_msbuild Editor.vcxproj //t:Build "//p:Platform=x64" + vs_msbuild Editor.vcxproj //t:Build "//p:Platform=arm64" cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_SUPPORT" cp "$X64_TARGET" "$WINDOWS_PROGRAM_SUPPORT" + cp "$ARM64_TARGET" "$WINDOWS_PROGRAM_SUPPORT" builder_if_release_build_level cp "$WIN32_TARGET_PATH/editor32.pdb" "$WINDOWS_DEBUGPATH_SUPPORT" builder_if_release_build_level cp "$X64_TARGET_PATH/editor64.pdb" "$WINDOWS_DEBUGPATH_SUPPORT" + builder_if_release_build_level cp "$ARM64_TARGET_PATH/editorarm64.pdb" "$WINDOWS_DEBUGPATH_SUPPORT" } builder_run_action clean:project do_clean diff --git a/windows/src/test/unit-tests/shared-data/build.sh b/windows/src/test/unit-tests/shared-data/build.sh index 0262202238..c613509d06 100755 --- a/windows/src/test/unit-tests/shared-data/build.sh +++ b/windows/src/test/unit-tests/shared-data/build.sh @@ -29,6 +29,7 @@ function do_test() { "./delphi/$WIN64_TARGET_PATH/delphishareddata.exe" > delphi-win64.txt "./cpp/$WIN32_TARGET_PATH/cppshareddata.exe" > cpp-win32.txt "./cpp/$X64_TARGET_PATH/cppshareddata.exe" > cpp-win64.txt + "./cpp/$ARM64_TARGET_PATH/cppshareddata.exe" > cpp-arm64.txt diff -q delphi-win32.txt delphi-win64.txt diff -q delphi-win32.txt cpp-win32.txt diff -q delphi-win32.txt cpp-win64.txt From ecec5e49f4b4c55a8596de4946759fea01785c66 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Wed, 15 Oct 2025 10:58:42 +1000 Subject: [PATCH 09/59] refactor(windows): address review comments --- windows/src/engine/keymanhp/build.sh | 0 windows/src/engine/keymanhp/keymanhp.cpp | 21 ++++++++++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) mode change 100644 => 100755 windows/src/engine/keymanhp/build.sh diff --git a/windows/src/engine/keymanhp/build.sh b/windows/src/engine/keymanhp/build.sh old mode 100644 new mode 100755 diff --git a/windows/src/engine/keymanhp/keymanhp.cpp b/windows/src/engine/keymanhp/keymanhp.cpp index 48217190e7..38fe36595a 100644 --- a/windows/src/engine/keymanhp/keymanhp.cpp +++ b/windows/src/engine/keymanhp/keymanhp.cpp @@ -62,25 +62,32 @@ HANDLE hWatcherThreadTerminateEvent = NULL; BOOL KeymanStarted = FALSE; // Global strings +#if defined(_M_X64) + #define WINDOW_TITLE L"Keymanhp-x64" +#elif defined(_M_ARM64) + #define WINDOW_TITLE L"Keymanhp-arm64" +#else + #error Unknown architecture +#endif const PWSTR - szWindowClass = L"Keymanhp", // Do not localize - szWindowTitle = L"Keymanhp", // Do not localize + szWindowClass = WINDOW_TITLE, // Do not localize + szWindowTitle = WINDOW_TITLE, // Do not localize szTitle = L"Keyman Engine x64", - szError_Keymanx86NotFound = L"Keyman Engine x86 is not running. Do not run keymanx64.exe -- it must be started by Keyman Engine x86", - szError_Keymanx86NotFound_Comms = L"Keyman Engine x86 has closed unexpectedly. Closing down Keyman Engine x64", + szError_Keymanx86NotFound = L"Keyman Engine x86 is not running. Do not run keymanhp.*.exe -- it must be started by Keyman Engine x86", + szError_Keymanx86NotFound_Comms = L"Keyman Engine x86 has closed unexpectedly. Closing down Keyman Engine hp64", szError_FailedToRegisterController = L"Failed to register controller window", - szError_FailedToInitialise = L"Failed to initialise Keyman Engine x64", + szError_FailedToInitialise = L"Failed to initialise Keyman Engine hp", szError_FailedToFindParentProcess = L"Unable to open parent process; it may have disappeared", szError_ChangeWindowMessageFilter = L"Failed to prepare message filters", - szError_CannotRunMultipleInstances = L"Only one instance of Keyman Engine x64 can run at a time", + szError_CannotRunMultipleInstances = L"Only one instance of Keyman Engine hp can run at a time", szError_FailedToRegister = L"Failed to register window class", szError_FailedToInitInstance = L"Failed to initialise application", - szError_InvalidCommandline = L"Incorrect command line for Keyman Engine x64; should be passed handle of Keyman Engine x86", + szError_InvalidCommandline = L"Incorrect command line for Keyman Engine hp; should be passed handle of Keyman Engine x86", szError_WatcherThreadFailed = L"Failed to create watcher thread", szFail_UnknownError = L"Unknown error %d", From 9a7cb42fc74291c3d7aa906cc62d159f241f664f Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Mon, 20 Oct 2025 16:03:39 +1000 Subject: [PATCH 10/59] feat(windows): add keymanarm64.def --- windows/src/engine/inst/components.wxs | 4 ++ windows/src/engine/keyman/UfrmKeyman7Main.pas | 52 +++++++++++++++++-- windows/src/engine/keyman32/keyman32.vcxproj | 28 +++++++--- .../engine/keyman32/keyman32.vcxproj.filters | 6 +++ windows/src/engine/keyman32/keyman64.h | 8 +-- windows/src/engine/keymanhp/keymanhp.cpp | 4 +- windows/src/engine/keymanhp/keymanhp.vcxproj | 4 +- .../src/global/delphi/general/utilwow64.pas | 4 ++ 8 files changed, 92 insertions(+), 18 deletions(-) diff --git a/windows/src/engine/inst/components.wxs b/windows/src/engine/inst/components.wxs index 78e8fb4dd3..da7f12b6ba 100644 --- a/windows/src/engine/inst/components.wxs +++ b/windows/src/engine/inst/components.wxs @@ -137,6 +137,10 @@ + + + + diff --git a/windows/src/engine/keyman/UfrmKeyman7Main.pas b/windows/src/engine/keyman/UfrmKeyman7Main.pas index 7f948d0518..85cf6bcc71 100644 --- a/windows/src/engine/keyman/UfrmKeyman7Main.pas +++ b/windows/src/engine/keyman/UfrmKeyman7Main.pas @@ -268,7 +268,8 @@ type //procedure SnapToolHelp; procedure RecreateTaskbarIcons; function StartKeymanEngine: Boolean; - procedure StartKeymanX64; + procedure StartKeymanHPX64; + procedure StartKeymanHParm64; // TODO could combine this function procedure OpenTextEditor; //function GetCachedKeymanID(hkl: DWORD): DWORD; procedure ShowLanguageSwitchForm; @@ -1325,7 +1326,8 @@ begin else kmint.KeymanEngineControl.RestartEngine; // I1486 - StartKeymanX64; + //StartKeymanHPX64; + StartKeymanHPARM64 end; @@ -1954,7 +1956,7 @@ begin FLangSwitchRefreshWatcher.Start; end; -procedure TfrmKeyman7Main.StartKeymanX64; +procedure TfrmKeyman7Main.StartKeymanHPX64; var cmd, dir, params: string; sei: TShellExecuteInfoW; @@ -1964,7 +1966,7 @@ begin try // TODO: use TKeymanPaths to find keymanx64? dir := ExtractFilePath(ParamStr(0)); - cmd := dir + 'keymanx64.exe'; + cmd := dir + 'keymanhp.x64.exe'; params := Format('%d %d', [GetCurrentProcessId, Application.Handle]); if not FileExists(cmd) then @@ -1988,7 +1990,47 @@ begin begin // We're going to handle any exceptions here but we'd like to know that // they happened - TKeymanSentryClient.ReportHandledException(E, 'Error starting keymanx64', True); + TKeymanSentryClient.ReportHandledException(E, 'Error starting keymanhp.x64', True); + end; + end; +end; + +procedure TfrmKeyman7Main.StartKeymanHPARM64; +var + cmd, dir, params: string; + sei: TShellExecuteInfoW; +begin + // This will actually need to be replaced with the new of IsWow64Process2 + //if not IsWow64 then Exit; // I4374 + + try + // TODO: use TKeymanPaths to find keymanx64? + dir := ExtractFilePath(ParamStr(0)); + cmd := dir + 'keymanhp.arm64.exe'; + params := Format('%d %d', [GetCurrentProcessId, Application.Handle]); + + if not FileExists(cmd) then + // We'll get notification of the issue but it won't + // crash the process + raise Exception.Create(cmd+' could not be found'); + + FillChar(sei, SizeOf(sei), 0); + sei.cbSize := SizeOf(sei); + sei.Wnd := Handle; + sei.lpVerb := 'open'; + sei.lpFile := PWideChar(cmd); + sei.lpParameters := PChar(params); + sei.lpDirectory := PWideChar(dir); + sei.nShow := SW_SHOW; + + if not ShellExecuteExW(@sei) then + RaiseLastOSError; + except + on E:Exception do + begin + // We're going to handle any exceptions here but we'd like to know that + // they happened + TKeymanSentryClient.ReportHandledException(E, 'Error starting keymanhp.x64', True); end; end; end; diff --git a/windows/src/engine/keyman32/keyman32.vcxproj b/windows/src/engine/keyman32/keyman32.vcxproj index 1a79793a75..ab1ffadbd0 100644 --- a/windows/src/engine/keyman32/keyman32.vcxproj +++ b/windows/src/engine/keyman32/keyman32.vcxproj @@ -309,7 +309,7 @@ /verbose:lib /section:.SHARDATA,rws %(AdditionalOptions) libicuuc.a;libicuin.a;libkeymancore.a;psapi.lib;rpcrt4.lib;version.lib;setupapi.lib;iphlpapi.lib;imm32.lib;crypt32.lib;wintrust.lib;imagehlp.lib;ws2_32.lib;%(AdditionalDependencies) true - keyman64.def + keymanarm64.def true true false @@ -319,11 +319,11 @@ 0x140000000 true true - ..\..\..\lib\keyman64.lib + ..\..\..\lib\keymanarm64.lib true - ./Keyman64.bsc + ./Keymanarm64.bsc @@ -467,7 +467,7 @@ /verbose:lib /section:.SHARDATA,rws %(AdditionalOptions) libicuuc.a;libicuin.a;libkeymancore.a;psapi.lib;rpcrt4.lib;version.lib;setupapi.lib;iphlpapi.lib;imm32.lib;crypt32.lib;wintrust.lib;imagehlp.lib;ws2_32.lib;%(AdditionalDependencies) true - keyman64.def + keymanarm64.def true true Windows @@ -478,7 +478,7 @@ true - ./Keyman32.bsc + ./Keymanarm64.bsc @@ -576,6 +576,14 @@ true true + true + true + + + true + true + true + true @@ -595,6 +603,14 @@ true true + true + true + + + true + true + true + true @@ -632,4 +648,4 @@ - \ No newline at end of file + diff --git a/windows/src/engine/keyman32/keyman32.vcxproj.filters b/windows/src/engine/keyman32/keyman32.vcxproj.filters index 5627c72b04..041d7c2984 100644 --- a/windows/src/engine/keyman32/keyman32.vcxproj.filters +++ b/windows/src/engine/keyman32/keyman32.vcxproj.filters @@ -155,6 +155,9 @@ Source Files + + Source Files + @@ -166,6 +169,9 @@ Source Files + + Source Files + diff --git a/windows/src/engine/keyman32/keyman64.h b/windows/src/engine/keyman32/keyman64.h index 4a42bb3abd..e46dad1782 100644 --- a/windows/src/engine/keyman32/keyman64.h +++ b/windows/src/engine/keyman32/keyman64.h @@ -81,10 +81,12 @@ #include "../../../../common/windows/cpp/include/xstring.h" #include "../../../../common/windows/cpp/include/legacy_kmx_memory.h" -#ifdef _WIN64 -#define LIBRARY_NAME "KEYMAN64" +#if defined(_M_ARM64) + #define LIBRARY_NAME "KEYMANARM64" +#elif defined(_M_X64) + #define LIBRARY_NAME "KEYMAN64" #else -#define LIBRARY_NAME "KEYMAN32" + #define LIBRARY_NAME "KEYMAN32" #endif #define NOT_IMPLEMENTED assert(FALSE) diff --git a/windows/src/engine/keymanhp/keymanhp.cpp b/windows/src/engine/keymanhp/keymanhp.cpp index be6338d4c4..38fe36595a 100644 --- a/windows/src/engine/keymanhp/keymanhp.cpp +++ b/windows/src/engine/keymanhp/keymanhp.cpp @@ -71,8 +71,8 @@ BOOL KeymanStarted = FALSE; #endif const PWSTR - szWindowClass = L"Keymanhp", // Do not localize - szWindowTitle = L"Keymanhp", // Do not localize + szWindowClass = WINDOW_TITLE, // Do not localize + szWindowTitle = WINDOW_TITLE, // Do not localize szTitle = L"Keyman Engine x64", szError_Keymanx86NotFound = L"Keyman Engine x86 is not running. Do not run keymanhp.*.exe -- it must be started by Keyman Engine x86", diff --git a/windows/src/engine/keymanhp/keymanhp.vcxproj b/windows/src/engine/keymanhp/keymanhp.vcxproj index 9f1dbd62a3..36123f79cf 100644 --- a/windows/src/engine/keymanhp/keymanhp.vcxproj +++ b/windows/src/engine/keymanhp/keymanhp.vcxproj @@ -112,10 +112,10 @@ keymanhp.arm64 - keymanx64 + keymanhp.x64 - keymanx64 + keymanhp.x64 diff --git a/windows/src/global/delphi/general/utilwow64.pas b/windows/src/global/delphi/general/utilwow64.pas index cf490ed036..e461ca4051 100644 --- a/windows/src/global/delphi/general/utilwow64.pas +++ b/windows/src/global/delphi/general/utilwow64.pas @@ -21,4 +21,8 @@ begin Result := FIsWow64; // not on Wow64 end; +// TODO: workout how to access IsWow64Process2 +// then we can determine if we should start ARM64 + + end. From 472c8e20277137e4723c56e732fb81a571f224b9 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Wed, 22 Oct 2025 22:20:48 +1000 Subject: [PATCH 11/59] feat(windows): add keymanarm64.def update gitignore --- windows/src/.gitignore | 2 + windows/src/engine/inst/components.wxs | 8 ++-- windows/src/engine/keyman/UfrmKeyman7Main.pas | 6 +-- windows/src/engine/keyman32/keymanarm64.def | 46 +++++++++++++++++++ windows/src/engine/keyman32/keymanarm64.rc | 1 + windows/src/engine/keymanhp/keymanhp.cpp | 20 +++++--- .../src/global/delphi/general/utilwow64.pas | 30 +++++++++++- 7 files changed, 98 insertions(+), 15 deletions(-) create mode 100644 windows/src/engine/keyman32/keymanarm64.def create mode 100644 windows/src/engine/keyman32/keymanarm64.rc diff --git a/windows/src/.gitignore b/windows/src/.gitignore index b48915630c..5702b35948 100644 --- a/windows/src/.gitignore +++ b/windows/src/.gitignore @@ -7,9 +7,11 @@ **/obj/Win32/ **/obj/Win64/ **/obj/x64/ +**/obj/arm64/ **/bin/Win32/ **/bin/Win64/ **/bin/x64/ +**/bin/arm64/ # Temporary build files for VC++ **/*.FileListAbsolute.txt diff --git a/windows/src/engine/inst/components.wxs b/windows/src/engine/inst/components.wxs index da7f12b6ba..be36d57743 100644 --- a/windows/src/engine/inst/components.wxs +++ b/windows/src/engine/inst/components.wxs @@ -242,9 +242,11 @@ - - VersionNT64 AND NOT (ProcessorArchitecture="AMD64") - + + VersionNT64 AND ProcessorArchitecture="ARM64" + + + diff --git a/windows/src/engine/keyman/UfrmKeyman7Main.pas b/windows/src/engine/keyman/UfrmKeyman7Main.pas index 85cf6bcc71..917ef6e6d5 100644 --- a/windows/src/engine/keyman/UfrmKeyman7Main.pas +++ b/windows/src/engine/keyman/UfrmKeyman7Main.pas @@ -1326,7 +1326,7 @@ begin else kmint.KeymanEngineControl.RestartEngine; // I1486 - //StartKeymanHPX64; + StartKeymanHPX64; StartKeymanHPARM64 end; @@ -2000,8 +2000,8 @@ var cmd, dir, params: string; sei: TShellExecuteInfoW; begin - // This will actually need to be replaced with the new of IsWow64Process2 - //if not IsWow64 then Exit; // I4374 + + if not IsNativeMachineWowArm64 then Exit; try // TODO: use TKeymanPaths to find keymanx64? diff --git a/windows/src/engine/keyman32/keymanarm64.def b/windows/src/engine/keyman32/keymanarm64.def new file mode 100644 index 0000000000..8a6014675e --- /dev/null +++ b/windows/src/engine/keyman32/keymanarm64.def @@ -0,0 +1,46 @@ +LIBRARY KEYMANARM64 + +EXPORTS + Keyman_GetInitialised + Keyman_Initialise + Keyman_Exit + Keyman_GetLastActiveWindow + Keyman_GetLastFocusWindow + KMSetOutput + KMGetContext + KMQueueAction + KMDisplayIM + KMHideIM + KMGetActiveKeyboard + KMGetKeyboardPath + + TIPActivateEx + TIPActivateKeyboard + TIPProcessKey + TIPProcessKeyEx + TIPIsKeymanRunning + GetKeyboardPreservedKeys + + GetActiveKeymanID + Keyman_RegisterControllerWindow + Keyman_UnregisterControllerWindow + Keyman_RestartEngine + + Keyman_SendMasterController + Keyman_PostControllers + Keyman_PostMasterController + + Keyman_StartExit + Keyman_ResetInitialisation + + Keyman_WriteDebugEvent + Keyman_WriteDebugEventW + + Keyman_Diagnostic + + Keyman_RegisterMasterController + Keyman_UnregisterMasterController + Keyman_RegisterControllerThread + Keyman_UnregisterControllerThread + + SetCustomPostKeyCallback diff --git a/windows/src/engine/keyman32/keymanarm64.rc b/windows/src/engine/keyman32/keymanarm64.rc new file mode 100644 index 0000000000..c4fe9ce92e --- /dev/null +++ b/windows/src/engine/keyman32/keymanarm64.rc @@ -0,0 +1 @@ +#include "version64.rc" diff --git a/windows/src/engine/keymanhp/keymanhp.cpp b/windows/src/engine/keymanhp/keymanhp.cpp index 38fe36595a..6b0fb183cb 100644 --- a/windows/src/engine/keymanhp/keymanhp.cpp +++ b/windows/src/engine/keymanhp/keymanhp.cpp @@ -64,8 +64,12 @@ BOOL KeymanStarted = FALSE; // Global strings #if defined(_M_X64) #define WINDOW_TITLE L"Keymanhp-x64" + #define EXECUTABLE_TITLE L"Keyman Engine x64" + #define ARCH_LOG_FILE ".keymanhp-x64" #elif defined(_M_ARM64) #define WINDOW_TITLE L"Keymanhp-arm64" + #define EXECUTABLE_TITLE L"Keyman Engine arm64" + #define ARCH_LOG_FILE ".keymanhp-arm64" #else #error Unknown architecture #endif @@ -74,7 +78,7 @@ const PWSTR szWindowClass = WINDOW_TITLE, // Do not localize szWindowTitle = WINDOW_TITLE, // Do not localize - szTitle = L"Keyman Engine x64", + szTitle = EXECUTABLE_TITLE, szError_Keymanx86NotFound = L"Keyman Engine x86 is not running. Do not run keymanhp.*.exe -- it must be started by Keyman Engine x86", szError_Keymanx86NotFound_Comms = L"Keyman Engine x86 has closed unexpectedly. Closing down Keyman Engine hp64", szError_FailedToRegisterController = L"Failed to register controller window", @@ -97,8 +101,7 @@ const PWSTR szWindowClass_x86_Wnd = L"TfrmKeyman7Main"; // Do not localize //const char *szGPA_ChangeWindowMessageFilter = "ChangeWindowMessageFilter"; // Do not localize - -#define KEYMAN_SENTRY_LOGGER_DESKTOP_ENGINE_KEYMANX64 KEYMAN_SENTRY_LOGGER_DESKTOP_ENGINE ".keymanx64" +#define KEYMAN_SENTRY_LOGGER_DESKTOP_ENGINE_KEYMANHP KEYMAN_SENTRY_LOGGER_DESKTOP_ENGINE ARCH_LOG_FILE // // FUNCTION: _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int @@ -107,7 +110,8 @@ const PWSTR // // COMMENTS: // -// A mutex is used to ensure only one instance of Keyman Engine x64 +// A mutex is used to ensure only one instance of Keyman Engine HP +// for each architecture. // int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, @@ -115,8 +119,8 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); - - keyman_sentry_init(false, KEYMAN_SENTRY_LOGGER_DESKTOP_ENGINE_KEYMANX64); +#if defined(_M_X64) + keyman_sentry_init(false, KEYMAN_SENTRY_LOGGER_DESKTOP_ENGINE_KEYMANHP); keyman_sentry_setexceptionfilter(); // We used the 'Started' event when testing Sentry integration in 14.0 alpha @@ -126,10 +130,12 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, if (!wcscmp(lpCmdLine, L"-sentry-client-test-exception")) { keyman_sentry_test_crash(); } +#endif BOOL result = Run(hInstance, lpCmdLine, nCmdShow); - +#if defined(_M_X64) keyman_sentry_shutdown(); +#endif return result ? 0 : 1; } diff --git a/windows/src/global/delphi/general/utilwow64.pas b/windows/src/global/delphi/general/utilwow64.pas index e461ca4051..d46aa67246 100644 --- a/windows/src/global/delphi/general/utilwow64.pas +++ b/windows/src/global/delphi/general/utilwow64.pas @@ -5,6 +5,11 @@ interface uses Winapi.Windows; +{$IFNDEF IMAGE_FILE_MACHINE_ARM64} +const + IMAGE_FILE_MACHINE_ARM64 = $AA64; +{$ENDIF} + function IsWow64: Boolean; implementation @@ -12,6 +17,9 @@ implementation uses System.SysUtils; +type + TIsWow64Process2 = function(hProcess: THandle; out pProcessMachine: USHORT; out pNativeMachine: USHORT): BOOL; stdcall; + function IsWow64: Boolean; var FIsWow64: BOOL; @@ -21,8 +29,26 @@ begin Result := FIsWow64; // not on Wow64 end; -// TODO: workout how to access IsWow64Process2 -// then we can determine if we should start ARM64 +(** + Determines whether the current system's native architecture is ARM64. + @returns: True if the native machine architecture is ARM64, False otherwise +*) +function IsNativeMachineWowArm64: Boolean; +var + processMachine: USHORT; + nativeMachine: USHORT; + IsWow64Process2 : TIsWow64Process2; +begin + Result := False; + IsWow64Process2 := GetProcAddress(GetModuleHandle(kernel32), 'IsWow64Process2'); + if Assigned(IsWow64Process2) then + begin + if IsWow64Process2(GetCurrentProcess, processMachine, nativeMachine) then + begin + Result := (nativeMachine = IMAGE_FILE_MACHINE_ARM64); + end; + end; +end; end. From 5f974775cd51c50c7c473396f56bb877a3a4361d Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Wed, 22 Oct 2025 22:48:27 +1000 Subject: [PATCH 12/59] feat(windows): remove echo --- core/build.bat | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/build.bat b/core/build.bat index 790ca31ebe..3ac50e83d9 100644 --- a/core/build.bat +++ b/core/build.bat @@ -10,7 +10,6 @@ if "%1"=="x86" goto build if "%1"=="x64" goto build if "%1"=="ARM64" goto build - echo "Invalid parameter." goto help @@ -38,7 +37,6 @@ cd %KEYMAN_ROOT%\core cmd /c build.bat x64 %2 %3 %4 %5 %6 %7 %8 %9 || exit !errorlevel! cd %KEYMAN_ROOT%\core -echo cmd /c build.bat ARM64 %2 %3 %4 %5 %6 %7 %8 %9 || exit !errorlevel! cmd /c build.bat ARM64 %2 %3 %4 %5 %6 %7 %8 %9 || exit !errorlevel! goto :eof From d52b48cbbbd4a168802a7a466c5f769b72ee3f62 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Tue, 28 Oct 2025 16:40:42 +1000 Subject: [PATCH 13/59] feat(windows): handle arm64 complier environment Update the build.bat to handle configuring the build environment with vsdevcmd correctly for arm64 2019 doesn't work very well so have to have pretty weird if statement. also checked in some missed updates to function name change --- core/build.bat | 48 +++++++++++++++---- core/commands.inc.sh | 6 +-- windows/src/engine/keyman/UfrmKeyman7Main.pas | 2 +- .../src/global/delphi/general/utilwow64.pas | 3 +- 4 files changed, 46 insertions(+), 13 deletions(-) diff --git a/core/build.bat b/core/build.bat index 3ac50e83d9..446246c8d1 100644 --- a/core/build.bat +++ b/core/build.bat @@ -8,7 +8,7 @@ if "%1"=="" goto help if "%1"=="all" goto all if "%1"=="x86" goto build if "%1"=="x64" goto build -if "%1"=="ARM64" goto build +if "%1"=="arm64" goto build echo "Invalid parameter." goto help @@ -16,9 +16,9 @@ goto help rem ---------------------------------- :help -echo Usage: %0 x86^|x64^|ARM64^|all debug^|release [configure] [build] [test] [additional params for meson/ninja] +echo Usage: %0 x86^|x64^|arm64^|all debug^|release [configure] [build] [test] [additional params for meson/ninja] echo or -echo Usage: %0 x86^|x64^|ARM64^ -c +echo Usage: %0 x86^|x64^|arm64^ -c echo -c will leave your environment configured for Visual Studio for selected platform. echo. echo Otherwise, %0 is intended to be used by build.sh, not directly. @@ -37,7 +37,7 @@ cd %KEYMAN_ROOT%\core cmd /c build.bat x64 %2 %3 %4 %5 %6 %7 %8 %9 || exit !errorlevel! cd %KEYMAN_ROOT%\core -cmd /c build.bat ARM64 %2 %3 %4 %5 %6 %7 %8 %9 || exit !errorlevel! +cmd /c build.bat arm64 %2 %3 %4 %5 %6 %7 %8 %9 || exit !errorlevel! goto :eof @@ -45,11 +45,28 @@ rem ---------------------------------- :build +set "HOST_ARCH=%PROCESSOR_ARCHITECTURE%" + +rem Map Windows arch strings to VsDevCmd expected values +if /I "%HOST_ARCH%"=="AMD64" set "HOST_ARCH=amd64" +if /I "%HOST_ARCH%"=="x86" set "HOST_ARCH=x86" +if /I "%HOST_ARCH%"=="ARM64" set "HOST_ARCH=arm64" + + set ARCH=%1 shift if "%1"=="-c" goto :setup +rem Initialize MESON_CROSS_FILE as empty +set "MESON_CROSS_FILE=" + +rem Check if cross file exists (using %~dp0 for script directory) +if exist "%~dp0cross-%ARCH%.build" ( + echo [DEBUG] Using cross file cross-%ARCH%.build + set "MESON_CROSS_FILE=--cross-file cross-%ARCH%.build" +) + echo === Locating Visual Studio === rem From https://github.com/microsoft/vswhere @@ -69,8 +86,23 @@ if not exist "!VsDevCmd_Path!" ( echo === Configuring VC++ === set VSCMD_SKIP_SENDTELEMETRY=1 -call "!VsDevCmd_Path!" -arch=!ARCH! -no_logo -startdir=none || exit !errorlevel! - +rem vsdevcmd.bat -arch parameter for 2019 is can only be x86 or amd64. (arm64 is not supported till 2022) +rem -host_arch does support is required for arm64 builds on x86/amd64 hosts. +rem However on arm64 host we cant even use vsdevcmd -arch=arm64 as it fails.(2019) +rem for now we will have workaround this untill updating to VS2022 +if /I "%HOST_ARCH%"=="arm64" ( + if /I "%ARCH%"=="arm64" ( + call "!VsDevCmd_Path!" -no_logo -startdir=none || exit !errorlevel! + ) else ( + call "!VsDevCmd_Path!" -arch=!ARCH! -no_logo -startdir=none || exit !errorlevel! + ) +) else ( + if /I "%ARCH%"=="arm64" ( + call "!VsDevCmd_Path!" -arch=!ARCH! -host_arch=!HOST_ARCH! -no_logo -startdir=none || exit !errorlevel! + ) else ( + call "!VsDevCmd_Path!" -arch=!ARCH! -no_logo -startdir=none || exit !errorlevel! + ) +) cd %KEYMAN_ROOT%\core set BUILDTYPE=%1 @@ -85,9 +117,9 @@ if "!COMMAND!" == "configure" ( echo === Configuring Keyman Core for Windows !ARCH! !BUILDTYPE! === if exist build\!ARCH!\!BUILDTYPE! rd /s/q build\!ARCH!\!BUILDTYPE! if "%1" == "--no-tests" ( - meson setup build\!ARCH!\!BUILDTYPE! !STATIC_LIBRARY! --buildtype !BUILDTYPE! -Dkeyman_core_tests=false --werror %2 %3 %4 %5 %6 %7 %8 %9 || exit !errorlevel! + meson setup !MESON_CROSS_FILE! build\!ARCH!\!BUILDTYPE ! !STATIC_LIBRARY! --buildtype !BUILDTYPE! -Dkeyman_core_tests=false --werror %2 %3 %4 %5 %6 %7 %8 %9 || exit !errorlevel! ) else ( - meson setup build\!ARCH!\!BUILDTYPE! !STATIC_LIBRARY! --buildtype !BUILDTYPE! --werror %1 %2 %3 %4 %5 %6 %7 %8 %9 || exit !errorlevel! + meson setup !MESON_CROSS_FILE! build\!ARCH!\!BUILDTYPE! !STA T IC_LIBRARY! --buildtype !BUILDTYPE! --werror %1 %2 %3 %4 %5 %6 %7 %8 %9 || exit !errorlevel! ) shift ) diff --git a/core/commands.inc.sh b/core/commands.inc.sh index 9672244c86..4584b2dfd6 100644 --- a/core/commands.inc.sh +++ b/core/commands.inc.sh @@ -50,7 +50,7 @@ do_configure() { STANDARD_MESON_ARGS="$STANDARD_MESON_ARGS --cross-file wasm.defs.build --cross-file wasm.build --default-library static" fi - if [[ $target =~ ^(x86|x64|ARM64)$ ]]; then + if [[ $target =~ ^(x86|x64|arm64)$ ]]; then cmd //C build.bat $target $BUILDER_CONFIGURATION configure $BUILD_BAT_keyman_core_tests "${builder_extra_params[@]}" else pushd "$THIS_SCRIPT_PATH" > /dev/null @@ -69,7 +69,7 @@ do_configure() { do_build() { local target=$1 builder_start_action build:$target || return 0 - if [[ $target =~ ^(x86|x64|ARM64)$ ]]; then + if [[ $target =~ ^(x86|x64|arm64)$ ]]; then cmd //C build.bat $target $BUILDER_CONFIGURATION build "${builder_extra_params[@]}" elif $MESON_LOW_VERSION; then pushd "$MESON_PATH" > /dev/null @@ -88,7 +88,7 @@ do_build() { do_test() { local target=$1 builder_start_action test:$target || return 0 - if [[ $target =~ ^(x86|x64|ARM64)$ ]]; then + if [[ $target =~ ^(x86|x64|arm64)$ ]]; then cmd //C build.bat $target $BUILDER_CONFIGURATION test $testparams else if [[ $target == wasm ]] && builder_is_macos; then diff --git a/windows/src/engine/keyman/UfrmKeyman7Main.pas b/windows/src/engine/keyman/UfrmKeyman7Main.pas index 917ef6e6d5..a5f6e48be1 100644 --- a/windows/src/engine/keyman/UfrmKeyman7Main.pas +++ b/windows/src/engine/keyman/UfrmKeyman7Main.pas @@ -2001,7 +2001,7 @@ var sei: TShellExecuteInfoW; begin - if not IsNativeMachineWowArm64 then Exit; + if not IsNativeMachineArm64 then Exit; try // TODO: use TKeymanPaths to find keymanx64? diff --git a/windows/src/global/delphi/general/utilwow64.pas b/windows/src/global/delphi/general/utilwow64.pas index d46aa67246..93a59d6260 100644 --- a/windows/src/global/delphi/general/utilwow64.pas +++ b/windows/src/global/delphi/general/utilwow64.pas @@ -11,6 +11,7 @@ const {$ENDIF} function IsWow64: Boolean; +function IsNativeMachineArm64: Boolean; implementation @@ -33,7 +34,7 @@ end; Determines whether the current system's native architecture is ARM64. @returns: True if the native machine architecture is ARM64, False otherwise *) -function IsNativeMachineWowArm64: Boolean; +function IsNativeMachineArm64: Boolean; var processMachine: USHORT; nativeMachine: USHORT; From 2f2df0bb8f1e95d6fa38496ca9c570452b45dfdc Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Tue, 28 Oct 2025 17:08:47 +1000 Subject: [PATCH 14/59] feat(windows): fix typos entered into the build.bat --- core/build.bat | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/build.bat b/core/build.bat index 446246c8d1..ef38f28c98 100644 --- a/core/build.bat +++ b/core/build.bat @@ -117,9 +117,9 @@ if "!COMMAND!" == "configure" ( echo === Configuring Keyman Core for Windows !ARCH! !BUILDTYPE! === if exist build\!ARCH!\!BUILDTYPE! rd /s/q build\!ARCH!\!BUILDTYPE! if "%1" == "--no-tests" ( - meson setup !MESON_CROSS_FILE! build\!ARCH!\!BUILDTYPE ! !STATIC_LIBRARY! --buildtype !BUILDTYPE! -Dkeyman_core_tests=false --werror %2 %3 %4 %5 %6 %7 %8 %9 || exit !errorlevel! + meson setup !MESON_CROSS_FILE! build\!ARCH!\!BUILDTYPE! !STATIC_LIBRARY! --buildtype !BUILDTYPE! -Dkeyman_core_tests=false --werror %2 %3 %4 %5 %6 %7 %8 %9 || exit !errorlevel! ) else ( - meson setup !MESON_CROSS_FILE! build\!ARCH!\!BUILDTYPE! !STA T IC_LIBRARY! --buildtype !BUILDTYPE! --werror %1 %2 %3 %4 %5 %6 %7 %8 %9 || exit !errorlevel! + meson setup !MESON_CROSS_FILE! build\!ARCH!\!BUILDTYPE! !STATIC_LIBRARY! --buildtype !BUILDTYPE! --werror %1 %2 %3 %4 %5 %6 %7 %8 %9 || exit !errorlevel! ) shift ) From 6ed0d6b280e59b264b0626d8fbb3bc3b14e44836 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Thu, 30 Oct 2025 16:31:45 +0100 Subject: [PATCH 15/59] chore(windows): upgrade VC++ projects to v143 (VS2022) Test-bot: skip Build-bot: skip release:developer,windows --- .../delphi/ext/tds2dbg/tds2dbg.vcxproj | 236 ++--- developer/src/kmanalyze/kmanalyze.vcxproj | 418 ++++---- developer/src/kmdecomp/kmdecomp.vcxproj | 340 +++---- .../src/samples/imsample/imsample.vcxproj | 530 +++++----- .../src/engine/keyman32/keyman-engine.vcxproj | 802 +++++++-------- windows/src/engine/keyman32/keyman32.vcxproj | 930 +++++++++--------- .../engine/keyman32/keyman32.vcxproj.filters | 534 +++++----- .../keyman-engine-tests.vcxproj | 320 +++--- windows/src/engine/keymanhp/keymanhp.vcxproj | 4 +- .../src/engine/kmrefresh/kmrefresh.vcxproj | 312 +++--- windows/src/engine/kmtip/kmtip.vcxproj | 862 ++++++++-------- windows/src/engine/mcompile/mcompile.vcxproj | 266 ++--- windows/src/engine/testhost/testhost.vcxproj | 342 +++---- windows/src/support/etl2log/etl2log.vcxproj | 362 +++---- windows/src/support/texteditor/Editor.vcxproj | 348 +++---- .../shared-data/cpp/cppshareddata.vcxproj | 350 +++---- 16 files changed, 3481 insertions(+), 3475 deletions(-) diff --git a/common/windows/delphi/ext/tds2dbg/tds2dbg.vcxproj b/common/windows/delphi/ext/tds2dbg/tds2dbg.vcxproj index 8d57ae5c66..5183081136 100644 --- a/common/windows/delphi/ext/tds2dbg/tds2dbg.vcxproj +++ b/common/windows/delphi/ext/tds2dbg/tds2dbg.vcxproj @@ -1,119 +1,119 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 15.0 - {40BFECE3-7FC0-4649-A3DC-E017FF84C75B} - Win32Proj - 10.0.17763.0 - - - - Application - true - v141 - - - Application - false - v141 - - - Application - true - v141 - - - Application - false - v141 - - - - - - - - - - - - - - - - - - - - - true - - - true - - - - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreadedDebugDLL - Level3 - ProgramDatabase - Disabled - - - MachineX86 - true - Console - - - - - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreadedDLL - Level3 - ProgramDatabase - - - MachineX86 - true - Console - true - true - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {40BFECE3-7FC0-4649-A3DC-E017FF84C75B} + Win32Proj + 10.0 + + + + Application + true + v143 + + + Application + false + v143 + + + Application + true + v143 + + + Application + false + v143 + + + + + + + + + + + + + + + + + + + + + true + + + true + + + + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + Level3 + ProgramDatabase + Disabled + + + MachineX86 + true + Console + + + + + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + Level3 + ProgramDatabase + + + MachineX86 + true + Console + true + true + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/developer/src/kmanalyze/kmanalyze.vcxproj b/developer/src/kmanalyze/kmanalyze.vcxproj index 20fd857a35..da59aaf833 100644 --- a/developer/src/kmanalyze/kmanalyze.vcxproj +++ b/developer/src/kmanalyze/kmanalyze.vcxproj @@ -1,210 +1,210 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 15.0 - {4EAE6DFD-E18A-493D-A00F-4846A2593F56} - Win32Proj - kmanalyze - 10.0 - - - - Application - true - v142 - MultiByte - - - Application - false - v142 - true - MultiByte - - - Application - true - v142 - MultiByte - - - Application - false - v142 - true - MultiByte - - - - - - - - - - - - - - - - - - - - - true - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(KEYMAN_ROOT)\windows\src\global\inc;$(KEYMAN_ROOT)\common\windows\delphi\ext\sentry - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - - true - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(KEYMAN_ROOT)\windows\src\global\inc;$(KEYMAN_ROOT)\common\windows\delphi\ext\sentry - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - - false - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(KEYMAN_ROOT)\windows\src\global\inc;$(KEYMAN_ROOT)\common\windows\delphi\ext\sentry - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - - false - $(VC_IncludePath);$(WindowsSDK_IncludePath);$(KEYMAN_ROOT)\windows\src\global\inc;$(KEYMAN_ROOT)\common\windows\delphi\ext\sentry - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - - - Use - Level3 - Disabled - true - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - pch.h - MultiThreadedDebug - $(KEYMAN_ROOT)\common\windows\delphi\ext\sentry;%(AdditionalIncludeDirectories) - - - Console - true - $(KEYMAN_ROOT)\common\windows\delphi\ext\sentry\sentry.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - sentry.dll - - - - - Use - Level3 - Disabled - true - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - pch.h - MultiThreaded - $(KEYMAN_ROOT)\common\windows\delphi\ext\sentry;%(AdditionalIncludeDirectories) - - - Console - true - $(KEYMAN_ROOT)\common\windows\delphi\ext\sentry\sentry.x64.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - sentry.dll - - - - - Use - Level3 - MaxSpeed - true - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - pch.h - MultiThreaded - $(KEYMAN_ROOT)\common\windows\delphi\ext\sentry;%(AdditionalIncludeDirectories) - - - Console - true - true - true - $(KEYMAN_ROOT)\common\windows\delphi\ext\sentry\sentry.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - sentry.dll - - - - - Use - Level3 - MaxSpeed - true - true - true - NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - pch.h - MultiThreaded - $(KEYMAN_ROOT)\common\windows\delphi\ext\sentry;%(AdditionalIncludeDirectories) - - - Console - true - true - true - $(KEYMAN_ROOT)\common\windows\delphi\ext\sentry\sentry.x64.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - sentry.dll - - - - - - - - - - - NotUsing - NotUsing - NotUsing - NotUsing - - - - - - Create - Create - Create - Create - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {4EAE6DFD-E18A-493D-A00F-4846A2593F56} + Win32Proj + kmanalyze + 10.0 + + + + Application + true + v143 + MultiByte + + + Application + false + v143 + true + MultiByte + + + Application + true + v143 + MultiByte + + + Application + false + v143 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + true + $(VC_IncludePath);$(WindowsSDK_IncludePath);$(KEYMAN_ROOT)\windows\src\global\inc;$(KEYMAN_ROOT)\common\windows\delphi\ext\sentry + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + + true + $(VC_IncludePath);$(WindowsSDK_IncludePath);$(KEYMAN_ROOT)\windows\src\global\inc;$(KEYMAN_ROOT)\common\windows\delphi\ext\sentry + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + + false + $(VC_IncludePath);$(WindowsSDK_IncludePath);$(KEYMAN_ROOT)\windows\src\global\inc;$(KEYMAN_ROOT)\common\windows\delphi\ext\sentry + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + + false + $(VC_IncludePath);$(WindowsSDK_IncludePath);$(KEYMAN_ROOT)\windows\src\global\inc;$(KEYMAN_ROOT)\common\windows\delphi\ext\sentry + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + + + Use + Level3 + Disabled + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + pch.h + MultiThreadedDebug + $(KEYMAN_ROOT)\common\windows\delphi\ext\sentry;%(AdditionalIncludeDirectories) + + + Console + true + $(KEYMAN_ROOT)\common\windows\delphi\ext\sentry\sentry.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + sentry.dll + + + + + Use + Level3 + Disabled + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + pch.h + MultiThreaded + $(KEYMAN_ROOT)\common\windows\delphi\ext\sentry;%(AdditionalIncludeDirectories) + + + Console + true + $(KEYMAN_ROOT)\common\windows\delphi\ext\sentry\sentry.x64.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + sentry.dll + + + + + Use + Level3 + MaxSpeed + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + pch.h + MultiThreaded + $(KEYMAN_ROOT)\common\windows\delphi\ext\sentry;%(AdditionalIncludeDirectories) + + + Console + true + true + true + $(KEYMAN_ROOT)\common\windows\delphi\ext\sentry\sentry.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + sentry.dll + + + + + Use + Level3 + MaxSpeed + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + pch.h + MultiThreaded + $(KEYMAN_ROOT)\common\windows\delphi\ext\sentry;%(AdditionalIncludeDirectories) + + + Console + true + true + true + $(KEYMAN_ROOT)\common\windows\delphi\ext\sentry\sentry.x64.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + sentry.dll + + + + + + + + + + + NotUsing + NotUsing + NotUsing + NotUsing + + + + + + Create + Create + Create + Create + + + + + + + + \ No newline at end of file diff --git a/developer/src/kmdecomp/kmdecomp.vcxproj b/developer/src/kmdecomp/kmdecomp.vcxproj index 223ae72199..36cea5f3ff 100644 --- a/developer/src/kmdecomp/kmdecomp.vcxproj +++ b/developer/src/kmdecomp/kmdecomp.vcxproj @@ -1,171 +1,171 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {963D608A-6689-469C-AE42-F56696DD42CC} - 10.0 - - - - Application - false - MultiByte - v142 - - - Application - false - MultiByte - v142 - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - true - false - AllRules.ruleset - - - AllRules.ruleset - - - - - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - $(IncludePath) - - - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(IncludePath) - - - - .\Debug/kmdecomp.tlb - - - - - Disabled - $(KEYMAN_ROOT)\windows\src\global\inc;$(KEYMAN_ROOT)\common\windows\delphi\ext\sentry;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - Level3 - true - EditAndContinue - stdcpp17 - Use - pch.h - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c09 - - - true - true - Console - MachineX86 - true - $(KEYMAN_ROOT)\common\windows\delphi\ext\sentry\sentry.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - sentry.dll - - - true - .\Debug/kmdecomp.bsc - - - - - .\Release/kmdecomp.tlb - - - - - MaxSpeed - OnlyExplicitInline - $(KEYMAN_ROOT)\windows\src\global\inc;$(KEYMAN_ROOT)\common\windows\delphi\ext\sentry;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - Level3 - true - true - stdcpp17 - Use - pch.h - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c09 - - - true - Console - MachineX86 - true - $(KEYMAN_ROOT)\common\windows\delphi\ext\sentry\sentry.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - sentry.dll - - - true - .\Release/kmdecomp.bsc - - - - - NotUsing - NotUsing - - - - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - - - Create - Create - - - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {963D608A-6689-469C-AE42-F56696DD42CC} + 10.0 + + + + Application + false + MultiByte + v143 + + + Application + false + MultiByte + v143 + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + true + false + AllRules.ruleset + + + AllRules.ruleset + + + + + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(IncludePath) + + + + .\Debug/kmdecomp.tlb + + + + + Disabled + $(KEYMAN_ROOT)\windows\src\global\inc;$(KEYMAN_ROOT)\common\windows\delphi\ext\sentry;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + Level3 + true + EditAndContinue + stdcpp17 + Use + pch.h + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c09 + + + true + true + Console + MachineX86 + true + $(KEYMAN_ROOT)\common\windows\delphi\ext\sentry\sentry.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + sentry.dll + + + true + .\Debug/kmdecomp.bsc + + + + + .\Release/kmdecomp.tlb + + + + + MaxSpeed + OnlyExplicitInline + $(KEYMAN_ROOT)\windows\src\global\inc;$(KEYMAN_ROOT)\common\windows\delphi\ext\sentry;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreaded + true + Level3 + true + true + stdcpp17 + Use + pch.h + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c09 + + + true + Console + MachineX86 + true + $(KEYMAN_ROOT)\common\windows\delphi\ext\sentry\sentry.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + sentry.dll + + + true + .\Release/kmdecomp.bsc + + + + + NotUsing + NotUsing + + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + Create + Create + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + + + + + + + + + + \ No newline at end of file diff --git a/developer/src/samples/imsample/imsample.vcxproj b/developer/src/samples/imsample/imsample.vcxproj index 9abee9aeff..93413dbe8f 100644 --- a/developer/src/samples/imsample/imsample.vcxproj +++ b/developer/src/samples/imsample/imsample.vcxproj @@ -1,266 +1,266 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - - - {0C9DB8F9-B788-8782-A97D-4F8294AA0B4E} - 10.0 - imsample - - - - DynamicLibrary - false - v142 - - - DynamicLibrary - false - v142 - - - DynamicLibrary - false - v142 - - - DynamicLibrary - false - v142 - - - - - - - - - - - - - - - - - - - - - - - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - true - - - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - true - .dll - $(ProjectName).x64 - - - false - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - - false - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - .dll - $(ProjectName).x64 - - - - MultiThreadedDebug - Default - true - Disabled - true - Level3 - true - EditAndContinue - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - .\IMSample.pch - true - - - true - _DEBUG;%(PreprocessorDefinitions) - .\IMSample.tlb - true - NUL - Win32 - - - 0x0c09 - _DEBUG;%(PreprocessorDefinitions) - - - true - .\IMSample.bsc - - - true - true - true - Windows - $(OutDir)$(TargetName)$(TargetExt) - .\IMSample.lib - odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - .\imsample.def - true - - - - - MultiThreadedDebug - Default - false - Disabled - true - Level3 - ProgramDatabase - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - .\IMSample.pch - true - - - true - _DEBUG;%(PreprocessorDefinitions) - .\IMSample.tlb - true - NUL - - - 0x0c09 - _DEBUG;%(PreprocessorDefinitions) - - - true - .\IMSample.bsc - - - true - true - true - Windows - $(OutDir)$(TargetName)$(TargetExt) - $(OutDir)$(TargetName).lib - odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - .\imsample.def - true - - - - - MultiThreaded - OnlyExplicitInline - true - true - MaxSpeed - true - Level3 - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - .\IMSample.pch - true - - - true - NDEBUG;%(PreprocessorDefinitions) - .\IMSample.tlb - true - NUL - Win32 - - - 0x0c09 - NDEBUG;%(PreprocessorDefinitions) - - - true - .\IMSample.bsc - - - true - true - Windows - odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - .\imsample.def - true - - - - - MultiThreaded - OnlyExplicitInline - true - true - MaxSpeed - true - Level3 - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - .\IMSample.pch - true - - - true - NDEBUG;%(PreprocessorDefinitions) - .\IMSample.tlb - true - NUL - - - 0x0c09 - NDEBUG;%(PreprocessorDefinitions) - - - true - .\IMSample.bsc - - - true - true - Windows - odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - .\imsample.def - true - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + {0C9DB8F9-B788-8782-A97D-4F8294AA0B4E} + 10.0 + imsample + + + + DynamicLibrary + false + v143 + + + DynamicLibrary + false + v143 + + + DynamicLibrary + false + v143 + + + DynamicLibrary + false + v143 + + + + + + + + + + + + + + + + + + + + + + + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + true + + + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + true + .dll + $(ProjectName).x64 + + + false + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + + false + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + .dll + $(ProjectName).x64 + + + + MultiThreadedDebug + Default + true + Disabled + true + Level3 + true + EditAndContinue + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + .\IMSample.pch + true + + + true + _DEBUG;%(PreprocessorDefinitions) + .\IMSample.tlb + true + NUL + Win32 + + + 0x0c09 + _DEBUG;%(PreprocessorDefinitions) + + + true + .\IMSample.bsc + + + true + true + true + Windows + $(OutDir)$(TargetName)$(TargetExt) + .\IMSample.lib + odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + .\imsample.def + true + + + + + MultiThreadedDebug + Default + false + Disabled + true + Level3 + ProgramDatabase + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + .\IMSample.pch + true + + + true + _DEBUG;%(PreprocessorDefinitions) + .\IMSample.tlb + true + NUL + + + 0x0c09 + _DEBUG;%(PreprocessorDefinitions) + + + true + .\IMSample.bsc + + + true + true + true + Windows + $(OutDir)$(TargetName)$(TargetExt) + $(OutDir)$(TargetName).lib + odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + .\imsample.def + true + + + + + MultiThreaded + OnlyExplicitInline + true + true + MaxSpeed + true + Level3 + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + .\IMSample.pch + true + + + true + NDEBUG;%(PreprocessorDefinitions) + .\IMSample.tlb + true + NUL + Win32 + + + 0x0c09 + NDEBUG;%(PreprocessorDefinitions) + + + true + .\IMSample.bsc + + + true + true + Windows + odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + .\imsample.def + true + + + + + MultiThreaded + OnlyExplicitInline + true + true + MaxSpeed + true + Level3 + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + .\IMSample.pch + true + + + true + NDEBUG;%(PreprocessorDefinitions) + .\IMSample.tlb + true + NUL + + + 0x0c09 + NDEBUG;%(PreprocessorDefinitions) + + + true + .\IMSample.bsc + + + true + true + Windows + odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + .\imsample.def + true + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/windows/src/engine/keyman32/keyman-engine.vcxproj b/windows/src/engine/keyman32/keyman-engine.vcxproj index f958f9a797..e268b10e22 100644 --- a/windows/src/engine/keyman32/keyman-engine.vcxproj +++ b/windows/src/engine/keyman32/keyman-engine.vcxproj @@ -1,402 +1,402 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {A7069186-5AE7-4504-8926-861B7A34BA9E} - Keyman32 - 10.0 - - - - StaticLibrary - false - v142 - - - StaticLibrary - false - v142 - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - false - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - true - AllRules.ruleset - - - AllRules.ruleset - - - - - $(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\x86\$(Configuration);$(LibraryPath) - $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\include;$(ProjectDir)..\..\..\..\core\include;$(IncludePath) - - - $(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\rust\x86\$(Configuration);$(LibraryPath) - $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\include;$(IncludePath) - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - Win32 - ./Keyman32.tlb - - - - - MaxSpeed - OnlyExplicitInline - .\;..\..\global\inc;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - - - MultiThreaded - true - Use - pch.h - All - ./ - ./ - ./ - Level4 - true - true - ProgramDatabase - - - NDEBUG;%(PreprocessorDefinitions) - 0x0409 - - - /verbose:lib /section:.SHARDATA,rws %(AdditionalOptions) - keymancore.lib;libicuuc.a;libicuin.a;psapi.lib;rpcrt4.lib;version.lib;setupapi.lib;iphlpapi.lib;imm32.lib;crypt32.lib;wintrust.lib;imagehlp.lib;ws2_32.lib;%(AdditionalDependencies) - ./Keyman32.dll - true - keyman32.def - true - ./Keyman32.pdb - true - ./Keyman32.map - false - Windows - true - true - 0x1c100000 - ./Keyman32.lib - MachineX86 - true - true - - - true - ./Keyman32.bsc - - - - - - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - Win32 - ./Keyman32.tlb - - - - - Disabled - .\;..\..\global\inc;.;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - - - MultiThreadedDebug - Use - pch.h - All - ./ - ./ - ./ - true - Level4 - true - true - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0409 - - - /verbose:lib /section:.SHARDATA,rws %(AdditionalOptions) - keymancore.lib;psapi.lib;rpcrt4.lib;version.lib;setupapi.lib;iphlpapi.lib;imm32.lib;crypt32.lib;wintrust.lib;imagehlp.lib;ws2_32.lib;%(AdditionalDependencies) - ./Keyman32.dll - true - keyman32.def - true - ./Keyman32.pdb - true - ./Keyman32.map - Windows - 0x1C100000 - ./Keyman32.lib - MachineX86 - true - true - - - true - ./Keyman32.bsc - - - - - - - - - - - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - - - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - - - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - - - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - - - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - - - - - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - - - - - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - - - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - - - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - - - - - - - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - - - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - - - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - - - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - - - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - - - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - - - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - - - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - - - - Create - Create - - - - - - - - - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - - - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - - - - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - - - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - - - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - - - - - Document - false - false - mc %(FullPath) - Compiling keyman-debug-etw - %(Filename).rc;%(Filename.h);MSG00001.bin - mc %(FullPath) - Compiling keyman-debug-etw - %(Filename).rc;%(Filename.h);MSG00001.bin - Designer - - - - - - - - - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {A7069186-5AE7-4504-8926-861B7A34BA9E} + Keyman32 + 10.0 + + + + StaticLibrary + false + v143 + + + StaticLibrary + false + v143 + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + false + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + true + AllRules.ruleset + + + AllRules.ruleset + + + + + $(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\x86\$(Configuration);$(LibraryPath) + $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\include;$(ProjectDir)..\..\..\..\core\include;$(IncludePath) + + + $(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\rust\x86\$(Configuration);$(LibraryPath) + $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\include;$(IncludePath) + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + ./Keyman32.tlb + + + + + MaxSpeed + OnlyExplicitInline + .\;..\..\global\inc;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + + + MultiThreaded + true + Use + pch.h + All + ./ + ./ + ./ + Level4 + true + true + ProgramDatabase + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + /verbose:lib /section:.SHARDATA,rws %(AdditionalOptions) + keymancore.lib;libicuuc.a;libicuin.a;psapi.lib;rpcrt4.lib;version.lib;setupapi.lib;iphlpapi.lib;imm32.lib;crypt32.lib;wintrust.lib;imagehlp.lib;ws2_32.lib;%(AdditionalDependencies) + ./Keyman32.dll + true + keyman32.def + true + ./Keyman32.pdb + true + ./Keyman32.map + false + Windows + true + true + 0x1c100000 + ./Keyman32.lib + MachineX86 + true + true + + + true + ./Keyman32.bsc + + + + + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + ./Keyman32.tlb + + + + + Disabled + .\;..\..\global\inc;.;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + + + MultiThreadedDebug + Use + pch.h + All + ./ + ./ + ./ + true + Level4 + true + true + EditAndContinue + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + /verbose:lib /section:.SHARDATA,rws %(AdditionalOptions) + keymancore.lib;psapi.lib;rpcrt4.lib;version.lib;setupapi.lib;iphlpapi.lib;imm32.lib;crypt32.lib;wintrust.lib;imagehlp.lib;ws2_32.lib;%(AdditionalDependencies) + ./Keyman32.dll + true + keyman32.def + true + ./Keyman32.pdb + true + ./Keyman32.map + Windows + 0x1C100000 + ./Keyman32.lib + MachineX86 + true + true + + + true + ./Keyman32.bsc + + + + + + + + + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + + + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + + Create + Create + + + + + + + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + + + + + Document + false + false + mc %(FullPath) + Compiling keyman-debug-etw + %(Filename).rc;%(Filename.h);MSG00001.bin + mc %(FullPath) + Compiling keyman-debug-etw + %(Filename).rc;%(Filename.h);MSG00001.bin + Designer + + + + + + + + + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/windows/src/engine/keyman32/keyman32.vcxproj b/windows/src/engine/keyman32/keyman32.vcxproj index 71ae7ec501..ba15db6516 100644 --- a/windows/src/engine/keyman32/keyman32.vcxproj +++ b/windows/src/engine/keyman32/keyman32.vcxproj @@ -1,466 +1,466 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {BD5564FB-35A5-4A3C-B96A-4A6578E2B593} - Keyman32 - 10.0 - keyman32 - - - - DynamicLibrary - false - v142 - - - DynamicLibrary - false - v142 - - - DynamicLibrary - false - v142 - - - DynamicLibrary - false - v142 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - false - false - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - true - true - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - $(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\x86\$(Configuration);$(LibraryPath) - $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\include;$(IncludePath) - keyman32 - - - $(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\x64\$(Configuration);$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64) - $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\include;$(IncludePath) - keyman64 - - - $(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\x86\$(Configuration);$(LibraryPath) - $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\include;$(IncludePath) - keyman32 - - - $(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\x64\$(Configuration);$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64) - $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\include;$(IncludePath) - keyman64 - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - Win32 - ./Keyman32.tlb - - - - - MaxSpeed - OnlyExplicitInline - .\;..\..\global\inc;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - - - MultiThreaded - true - Use - pch.h - All - Level4 - true - true - ProgramDatabase - - - NDEBUG;%(PreprocessorDefinitions) - 0x0409 - - - /verbose:lib /section:.SHARDATA,rws %(AdditionalOptions) - libicuuc.a;libicuin.a;libkeymancore.a;psapi.lib;rpcrt4.lib;version.lib;setupapi.lib;iphlpapi.lib;imm32.lib;crypt32.lib;wintrust.lib;imagehlp.lib;ws2_32.lib;%(AdditionalDependencies) - true - keyman32.def - true - true - false - Windows - true - true - 0x1c100000 - MachineX86 - true - true - ..\..\..\lib\keyman32.lib - - - true - ./Keyman32.bsc - - - - - - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - ./Keyman32.tlb - - - - - MaxSpeed - OnlyExplicitInline - .\;..\..\global\inc;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - - - MultiThreaded - true - Use - pch.h - All - Level4 - true - true - ProgramDatabase - - - NDEBUG;%(PreprocessorDefinitions) - 0x0409 - - - /verbose:lib /section:.SHARDATA,rws %(AdditionalOptions) - libicuuc.a;libicuin.a;libkeymancore.a;psapi.lib;rpcrt4.lib;version.lib;setupapi.lib;iphlpapi.lib;imm32.lib;crypt32.lib;wintrust.lib;imagehlp.lib;ws2_32.lib;%(AdditionalDependencies) - true - keyman64.def - true - true - false - Windows - true - true - 0x1c100000 - true - true - ..\..\..\lib\keyman64.lib - - - true - ./Keyman64.bsc - - - - - - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - Win32 - ./Keyman32.tlb - - - - - Disabled - .\;..\..\global\inc;.;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - - - MultiThreadedDebug - Use - pch.h - All - true - Level4 - true - true - EditAndContinue - - - _DEBUG;%(PreprocessorDefinitions) - 0x0409 - - - /verbose:lib /section:.SHARDATA,rws %(AdditionalOptions) - libicuuc.a;libicuin.a;libkeymancore.a;psapi.lib;rpcrt4.lib;version.lib;setupapi.lib;iphlpapi.lib;imm32.lib;crypt32.lib;wintrust.lib;imagehlp.lib;ws2_32.lib;%(AdditionalDependencies) - true - keyman32.def - true - true - Windows - 0x1C100000 - MachineX86 - true - true - ..\..\..\lib\keyman32.lib - - - true - ./Keyman32.bsc - - - - - - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - ./Keyman32.tlb - - - - - Disabled - .\;..\..\global\inc;.;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - - - MultiThreadedDebug - Use - pch.h - All - true - Level4 - true - true - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0409 - - - /verbose:lib /section:.SHARDATA,rws %(AdditionalOptions) - libicuuc.a;libicuin.a;libkeymancore.a;psapi.lib;rpcrt4.lib;version.lib;setupapi.lib;iphlpapi.lib;imm32.lib;crypt32.lib;wintrust.lib;imagehlp.lib;ws2_32.lib;%(AdditionalDependencies) - true - keyman64.def - true - true - Windows - 0x1C100000 - true - true - ..\..\..\lib\keyman64.lib - - - true - ./Keyman32.bsc - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Create - Create - Create - Create - - - - - - - - - - - - - - - - - Document - false - false - false - false - mc %(FullPath) - mc %(FullPath) - Compiling keyman-debug-etw - Compiling keyman-debug-etw - %(Filename).rc;%(Filename.h);MSG00001.bin - %(Filename).rc;%(Filename.h);MSG00001.bin - mc %(FullPath) - mc %(FullPath) - Compiling keyman-debug-etw - Compiling keyman-debug-etw - %(Filename).rc;%(Filename.h);MSG00001.bin - %(Filename).rc;%(Filename.h);MSG00001.bin - Designer - - - true - true - - - - - true - true - - - - - - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - true - true - - - true - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {BD5564FB-35A5-4A3C-B96A-4A6578E2B593} + Keyman32 + 10.0 + keyman32 + + + + DynamicLibrary + false + v143 + + + DynamicLibrary + false + v143 + + + DynamicLibrary + false + v143 + + + DynamicLibrary + false + v143 + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + false + false + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + true + true + AllRules.ruleset + AllRules.ruleset + + + + + AllRules.ruleset + AllRules.ruleset + + + + + + + $(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\x86\$(Configuration);$(LibraryPath) + $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\include;$(IncludePath) + keyman32 + + + $(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\x64\$(Configuration);$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64) + $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\include;$(IncludePath) + keyman64 + + + $(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\x86\$(Configuration);$(LibraryPath) + $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\include;$(IncludePath) + keyman32 + + + $(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\x64\$(Configuration);$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64) + $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\include;$(IncludePath) + keyman64 + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + ./Keyman32.tlb + + + + + MaxSpeed + OnlyExplicitInline + .\;..\..\global\inc;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + + + MultiThreaded + true + Use + pch.h + All + Level4 + true + true + ProgramDatabase + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + /verbose:lib /section:.SHARDATA,rws %(AdditionalOptions) + libicuuc.a;libicuin.a;libkeymancore.a;psapi.lib;rpcrt4.lib;version.lib;setupapi.lib;iphlpapi.lib;imm32.lib;crypt32.lib;wintrust.lib;imagehlp.lib;ws2_32.lib;%(AdditionalDependencies) + true + keyman32.def + true + true + false + Windows + true + true + 0x1c100000 + MachineX86 + true + true + ..\..\..\lib\keyman32.lib + + + true + ./Keyman32.bsc + + + + + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + ./Keyman32.tlb + + + + + MaxSpeed + OnlyExplicitInline + .\;..\..\global\inc;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + + + MultiThreaded + true + Use + pch.h + All + Level4 + true + true + ProgramDatabase + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + /verbose:lib /section:.SHARDATA,rws %(AdditionalOptions) + libicuuc.a;libicuin.a;libkeymancore.a;psapi.lib;rpcrt4.lib;version.lib;setupapi.lib;iphlpapi.lib;imm32.lib;crypt32.lib;wintrust.lib;imagehlp.lib;ws2_32.lib;%(AdditionalDependencies) + true + keyman64.def + true + true + false + Windows + true + true + 0x1c100000 + true + true + ..\..\..\lib\keyman64.lib + + + true + ./Keyman64.bsc + + + + + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + ./Keyman32.tlb + + + + + Disabled + .\;..\..\global\inc;.;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + + + MultiThreadedDebug + Use + pch.h + All + true + Level4 + true + true + EditAndContinue + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + /verbose:lib /section:.SHARDATA,rws %(AdditionalOptions) + libicuuc.a;libicuin.a;libkeymancore.a;psapi.lib;rpcrt4.lib;version.lib;setupapi.lib;iphlpapi.lib;imm32.lib;crypt32.lib;wintrust.lib;imagehlp.lib;ws2_32.lib;%(AdditionalDependencies) + true + keyman32.def + true + true + Windows + 0x1C100000 + MachineX86 + true + true + ..\..\..\lib\keyman32.lib + + + true + ./Keyman32.bsc + + + + + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + ./Keyman32.tlb + + + + + Disabled + .\;..\..\global\inc;.;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + + + MultiThreadedDebug + Use + pch.h + All + true + Level4 + true + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + /verbose:lib /section:.SHARDATA,rws %(AdditionalOptions) + libicuuc.a;libicuin.a;libkeymancore.a;psapi.lib;rpcrt4.lib;version.lib;setupapi.lib;iphlpapi.lib;imm32.lib;crypt32.lib;wintrust.lib;imagehlp.lib;ws2_32.lib;%(AdditionalDependencies) + true + keyman64.def + true + true + Windows + 0x1C100000 + true + true + ..\..\..\lib\keyman64.lib + + + true + ./Keyman32.bsc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + + + + + + + + + + + + + + + + + Document + false + false + false + false + mc %(FullPath) + mc %(FullPath) + Compiling keyman-debug-etw + Compiling keyman-debug-etw + %(Filename).rc;%(Filename.h);MSG00001.bin + %(Filename).rc;%(Filename.h);MSG00001.bin + mc %(FullPath) + mc %(FullPath) + Compiling keyman-debug-etw + Compiling keyman-debug-etw + %(Filename).rc;%(Filename.h);MSG00001.bin + %(Filename).rc;%(Filename.h);MSG00001.bin + Designer + + + true + true + + + + + true + true + + + + + + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + true + true + + + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/windows/src/engine/keyman32/keyman32.vcxproj.filters b/windows/src/engine/keyman32/keyman32.vcxproj.filters index 5627c72b04..cffae6a908 100644 --- a/windows/src/engine/keyman32/keyman32.vcxproj.filters +++ b/windows/src/engine/keyman32/keyman32.vcxproj.filters @@ -1,265 +1,271 @@ - - - - - {2dc5904b-4033-47e6-88ac-ebe442c06c2e} - cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90 - - - {27baf0f2-3926-4720-b5f9-045e47cd975c} - h;hpp;hxx;hm;inl;fi;fd - - - {088a2b68-c9db-41f4-9f45-37fdf758931e} - ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - Source Files - - - Resource Files - - - Resource Files - - - Source Files - - - - - Source Files - - - Source Files - - - Source Files - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Source Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - - - + + + + + {2dc5904b-4033-47e6-88ac-ebe442c06c2e} + cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90 + + + {27baf0f2-3926-4720-b5f9-045e47cd975c} + h;hpp;hxx;hm;inl;fi;fd + + + {088a2b68-c9db-41f4-9f45-37fdf758931e} + ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Source Files + + + Resource Files + + + Resource Files + + + Source Files + + + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Source Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + \ No newline at end of file diff --git a/windows/src/engine/keyman32/tests/keyman-engine-tests/keyman-engine-tests.vcxproj b/windows/src/engine/keyman32/tests/keyman-engine-tests/keyman-engine-tests.vcxproj index 48afed6fdd..5bf2365a59 100644 --- a/windows/src/engine/keyman32/tests/keyman-engine-tests/keyman-engine-tests.vcxproj +++ b/windows/src/engine/keyman32/tests/keyman-engine-tests/keyman-engine-tests.vcxproj @@ -1,160 +1,160 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - {46399ed7-79a1-4e7e-bd96-4b1aeec838ae} - Win32Proj - 10.0.19041.0 - Application - v142 - Unicode - keyman-engine-tests - - - - - - - - - $(ProjectDir)..\..\..\..\..\..\common\include;$(ProjectDir)..\..\..\..\..\..\core\include;$(ProjectDir)..\..\..\..\..\..\core\build\x86\$(Configuration)\include;$(ProjectDir)..\..\..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\global\inc;$(ProjectDir)..\..;$(IncludePath) - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - $(ProjectDir)..\..\..\..\..\..\core\build\x86\$(Configuration)\src;$(ProjectDir)..\..\..\..\kmtip\bin\Win32\$(Configuration);$(ProjectDir)..\..\..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\i18n;$(LibraryPath) - true - - - $(ProjectDir)..\..\..\..\..\..\common\include;$(ProjectDir)..\..\..\..\..\..\core\include;$(ProjectDir)..\..\..\..\..\..\core\build\x86\$(Configuration)\include;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\global\inc;$(ProjectDir)..\..;$(IncludePath) - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - - $(ProjectDir)..\..\..\..\..\..\common\include;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\include;$(ProjectDir)..\..\..\..\..\..\core\include;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\global\inc;$(ProjectDir)..\..;$(IncludePath) - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - - $(ProjectDir)..\..\..\..\..\..\common\include;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\include;$(ProjectDir)..\..\..\..\..\..\core\include;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\global\inc;$(ProjectDir)..\..;$(IncludePath) - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - - - - - - - - - - - Create - Create - Create - Create - - - - - - - - {a7069186-5ae7-4504-8926-861b7a34ba9e} - - - - - - - - - - Use - pch.h - Disabled - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - Level3 - %(AdditionalIncludeDirectories) - - - true - Console - version.lib;psapi.lib;imm32.lib;libkeymancore.a;libicuuc.a;libicuin.a;%(AdditionalDependencies) - - - false - - - - - Use - pch.h - Disabled - X64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - Level3 - - - true - Console - - - - - Use - pch.h - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreaded - Level3 - ProgramDatabase - - - true - Console - true - true - - - - - Use - pch.h - X64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreaded - Level3 - ProgramDatabase - - - true - Console - true - true - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {46399ed7-79a1-4e7e-bd96-4b1aeec838ae} + Win32Proj + 10.0 + Application + v143 + Unicode + keyman-engine-tests + + + + + + + + + $(ProjectDir)..\..\..\..\..\..\common\include;$(ProjectDir)..\..\..\..\..\..\core\include;$(ProjectDir)..\..\..\..\..\..\core\build\x86\$(Configuration)\include;$(ProjectDir)..\..\..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\global\inc;$(ProjectDir)..\..;$(IncludePath) + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + $(ProjectDir)..\..\..\..\..\..\core\build\x86\$(Configuration)\src;$(ProjectDir)..\..\..\..\kmtip\bin\Win32\$(Configuration);$(ProjectDir)..\..\..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\i18n;$(LibraryPath) + true + + + $(ProjectDir)..\..\..\..\..\..\common\include;$(ProjectDir)..\..\..\..\..\..\core\include;$(ProjectDir)..\..\..\..\..\..\core\build\x86\$(Configuration)\include;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\global\inc;$(ProjectDir)..\..;$(IncludePath) + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + + $(ProjectDir)..\..\..\..\..\..\common\include;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\include;$(ProjectDir)..\..\..\..\..\..\core\include;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\global\inc;$(ProjectDir)..\..;$(IncludePath) + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + + $(ProjectDir)..\..\..\..\..\..\common\include;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\include;$(ProjectDir)..\..\..\..\..\..\core\include;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\global\inc;$(ProjectDir)..\..;$(IncludePath) + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + + + + + + + + + + + Create + Create + Create + Create + + + + + + + + {a7069186-5ae7-4504-8926-861b7a34ba9e} + + + + + + + + + + Use + pch.h + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + Level3 + %(AdditionalIncludeDirectories) + + + true + Console + version.lib;psapi.lib;imm32.lib;libkeymancore.a;libicuuc.a;libicuin.a;%(AdditionalDependencies) + + + false + + + + + Use + pch.h + Disabled + X64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + Level3 + + + true + Console + + + + + Use + pch.h + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreaded + Level3 + ProgramDatabase + + + true + Console + true + true + + + + + Use + pch.h + X64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreaded + Level3 + ProgramDatabase + + + true + Console + true + true + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + \ No newline at end of file diff --git a/windows/src/engine/keymanhp/keymanhp.vcxproj b/windows/src/engine/keymanhp/keymanhp.vcxproj index 5cda7ead85..31373da95e 100644 --- a/windows/src/engine/keymanhp/keymanhp.vcxproj +++ b/windows/src/engine/keymanhp/keymanhp.vcxproj @@ -22,12 +22,12 @@ Application Unicode true - v142 + v143 Application Unicode - v142 + v143 diff --git a/windows/src/engine/kmrefresh/kmrefresh.vcxproj b/windows/src/engine/kmrefresh/kmrefresh.vcxproj index a978cb947e..0b252895f7 100644 --- a/windows/src/engine/kmrefresh/kmrefresh.vcxproj +++ b/windows/src/engine/kmrefresh/kmrefresh.vcxproj @@ -1,157 +1,157 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 15.0 - {A3B8F75F-E63E-434E-8A2A-034AD9B66571} - kmrefresh - 10.0 - - - - Application - true - Unicode - v142 - - - Application - false - true - Unicode - v142 - - - Application - true - Unicode - v142 - - - Application - false - true - Unicode - v142 - - - - - - - - - - - - - - - - - - - - - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectName).x64 - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - $(ProjectName).x86 - - - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - $(ProjectName).x86 - - - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectName).x64 - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - - - Level3 - Disabled - true - true - MultiThreadedDebug - - - Windows - - - - - Level3 - Disabled - true - true - MultiThreadedDebug - - - Windows - - - - - Level3 - MaxSpeed - true - true - true - true - MultiThreaded - - - Windows - true - true - - - - - Level3 - MaxSpeed - true - true - true - true - MultiThreaded - - - Windows - true - true - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {A3B8F75F-E63E-434E-8A2A-034AD9B66571} + kmrefresh + 10.0 + + + + Application + true + Unicode + v143 + + + Application + false + true + Unicode + v143 + + + Application + true + Unicode + v143 + + + Application + false + true + Unicode + v143 + + + + + + + + + + + + + + + + + + + + + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectName).x64 + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + $(ProjectName).x86 + + + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + $(ProjectName).x86 + + + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectName).x64 + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + + + Level3 + Disabled + true + true + MultiThreadedDebug + + + Windows + + + + + Level3 + Disabled + true + true + MultiThreadedDebug + + + Windows + + + + + Level3 + MaxSpeed + true + true + true + true + MultiThreaded + + + Windows + true + true + + + + + Level3 + MaxSpeed + true + true + true + true + MultiThreaded + + + Windows + true + true + + + + + + + + + + + \ No newline at end of file diff --git a/windows/src/engine/kmtip/kmtip.vcxproj b/windows/src/engine/kmtip/kmtip.vcxproj index f3fb74116f..173853f507 100644 --- a/windows/src/engine/kmtip/kmtip.vcxproj +++ b/windows/src/engine/kmtip/kmtip.vcxproj @@ -1,432 +1,432 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4} - 10.0 - - - - DynamicLibrary - false - MultiByte - v142 - - - DynamicLibrary - false - MultiByte - v142 - - - DynamicLibrary - false - MultiByte - v142 - - - DynamicLibrary - false - MultiByte - v142 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - true - true - false - false - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - true - true - true - true - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - .dll - .dll - .dll - .dll - kmtip64 - kmtip64 - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - Win32 - ./kmtip.tlb - - - - - MaxSpeed - OnlyExplicitInline - .\;..\..\global\inc;..\..\resellers;C:\Program Files\Microsoft Platform SDK\Include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;_USRDLL;KMTIP_EXPORTS;%(PreprocessorDefinitions) - true - MultiThreaded - true - All - Level3 - true - true - Use - pch.h - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c09 - - - ..\..\..\lib\keyman32.lib;version.lib;wintrust.lib;crypt32.lib;imagehlp.lib;%(AdditionalDependencies) - true - .\kmtip.def - true - 0x4C100000 - MachineX86 - true - true - - - true - ./kmtip.bsc - - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - ./kmtip.tlb - - - - - MaxSpeed - OnlyExplicitInline - .\;..\..\global\inc;..\..\resellers;C:\Program Files\Microsoft Platform SDK\Include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;_USRDLL;KMTIP_EXPORTS;%(PreprocessorDefinitions) - true - MultiThreaded - true - All - Level3 - true - true - Use - pch.h - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c09 - - - ..\..\..\lib\keyman64.lib;version.lib;wintrust.lib;crypt32.lib;imagehlp.lib;%(AdditionalDependencies) - true - .\kmtip64.def - true - 0x4C100000 - true - true - - - true - ./kmtip.bsc - - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - Win32 - ./kmtip.tlb - - - - - Disabled - .\;..\..\global\inc;..\..\resellers;C:\Program Files\Microsoft Platform SDK\Include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;_USRDLL;KMTIP_EXPORTS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - true - Level3 - true - EditAndContinue - true - Use - pch.h - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c09 - - - ..\..\..\lib\keyman32.lib;version.lib;wintrust.lib;crypt32.lib;imagehlp.lib;%(AdditionalDependencies) - true - .\kmtip.def - true - true - 0x4C100000 - MachineX86 - true - - - true - ./kmtip.bsc - - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - ./kmtip.tlb - - - - - Disabled - .\;..\..\global\inc;..\..\resellers;C:\Program Files\Microsoft Platform SDK\Include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;_USRDLL;KMTIP_EXPORTS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - true - Level3 - true - ProgramDatabase - true - Use - pch.h - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c09 - - - ..\..\..\lib\keyman64.lib;version.lib;wintrust.lib;crypt32.lib;imagehlp.lib;%(AdditionalDependencies) - true - .\kmtip64.def - true - true - 0x4C100000 - true - - - true - ./kmtip.bsc - - - - - - - - - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - Create - Create - Create - Create - - - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - %(AdditionalIncludeDirectories) - %(AdditionalIncludeDirectories) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - true - true - - - true - true - - - - - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - %(PreprocessorDefinitions) - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4} + 10.0 + + + + DynamicLibrary + false + MultiByte + v143 + + + DynamicLibrary + false + MultiByte + v143 + + + DynamicLibrary + false + MultiByte + v143 + + + DynamicLibrary + false + MultiByte + v143 + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + true + true + false + false + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + true + true + true + true + AllRules.ruleset + AllRules.ruleset + + + + + AllRules.ruleset + AllRules.ruleset + + + + + .dll + .dll + .dll + .dll + kmtip64 + kmtip64 + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + ./kmtip.tlb + + + + + MaxSpeed + OnlyExplicitInline + .\;..\..\global\inc;..\..\resellers;C:\Program Files\Microsoft Platform SDK\Include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;KMTIP_EXPORTS;%(PreprocessorDefinitions) + true + MultiThreaded + true + All + Level3 + true + true + Use + pch.h + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c09 + + + ..\..\..\lib\keyman32.lib;version.lib;wintrust.lib;crypt32.lib;imagehlp.lib;%(AdditionalDependencies) + true + .\kmtip.def + true + 0x4C100000 + MachineX86 + true + true + + + true + ./kmtip.bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + ./kmtip.tlb + + + + + MaxSpeed + OnlyExplicitInline + .\;..\..\global\inc;..\..\resellers;C:\Program Files\Microsoft Platform SDK\Include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;KMTIP_EXPORTS;%(PreprocessorDefinitions) + true + MultiThreaded + true + All + Level3 + true + true + Use + pch.h + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c09 + + + ..\..\..\lib\keyman64.lib;version.lib;wintrust.lib;crypt32.lib;imagehlp.lib;%(AdditionalDependencies) + true + .\kmtip64.def + true + 0x4C100000 + true + true + + + true + ./kmtip.bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + ./kmtip.tlb + + + + + Disabled + .\;..\..\global\inc;..\..\resellers;C:\Program Files\Microsoft Platform SDK\Include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;KMTIP_EXPORTS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + true + Level3 + true + EditAndContinue + true + Use + pch.h + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c09 + + + ..\..\..\lib\keyman32.lib;version.lib;wintrust.lib;crypt32.lib;imagehlp.lib;%(AdditionalDependencies) + true + .\kmtip.def + true + true + 0x4C100000 + MachineX86 + true + + + true + ./kmtip.bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + ./kmtip.tlb + + + + + Disabled + .\;..\..\global\inc;..\..\resellers;C:\Program Files\Microsoft Platform SDK\Include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;KMTIP_EXPORTS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + true + Level3 + true + ProgramDatabase + true + Use + pch.h + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c09 + + + ..\..\..\lib\keyman64.lib;version.lib;wintrust.lib;crypt32.lib;imagehlp.lib;%(AdditionalDependencies) + true + .\kmtip64.def + true + true + 0x4C100000 + true + + + true + ./kmtip.bsc + + + + + + + + + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + + + + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + + + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + + + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + Create + Create + Create + Create + + + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + + + + + true + true + + + true + true + + + + + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + %(PreprocessorDefinitions) + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/windows/src/engine/mcompile/mcompile.vcxproj b/windows/src/engine/mcompile/mcompile.vcxproj index e9c426a330..99f60fa722 100644 --- a/windows/src/engine/mcompile/mcompile.vcxproj +++ b/windows/src/engine/mcompile/mcompile.vcxproj @@ -1,134 +1,134 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {5C22DDDA-CEAD-45F1-96B0-1473111156AA} - Win32Proj - mtop - mcompile - 10.0 - - - - Application - true - Unicode - v142 - - - Application - false - true - Unicode - v142 - - - - - - - - - - - - - true - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - false - *.cdf;*.cache;*.obj;*.ilk;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.metagen;*.bi - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - - false - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - false - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - - - Use - Level3 - Disabled - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreadedDebug - ..\..\..\..\common\windows\delphi\ext\sentry;..\..\global\inc - pch.h - - - Console - true - ..\..\..\..\common\windows\delphi\ext\sentry\sentry.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - sentry.dll - - - - - Level3 - Use - MaxSpeed - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreaded - ..\..\..\..\common\windows\delphi\ext\sentry;..\..\global\inc - pch.h - - - Console - true - true - true - ..\..\..\..\common\windows\delphi\ext\sentry\sentry.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - sentry.dll - - - - - - - - - - - - - - - - NotUsing - NotUsing - - - - - - - - - - Create - Create - pch.h - pch.h - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {5C22DDDA-CEAD-45F1-96B0-1473111156AA} + Win32Proj + mtop + mcompile + 10.0 + + + + Application + true + Unicode + v143 + + + Application + false + true + Unicode + v143 + + + + + + + + + + + + + true + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + false + *.cdf;*.cache;*.obj;*.ilk;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.metagen;*.bi + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + + false + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + false + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + + + Use + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDebug + ..\..\..\..\common\windows\delphi\ext\sentry;..\..\global\inc + pch.h + + + Console + true + ..\..\..\..\common\windows\delphi\ext\sentry\sentry.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + sentry.dll + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreaded + ..\..\..\..\common\windows\delphi\ext\sentry;..\..\global\inc + pch.h + + + Console + true + true + true + ..\..\..\..\common\windows\delphi\ext\sentry\sentry.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + sentry.dll + + + + + + + + + + + + + + + + NotUsing + NotUsing + + + + + + + + + + Create + Create + pch.h + pch.h + + + + + + + + + + + \ No newline at end of file diff --git a/windows/src/engine/testhost/testhost.vcxproj b/windows/src/engine/testhost/testhost.vcxproj index 8b965e942c..e9d06a87a6 100644 --- a/windows/src/engine/testhost/testhost.vcxproj +++ b/windows/src/engine/testhost/testhost.vcxproj @@ -1,172 +1,172 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - Win32Proj - {12818da3-0472-49a5-96fc-a4808a1a77fa} - testhost - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - - false - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - - true - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - - false - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - - - Level3 - true - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - stdcpp17 - - - Windows - true - - - - - Level3 - true - true - true - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - stdcpp17 - - - Windows - true - true - true - - - - - Level3 - true - _DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - stdcpp17 - - - Windows - true - - - - - Level3 - true - true - true - NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - stdcpp17 - - - Windows - true - true - true - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + Win32Proj + {12818da3-0472-49a5-96fc-a4808a1a77fa} + testhost + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + + false + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + + true + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + + false + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + + + Level3 + true + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + stdcpp17 + + + Windows + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + stdcpp17 + + + Windows + true + true + true + + + + + Level3 + true + _DEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + stdcpp17 + + + Windows + true + + + + + Level3 + true + true + true + NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + stdcpp17 + + + Windows + true + true + true + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/windows/src/support/etl2log/etl2log.vcxproj b/windows/src/support/etl2log/etl2log.vcxproj index d8e0372cb2..839d6f2886 100644 --- a/windows/src/support/etl2log/etl2log.vcxproj +++ b/windows/src/support/etl2log/etl2log.vcxproj @@ -1,182 +1,182 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 15.0 - {8754791A-42D7-4E93-84F1-97DEF9D644EB} - Win32Proj - etl2log - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - - true - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - - false - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - - false - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - - - Use - Level3 - Disabled - true - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - tdh.lib;%(AdditionalDependencies) - - - - - Use - Level3 - Disabled - true - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - tdh.lib;%(AdditionalDependencies) - - - - - Use - Level3 - MaxSpeed - true - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - true - true - tdh.lib;%(AdditionalDependencies) - - - - - Use - Level3 - MaxSpeed - true - true - true - NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - true - true - tdh.lib;%(AdditionalDependencies) - - - - - - - - Create - Create - Create - Create - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {8754791A-42D7-4E93-84F1-97DEF9D644EB} + Win32Proj + etl2log + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + + true + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + + false + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + + false + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + + + Use + Level3 + Disabled + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + tdh.lib;%(AdditionalDependencies) + + + + + Use + Level3 + Disabled + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + tdh.lib;%(AdditionalDependencies) + + + + + Use + Level3 + MaxSpeed + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + tdh.lib;%(AdditionalDependencies) + + + + + Use + Level3 + MaxSpeed + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + tdh.lib;%(AdditionalDependencies) + + + + + + + + Create + Create + Create + Create + + + + + + + + + + + + \ No newline at end of file diff --git a/windows/src/support/texteditor/Editor.vcxproj b/windows/src/support/texteditor/Editor.vcxproj index 4b01793829..30879810b3 100644 --- a/windows/src/support/texteditor/Editor.vcxproj +++ b/windows/src/support/texteditor/Editor.vcxproj @@ -1,175 +1,175 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - Win32Proj - {6804767e-857f-48cc-b843-22bf357a668c} - Editor - 10.0 - - - - Application - true - v142 - Unicode - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - - Application - false - v142 - true - Unicode - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - - Application - true - v142 - Unicode - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - - Application - false - v142 - true - Unicode - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - - - - - - - - - - - - - - - - - - - - true - $(ProjectName)32 - - - false - $(ProjectName)32 - - - true - $(ProjectName)64 - - - false - $(ProjectName)64 - - - - Level3 - true - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - - - Windows - true - $(OutDir)$(TargetName)$(TargetExt) - - - - - Level3 - true - true - true - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - - - Windows - true - true - true - - - - - Level3 - true - _DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - - - Windows - true - - - - - Level3 - true - true - true - NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - - - Windows - true - true - true - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + Win32Proj + {6804767e-857f-48cc-b843-22bf357a668c} + Editor + 10.0 + + + + Application + true + v143 + Unicode + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + + Application + false + v143 + true + Unicode + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + + Application + true + v143 + Unicode + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + + Application + false + v143 + true + Unicode + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + + + + + + + + + + + + + + + + + + + + true + $(ProjectName)32 + + + false + $(ProjectName)32 + + + true + $(ProjectName)64 + + + false + $(ProjectName)64 + + + + Level3 + true + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + + + Windows + true + $(OutDir)$(TargetName)$(TargetExt) + + + + + Level3 + true + true + true + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + + + Windows + true + true + true + + + + + Level3 + true + _DEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + + + Windows + true + + + + + Level3 + true + true + true + NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + + + Windows + true + true + true + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/windows/src/test/unit-tests/shared-data/cpp/cppshareddata.vcxproj b/windows/src/test/unit-tests/shared-data/cpp/cppshareddata.vcxproj index 77f601a5c5..8c76a595a8 100644 --- a/windows/src/test/unit-tests/shared-data/cpp/cppshareddata.vcxproj +++ b/windows/src/test/unit-tests/shared-data/cpp/cppshareddata.vcxproj @@ -1,176 +1,176 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 15.0 - {748219AC-3BDE-40FC-8E93-7516C4BCE81D} - Win32Proj - cppshareddata - 10.0 - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - - true - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - - false - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - - false - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - - - Use - Level3 - Disabled - true - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - false - pch.h - - - Console - true - - - - - Use - Level3 - Disabled - true - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) - false - pch.h - - - Console - true - - - - - Use - Level3 - MaxSpeed - true - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - false - pch.h - - - Console - true - true - true - - - - - Use - Level3 - MaxSpeed - true - true - true - NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - false - pch.h - - - Console - true - true - true - - - - - - - - - Create - Create - Create - Create - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {748219AC-3BDE-40FC-8E93-7516C4BCE81D} + Win32Proj + cppshareddata + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + + true + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + + false + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + + false + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + + + Use + Level3 + Disabled + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + false + pch.h + + + Console + true + + + + + Use + Level3 + Disabled + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + false + pch.h + + + Console + true + + + + + Use + Level3 + MaxSpeed + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + false + pch.h + + + Console + true + true + true + + + + + Use + Level3 + MaxSpeed + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + false + pch.h + + + Console + true + true + true + + + + + + + + + Create + Create + Create + Create + + + + + \ No newline at end of file From 80d789c706863afb756eaa7750b0724e70dd2040 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Mon, 3 Nov 2025 12:53:12 +1000 Subject: [PATCH 16/59] feat(windows): update keymanhp to v2022 and engine.sln --- windows/src/engine/engine.sln | 4 ++-- windows/src/engine/keymanhp/keymanhp.vcxproj | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/windows/src/engine/engine.sln b/windows/src/engine/engine.sln index d004e70f20..1b6a885231 100644 --- a/windows/src/engine/engine.sln +++ b/windows/src/engine/engine.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.31313.79 +# Visual Studio Version 17 +VisualStudioVersion = 17.14.36623.8 d17.14 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "keyman32", "keyman32\Keyman32.vcxproj", "{BD5564FB-35A5-4A3C-B96A-4A6578E2B593}" EndProject diff --git a/windows/src/engine/keymanhp/keymanhp.vcxproj b/windows/src/engine/keymanhp/keymanhp.vcxproj index 61547d18ac..51ce882690 100644 --- a/windows/src/engine/keymanhp/keymanhp.vcxproj +++ b/windows/src/engine/keymanhp/keymanhp.vcxproj @@ -36,7 +36,7 @@ Application Unicode true - v142 + v143 Application @@ -46,7 +46,7 @@ Application Unicode - v142 + v143 From 53ecc3665c053f13696c4e3f511cbe2cadd3239e Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Thu, 13 Nov 2025 16:41:46 +1000 Subject: [PATCH 17/59] feat(windows): as wixproj for dotnet build wip --- resources/build/win/wix6.inc.sh | 20 + .../src/desktop/inst/KeymanDesktop.wixproj | 57 +++ windows/src/desktop/inst/build.sh | 70 ++- windows/src/desktop/inst/keymandesktop.wxs | 415 +++++++++--------- windows/src/engine/inst/build.sh | 28 +- windows/src/engine/inst/components.wxs | 81 ++-- windows/src/engine/inst/keymanengine.wxs | 80 ++-- 7 files changed, 441 insertions(+), 310 deletions(-) create mode 100644 resources/build/win/wix6.inc.sh create mode 100644 windows/src/desktop/inst/KeymanDesktop.wixproj diff --git a/resources/build/win/wix6.inc.sh b/resources/build/win/wix6.inc.sh new file mode 100644 index 0000000000..46a19a2dc4 --- /dev/null +++ b/resources/build/win/wix6.inc.sh @@ -0,0 +1,20 @@ + +WIX6PATH="C:\Users\ross_\.dotnet\tools" + +# !IFDEF LINT +#WIXLIGHTLINT=() +#!ELSE +# we suppress ICE82 because it reports spurious errors with merge module keymanengine to do with duplicate sequence numbers. Safely ignored. +#WIXLIGHTLINT=(-sice:ICE82 -sice:ICE80) +#!ENDIF + +if [[ "$GO_FAST" == 1 ]]; then + # for debug builds, we turn off compression because it is so hideously slow + # for test builds, we also turn off compression + WIXCOMPRESSION="-dcl none" +else + WIXCOMPRESSION="-dcl high" +fi + +# WIXLIT="$WIX6PATH/lit.exe" -wx -nologo +WIX6BUILD="$WIX6PATH/wix.exe build" diff --git a/windows/src/desktop/inst/KeymanDesktop.wixproj b/windows/src/desktop/inst/KeymanDesktop.wixproj new file mode 100644 index 0000000000..f85e50979f --- /dev/null +++ b/windows/src/desktop/inst/KeymanDesktop.wixproj @@ -0,0 +1,57 @@ + + + $(ProjectDir) + keymandesktop + AnyCPU + ICE80;ICE82 + en-us + none + true + + + PRODUCTID=$(PRODUCTID); + RELEASE=$(RELEASE); + KEYMAN_VERSION=$(KEYMAN_VERSION); + KEYMAN_VERSION_WIN=$(KEYMAN_VERSION_WIN); + KEYMAN_VERSION_WITH_TAG=$(KEYMAN_VERSION_WITH_TAG); + CefSourceDir=$(CefSourceDir); + DESKTOPUISOURCE=$(DESKTOPUISOURCE); + LOCALESOURCE=$(LOCALESOURCE) + + + + + + + CEF + INSTALLDIR + var.CefSourceDir + + + + + + DesktopUI + INSTALLDIR + var.DESKTOPUISOURCE + + true + + + + Locale + LocaleDir + var.LOCALESOURCE + + + + + + + + + + + diff --git a/windows/src/desktop/inst/build.sh b/windows/src/desktop/inst/build.sh index 8e64342a22..9c0d28937b 100755 --- a/windows/src/desktop/inst/build.sh +++ b/windows/src/desktop/inst/build.sh @@ -20,7 +20,7 @@ builder_if_release_build_level builder_describe_outputs \ builder_parse "$@" . "$KEYMAN_ROOT/resources/build/win/environment.inc.sh" -. "$KEYMAN_ROOT/resources/build/win/wix.inc.sh" +. "$KEYMAN_ROOT/resources/build/win/wix6.inc.sh" . "$KEYMAN_ROOT/resources/build/zip.inc.sh" # In dev environments, we'll hack the tier to alpha; CI sets this for us in real builds. @@ -62,20 +62,20 @@ function do_publish() { # # Build the installation archive # - do_candle - + #do_candle + do_wix_build # ICE82: we suppress because it reports spurious errors with merge module # keymanengine to do with duplicate sequence numbers. Safely ignored. # ICE80: we suppress because it reports x64 components without targeting x64. # Safely ignored. - "$WIXLIGHT" \ - -sice:ICE82 -sice:ICE80 \ - -nologo \ - -dWixUILicenseRtf=License.rtf \ - "$WIXLIGHTCOMPRESSION" \ - -out keymandesktop.msi -ext WixUIExtension \ - keymandesktop.wixobj desktopui.wixobj cef.wixobj locale.wixobj + #"$WIXLIGHT" \ + # -sice:ICE82 -sice:ICE80 \ + # -nologo \ + # -dWixUILicenseRtf=License.rtf \ + # "$WIXLIGHTCOMPRESSION" \ + # -out keymandesktop.msi -ext WixUIExtension \ + # keymandesktop.wixobj desktopui.wixobj cef.wixobj locale.wixobj # # Sign the installation archive @@ -135,12 +135,53 @@ function test-releaseexists() { fi } + +function do_wix_build_OLD() { + #"${WIXCOMPRESSION}" \ this line was in the wix build cli -culture en-us \ + local GUID1=$(generate_uuid) + DESKTOP_UI_SRC="../kmshell/xml" + LOCALE_SRC="../kmshell/locale" +$WIX6BUILD \ + -d KEYMAN_VERSION_WITH_TAG="${KEYMAN_VERSION_WITH_TAG}" \ + -d KEYMAN_VERSION="${KEYMAN_VERSION_WIN}" \ + -d RELEASE="${KEYMAN_VERSION_RELEASE}" \ + -d PRODUCTID="${GUID1}" \ + -d CefSourceDir="${KEYMAN_CEF4DELPHI_ROOT}" \ + -d DesktopUISource="${DESKTOP_UI_SRC}" \ + -d LocaleSource="${LOCALE_SRC}" \ + -d HarvestFileGenerateGuidsNow=true \ + keymandesktop.wxs \ + -ext WixToolset.Util.wixext \ + -o "KeymanDesktop-${KEYMAN_VERSION_WITH_TAG}.msi" \ + +} + +function do_wix_build() { + #"${WIXCOMPRESSION}" \ this line was in the wix build cli -culture en-us \ + exclude-cef + local GUID1=$(generate_uuid) + DESKTOPUISOURCE="../kmshell/xml" + LOCALESOURCE="../kmshell/locale" +echo "Building with ProductID: $GUID1" + dotnet build KeymanDesktop.wixproj \ + -p:PRODUCTID="$GUID1" \ + -p:RELEASE="$KEYMAN_VERSION_RELEASE" \ + -p:KEYMAN_VERSION="$KEYMAN_VERSION_WIN" \ + -p:KEYMAN_VERSION_WITH_TAG="$KEYMAN_VERSION_WITH_TAG" \ + -p:KEYMAN_VERSION_WIN="$KEYMAN_VERSION_WIN" \ + -p:CefSourceDir="$KEYMAN_WIX_TEMP_CEF" \ + -p:DESKTOPUISOURCE="$DESKTOPUISOURCE" \ + -p:LOCALESOURCE="$LOCALESOURCE" +} + + function do_candle() { heat-cef builder_heading candle local GUID1=$(generate_uuid) + "$WIXHEAT" dir "$KEYMAN_WIX_TEMP_CEF" -o cef.wxs -ag -cg CEF -dr INSTALLDIR -var var.CefSourceDir -wx -nologo "$WIXHEAT" dir ../kmshell/xml -o desktopui.wxs -ag -cg DesktopUI -dr INSTALLDIR -suid -var var.DESKTOPUISOURCE -wx -nologo "$WIXHEAT" dir ../kmshell/locale -o locale.wxs -ag -cg Locale -dr INSTALLDIR -var var.LOCALESOURCE -wx -nologo "$WIXCANDLE" -dKEYMAN_VERSION_WITH_TAG=${KEYMAN_VERSION_WITH_TAG} -dKEYMAN_VERSION=${KEYMAN_VERSION_WIN} -dRELEASE=${KEYMAN_VERSION_RELEASE} -dPRODUCTID=$GUID1 \ @@ -160,6 +201,15 @@ function heat-cef() { rm -rf "$KEYMAN_WIX_TEMP_CEF" } +function exclude-cef() { + builder_heading exclude-cef + + # We copy the files to a temp folder in order to exclude .git from harvesting + rm -rf "$KEYMAN_WIX_TEMP_CEF" + mkdir -p "$KEYMAN_WIX_TEMP_CEF" + cp -r "$KEYMAN_CEF4DELPHI_ROOT"/* "$KEYMAN_WIX_TEMP_CEF" +} + function create-setup-inf() { builder_heading create-setup-inf diff --git a/windows/src/desktop/inst/keymandesktop.wxs b/windows/src/desktop/inst/keymandesktop.wxs index b6329253e4..721cb33e94 100644 --- a/windows/src/desktop/inst/keymandesktop.wxs +++ b/windows/src/desktop/inst/keymandesktop.wxs @@ -1,10 +1,6 @@ - - - - + + + @@ -72,197 +68,35 @@ * DISABLEADVTSHORTCUTS: https://learn.microsoft.com/en-us/windows/win32/msi/disableadvtshortcuts * Shortcut advertisement: https://learn.microsoft.com/en-us/windows/win32/msi/advertisement --> - + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + + + Level="1" ConfigurableDirectory="INSTALLDIR" AllowAdvertise="no" AllowAbsent="no"> @@ -275,67 +109,65 @@ - - - + - - - - - + + + + + - + - - + + - VERSION11FOUND + - - + + - CURRENTVERSIONFOUND - NEWERFOUND Or HIGHERFOUND + + - VERSION11FOUND + - - + + - + - + - 1 + - + - = 601)]]> + @@ -343,5 +175,176 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/windows/src/engine/inst/build.sh b/windows/src/engine/inst/build.sh index 3f98ed7688..eed4ca1b69 100755 --- a/windows/src/engine/inst/build.sh +++ b/windows/src/engine/inst/build.sh @@ -34,15 +34,29 @@ function do_publish() { # # Build the installation archive # - "$WIXCANDLE" -dKEYMAN_VERSION=$KEYMAN_VERSION_WIN -dRELEASE=$KEYMAN_VERSION_RELEASE -ext WixUtilExtension keymanengine.wxs components.wxs + #"$WIXCANDLE" -dKEYMAN_VERSION=$KEYMAN_VERSION_WIN -dRELEASE=$KEYMAN_VERSION_RELEASE -ext WixUtilExtension keymanengine.wxs components.wxs # warning 1072 relates to Error table defined by WixUtilExtension. Doesn't really affect us. - "$WIXLIGHT" \ - -sw1072 \ - -ext WixUtilExtension \ - "$WIXLIGHTCOMPRESSION" \ - keymanengine.wixobj components.wixobj \ - -o keymanengine.msm + #"$WIXLIGHT" \ + # -sw1072 \ + # -ext WixUtilExtension \ + # "$WIXLIGHTCOMPRESSION" \ + # keymanengine.wixobj components.wixobj \ + # -o keymanengine.msm + #wix build keymanengine.wxs components.wxs \ + #-ext WixToolset.Util.wixext \ + #-d KEYMAN_VERSION=$KEYMAN_VERSION_WIN \ + #-d RELEASE=$KEYMAN_VERSION_RELEASE \ + #-sw1072 \ + #-out keymanengine.msm + wix build -d KEYMAN_VERSION=$env:KEYMAN_VERSION -d RELEASE=$env:KEYMAN_VERSION_RELEASE keymanengine.wxs components.wxs -ext WixToolset.Util.wixext -sw1072 -out keymanengine.msm + + + echo $KEYMAN_VERSION_RELEASE + echo $KEYMAN_VERSION_WIN + echo $KEYMAN_VERSION + echo $RELEASE + # # Sign the installation archive diff --git a/windows/src/engine/inst/components.wxs b/windows/src/engine/inst/components.wxs index be36d57743..0bcb3937fc 100644 --- a/windows/src/engine/inst/components.wxs +++ b/windows/src/engine/inst/components.wxs @@ -1,10 +1,8 @@ - - + - + @@ -51,8 +49,8 @@ - - VersionNT64 + + @@ -130,7 +128,7 @@ - + @@ -142,51 +140,44 @@ - + - + - + - + - - + + + + - - + + - - - - - - - - - - - + + + + + + + + + + + @@ -215,8 +206,8 @@ - - VersionNT >= 602 + + @@ -234,16 +225,16 @@ - - VersionNT64 + + - - VersionNT64 AND ProcessorArchitecture="ARM64" + + @@ -260,16 +251,16 @@ - + - + - + - + diff --git a/windows/src/engine/inst/keymanengine.wxs b/windows/src/engine/inst/keymanengine.wxs index 2aaaf1de9a..509f91bc18 100644 --- a/windows/src/engine/inst/keymanengine.wxs +++ b/windows/src/engine/inst/keymanengine.wxs @@ -1,15 +1,23 @@ - - - - + + - - + + + + + + + + + + + + + + @@ -21,30 +29,30 @@ guid rules with merge modules, as we end up with LGHT0231, as the CommonFilesFolder root folder seems to be ignored when building the merge module. Therefore we list these files in a single component for now. --> - - - - - - - - - - - - - - + + + + + + + + + + + + + + - + - - + + @@ -61,9 +69,9 @@ - - - + + + @@ -80,18 +88,6 @@ - - - - - - - - - - - - - - + + From ab6772e36daa6151e977a0fdc6d7b05671fe6092 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Sun, 16 Nov 2025 07:59:40 +1000 Subject: [PATCH 18/59] feat(windows): build a kmtip ARM64X build Add ARM64EC build then use to create a ARM64X build. --- resources/build/win/delphi_flags.inc.sh | 1 + windows/src/desktop/inst/keymandesktop.wxs | 7 +- windows/src/engine/engine.sln | 24 +- windows/src/engine/inst/build.sh | 8 +- windows/src/engine/inst/components.wxs | 7 +- windows/src/engine/inst/keymanengine.wxs | 5 +- .../src/engine/keyman32/keyman-engine.vcxproj | 267 +++++++++++++++++- windows/src/engine/keyman32/keyman32.vcxproj | 177 +++++++++++- .../engine/keyman32/keyman32.vcxproj.filters | 8 +- .../keyman-engine-tests.vcxproj | 53 +++- windows/src/engine/keymanhp/keymanhp.vcxproj | 125 ++++++++ .../src/engine/kmrefresh/kmrefresh.vcxproj | 67 ++++- windows/src/engine/kmtip/build.sh | 9 + windows/src/engine/kmtip/kmtip.vcxproj | 217 +++++++++++++- .../src/engine/kmtip/kmtip.vcxproj.filters | 6 + windows/src/engine/kmtip/kmtiparm64.def | 7 + windows/src/engine/kmtip/kmtiparm64EC.def | 7 + windows/src/engine/mcompile/mcompile.vcxproj | 86 +++++- windows/src/engine/testhost/build.sh | 2 + windows/src/engine/testhost/testhost.vcxproj | 69 ++++- 20 files changed, 1128 insertions(+), 24 deletions(-) create mode 100644 windows/src/engine/kmtip/kmtiparm64.def create mode 100644 windows/src/engine/kmtip/kmtiparm64EC.def diff --git a/resources/build/win/delphi_flags.inc.sh b/resources/build/win/delphi_flags.inc.sh index d284fab040..91d47787f0 100644 --- a/resources/build/win/delphi_flags.inc.sh +++ b/resources/build/win/delphi_flags.inc.sh @@ -19,6 +19,7 @@ DELPHI_MSBUILD_FLAG_DEBUG="//p:Config=$TARGET_PATH" WIN32_TARGET_PATH=bin/Win32/$TARGET_PATH X64_TARGET_PATH=bin/x64/$TARGET_PATH ARM64_TARGET_PATH=bin/arm64/$TARGET_PATH +ARM64EC_TARGET_PATH=bin/ARM64EC/$TARGET_PATH # Delphi x86, x64 # WIN32_TARGET_PATH=... diff --git a/windows/src/desktop/inst/keymandesktop.wxs b/windows/src/desktop/inst/keymandesktop.wxs index 721cb33e94..f4b9d22829 100644 --- a/windows/src/desktop/inst/keymandesktop.wxs +++ b/windows/src/desktop/inst/keymandesktop.wxs @@ -76,6 +76,10 @@ + + + + @@ -119,6 +123,7 @@ + @@ -133,7 +138,6 @@ - @@ -174,6 +178,7 @@ + diff --git a/windows/src/engine/engine.sln b/windows/src/engine/engine.sln index 1b6a885231..5e4fc53ed8 100644 --- a/windows/src/engine/engine.sln +++ b/windows/src/engine/engine.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 -VisualStudioVersion = 17.14.36623.8 d17.14 +VisualStudioVersion = 17.14.36623.8 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "keyman32", "keyman32\Keyman32.vcxproj", "{BD5564FB-35A5-4A3C-B96A-4A6578E2B593}" EndProject @@ -22,95 +22,117 @@ EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|ARM64 = Debug|ARM64 + Debug|ARM64EC = Debug|ARM64EC Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|ARM64 = Release|ARM64 + Release|ARM64EC = Release|ARM64EC Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Debug|ARM64.ActiveCfg = Debug|ARM64 {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Debug|ARM64.Build.0 = Debug|ARM64 + {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Debug|Win32.ActiveCfg = Debug|Win32 {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Debug|Win32.Build.0 = Debug|Win32 {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Debug|x64.ActiveCfg = Debug|x64 {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Debug|x64.Build.0 = Debug|x64 {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Release|ARM64.ActiveCfg = Release|ARM64 {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Release|ARM64.Build.0 = Release|ARM64 + {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Release|ARM64EC.ActiveCfg = Release|ARM64EC {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Release|Win32.ActiveCfg = Release|Win32 {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Release|Win32.Build.0 = Release|Win32 {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Release|x64.ActiveCfg = Release|x64 {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Release|x64.Build.0 = Release|x64 {A34650EA-D6E8-4229-8091-6BF1443565B5}.Debug|ARM64.ActiveCfg = Debug|ARM64 {A34650EA-D6E8-4229-8091-6BF1443565B5}.Debug|ARM64.Build.0 = Debug|ARM64 + {A34650EA-D6E8-4229-8091-6BF1443565B5}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC {A34650EA-D6E8-4229-8091-6BF1443565B5}.Debug|Win32.ActiveCfg = Debug|x64 {A34650EA-D6E8-4229-8091-6BF1443565B5}.Debug|x64.ActiveCfg = Debug|x64 {A34650EA-D6E8-4229-8091-6BF1443565B5}.Debug|x64.Build.0 = Debug|x64 {A34650EA-D6E8-4229-8091-6BF1443565B5}.Release|ARM64.ActiveCfg = Release|ARM64 {A34650EA-D6E8-4229-8091-6BF1443565B5}.Release|ARM64.Build.0 = Release|ARM64 + {A34650EA-D6E8-4229-8091-6BF1443565B5}.Release|ARM64EC.ActiveCfg = Release|ARM64EC {A34650EA-D6E8-4229-8091-6BF1443565B5}.Release|Win32.ActiveCfg = Release|x64 {A34650EA-D6E8-4229-8091-6BF1443565B5}.Release|x64.ActiveCfg = Release|x64 {A34650EA-D6E8-4229-8091-6BF1443565B5}.Release|x64.Build.0 = Release|x64 {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Debug|ARM64.ActiveCfg = Debug|ARM64 {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Debug|ARM64.Build.0 = Debug|ARM64 + {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC + {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Debug|ARM64EC.Build.0 = Debug|ARM64EC {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Debug|Win32.ActiveCfg = Debug|Win32 {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Debug|Win32.Build.0 = Debug|Win32 {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Debug|x64.ActiveCfg = Debug|x64 {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Debug|x64.Build.0 = Debug|x64 {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Release|ARM64.ActiveCfg = Release|ARM64 {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Release|ARM64.Build.0 = Release|ARM64 + {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Release|ARM64EC.ActiveCfg = Release|ARM64EC + {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Release|ARM64EC.Build.0 = Release|ARM64EC {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Release|Win32.ActiveCfg = Release|Win32 {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Release|Win32.Build.0 = Release|Win32 {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Release|x64.ActiveCfg = Release|x64 {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Release|x64.Build.0 = Release|x64 {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Debug|ARM64.ActiveCfg = Debug|Win32 + {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Debug|Win32.ActiveCfg = Debug|Win32 {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Debug|Win32.Build.0 = Debug|Win32 {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Debug|x64.ActiveCfg = Debug|Win32 {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Release|ARM64.ActiveCfg = Release|ARM64 + {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Release|ARM64EC.ActiveCfg = Release|ARM64EC {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Release|Win32.ActiveCfg = Release|Win32 {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Release|Win32.Build.0 = Release|Win32 {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Release|x64.ActiveCfg = Release|Win32 {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Debug|ARM64.ActiveCfg = Debug|ARM64 {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Debug|ARM64.Build.0 = Debug|ARM64 + {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Debug|Win32.ActiveCfg = Debug|Win32 {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Debug|Win32.Build.0 = Debug|Win32 {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Debug|x64.ActiveCfg = Debug|x64 {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Debug|x64.Build.0 = Debug|x64 {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Release|ARM64.ActiveCfg = Release|ARM64 {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Release|ARM64.Build.0 = Release|ARM64 + {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Release|ARM64EC.ActiveCfg = Release|ARM64EC {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Release|Win32.ActiveCfg = Release|Win32 {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Release|Win32.Build.0 = Release|Win32 {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Release|x64.ActiveCfg = Release|x64 {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Release|x64.Build.0 = Release|x64 {46399ED7-79A1-4E7E-BD96-4B1AEEC838AE}.Debug|ARM64.ActiveCfg = Debug|ARM64 {46399ED7-79A1-4E7E-BD96-4B1AEEC838AE}.Debug|ARM64.Build.0 = Debug|ARM64 + {46399ED7-79A1-4E7E-BD96-4B1AEEC838AE}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC {46399ED7-79A1-4E7E-BD96-4B1AEEC838AE}.Debug|Win32.ActiveCfg = Debug|Win32 {46399ED7-79A1-4E7E-BD96-4B1AEEC838AE}.Debug|Win32.Build.0 = Debug|Win32 {46399ED7-79A1-4E7E-BD96-4B1AEEC838AE}.Debug|x64.ActiveCfg = Debug|x64 {46399ED7-79A1-4E7E-BD96-4B1AEEC838AE}.Debug|x64.Build.0 = Debug|x64 {46399ED7-79A1-4E7E-BD96-4B1AEEC838AE}.Release|ARM64.ActiveCfg = Release|ARM64 {46399ED7-79A1-4E7E-BD96-4B1AEEC838AE}.Release|ARM64.Build.0 = Release|ARM64 + {46399ED7-79A1-4E7E-BD96-4B1AEEC838AE}.Release|ARM64EC.ActiveCfg = Release|ARM64EC {46399ED7-79A1-4E7E-BD96-4B1AEEC838AE}.Release|Win32.ActiveCfg = Release|Win32 {46399ED7-79A1-4E7E-BD96-4B1AEEC838AE}.Release|Win32.Build.0 = Release|Win32 {46399ED7-79A1-4E7E-BD96-4B1AEEC838AE}.Release|x64.ActiveCfg = Release|x64 {46399ED7-79A1-4E7E-BD96-4B1AEEC838AE}.Release|x64.Build.0 = Release|x64 {A7069186-5AE7-4504-8926-861B7A34BA9E}.Debug|ARM64.ActiveCfg = Debug|Win32 + {A7069186-5AE7-4504-8926-861B7A34BA9E}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC {A7069186-5AE7-4504-8926-861B7A34BA9E}.Debug|Win32.ActiveCfg = Debug|Win32 {A7069186-5AE7-4504-8926-861B7A34BA9E}.Debug|Win32.Build.0 = Debug|Win32 {A7069186-5AE7-4504-8926-861B7A34BA9E}.Debug|x64.ActiveCfg = Debug|Win32 {A7069186-5AE7-4504-8926-861B7A34BA9E}.Release|ARM64.ActiveCfg = Release|ARM64 + {A7069186-5AE7-4504-8926-861B7A34BA9E}.Release|ARM64EC.ActiveCfg = Release|ARM64EC {A7069186-5AE7-4504-8926-861B7A34BA9E}.Release|Win32.ActiveCfg = Release|Win32 {A7069186-5AE7-4504-8926-861B7A34BA9E}.Release|Win32.Build.0 = Release|Win32 {A7069186-5AE7-4504-8926-861B7A34BA9E}.Release|x64.ActiveCfg = Release|Win32 {12818DA3-0472-49A5-96FC-A4808A1A77FA}.Debug|ARM64.ActiveCfg = Debug|ARM64 {12818DA3-0472-49A5-96FC-A4808A1A77FA}.Debug|ARM64.Build.0 = Debug|ARM64 + {12818DA3-0472-49A5-96FC-A4808A1A77FA}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC + {12818DA3-0472-49A5-96FC-A4808A1A77FA}.Debug|ARM64EC.Build.0 = Debug|ARM64EC {12818DA3-0472-49A5-96FC-A4808A1A77FA}.Debug|Win32.ActiveCfg = Debug|Win32 {12818DA3-0472-49A5-96FC-A4808A1A77FA}.Debug|Win32.Build.0 = Debug|Win32 {12818DA3-0472-49A5-96FC-A4808A1A77FA}.Debug|x64.ActiveCfg = Debug|x64 {12818DA3-0472-49A5-96FC-A4808A1A77FA}.Debug|x64.Build.0 = Debug|x64 {12818DA3-0472-49A5-96FC-A4808A1A77FA}.Release|ARM64.ActiveCfg = Release|ARM64 {12818DA3-0472-49A5-96FC-A4808A1A77FA}.Release|ARM64.Build.0 = Release|ARM64 + {12818DA3-0472-49A5-96FC-A4808A1A77FA}.Release|ARM64EC.ActiveCfg = Release|ARM64EC + {12818DA3-0472-49A5-96FC-A4808A1A77FA}.Release|ARM64EC.Build.0 = Release|ARM64EC {12818DA3-0472-49A5-96FC-A4808A1A77FA}.Release|Win32.ActiveCfg = Release|Win32 {12818DA3-0472-49A5-96FC-A4808A1A77FA}.Release|Win32.Build.0 = Release|Win32 {12818DA3-0472-49A5-96FC-A4808A1A77FA}.Release|x64.ActiveCfg = Release|x64 diff --git a/windows/src/engine/inst/build.sh b/windows/src/engine/inst/build.sh index eed4ca1b69..0a4fd554a9 100755 --- a/windows/src/engine/inst/build.sh +++ b/windows/src/engine/inst/build.sh @@ -49,13 +49,15 @@ function do_publish() { #-d RELEASE=$KEYMAN_VERSION_RELEASE \ #-sw1072 \ #-out keymanengine.msm - wix build -d KEYMAN_VERSION=$env:KEYMAN_VERSION -d RELEASE=$env:KEYMAN_VERSION_RELEASE keymanengine.wxs components.wxs -ext WixToolset.Util.wixext -sw1072 -out keymanengine.msm - echo $KEYMAN_VERSION_RELEASE echo $KEYMAN_VERSION_WIN echo $KEYMAN_VERSION - echo $RELEASE + #echo $RELEASE + wix build -d KEYMAN_VERSION=$KEYMAN_VERSION_WIN -d RELEASE=$KEYMAN_VERSION_RELEASE keymanengine.wxs components.wxs -ext WixToolset.Util.wixext -sw1072 -out keymanengine.msm + + + # diff --git a/windows/src/engine/inst/components.wxs b/windows/src/engine/inst/components.wxs index 0bcb3937fc..c819b6572e 100644 --- a/windows/src/engine/inst/components.wxs +++ b/windows/src/engine/inst/components.wxs @@ -225,7 +225,8 @@ - + + @@ -233,9 +234,9 @@ - + - + diff --git a/windows/src/engine/inst/keymanengine.wxs b/windows/src/engine/inst/keymanengine.wxs index 509f91bc18..6310301994 100644 --- a/windows/src/engine/inst/keymanengine.wxs +++ b/windows/src/engine/inst/keymanengine.wxs @@ -1,10 +1,9 @@  - - + @@ -16,7 +15,7 @@ - + diff --git a/windows/src/engine/keyman32/keyman-engine.vcxproj b/windows/src/engine/keyman32/keyman-engine.vcxproj index 882354b491..9c8b5ffb9b 100644 --- a/windows/src/engine/keyman32/keyman-engine.vcxproj +++ b/windows/src/engine/keyman32/keyman-engine.vcxproj @@ -5,6 +5,10 @@ Debug ARM64 + + Debug + ARM64EC + Debug Win32 @@ -13,6 +17,10 @@ Release ARM64 + + Release + ARM64EC + Release Win32 @@ -29,6 +37,11 @@ false v143 + + StaticLibrary + false + v143 + StaticLibrary false @@ -39,6 +52,11 @@ false v143 + + StaticLibrary + false + v143 + StaticLibrary false @@ -51,6 +69,10 @@ + + + + @@ -59,6 +81,10 @@ + + + + @@ -67,34 +93,50 @@ <_ProjectFileVersion>10.0.30319.1 $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ false + false false $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ true + true true AllRules.ruleset + AllRules.ruleset AllRules.ruleset + + AllRules.ruleset + AllRules.ruleset AllRules.ruleset + + $(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\x86\$(Configuration);$(LibraryPath) $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\include;$(ProjectDir)..\..\..\..\core\include;$(IncludePath) + + $(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\x86\$(Configuration);$(LibraryPath) + $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\include;$(ProjectDir)..\..\..\..\core\include;$(IncludePath) + $(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\ARM64\$(Configuration);$(LibraryPath) $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\include;$(ProjectDir)..\..\..\..\core\include;$(IncludePath) @@ -103,6 +145,10 @@ $(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\rust\x86\$(Configuration);$(LibraryPath) $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\include;$(IncludePath) + + $(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\rust\x86\$(Configuration);$(LibraryPath) + $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\x86\$(Configuration)\include;$(IncludePath) + $(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\rust\ARM64\$(Configuration);$(LibraryPath) $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\include;$(IncludePath) @@ -171,6 +217,68 @@ + + + NDEBUG;%(PreprocessorDefinitions) + true + true + ./Keyman32.tlb + + + + + MaxSpeed + OnlyExplicitInline + .\;..\..\global\inc;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + + + MultiThreaded + true + Use + pch.h + All + ./ + ./ + ./ + Level4 + true + true + ProgramDatabase + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + /verbose:lib /section:.SHARDATA,rws %(AdditionalOptions) + keymancore.lib;libicuuc.a;libicuin.a;psapi.lib;rpcrt4.lib;version.lib;setupapi.lib;iphlpapi.lib;imm32.lib;crypt32.lib;wintrust.lib;imagehlp.lib;ws2_32.lib;%(AdditionalDependencies) + ./Keyman32.dll + true + keyman32.def + true + ./Keyman32.pdb + true + ./Keyman32.map + false + Windows + true + true + 0x1c100000 + ./Keyman32.lib + true + true + + + true + ./Keyman32.bsc + + + + + + NDEBUG;%(PreprocessorDefinitions) @@ -292,6 +400,63 @@ + + + _DEBUG;%(PreprocessorDefinitions) + true + true + ./Keyman32.tlb + + + + + Disabled + .\;..\..\global\inc;.;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + + + MultiThreadedDebug + Use + pch.h + All + ./ + ./ + ./ + true + Level4 + true + true + EditAndContinue + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + /verbose:lib /section:.SHARDATA,rws %(AdditionalOptions) + keymancore.lib;psapi.lib;rpcrt4.lib;version.lib;setupapi.lib;iphlpapi.lib;imm32.lib;crypt32.lib;wintrust.lib;imagehlp.lib;ws2_32.lib;%(AdditionalDependencies) + ./Keyman32.dll + true + keyman32.def + true + ./Keyman32.pdb + true + ./Keyman32.map + Windows + 0x1C100000 + ./Keyman32.lib + true + true + + + true + ./Keyman32.bsc + + + + + + _DEBUG;%(PreprocessorDefinitions) @@ -354,96 +519,132 @@ %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) @@ -452,89 +653,123 @@ %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) Create + Create Create Create + Create Create @@ -545,53 +780,73 @@ %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) @@ -599,20 +854,28 @@ Document false + false false false + false false mc %(FullPath) + mc %(FullPath) mc %(FullPath) Compiling keyman-debug-etw + Compiling keyman-debug-etw Compiling keyman-debug-etw %(Filename).rc;%(Filename.h);MSG00001.bin + %(Filename).rc;%(Filename.h);MSG00001.bin %(Filename).rc;%(Filename.h);MSG00001.bin mc %(FullPath) + mc %(FullPath) mc %(FullPath) Compiling keyman-debug-etw + Compiling keyman-debug-etw Compiling keyman-debug-etw %(Filename).rc;%(Filename.h);MSG00001.bin + %(Filename).rc;%(Filename.h);MSG00001.bin %(Filename).rc;%(Filename.h);MSG00001.bin Designer @@ -624,8 +887,10 @@ %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) @@ -664,4 +929,4 @@ - + \ No newline at end of file diff --git a/windows/src/engine/keyman32/keyman32.vcxproj b/windows/src/engine/keyman32/keyman32.vcxproj index 11c7d42496..9aa53fc685 100644 --- a/windows/src/engine/keyman32/keyman32.vcxproj +++ b/windows/src/engine/keyman32/keyman32.vcxproj @@ -5,6 +5,10 @@ Debug ARM64 + + Debug + ARM64EC + Debug Win32 @@ -17,6 +21,10 @@ Release ARM64 + + Release + ARM64EC + Release Win32 @@ -43,6 +51,11 @@ false v143 + + DynamicLibrary + false + v143 + DynamicLibrary false @@ -58,6 +71,11 @@ false v143 + + DynamicLibrary + false + v143 + DynamicLibrary false @@ -74,6 +92,10 @@ + + + + @@ -86,6 +108,10 @@ + + + + @@ -95,39 +121,51 @@ <_ProjectFileVersion>10.0.30319.1 $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ false false + false false $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ true true + true true AllRules.ruleset AllRules.ruleset + AllRules.ruleset AllRules.ruleset + + AllRules.ruleset AllRules.ruleset + AllRules.ruleset AllRules.ruleset + + @@ -140,6 +178,11 @@ $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\include;$(IncludePath) keyman64 + + $(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\x64\$(Configuration);$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64) + $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\include;$(IncludePath) + keyman64 + $(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\ARM64\$(Configuration);$(VC_LibraryPath_ARM64);$(WindowsSDK_LibraryPath_ARM64) $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\arm64\$(Configuration)\include;$(IncludePath) @@ -155,6 +198,11 @@ $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\include;$(IncludePath) keyman64 + + $(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\x64\$(Configuration);$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64) + $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\include;$(IncludePath) + keyman64 + $(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\ARM64\$(Configuration);$(VC_LibraryPath_ARM64);$(WindowsSDK_LibraryPath_ARM64) $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\include;$(IncludePath) @@ -274,6 +322,62 @@ + + + NDEBUG;%(PreprocessorDefinitions) + true + true + ./Keyman32.tlb + + + + + MaxSpeed + OnlyExplicitInline + .\;..\..\global\inc;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + + + MultiThreaded + true + Use + pch.h + All + Level4 + true + true + ProgramDatabase + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + /verbose:lib /section:.SHARDATA,rws %(AdditionalOptions) + libicuuc.a;libicuin.a;libkeymancore.a;psapi.lib;rpcrt4.lib;version.lib;setupapi.lib;iphlpapi.lib;imm32.lib;crypt32.lib;wintrust.lib;imagehlp.lib;ws2_32.lib;%(AdditionalDependencies) + true + keyman64.def + true + true + false + Windows + true + true + 0x140000000 + true + true + ..\..\..\lib\keyman64.lib + + + true + ./Keyman64.bsc + + + + + + NDEBUG;%(PreprocessorDefinitions) @@ -434,6 +538,57 @@ + + + _DEBUG;%(PreprocessorDefinitions) + true + true + ./Keyman32.tlb + + + + + Disabled + .\;..\..\global\inc;.;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + + + MultiThreadedDebug + Use + pch.h + All + true + Level4 + true + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + /verbose:lib /section:.SHARDATA,rws %(AdditionalOptions) + libicuuc.a;libicuin.a;libkeymancore.a;psapi.lib;rpcrt4.lib;version.lib;setupapi.lib;iphlpapi.lib;imm32.lib;crypt32.lib;wintrust.lib;imagehlp.lib;ws2_32.lib;%(AdditionalDependencies) + true + keyman64.def + true + true + Windows + 0x140000000 + true + true + ..\..\..\lib\keyman64.lib + + + true + ./Keyman32.bsc + + + + + + _DEBUG;%(PreprocessorDefinitions) @@ -519,9 +674,11 @@ Create Create + Create Create Create Create + Create Create @@ -542,34 +699,44 @@ Document false false + false false false false + false false mc %(FullPath) mc %(FullPath) + mc %(FullPath) mc %(FullPath) Compiling keyman-debug-etw Compiling keyman-debug-etw + Compiling keyman-debug-etw Compiling keyman-debug-etw %(Filename).rc;%(Filename.h);MSG00001.bin %(Filename).rc;%(Filename.h);MSG00001.bin + %(Filename).rc;%(Filename.h);MSG00001.bin %(Filename).rc;%(Filename.h);MSG00001.bin mc %(FullPath) mc %(FullPath) + mc %(FullPath) mc %(FullPath) Compiling keyman-debug-etw Compiling keyman-debug-etw + Compiling keyman-debug-etw Compiling keyman-debug-etw %(Filename).rc;%(Filename.h);MSG00001.bin %(Filename).rc;%(Filename.h);MSG00001.bin + %(Filename).rc;%(Filename.h);MSG00001.bin %(Filename).rc;%(Filename.h);MSG00001.bin Designer true + true true true + true true @@ -584,7 +751,9 @@ true true true + true true + true @@ -592,13 +761,17 @@ %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) true + true true true + true true @@ -611,7 +784,9 @@ true true true + true true + true @@ -650,4 +825,4 @@ - + \ No newline at end of file diff --git a/windows/src/engine/keyman32/keyman32.vcxproj.filters b/windows/src/engine/keyman32/keyman32.vcxproj.filters index ca3de862c6..6d2f42977f 100644 --- a/windows/src/engine/keyman32/keyman32.vcxproj.filters +++ b/windows/src/engine/keyman32/keyman32.vcxproj.filters @@ -141,6 +141,9 @@ Source Files + + Source Files + @@ -264,8 +267,11 @@ Header Files + + Header Files + - + \ No newline at end of file diff --git a/windows/src/engine/keyman32/tests/keyman-engine-tests/keyman-engine-tests.vcxproj b/windows/src/engine/keyman32/tests/keyman-engine-tests/keyman-engine-tests.vcxproj index 699095a5ec..9b9a7d3ffa 100644 --- a/windows/src/engine/keyman32/tests/keyman-engine-tests/keyman-engine-tests.vcxproj +++ b/windows/src/engine/keyman32/tests/keyman-engine-tests/keyman-engine-tests.vcxproj @@ -5,6 +5,10 @@ Debug ARM64 + + Debug + ARM64EC + Debug Win32 @@ -13,6 +17,10 @@ Release ARM64 + + Release + ARM64EC + Release Win32 @@ -58,6 +66,11 @@ $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + $(ProjectDir)..\..\..\..\..\..\common\include;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\include;$(ProjectDir)..\..\..\..\..\..\core\include;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\global\inc;$(ProjectDir)..\..;$(IncludePath) + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + $(ProjectDir)..\..\..\..\..\..\common\include;$(ProjectDir)..\..\..\..\..\..\core\build\ARM64\$(Configuration)\include;$(ProjectDir)..\..\..\..\..\..\core\include;$(ProjectDir)..\..\..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\global\inc;$(ProjectDir)..\..;$(IncludePath) $(ProjectDir)bin\$(Platform)\$(Configuration)\ @@ -68,6 +81,11 @@ $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + $(ProjectDir)..\..\..\..\..\..\common\include;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\include;$(ProjectDir)..\..\..\..\..\..\core\include;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\global\inc;$(ProjectDir)..\..;$(IncludePath) + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + $(ProjectDir)..\..\..\..\..\..\common\include;$(ProjectDir)..\..\..\..\..\..\core\build\ARM64\$(Configuration)\include;$(ProjectDir)..\..\..\..\..\..\core\include;$(ProjectDir)..\..\..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\global\inc;$(ProjectDir)..\..;$(IncludePath) $(ProjectDir)bin\$(Platform)\$(Configuration)\ @@ -86,8 +104,10 @@ Create Create Create + Create Create Create + Create Create @@ -139,6 +159,21 @@ Console + + + Use + pch.h + Disabled + X64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + Level3 + + + true + Console + + Use @@ -186,6 +221,22 @@ true + + + Use + pch.h + X64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreaded + Level3 + ProgramDatabase + + + true + Console + true + true + + Use @@ -208,4 +259,4 @@ - + \ No newline at end of file diff --git a/windows/src/engine/keymanhp/keymanhp.vcxproj b/windows/src/engine/keymanhp/keymanhp.vcxproj index 51ce882690..bf8a8b3350 100644 --- a/windows/src/engine/keymanhp/keymanhp.vcxproj +++ b/windows/src/engine/keymanhp/keymanhp.vcxproj @@ -5,6 +5,10 @@ Debug ARM64 + + Debug + ARM64EC + Debug x64 @@ -13,6 +17,10 @@ Release ARM64 + + Release + ARM64EC + Release x64 @@ -32,6 +40,12 @@ true v143 + + Application + Unicode + true + v143 + Application Unicode @@ -43,6 +57,11 @@ Unicode v143 + + Application + Unicode + v143 + Application Unicode @@ -54,12 +73,18 @@ + + + + + + @@ -67,44 +92,66 @@ <_ProjectFileVersion>10.0.30319.1 $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ true + true true false + false false $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ false + false false false + false false AllRules.ruleset + AllRules.ruleset AllRules.ruleset + + AllRules.ruleset + AllRules.ruleset AllRules.ruleset + + *.cdf;*.cache;*.obj;*.ilk;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.metagen;*.bi + *.cdf;*.cache;*.obj;*.ilk;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.metagen;*.bi *.cdf;*.cache;*.obj;*.ilk;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.metagen;*.bi *.cdf;*.cache;*.obj;*.ilk;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.metagen;*.bi + *.cdf;*.cache;*.obj;*.ilk;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.metagen;*.bi *.cdf;*.cache;*.obj;*.ilk;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.metagen;*.bi keymanhp.x64 + + keymanhp.x64 + keymanhp.x64 + + keymanhp.x64 + keymanhp.arm64 @@ -114,9 +161,15 @@ keymanhp.x64 + + keymanhp.x64 + keymanhp.x64 + + keymanhp.x64 + X64 @@ -157,6 +210,43 @@ + + + + Disabled + ..\..\global\inc;..\..\..\..\common\windows\delphi\ext\sentry;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + false + true + EnableFastChecks + MultiThreadedDebug + + + Level4 + true + ProgramDatabase + true + + + ..\..\..\..\common\windows\delphi\ext\sentry\sentry.x64.lib;keyman64.lib;libcmtd.lib;%(AdditionalDependencies) + ..\..\..\lib;%(AdditionalLibraryDirectories) + false + true + Windows + true + sentry.dll + + + + + + + + + + + + @@ -232,6 +322,41 @@ + + + + ..\..\global\inc;..\..\..\..\common\windows\delphi\ext\sentry;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + false + MultiThreaded + + + Level4 + true + ProgramDatabase + true + + + ..\..\..\..\common\windows\delphi\ext\sentry\sentry.x64.lib;keyman64.lib;libcmt.lib;%(AdditionalDependencies) + ..\..\..\lib;%(AdditionalLibraryDirectories) + false + true + Windows + true + true + true + true + sentry.dll + + + + + + + + + + diff --git a/windows/src/engine/kmrefresh/kmrefresh.vcxproj b/windows/src/engine/kmrefresh/kmrefresh.vcxproj index 447137a859..d38eee355b 100644 --- a/windows/src/engine/kmrefresh/kmrefresh.vcxproj +++ b/windows/src/engine/kmrefresh/kmrefresh.vcxproj @@ -5,6 +5,10 @@ Debug ARM64 + + Debug + ARM64EC + Debug Win32 @@ -13,6 +17,10 @@ Release ARM64 + + Release + ARM64EC + Release Win32 @@ -52,6 +60,12 @@ Unicode v143 + + Application + true + Unicode + v143 + Application true @@ -65,6 +79,13 @@ Unicode v143 + + Application + false + true + Unicode + v143 + Application false @@ -86,12 +107,18 @@ + + + + + + @@ -101,6 +128,11 @@ $(ProjectName).x64 $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectName).x64 + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectName).x64 @@ -121,6 +153,11 @@ $(ProjectName).x64 $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectName).x64 + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectName).x64 @@ -150,6 +187,18 @@ Windows + + + Level3 + Disabled + true + true + MultiThreadedDebug + + + Windows + + Level3 @@ -194,6 +243,22 @@ true + + + Level3 + MaxSpeed + true + true + true + true + MultiThreaded + + + Windows + true + true + + Level3 @@ -219,4 +284,4 @@ - + \ No newline at end of file diff --git a/windows/src/engine/kmtip/build.sh b/windows/src/engine/kmtip/build.sh index ba283347b5..4e72a3a5de 100755 --- a/windows/src/engine/kmtip/build.sh +++ b/windows/src/engine/kmtip/build.sh @@ -18,12 +18,14 @@ source "$KEYMAN_ROOT/resources/build/win/environment.inc.sh" WIN32_TARGET="$WIN32_TARGET_PATH/kmtip.dll" X64_TARGET="$X64_TARGET_PATH/kmtip64.dll" ARM64_TARGET="$ARM64_TARGET_PATH/kmtiparm64.dll" +ARM64EC_TARGET="$ARM64EC_TARGET_PATH/kmtiparm64EC.dll" builder_describe_outputs \ configure:project /resources/build/win/delphi_environment_generated.inc.sh \ build:x86 /windows/src/engine/kmtip/$WIN32_TARGET \ build:x64 /windows/src/engine/kmtip/$X64_TARGET \ build:arm64 /windows/src/engine/kmtip/$ARM64_TARGET \ + build:arm64ec /windows/src/engine/kmtip/$ARM64EC_TARGET \ #------------------------------------------------------------------------------------------------------------------- @@ -38,12 +40,16 @@ function do_build() { vs_msbuild kmtip.vcxproj //t:Build "//p:Platform=Win32" vs_msbuild kmtip.vcxproj //t:Build "//p:Platform=x64" vs_msbuild kmtip.vcxproj //t:Build "//p:Platform=arm64" + vs_msbuild kmtip.vcxproj //t:Build "//p:Platform=arm64EC" cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_ENGINE" builder_if_release_build_level cp "$WIN32_TARGET_PATH/kmtip.pdb" "$WINDOWS_DEBUGPATH_ENGINE" cp "$X64_TARGET" "$WINDOWS_PROGRAM_ENGINE" builder_if_release_build_level cp "$X64_TARGET_PATH/kmtip64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" cp "$ARM64_TARGET" "$WINDOWS_PROGRAM_ENGINE" builder_if_release_build_level cp "$ARM64_TARGET_PATH/kmtiparm64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" + cp "$ARM64EC_TARGET" "$WINDOWS_PROGRAM_ENGINE" + builder_if_release_build_level cp "$ARM64EC_TARGET_PATH/kmtiparm64EC.pdb" "$WINDOWS_DEBUGPATH_ENGINE" + } function do_publish() { @@ -56,12 +62,15 @@ function do_publish() { wrap-symstore "$WINDOWS_DEBUGPATH_ENGINE/kmtip64.pdb" //t keyman-engine-windows wrap-symstore "$WINDOWS_PROGRAM_ENGINE/kmtiparm64.dll" //t keyman-engine-windows wrap-symstore "$WINDOWS_DEBUGPATH_ENGINE/kmtiparm64.pdb" //t keyman-engine-windows + wrap-symstore "$WINDOWS_PROGRAM_ENGINE/kmtiparm64EC.dll" //t keyman-engine-windows + wrap-symstore "$WINDOWS_DEBUGPATH_ENGINE/kmtiparm64EC.pdb" //t keyman-engine-windows } function do_install() { cp "$WINDOWS_PROGRAM_ENGINE/kmtip.dll" "$INSTALLPATH_KEYMANENGINE/kmtip.dll" cp "$WINDOWS_PROGRAM_ENGINE/kmtip64.dll" "$INSTALLPATH_KEYMANENGINE/kmtip64.dll" cp "$WINDOWS_PROGRAM_ENGINE/kmtiparm64.dll" "$INSTALLPATH_KEYMANENGINE/kmtiparm64.dll" + cp "$WINDOWS_PROGRAM_ENGINE/kmtiparm64EC.dll" "$INSTALLPATH_KEYMANENGINE/kmtiparm64EC.dll" } builder_run_action clean:project do_clean diff --git a/windows/src/engine/kmtip/kmtip.vcxproj b/windows/src/engine/kmtip/kmtip.vcxproj index f0b33c7b55..e50deafe3e 100644 --- a/windows/src/engine/kmtip/kmtip.vcxproj +++ b/windows/src/engine/kmtip/kmtip.vcxproj @@ -5,6 +5,10 @@ Debug ARM64 + + Debug + ARM64EC + Debug Win32 @@ -17,6 +21,10 @@ Release ARM64 + + Release + ARM64EC + Release Win32 @@ -43,6 +51,12 @@ MultiByte v143 + + DynamicLibrary + false + MultiByte + v143 + DynamicLibrary false @@ -61,6 +75,12 @@ MultiByte v143 + + DynamicLibrary + false + MultiByte + v143 + DynamicLibrary false @@ -78,6 +98,10 @@ + + + + @@ -90,6 +114,10 @@ + + + + @@ -99,57 +127,81 @@ <_ProjectFileVersion>10.0.30319.1 $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ true true + true true false false + false false $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ true true + true true true true + true true AllRules.ruleset AllRules.ruleset + AllRules.ruleset AllRules.ruleset + + AllRules.ruleset AllRules.ruleset + AllRules.ruleset AllRules.ruleset + + .dll .dll + .dll .dll .dll .dll + .dll .dll kmtip64 + kmtiparm64EC kmtiparm64 kmtip64 + kmtiparm64EC kmtiparm64 + + true + + + true + NDEBUG;%(PreprocessorDefinitions) @@ -227,7 +279,49 @@ true .\kmtip64.def true - 0x4C100000 + 0x140000000 + true + true + + + true + ./kmtip.bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + ./kmtip.tlb + + + + + MaxSpeed + OnlyExplicitInline + .\;..\..\global\inc;..\..\resellers;C:\Program Files\Microsoft Platform SDK\Include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;KMTIP_EXPORTS;%(PreprocessorDefinitions) + true + MultiThreaded + true + All + Level3 + true + true + Use + pch.h + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c09 + + + ..\..\..\lib\keyman64.lib;..\..\..\lib\keymanarm64.lib;version.lib;wintrust.lib;crypt32.lib;imagehlp.lib;%(AdditionalDependencies) + true + .\kmtiparm64EC.def + true + 0x140000000 true true @@ -265,11 +359,11 @@ 0x0c09 - ..\..\..\lib\keyman64.lib;version.lib;wintrust.lib;crypt32.lib;imagehlp.lib;%(AdditionalDependencies) + ..\..\..\lib\keymanarm64.lib;version.lib;wintrust.lib;crypt32.lib;imagehlp.lib;%(AdditionalDependencies) true - .\kmtip64.def + .\kmtiparm64.def true - 0x4C100000 + 0x140000000 true true @@ -354,7 +448,48 @@ .\kmtip64.def true true - 0x4C100000 + 0x140000000 + true + + + true + ./kmtip.bsc + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + ./kmtip.tlb + + + + + Disabled + .\;..\..\global\inc;..\..\resellers;C:\Program Files\Microsoft Platform SDK\Include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;KMTIP_EXPORTS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + true + Level3 + true + ProgramDatabase + true + Use + pch.h + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c09 + + + ..\..\..\lib\keyman64.lib;..\..\..\lib\keymanarm64.lib;version.lib;wintrust.lib;crypt32.lib;imagehlp.lib;%(AdditionalDependencies) + true + .\kmtiparm64EC.def + true + true + 0x140000000 true @@ -392,7 +527,7 @@ ..\..\..\lib\keymanarm64.lib;version.lib;wintrust.lib;crypt32.lib;imagehlp.lib;%(AdditionalDependencies) true - .\kmtip64.def + .\kmtiparm64.def true true 0x140000000 @@ -411,186 +546,256 @@ %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) Create Create Create + Create Create Create + Create Create %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) %(AdditionalIncludeDirectories) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) true + true true true + true true true true + true + true + true + true + + + true + true + true + true + true + true + + + true + true + true + true + true + true %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) + %(PreprocessorDefinitions) %(PreprocessorDefinitions) diff --git a/windows/src/engine/kmtip/kmtip.vcxproj.filters b/windows/src/engine/kmtip/kmtip.vcxproj.filters index b7d69593c2..47e5f0ef1c 100644 --- a/windows/src/engine/kmtip/kmtip.vcxproj.filters +++ b/windows/src/engine/kmtip/kmtip.vcxproj.filters @@ -83,6 +83,12 @@ Source Files\Framework + + Source Files\Framework + + + Source Files\Framework + diff --git a/windows/src/engine/kmtip/kmtiparm64.def b/windows/src/engine/kmtip/kmtiparm64.def new file mode 100644 index 0000000000..b1c7e92987 --- /dev/null +++ b/windows/src/engine/kmtip/kmtiparm64.def @@ -0,0 +1,7 @@ +LIBRARY kmtiparm64.dll + +EXPORTS + DllGetClassObject PRIVATE + DllCanUnloadNow PRIVATE + DllRegisterServer PRIVATE + DllUnregisterServer PRIVATE diff --git a/windows/src/engine/kmtip/kmtiparm64EC.def b/windows/src/engine/kmtip/kmtiparm64EC.def new file mode 100644 index 0000000000..c1f716c667 --- /dev/null +++ b/windows/src/engine/kmtip/kmtiparm64EC.def @@ -0,0 +1,7 @@ +LIBRARY kmtiparm64EC.dll + +EXPORTS + DllGetClassObject PRIVATE + DllCanUnloadNow PRIVATE + DllRegisterServer PRIVATE + DllUnregisterServer PRIVATE diff --git a/windows/src/engine/mcompile/mcompile.vcxproj b/windows/src/engine/mcompile/mcompile.vcxproj index 863394cd52..311016cc6e 100644 --- a/windows/src/engine/mcompile/mcompile.vcxproj +++ b/windows/src/engine/mcompile/mcompile.vcxproj @@ -5,6 +5,10 @@ Debug ARM64 + + Debug + ARM64EC + Debug Win32 @@ -13,6 +17,10 @@ Release ARM64 + + Release + ARM64EC + Release Win32 @@ -32,6 +40,12 @@ Unicode v143 + + Application + true + Unicode + v143 + Application true @@ -45,6 +59,13 @@ Unicode v143 + + Application + false + true + Unicode + v143 + Application false @@ -58,12 +79,18 @@ + + + + + + @@ -75,6 +102,13 @@ *.cdf;*.cache;*.obj;*.ilk;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.metagen;*.bi $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + true + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + false + *.cdf;*.cache;*.obj;*.ilk;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.metagen;*.bi + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + true $(ProjectDir)bin\$(Platform)\$(Configuration)\ @@ -88,6 +122,12 @@ false $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + false + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + false + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + false $(ProjectDir)bin\$(Platform)\$(Configuration)\ @@ -111,6 +151,23 @@ sentry.dll + + + Use + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDebug + ..\..\..\..\common\windows\delphi\ext\sentry;..\..\global\inc + pch.h + + + Console + true + ..\..\..\..\common\windows\delphi\ext\sentry\sentry.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + sentry.dll + + Use @@ -149,6 +206,27 @@ sentry.dll + + + Level3 + Use + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreaded + ..\..\..\..\common\windows\delphi\ext\sentry;..\..\global\inc + pch.h + + + Console + true + true + true + ..\..\..\..\common\windows\delphi\ext\sentry\sentry.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + sentry.dll + + Level3 @@ -184,8 +262,10 @@ NotUsing + NotUsing NotUsing NotUsing + NotUsing NotUsing @@ -197,12 +277,16 @@ Create + Create Create Create + Create Create pch.h + pch.h pch.h pch.h + pch.h pch.h @@ -215,4 +299,4 @@ - + \ No newline at end of file diff --git a/windows/src/engine/testhost/build.sh b/windows/src/engine/testhost/build.sh index 2ff6b844c2..157e71b8b9 100755 --- a/windows/src/engine/testhost/build.sh +++ b/windows/src/engine/testhost/build.sh @@ -15,6 +15,7 @@ builder_parse "$@" source "$KEYMAN_ROOT/resources/build/win/environment.inc.sh" WIN32_TARGET="$WIN32_TARGET_PATH/testhost.exe" X64_TARGET="$X64_TARGET_PATH/testhost.exe" +#ARM64_TARGET="$ARM64_TARGET_PATH/testhost.exe" builder_describe_outputs \ configure:project /resources/build/win/delphi_environment_generated.inc.sh \ @@ -31,6 +32,7 @@ function do_build() { create-windows-output-folders vs_msbuild testhost.vcxproj //t:Build "//p:Platform=Win32" vs_msbuild testhost.vcxproj //t:Build "//p:Platform=x64" +# vs_msbuild testhost.vcxproj //t:Build "//p:Platform=arm64" # Note, we don't copy this to bin } diff --git a/windows/src/engine/testhost/testhost.vcxproj b/windows/src/engine/testhost/testhost.vcxproj index 7b6ccc2aa5..dafd06a659 100644 --- a/windows/src/engine/testhost/testhost.vcxproj +++ b/windows/src/engine/testhost/testhost.vcxproj @@ -5,6 +5,10 @@ Debug ARM64 + + Debug + ARM64EC + Debug Win32 @@ -13,6 +17,10 @@ Release ARM64 + + Release + ARM64EC + Release Win32 @@ -53,6 +61,12 @@ v143 Unicode + + Application + true + v143 + Unicode + Application true @@ -66,6 +80,13 @@ true Unicode + + Application + false + v143 + true + Unicode + Application false @@ -87,12 +108,18 @@ + + + + + + @@ -112,6 +139,11 @@ $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + true + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + true $(ProjectDir)bin\$(Platform)\$(Configuration)\ @@ -122,6 +154,11 @@ $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ + + false + $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + false $(ProjectDir)bin\$(Platform)\$(Configuration)\ @@ -170,6 +207,19 @@ true + + + Level3 + true + _DEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + stdcpp17 + + + Windows + true + + Level3 @@ -200,6 +250,23 @@ true + + + Level3 + true + true + true + NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + stdcpp17 + + + Windows + true + true + true + + Level3 @@ -236,4 +303,4 @@ - + \ No newline at end of file From 25770b17f15c05b6a5bb4a4d9d200e792e9c0691 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Tue, 18 Nov 2025 11:55:38 +1000 Subject: [PATCH 19/59] feat(windows): setproperty wix_native_machine msi Works in the msi but not the exe --- resources/build/win/wix.inc.sh | 2 +- windows/src/desktop/inst/build.sh | 21 +- windows/src/desktop/inst/keymandesktop.wxs | 423 ++++++++++----------- windows/src/engine/inst/build.sh | 18 +- windows/src/engine/inst/components.wxs | 69 ++-- windows/src/engine/inst/keymanengine.wxs | 71 ++-- 6 files changed, 307 insertions(+), 297 deletions(-) diff --git a/resources/build/win/wix.inc.sh b/resources/build/win/wix.inc.sh index a9e084b10a..0ad63e85b7 100644 --- a/resources/build/win/wix.inc.sh +++ b/resources/build/win/wix.inc.sh @@ -1,5 +1,5 @@ -WIXPATH="$ProgramFilesx86/WiX Toolset v3.11/bin" +WIXPATH="$ProgramFilesx86/WiX Toolset v3.14/bin" # !IFDEF LINT WIXLIGHTLINT=() diff --git a/windows/src/desktop/inst/build.sh b/windows/src/desktop/inst/build.sh index 9c0d28937b..1417f90a32 100755 --- a/windows/src/desktop/inst/build.sh +++ b/windows/src/desktop/inst/build.sh @@ -20,7 +20,7 @@ builder_if_release_build_level builder_describe_outputs \ builder_parse "$@" . "$KEYMAN_ROOT/resources/build/win/environment.inc.sh" -. "$KEYMAN_ROOT/resources/build/win/wix6.inc.sh" +. "$KEYMAN_ROOT/resources/build/win/wix.inc.sh" . "$KEYMAN_ROOT/resources/build/zip.inc.sh" # In dev environments, we'll hack the tier to alpha; CI sets this for us in real builds. @@ -62,20 +62,20 @@ function do_publish() { # # Build the installation archive # - #do_candle - do_wix_build + do_candle + #do_wix_build # ICE82: we suppress because it reports spurious errors with merge module # keymanengine to do with duplicate sequence numbers. Safely ignored. # ICE80: we suppress because it reports x64 components without targeting x64. # Safely ignored. - #"$WIXLIGHT" \ - # -sice:ICE82 -sice:ICE80 \ - # -nologo \ - # -dWixUILicenseRtf=License.rtf \ - # "$WIXLIGHTCOMPRESSION" \ - # -out keymandesktop.msi -ext WixUIExtension \ - # keymandesktop.wixobj desktopui.wixobj cef.wixobj locale.wixobj + "$WIXLIGHT" \ + -sice:ICE82 -sice:ICE80 \ + -nologo \ + -dWixUILicenseRtf=License.rtf \ + "$WIXLIGHTCOMPRESSION" \ + -out keymandesktop.msi -ext WixUIExtension -ext WixUtilExtension \ + keymandesktop.wixobj desktopui.wixobj cef.wixobj locale.wixobj # # Sign the installation archive @@ -181,7 +181,6 @@ function do_candle() { builder_heading candle local GUID1=$(generate_uuid) - "$WIXHEAT" dir "$KEYMAN_WIX_TEMP_CEF" -o cef.wxs -ag -cg CEF -dr INSTALLDIR -var var.CefSourceDir -wx -nologo "$WIXHEAT" dir ../kmshell/xml -o desktopui.wxs -ag -cg DesktopUI -dr INSTALLDIR -suid -var var.DESKTOPUISOURCE -wx -nologo "$WIXHEAT" dir ../kmshell/locale -o locale.wxs -ag -cg Locale -dr INSTALLDIR -var var.LOCALESOURCE -wx -nologo "$WIXCANDLE" -dKEYMAN_VERSION_WITH_TAG=${KEYMAN_VERSION_WITH_TAG} -dKEYMAN_VERSION=${KEYMAN_VERSION_WIN} -dRELEASE=${KEYMAN_VERSION_RELEASE} -dPRODUCTID=$GUID1 \ diff --git a/windows/src/desktop/inst/keymandesktop.wxs b/windows/src/desktop/inst/keymandesktop.wxs index f4b9d22829..3873baaab7 100644 --- a/windows/src/desktop/inst/keymandesktop.wxs +++ b/windows/src/desktop/inst/keymandesktop.wxs @@ -1,6 +1,10 @@ - - - + + + + @@ -68,39 +72,197 @@ * DISABLEADVTSHORTCUTS: https://learn.microsoft.com/en-us/windows/win32/msi/disableadvtshortcuts * Shortcut advertisement: https://learn.microsoft.com/en-us/windows/win32/msi/advertisement --> - + - - + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - - - + - + Level="1" ConfigurableDirectory="INSTALLDIR" Absent="disallow" AllowAdvertise="no"> @@ -113,243 +275,74 @@ + - + + - - - - - - + + + + + - + - - + + + - + VERSION11FOUND - - + + - - + CURRENTVERSIONFOUND + NEWERFOUND Or HIGHERFOUND - + VERSION11FOUND - - + + - + - + - + 1 - + + - + = 601)]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/windows/src/engine/inst/build.sh b/windows/src/engine/inst/build.sh index 0a4fd554a9..3007484bf7 100755 --- a/windows/src/engine/inst/build.sh +++ b/windows/src/engine/inst/build.sh @@ -34,15 +34,17 @@ function do_publish() { # # Build the installation archive # - #"$WIXCANDLE" -dKEYMAN_VERSION=$KEYMAN_VERSION_WIN -dRELEASE=$KEYMAN_VERSION_RELEASE -ext WixUtilExtension keymanengine.wxs components.wxs + "$WIXCANDLE" -dKEYMAN_VERSION=$KEYMAN_VERSION_WIN -dRELEASE=$KEYMAN_VERSION_RELEASE -ext WixUtilExtension keymanengine.wxs components.wxs # warning 1072 relates to Error table defined by WixUtilExtension. Doesn't really affect us. - #"$WIXLIGHT" \ - # -sw1072 \ - # -ext WixUtilExtension \ - # "$WIXLIGHTCOMPRESSION" \ - # keymanengine.wixobj components.wixobj \ - # -o keymanengine.msm + "$WIXLIGHT" \ + -sw1072 \ + -sice:ICE03 \ + -sice:ICEM10 \ + -ext WixUtilExtension \ + "$WIXLIGHTCOMPRESSION" \ + keymanengine.wixobj components.wixobj \ + -o keymanengine.msm #wix build keymanengine.wxs components.wxs \ #-ext WixToolset.Util.wixext \ #-d KEYMAN_VERSION=$KEYMAN_VERSION_WIN \ @@ -54,7 +56,7 @@ function do_publish() { echo $KEYMAN_VERSION_WIN echo $KEYMAN_VERSION #echo $RELEASE - wix build -d KEYMAN_VERSION=$KEYMAN_VERSION_WIN -d RELEASE=$KEYMAN_VERSION_RELEASE keymanengine.wxs components.wxs -ext WixToolset.Util.wixext -sw1072 -out keymanengine.msm + #wix build -d KEYMAN_VERSION=$KEYMAN_VERSION_WIN -d RELEASE=$KEYMAN_VERSION_RELEASE keymanengine.wxs components.wxs -ext WixToolset.Util.wixext -sw1072 -out keymanengine.msm diff --git a/windows/src/engine/inst/components.wxs b/windows/src/engine/inst/components.wxs index c819b6572e..b56bddcde1 100644 --- a/windows/src/engine/inst/components.wxs +++ b/windows/src/engine/inst/components.wxs @@ -1,8 +1,10 @@ - + + - + @@ -49,8 +51,8 @@ - - + + VersionNT64 @@ -128,7 +130,7 @@ - + @@ -148,36 +150,43 @@ - + - + - - - - + + - - + + - - - - - - - - - - - + + + + + + + + + + + @@ -206,8 +215,8 @@ - - + + VersionNT >= 602 @@ -226,16 +235,16 @@ - - + + WIX_NATIVE_MACHINE = "34404" - - + + WIX_NATIVE_MACHINE = "43620" diff --git a/windows/src/engine/inst/keymanengine.wxs b/windows/src/engine/inst/keymanengine.wxs index 6310301994..0536cecc76 100644 --- a/windows/src/engine/inst/keymanengine.wxs +++ b/windows/src/engine/inst/keymanengine.wxs @@ -1,22 +1,25 @@ - - + + + + + - - - - + + - - + + - - + + @@ -28,30 +31,30 @@ guid rules with merge modules, as we end up with LGHT0231, as the CommonFilesFolder root folder seems to be ignored when building the merge module. Therefore we list these files in a single component for now. --> - - - - - - - - - - - - - - + + + + + + + + + + + + + + - + - - + + @@ -68,9 +71,9 @@ - - - + + + @@ -87,6 +90,10 @@ - - + + + + + + From b38b7b9d43b45538c33e33ce6ae55ad219b7bc1b Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Tue, 18 Nov 2025 20:10:55 +1000 Subject: [PATCH 20/59] feat(windows): set property before launchconditions --- windows/src/desktop/inst/keymandesktop.wxs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/windows/src/desktop/inst/keymandesktop.wxs b/windows/src/desktop/inst/keymandesktop.wxs index 3873baaab7..44056b5c73 100644 --- a/windows/src/desktop/inst/keymandesktop.wxs +++ b/windows/src/desktop/inst/keymandesktop.wxs @@ -81,7 +81,7 @@ - + From c9753f6ba299e5c8517f66bdd0330d5b08d9386a Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Wed, 19 Nov 2025 11:50:57 +1000 Subject: [PATCH 21/59] feat(windows): handle arch type in build.bat skip build.sh Add a host check for build.bat and run the architecture tests that match the host. for the meson builds from build.h for now just skip the arm64 tests. --- core/build.bat | 19 +++++++++++++------ core/build.sh | 5 +++-- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/core/build.bat b/core/build.bat index ef38f28c98..5cad105bf3 100644 --- a/core/build.bat +++ b/core/build.bat @@ -133,13 +133,20 @@ if "!COMMAND!" == "build" ( ) if "!COMMAND!" == "test" ( - echo === Testing Keyman Core for Windows !ARCH! !BUILDTYPE! === - cd build\!ARCH!\!BUILDTYPE! || exit !errorlevel! - meson test --print-errorlogs %1 %2 %3 %4 %5 %6 %7 %8 %9 || exit !errorlevel! - cd ..\..\.. - shift + if /I "%HOST_ARCH%"=="arm64" if /I "%ARCH%"=="arm64" ( + echo === Testing Keyman Core for Windows !ARCH! !BUILDTYPE! === + cd build\!ARCH!\!BUILDTYPE! || exit !errorlevel! + meson test --print-errorlogs %1 %2 %3 %4 %5 %6 %7 %8 %9 || exit !errorlevel! + cd ..\..\.. + shift + ) else ( + echo === Testing Keyman Core for Windows !ARCH! !BUILDTYPE! === + cd build\!ARCH!\!BUILDTYPE! || exit !errorlevel! + meson test --print-errorlogs %1 %2 %3 %4 %5 %6 %7 %8 %9 || exit !errorlevel! + cd ..\..\.. + shift + ) ) - goto :eof rem ---------------------------------- diff --git a/core/build.sh b/core/build.sh index f002870a18..aae454f238 100755 --- a/core/build.sh +++ b/core/build.sh @@ -195,8 +195,9 @@ if builder_start_action test:win; then meson test -C "$MESON_PATH" $testparams MESON_PATH="$KEYMAN_ROOT/core/build/x64/$BUILDER_CONFIGURATION" meson test -C "$MESON_PATH" $testparams - MESON_PATH="$KEYMAN_ROOT/core/build/arm64/$BUILDER_CONFIGURATION" - meson test -C "$MESON_PATH" $testparams + # We do not yet have CI/build hardware support for arm64 Windows testing + #MESON_PATH="$KEYMAN_ROOT/core/build/arm64/$BUILDER_CONFIGURATION" + #meson test -C "$MESON_PATH" $testparams builder_finish_action success test:win fi From c059627aa57d240eeca8c2f133590ed39388aa64 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Wed, 19 Nov 2025 14:07:21 +1000 Subject: [PATCH 22/59] feat(windows): link keymanarm64.dll correctly --- windows/src/engine/kmtip/kmtip.vcxproj | 16 ++++++++++++---- windows/src/engine/kmtip/kmtip.vcxproj.filters | 3 +++ windows/src/engine/kmtip/kmtiparm64.def | 7 +++++++ 3 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 windows/src/engine/kmtip/kmtiparm64.def diff --git a/windows/src/engine/kmtip/kmtip.vcxproj b/windows/src/engine/kmtip/kmtip.vcxproj index f0b33c7b55..2a460c9155 100644 --- a/windows/src/engine/kmtip/kmtip.vcxproj +++ b/windows/src/engine/kmtip/kmtip.vcxproj @@ -265,11 +265,11 @@ 0x0c09 - ..\..\..\lib\keyman64.lib;version.lib;wintrust.lib;crypt32.lib;imagehlp.lib;%(AdditionalDependencies) + ..\..\..\lib\keymanarm64.lib;version.lib;wintrust.lib;crypt32.lib;imagehlp.lib;%(AdditionalDependencies) true - .\kmtip64.def + .\kmtiparm64.def true - 0x4C100000 + 0x140000000 true true @@ -392,7 +392,7 @@ ..\..\..\lib\keymanarm64.lib;version.lib;wintrust.lib;crypt32.lib;imagehlp.lib;%(AdditionalDependencies) true - .\kmtip64.def + .\kmtiparm64.def true true 0x140000000 @@ -582,6 +582,14 @@ true true + true + true + + + true + true + true + true diff --git a/windows/src/engine/kmtip/kmtip.vcxproj.filters b/windows/src/engine/kmtip/kmtip.vcxproj.filters index b7d69593c2..89918c97f3 100644 --- a/windows/src/engine/kmtip/kmtip.vcxproj.filters +++ b/windows/src/engine/kmtip/kmtip.vcxproj.filters @@ -83,6 +83,9 @@ Source Files\Framework + + Source Files\Framework + diff --git a/windows/src/engine/kmtip/kmtiparm64.def b/windows/src/engine/kmtip/kmtiparm64.def new file mode 100644 index 0000000000..b1c7e92987 --- /dev/null +++ b/windows/src/engine/kmtip/kmtiparm64.def @@ -0,0 +1,7 @@ +LIBRARY kmtiparm64.dll + +EXPORTS + DllGetClassObject PRIVATE + DllCanUnloadNow PRIVATE + DllRegisterServer PRIVATE + DllUnregisterServer PRIVATE From 59c8ff6d7557391ab026cff317b540a6953883a4 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Wed, 19 Nov 2025 16:05:57 +1000 Subject: [PATCH 23/59] feat(windows): remove shared data arm64 test the arm64 shared data test will only be possible on arm64 machine which is capable of running the x64 applications --- windows/src/test/unit-tests/shared-data/build.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/windows/src/test/unit-tests/shared-data/build.sh b/windows/src/test/unit-tests/shared-data/build.sh index c613509d06..0262202238 100755 --- a/windows/src/test/unit-tests/shared-data/build.sh +++ b/windows/src/test/unit-tests/shared-data/build.sh @@ -29,7 +29,6 @@ function do_test() { "./delphi/$WIN64_TARGET_PATH/delphishareddata.exe" > delphi-win64.txt "./cpp/$WIN32_TARGET_PATH/cppshareddata.exe" > cpp-win32.txt "./cpp/$X64_TARGET_PATH/cppshareddata.exe" > cpp-win64.txt - "./cpp/$ARM64_TARGET_PATH/cppshareddata.exe" > cpp-arm64.txt diff -q delphi-win32.txt delphi-win64.txt diff -q delphi-win32.txt cpp-win32.txt diff -q delphi-win32.txt cpp-win64.txt From 6e5fb1cefe5e8e800327855a47425f776b26c5e2 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Thu, 20 Nov 2025 11:28:05 +1000 Subject: [PATCH 24/59] feat(windows): copy sentry arm build to bin folder --- windows/src/engine/keyman/build.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/windows/src/engine/keyman/build.sh b/windows/src/engine/keyman/build.sh index efdaf0698c..63b33b2f24 100755 --- a/windows/src/engine/keyman/build.sh +++ b/windows/src/engine/keyman/build.sh @@ -47,6 +47,7 @@ function do_build() { # Also copy sentry files here cp "$KEYMAN_ROOT/common/windows/delphi/ext/sentry/sentry.dll" \ "$KEYMAN_ROOT/common/windows/delphi/ext/sentry/sentry.x64.dll" \ + "$KEYMAN_ROOT/common/windows/delphi/ext/sentry/sentry.arm64.dll" \ "$KEYMAN_ROOT/common/windows/delphi/ext/sentry/crashpad_handler.exe" \ "$KEYMAN_ROOT/windows/bin/engine/" } @@ -62,6 +63,7 @@ function do_publish() { # Also sign sentry files here wrap-signcode //d "Keyman Engine for Windows" "$WINDOWS_PROGRAM_ENGINE/sentry.dll" wrap-signcode //d "Keyman Engine for Windows" "$WINDOWS_PROGRAM_ENGINE/sentry.x64.dll" + wrap-signcode //d "Keyman Engine for Windows" "$WINDOWS_PROGRAM_ENGINE/sentry.arm64.dll" wrap-signcode //d "Keyman Engine for Windows" "$WINDOWS_PROGRAM_ENGINE/crashpad_handler.exe" wrap-symstore "$WINDOWS_PROGRAM_ENGINE/keyman.exe" //t keyman-engine-windows From 767c007ca7bb2907aa66b390e8cedcd31c961e34 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Fri, 21 Nov 2025 10:07:09 +1000 Subject: [PATCH 25/59] feat(windows): rename kmtiparm64EC to kmtiparm64X --- windows/src/engine/inst/components.wxs | 4 ++-- windows/src/engine/kmtip/build.sh | 10 +++++----- windows/src/engine/kmtip/kmtip.vcxproj | 10 +++++----- windows/src/engine/kmtip/kmtip.vcxproj.filters | 2 +- .../engine/kmtip/{kmtiparm64EC.def => kmtiparm64X.def} | 2 +- 5 files changed, 14 insertions(+), 14 deletions(-) rename windows/src/engine/kmtip/{kmtiparm64EC.def => kmtiparm64X.def} (88%) diff --git a/windows/src/engine/inst/components.wxs b/windows/src/engine/inst/components.wxs index b56bddcde1..8b348cac3c 100644 --- a/windows/src/engine/inst/components.wxs +++ b/windows/src/engine/inst/components.wxs @@ -243,9 +243,9 @@ - + WIX_NATIVE_MACHINE = "43620" - + diff --git a/windows/src/engine/kmtip/build.sh b/windows/src/engine/kmtip/build.sh index 4e72a3a5de..9e89a8a539 100755 --- a/windows/src/engine/kmtip/build.sh +++ b/windows/src/engine/kmtip/build.sh @@ -18,7 +18,7 @@ source "$KEYMAN_ROOT/resources/build/win/environment.inc.sh" WIN32_TARGET="$WIN32_TARGET_PATH/kmtip.dll" X64_TARGET="$X64_TARGET_PATH/kmtip64.dll" ARM64_TARGET="$ARM64_TARGET_PATH/kmtiparm64.dll" -ARM64EC_TARGET="$ARM64EC_TARGET_PATH/kmtiparm64EC.dll" +ARM64EC_TARGET="$ARM64EC_TARGET_PATH/kmtiparm64X.dll" builder_describe_outputs \ configure:project /resources/build/win/delphi_environment_generated.inc.sh \ @@ -48,7 +48,7 @@ function do_build() { cp "$ARM64_TARGET" "$WINDOWS_PROGRAM_ENGINE" builder_if_release_build_level cp "$ARM64_TARGET_PATH/kmtiparm64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" cp "$ARM64EC_TARGET" "$WINDOWS_PROGRAM_ENGINE" - builder_if_release_build_level cp "$ARM64EC_TARGET_PATH/kmtiparm64EC.pdb" "$WINDOWS_DEBUGPATH_ENGINE" + builder_if_release_build_level cp "$ARM64EC_TARGET_PATH/kmtiparm64X.pdb" "$WINDOWS_DEBUGPATH_ENGINE" } @@ -62,15 +62,15 @@ function do_publish() { wrap-symstore "$WINDOWS_DEBUGPATH_ENGINE/kmtip64.pdb" //t keyman-engine-windows wrap-symstore "$WINDOWS_PROGRAM_ENGINE/kmtiparm64.dll" //t keyman-engine-windows wrap-symstore "$WINDOWS_DEBUGPATH_ENGINE/kmtiparm64.pdb" //t keyman-engine-windows - wrap-symstore "$WINDOWS_PROGRAM_ENGINE/kmtiparm64EC.dll" //t keyman-engine-windows - wrap-symstore "$WINDOWS_DEBUGPATH_ENGINE/kmtiparm64EC.pdb" //t keyman-engine-windows + wrap-symstore "$WINDOWS_PROGRAM_ENGINE/kmtiparm64X.dll" //t keyman-engine-windows + wrap-symstore "$WINDOWS_DEBUGPATH_ENGINE/kmtiparm64X.pdb" //t keyman-engine-windows } function do_install() { cp "$WINDOWS_PROGRAM_ENGINE/kmtip.dll" "$INSTALLPATH_KEYMANENGINE/kmtip.dll" cp "$WINDOWS_PROGRAM_ENGINE/kmtip64.dll" "$INSTALLPATH_KEYMANENGINE/kmtip64.dll" cp "$WINDOWS_PROGRAM_ENGINE/kmtiparm64.dll" "$INSTALLPATH_KEYMANENGINE/kmtiparm64.dll" - cp "$WINDOWS_PROGRAM_ENGINE/kmtiparm64EC.dll" "$INSTALLPATH_KEYMANENGINE/kmtiparm64EC.dll" + cp "$WINDOWS_PROGRAM_ENGINE/kmtiparm64X.dll" "$INSTALLPATH_KEYMANENGINE/kmtiparm64X.dll" } builder_run_action clean:project do_clean diff --git a/windows/src/engine/kmtip/kmtip.vcxproj b/windows/src/engine/kmtip/kmtip.vcxproj index e50deafe3e..f14e86ceb0 100644 --- a/windows/src/engine/kmtip/kmtip.vcxproj +++ b/windows/src/engine/kmtip/kmtip.vcxproj @@ -190,10 +190,10 @@ .dll .dll kmtip64 - kmtiparm64EC + kmtiparm64X kmtiparm64 kmtip64 - kmtiparm64EC + kmtiparm64X kmtiparm64 @@ -319,7 +319,7 @@ ..\..\..\lib\keyman64.lib;..\..\..\lib\keymanarm64.lib;version.lib;wintrust.lib;crypt32.lib;imagehlp.lib;%(AdditionalDependencies) true - .\kmtiparm64EC.def + .\kmtiparm64X.def true 0x140000000 true @@ -486,7 +486,7 @@ ..\..\..\lib\keyman64.lib;..\..\..\lib\keymanarm64.lib;version.lib;wintrust.lib;crypt32.lib;imagehlp.lib;%(AdditionalDependencies) true - .\kmtiparm64EC.def + .\kmtiparm64X.def true true 0x140000000 @@ -770,7 +770,7 @@ true true - + true true true diff --git a/windows/src/engine/kmtip/kmtip.vcxproj.filters b/windows/src/engine/kmtip/kmtip.vcxproj.filters index 901386f429..48c8bdf599 100644 --- a/windows/src/engine/kmtip/kmtip.vcxproj.filters +++ b/windows/src/engine/kmtip/kmtip.vcxproj.filters @@ -86,7 +86,7 @@ Source Files\Framework - + Source Files\Framework diff --git a/windows/src/engine/kmtip/kmtiparm64EC.def b/windows/src/engine/kmtip/kmtiparm64X.def similarity index 88% rename from windows/src/engine/kmtip/kmtiparm64EC.def rename to windows/src/engine/kmtip/kmtiparm64X.def index c1f716c667..3058feb26a 100644 --- a/windows/src/engine/kmtip/kmtiparm64EC.def +++ b/windows/src/engine/kmtip/kmtiparm64X.def @@ -1,4 +1,4 @@ -LIBRARY kmtiparm64EC.dll +LIBRARY kmtiparm64X.dll EXPORTS DllGetClassObject PRIVATE From b48bfeaf8bcb4429d9527f14b80b64b9c24c7faf Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Fri, 21 Nov 2025 11:58:49 +1000 Subject: [PATCH 26/59] feat(windows): fix manifest for each host --- windows/src/engine/keymanhp/build.sh | 6 ++++++ windows/src/engine/keymanhp/{manifest.in => manifesthp.in} | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) rename windows/src/engine/keymanhp/{manifest.in => manifesthp.in} (90%) diff --git a/windows/src/engine/keymanhp/build.sh b/windows/src/engine/keymanhp/build.sh index 156cdb5c3a..c72be7b7d0 100755 --- a/windows/src/engine/keymanhp/build.sh +++ b/windows/src/engine/keymanhp/build.sh @@ -38,19 +38,25 @@ function do_clean_arm64() { function do_build_x64() { create-windows-output-folders build_version.res + sed "s/Keyman Engine HP/Keyman Engine x64/g; + s/arch64/amd64/g" manifesthp.in > manifest.in build_manifest.res vs_msbuild keymanhp.vcxproj //t:Build "//p:Platform=x64" cp "$X64_TARGET" "$WINDOWS_PROGRAM_ENGINE" builder_if_release_build_level cp "$X64_TARGET_PATH/keymanhp.x64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" + rm manifest.in } function do_build_arm64() { create-windows-output-folders build_version.res + sed "s/Keyman Engine HP/Keyman Engine arm64/g; + s/arch64/arm64/g" manifesthp.in > manifest.in build_manifest.res vs_msbuild keymanhp.vcxproj //t:Build "//p:Platform=arm64" cp "$ARM64_TARGET" "$WINDOWS_PROGRAM_ENGINE" builder_if_release_build_level cp "$ARM64_TARGET_PATH/keymanhp.arm64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" + rm manifest.in } function do_publish_x64() { diff --git a/windows/src/engine/keymanhp/manifest.in b/windows/src/engine/keymanhp/manifesthp.in similarity index 90% rename from windows/src/engine/keymanhp/manifest.in rename to windows/src/engine/keymanhp/manifesthp.in index 6b58d64c7d..5fd0c12875 100644 --- a/windows/src/engine/keymanhp/manifest.in +++ b/windows/src/engine/keymanhp/manifesthp.in @@ -1,7 +1,7 @@ - - Keyman Engine x64 + + Keyman Engine HP From 19cc857b9912ca7682d2a86dc21104afa43ecda4 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Fri, 21 Nov 2025 14:49:57 +1000 Subject: [PATCH 27/59] feat(windows): fix version rc files to display correct fix the version.rc files to display the correct description and file name for keymanhp.*.exe fix version rc files to display correct Also fix up the Keymanengine arm64 version names. --- resources/build/win/wix6.inc.sh | 20 ------------ windows/src/engine/keyman32/keyman32.vcxproj | 2 +- windows/src/engine/keyman32/keymanarm64.rc | 2 +- windows/src/engine/keyman32/versionarm64.rc | 32 +++++++++++++++++++ windows/src/engine/keymanhp/build.sh | 4 +-- windows/src/engine/keymanhp/keymanarm64.rc | 6 ++++ windows/src/engine/keymanhp/keymanhp.cpp | 2 +- windows/src/engine/keymanhp/keymanhp.vcxproj | 11 ++++++- .../engine/keymanhp/keymanhp.vcxproj.filters | 5 ++- .../keymanhp/{keymanhp.rc => keymanx64.rc} | 2 +- windows/src/engine/keymanhp/versionarm64.rc | 32 +++++++++++++++++++ .../keymanhp/{version.rc => versionx64.rc} | 2 +- 12 files changed, 91 insertions(+), 29 deletions(-) delete mode 100644 resources/build/win/wix6.inc.sh create mode 100644 windows/src/engine/keyman32/versionarm64.rc create mode 100644 windows/src/engine/keymanhp/keymanarm64.rc rename windows/src/engine/keymanhp/{keymanhp.rc => keymanx64.rc} (84%) create mode 100644 windows/src/engine/keymanhp/versionarm64.rc rename windows/src/engine/keymanhp/{version.rc => versionx64.rc} (93%) diff --git a/resources/build/win/wix6.inc.sh b/resources/build/win/wix6.inc.sh deleted file mode 100644 index 46a19a2dc4..0000000000 --- a/resources/build/win/wix6.inc.sh +++ /dev/null @@ -1,20 +0,0 @@ - -WIX6PATH="C:\Users\ross_\.dotnet\tools" - -# !IFDEF LINT -#WIXLIGHTLINT=() -#!ELSE -# we suppress ICE82 because it reports spurious errors with merge module keymanengine to do with duplicate sequence numbers. Safely ignored. -#WIXLIGHTLINT=(-sice:ICE82 -sice:ICE80) -#!ENDIF - -if [[ "$GO_FAST" == 1 ]]; then - # for debug builds, we turn off compression because it is so hideously slow - # for test builds, we also turn off compression - WIXCOMPRESSION="-dcl none" -else - WIXCOMPRESSION="-dcl high" -fi - -# WIXLIT="$WIX6PATH/lit.exe" -wx -nologo -WIX6BUILD="$WIX6PATH/wix.exe build" diff --git a/windows/src/engine/keyman32/keyman32.vcxproj b/windows/src/engine/keyman32/keyman32.vcxproj index 9aa53fc685..5ec66a7783 100644 --- a/windows/src/engine/keyman32/keyman32.vcxproj +++ b/windows/src/engine/keyman32/keyman32.vcxproj @@ -205,7 +205,7 @@ $(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\ARM64\$(Configuration);$(VC_LibraryPath_ARM64);$(WindowsSDK_LibraryPath_ARM64) - $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\include;$(IncludePath) + $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\arm64\$(Configuration)\include;$(IncludePath) keymanarm64 diff --git a/windows/src/engine/keyman32/keymanarm64.rc b/windows/src/engine/keyman32/keymanarm64.rc index c4fe9ce92e..e143be7077 100644 --- a/windows/src/engine/keyman32/keymanarm64.rc +++ b/windows/src/engine/keyman32/keymanarm64.rc @@ -1 +1 @@ -#include "version64.rc" +#include "versionarm64.rc" diff --git a/windows/src/engine/keyman32/versionarm64.rc b/windows/src/engine/keyman32/versionarm64.rc new file mode 100644 index 0000000000..a2f3332e59 --- /dev/null +++ b/windows/src/engine/keyman32/versionarm64.rc @@ -0,0 +1,32 @@ +#include "../../../../common/windows/cpp/include/keymanversion.h" + +1 VERSIONINFO + FILEVERSION KV_FILEVERSION + PRODUCTVERSION KV_PRODUCTVERSION + FILEFLAGSMASK 0x3fL + FILEFLAGS 0x0L + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L + BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "0C0904E4" + BEGIN + VALUE "CompanyName", KV_COMPANY_NAME + VALUE "FileDescription", "Keyman Engine Processor Arm64\0" + VALUE "FileVersion", KV_VERSION_STRING + VALUE "InternalName", "KEYMANARM64\0" + VALUE "LegalCopyright", KV_LEGAL_COPYRIGHT + VALUE "LegalTrademarks", KV_LEGAL_TRADEMARKS + VALUE "OriginalFilename", "KEYMANARM64.DLL\0" + VALUE "ProductName", "Keyman Engine\0" + VALUE "ProductVersion", KV_VERSION_STRING + VALUE "Comments", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0xc09, 1252 + END + END diff --git a/windows/src/engine/keymanhp/build.sh b/windows/src/engine/keymanhp/build.sh index c72be7b7d0..89f3a2f163 100755 --- a/windows/src/engine/keymanhp/build.sh +++ b/windows/src/engine/keymanhp/build.sh @@ -37,7 +37,7 @@ function do_clean_arm64() { function do_build_x64() { create-windows-output-folders - build_version.res + run_in_vs_env rc versionx64.rc sed "s/Keyman Engine HP/Keyman Engine x64/g; s/arch64/amd64/g" manifesthp.in > manifest.in build_manifest.res @@ -49,7 +49,7 @@ function do_build_x64() { function do_build_arm64() { create-windows-output-folders - build_version.res + run_in_vs_env rc versionarm64.rc sed "s/Keyman Engine HP/Keyman Engine arm64/g; s/arch64/arm64/g" manifesthp.in > manifest.in build_manifest.res diff --git a/windows/src/engine/keymanhp/keymanarm64.rc b/windows/src/engine/keymanhp/keymanarm64.rc new file mode 100644 index 0000000000..343916115f --- /dev/null +++ b/windows/src/engine/keymanhp/keymanarm64.rc @@ -0,0 +1,6 @@ +// Microsoft Visual C++ generated resource script. +// +#include "versionarm64.rc" +#include "manifest.rc" +1 ICON "..\\..\\desktop\\branding\\keymandesktop90-64.ico" + diff --git a/windows/src/engine/keymanhp/keymanhp.cpp b/windows/src/engine/keymanhp/keymanhp.cpp index 6b0fb183cb..2f04f52dc9 100644 --- a/windows/src/engine/keymanhp/keymanhp.cpp +++ b/windows/src/engine/keymanhp/keymanhp.cpp @@ -68,7 +68,7 @@ BOOL KeymanStarted = FALSE; #define ARCH_LOG_FILE ".keymanhp-x64" #elif defined(_M_ARM64) #define WINDOW_TITLE L"Keymanhp-arm64" - #define EXECUTABLE_TITLE L"Keyman Engine arm64" + #define EXECUTABLE_TITLE L"Keyman Engine Arm64" #define ARCH_LOG_FILE ".keymanhp-arm64" #else #error Unknown architecture diff --git a/windows/src/engine/keymanhp/keymanhp.vcxproj b/windows/src/engine/keymanhp/keymanhp.vcxproj index bf8a8b3350..7dce6a62df 100644 --- a/windows/src/engine/keymanhp/keymanhp.vcxproj +++ b/windows/src/engine/keymanhp/keymanhp.vcxproj @@ -402,7 +402,16 @@ - + + true + true + true + true + + + true + true + diff --git a/windows/src/engine/keymanhp/keymanhp.vcxproj.filters b/windows/src/engine/keymanhp/keymanhp.vcxproj.filters index 116cf084a4..7c736dcc17 100644 --- a/windows/src/engine/keymanhp/keymanhp.vcxproj.filters +++ b/windows/src/engine/keymanhp/keymanhp.vcxproj.filters @@ -34,7 +34,10 @@ - + + Resource Files + + Resource Files diff --git a/windows/src/engine/keymanhp/keymanhp.rc b/windows/src/engine/keymanhp/keymanx64.rc similarity index 84% rename from windows/src/engine/keymanhp/keymanhp.rc rename to windows/src/engine/keymanhp/keymanx64.rc index 124704538b..2912156cd3 100644 --- a/windows/src/engine/keymanhp/keymanhp.rc +++ b/windows/src/engine/keymanhp/keymanx64.rc @@ -1,6 +1,6 @@ // Microsoft Visual C++ generated resource script. // -#include "version.rc" +#include "versionx64.rc" #include "manifest.rc" 1 ICON "..\\..\\desktop\\branding\\keymandesktop90-64.ico" diff --git a/windows/src/engine/keymanhp/versionarm64.rc b/windows/src/engine/keymanhp/versionarm64.rc new file mode 100644 index 0000000000..42b56aee6e --- /dev/null +++ b/windows/src/engine/keymanhp/versionarm64.rc @@ -0,0 +1,32 @@ +#include "../../../../common/windows/cpp/include/keymanversion.h" + +1 VERSIONINFO + FILEVERSION KV_FILEVERSION + PRODUCTVERSION KV_PRODUCTVERSION + FILEFLAGSMASK 0x3fL + FILEFLAGS 0x0L + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L + BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "0C0904E4" + BEGIN + VALUE "CompanyName", KV_COMPANY_NAME + VALUE "FileDescription", "Keyman Engine Arm64\0" + VALUE "FileVersion", KV_VERSION_STRING + VALUE "InternalName", "KEYMANARM64\0" + VALUE "LegalCopyright", KV_LEGAL_COPYRIGHT + VALUE "LegalTrademarks", KV_LEGAL_TRADEMARKS + VALUE "OriginalFilename", "KEYMAN.HP.ARM64.EXE\0" + VALUE "ProductName", "Keyman Engine\0" + VALUE "ProductVersion", KV_VERSION_STRING + VALUE "Comments", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0xc09, 1252 + END + END diff --git a/windows/src/engine/keymanhp/version.rc b/windows/src/engine/keymanhp/versionx64.rc similarity index 93% rename from windows/src/engine/keymanhp/version.rc rename to windows/src/engine/keymanhp/versionx64.rc index 80133aa7f2..9baa88c50c 100644 --- a/windows/src/engine/keymanhp/version.rc +++ b/windows/src/engine/keymanhp/versionx64.rc @@ -19,7 +19,7 @@ VALUE "InternalName", "KEYMANX64\0" VALUE "LegalCopyright", KV_LEGAL_COPYRIGHT VALUE "LegalTrademarks", KV_LEGAL_TRADEMARKS - VALUE "OriginalFilename", "KEYMANX64.EXE\0" + VALUE "OriginalFilename", "KEYMAN.HP.64.EXE\0" VALUE "ProductName", "Keyman Engine\0" VALUE "ProductVersion", KV_VERSION_STRING VALUE "Comments", "\0" From 23da5010197eb4f39488c430ec45275f1b091cf7 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Fri, 21 Nov 2025 15:58:25 +1000 Subject: [PATCH 28/59] feat(windows): remove dead code --- .../src/desktop/inst/KeymanDesktop.wixproj | 57 ------------------- windows/src/desktop/inst/build.sh | 54 +----------------- 2 files changed, 2 insertions(+), 109 deletions(-) delete mode 100644 windows/src/desktop/inst/KeymanDesktop.wixproj diff --git a/windows/src/desktop/inst/KeymanDesktop.wixproj b/windows/src/desktop/inst/KeymanDesktop.wixproj deleted file mode 100644 index f85e50979f..0000000000 --- a/windows/src/desktop/inst/KeymanDesktop.wixproj +++ /dev/null @@ -1,57 +0,0 @@ - - - $(ProjectDir) - keymandesktop - AnyCPU - ICE80;ICE82 - en-us - none - true - - - PRODUCTID=$(PRODUCTID); - RELEASE=$(RELEASE); - KEYMAN_VERSION=$(KEYMAN_VERSION); - KEYMAN_VERSION_WIN=$(KEYMAN_VERSION_WIN); - KEYMAN_VERSION_WITH_TAG=$(KEYMAN_VERSION_WITH_TAG); - CefSourceDir=$(CefSourceDir); - DESKTOPUISOURCE=$(DESKTOPUISOURCE); - LOCALESOURCE=$(LOCALESOURCE) - - - - - - - CEF - INSTALLDIR - var.CefSourceDir - - - - - - DesktopUI - INSTALLDIR - var.DESKTOPUISOURCE - - true - - - - Locale - LocaleDir - var.LOCALESOURCE - - - - - - - - - - - diff --git a/windows/src/desktop/inst/build.sh b/windows/src/desktop/inst/build.sh index 1417f90a32..9f7d170295 100755 --- a/windows/src/desktop/inst/build.sh +++ b/windows/src/desktop/inst/build.sh @@ -63,7 +63,7 @@ function do_publish() { # Build the installation archive # do_candle - #do_wix_build + # ICE82: we suppress because it reports spurious errors with merge module # keymanengine to do with duplicate sequence numbers. Safely ignored. # ICE80: we suppress because it reports x64 components without targeting x64. @@ -135,46 +135,6 @@ function test-releaseexists() { fi } - -function do_wix_build_OLD() { - #"${WIXCOMPRESSION}" \ this line was in the wix build cli -culture en-us \ - local GUID1=$(generate_uuid) - DESKTOP_UI_SRC="../kmshell/xml" - LOCALE_SRC="../kmshell/locale" -$WIX6BUILD \ - -d KEYMAN_VERSION_WITH_TAG="${KEYMAN_VERSION_WITH_TAG}" \ - -d KEYMAN_VERSION="${KEYMAN_VERSION_WIN}" \ - -d RELEASE="${KEYMAN_VERSION_RELEASE}" \ - -d PRODUCTID="${GUID1}" \ - -d CefSourceDir="${KEYMAN_CEF4DELPHI_ROOT}" \ - -d DesktopUISource="${DESKTOP_UI_SRC}" \ - -d LocaleSource="${LOCALE_SRC}" \ - -d HarvestFileGenerateGuidsNow=true \ - keymandesktop.wxs \ - -ext WixToolset.Util.wixext \ - -o "KeymanDesktop-${KEYMAN_VERSION_WITH_TAG}.msi" \ - -} - -function do_wix_build() { - #"${WIXCOMPRESSION}" \ this line was in the wix build cli -culture en-us \ - exclude-cef - local GUID1=$(generate_uuid) - DESKTOPUISOURCE="../kmshell/xml" - LOCALESOURCE="../kmshell/locale" -echo "Building with ProductID: $GUID1" - dotnet build KeymanDesktop.wixproj \ - -p:PRODUCTID="$GUID1" \ - -p:RELEASE="$KEYMAN_VERSION_RELEASE" \ - -p:KEYMAN_VERSION="$KEYMAN_VERSION_WIN" \ - -p:KEYMAN_VERSION_WITH_TAG="$KEYMAN_VERSION_WITH_TAG" \ - -p:KEYMAN_VERSION_WIN="$KEYMAN_VERSION_WIN" \ - -p:CefSourceDir="$KEYMAN_WIX_TEMP_CEF" \ - -p:DESKTOPUISOURCE="$DESKTOPUISOURCE" \ - -p:LOCALESOURCE="$LOCALESOURCE" -} - - function do_candle() { heat-cef @@ -191,7 +151,7 @@ function do_candle() { function heat-cef() { builder_heading heat-cef - # We copy the files to a temp folder in order to exclude .git and README.md from harvesting + # We copy the files to a temp folder in order to exclude .git from harvesting rm -rf "$KEYMAN_WIX_TEMP_CEF" mkdir -p "$KEYMAN_WIX_TEMP_CEF" cp -r "$KEYMAN_CEF4DELPHI_ROOT"/* "$KEYMAN_WIX_TEMP_CEF" @@ -200,16 +160,6 @@ function heat-cef() { rm -rf "$KEYMAN_WIX_TEMP_CEF" } -function exclude-cef() { - builder_heading exclude-cef - - # We copy the files to a temp folder in order to exclude .git from harvesting - rm -rf "$KEYMAN_WIX_TEMP_CEF" - mkdir -p "$KEYMAN_WIX_TEMP_CEF" - cp -r "$KEYMAN_CEF4DELPHI_ROOT"/* "$KEYMAN_WIX_TEMP_CEF" -} - - function create-setup-inf() { builder_heading create-setup-inf From 0375dea3d64c488f66e23b0dc11073145ab10d7e Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Mon, 24 Nov 2025 13:46:17 +1000 Subject: [PATCH 29/59] feat(windows): remove custom built sentry.arm64.dll --- .../windows/delphi/ext/sentry/sentry.a64.exp | Bin 48385 -> 0 bytes .../windows/delphi/ext/sentry/sentry.arm64.dll | Bin 146944 -> 0 bytes .../windows/delphi/ext/sentry/sentry.arm64.lib | Bin 79954 -> 0 bytes windows/src/engine/keyman/build.sh | 2 -- windows/src/engine/keymanhp/keymanhp.cpp | 8 ++++++-- windows/src/engine/keymanhp/keymanhp.vcxproj | 14 ++++++++++---- 6 files changed, 16 insertions(+), 8 deletions(-) delete mode 100644 common/windows/delphi/ext/sentry/sentry.a64.exp delete mode 100644 common/windows/delphi/ext/sentry/sentry.arm64.dll delete mode 100644 common/windows/delphi/ext/sentry/sentry.arm64.lib diff --git a/common/windows/delphi/ext/sentry/sentry.a64.exp b/common/windows/delphi/ext/sentry/sentry.a64.exp deleted file mode 100644 index efe6346cdcc10f63943536199ed2ab2c1fbbda90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48385 zcmeI*f1Fiw{s-{)9Z5);bhX3Mec##_SBtrpdPd%?L<3MPuhig(XP~+im4CnMtx~_+JpL0f7+AwqP=MV?L+(0 zepEvH(?B|aO6fp4hz8MM8bSxtAvBZ@rC~Ij%BY+wsFLDTMb%V8396;T=x`cAN6?XU z6wWb^reo+>8b!y^@pJ->rW5HTI+@1MDRe5GMq}x8I)l!nadZ})P3O>fI+xC)^Qn$5 zpbIHU6DURX)PQr>G)<&Q)I`m65lyBRYNa;HP&@sEvXrAdbfjGYw71So35kl=?0oZH_}aXGtH%2=vMj#&7<4scKRjF zr#t9Qx{DUj-EH=^^?JJxojJ5qgv!qowpX{g$4fC+R7A znx3I$^ep|3o}=aTJiS1_rxo-EdXZkDmGm;bLa)*)dW~MEH)u7zNpI2Hw1(cHcj-M^ zOMj&I=})wdKA=C-hqRvlLVu-?Xajvrf1|(CM*0W+lRlwM^eKHtpVMagg1)4$XbXK! z-_XD4Tl$W^r+?E{`Vak=aJn9g#foCv#k$3|k9Cjj5bF`!F}71|=UC6!F0o#*U1Pmt z#j!rI-C})XyT|s3^^5h7?HSuEws&kmY@gV^vHfBtvHfEMV+X`aV+Y0#iVcbljtz+& z96Ka7GqyYnxLo z%@>Dia~5lIVm58!By2nB@B;R$;z$$rjx>5M%wcw#zk-rMC|F!dxqLR&mP<9{l{s*m z!FwFql4(uywqVq)hAs803I2BGPhX2$YKUG$o!RDmI+@Sdo2EoV_44AA-XuM>A>FRb zv>(bhal8Dv6`zu7=}1e#9QvHeSZEFY@|f7tk!$kO!)uP0ebnZ~F=yk-C0m+v{!Y`B zYHLIA!@f}hipX-Ks=`%}Zn}o0OH@p2_-EWMtlRGDpF# z;gz*VgT-i%`wfW*+sjXBMnjvL)7ezEp=p|}1!~5&)M9OkT1}`^^O_r8b)NBRN_Ai> zb9ZuHk`0ra+a~D^m35s;Hl(vb2NSMDeipM8Y7DJ>r9jT_QNoOUr#YKxZChYabPap>a? z%2szS)!L2?Kby+?J65=wT;t?q_+Y2RnmY20na;LkzPUA>>9AKnt+hVGeQh$>fvxi> zyLK+wMRWWeD(UnVk!_RNPEE4RbZF1@W`@rWoV^iyHx2=9xu%RUHT3{h}h(L0$$AAVWMt4wZ)ZT)Y%%n-dNlthRa3aYToFMt%8p3hz z*Me^l#-7g;kL>z5m}zqk<+gQi?H0L^1nhGX(PMHcHxyN_>+X~*DbRmOIHEfZ$LtNr zbM4cpS$I*GY_y46{-m~TEq!5KWh)zr77t-Vs$y)##==X7A!{@2t6UJ=1xeZ65mKMEx&Zb*4Q*fH;e^>EZ=LY1P<5d5M zplW!!QcZd)rmEE-W@Jvp2~9fNo^1{e&2HWKl;7J0VwC5DoHrr)iWl*P-HlnkwwsY) zB4*6*d@P}ea^Wv9N+}K$C}W=#7YcQ7PKCThXluv_=u_e{%6bY)Xsap+Sk{&`Xq#53 ztltL)g_Yhj;Lt{(plt%mrl55)d=6)x53x>3XTx8iZA&s(xS`1!OV0x}Cp6doW{S)Z ztNH43Kqj9Nhf9W+2*UWNR^Xl#%Bf~@Qb!8kvGc(JyJR9VaC88NE&(2|Qa5c=&!8Y7D^=+?rfSCCJkYj0?3Zt;&rPIlnYCG>@c zmUxvR6e=gK{e~n*Am^;x>r&*GobWfGs2u#lhC@#1=NwyN=*ve$IB20Q!Cj-yS%$xK zY?-{cyK1(VQ+S%3wM{dpBz9frHq1mvJ2tws^HZ4mLz``u&1`!k)EzEdlM@MTLgAoo z_Y22Edz-g^M}+Ooa?6MINlS61%L~VO;fME7Tg*OPZ!54h+KWY(RQGg!su458)ke<= z@0r%d1iNw<;fUr21@oT)jNH#qsGdU>K(cG9!<WG0jR97X|+EYKUZzN z&mE{k&u&cP*Q|+Zy}XeIS3aEL{2OKcv?Nx3da9ZojwJC@U-0cvDLFaq|L&=KusDrK z!TOx3*-GQ;+oa&+Unx9U!TeN zn}m}p%GWQHE2XxWK1*EEwpp+%mz{#jjH?uukZm&hCAy%P7qOMHY@FOS%l5_`zNiw^ z-->H>_%$|ahLo_a4d%MxX{jgM!PKM&Lk}FB>4#(CzCw4~wAJfUK?&~{XmyX_cG>nt z@zD46pdRT!y%k`ojJr!OY-^vC*EVPD_6?bi;AaJAYVH|^eOC{H#@?)i^d|73%wD4# zF{%sPR#()@!^NPBa>3GO!0L&cb-LmIMY!jMaF-1KRf6~K@>eO|caXmZ zSZ`Qwu`zf*R;(|qSZplbM~U@^^${C~ z_v6F{z;+WGkN4xnN??7(>hOMoSSf6Gu?ct|EjAdohgc)tPZS#p>nGNP_mjlRVEx5f z@P4vb9JZ$zZeph~VhPw@VtKruA~piHx7bv?pDH#I#_O&Kcl{8ZCN>JTkJt>nj};pY z+gEHR-cJ`B1KUq*7T(Vg8w)EDn~nD~#m2$*7n_6kabn|P1I6az{VcIM*a2em@P4+~ z1X!uqe7v6{)(AULYysZKi#5Rx5?hG(bH!RnU7h4HCQmh+3|3qvR>?pAw_?#764I3%e6Q6TpYhXu< z^~UGC*jgArm{CN1@wr269qd@K{`fpaY&~q0*Z_R)6x#qhPOJox5gUomGsJqpP8H++>oT#Pu+zl254v2eH*BmJ_aj$`^@W`-#(lv|vHq|##CU(c zQfvT>ABHKCeex=?64*E~-mk6}D}|jUHUXb!i4BIGE!K$7*N6>;og>zS&)15T!N!a6 zcJ_0zIP6?8-d1LdC1B@?@%p|_Yy|9lFxyjL*Lm%fp(*mf$l_r--J)E)rXc z&v%GThfNlH5})rBn*nPPTZYefiOqzyiY>=yZetP6g0+dQz~{TgX2UXKEAjaru{p4I zu~qnduh?AJPsCQ^GtXZU&4Xpd*5LE6#OA|tVr%jFKCuO`yx2N?zF%x1tV3))KJ&6E zqD8PNVjJ-J*J6udonjmD`2n#du&H93@cBWprLbvYoAH^KD~=Gbi^aC!^Fw0GU_TZ6 z7N373wj4HHY%4xLEVcsnGci;|yiST}CF~NhZm>thR>3Y6>j8UIY&C3#SWnnvVryWR ziS>r@`YfWgu*=2z!X6h}2fIS7KkT<+>tQp+2Ed*W+W@;#tOUl}LJ@6*T_siudrE8* z>}s*Wu&2c~!)A#Mg*_v-1$K>C8H~51BKj6~tymoPtk_oA&&3k3--+=F=4`PMu;;|O z!LAb<3FB?Bhnw7sPtQ=7^1f{a&mu>_)M%Fy4NPs6Xr`v2n0J zhz)?!HC9zW2En*X3yzLj!VA!o5Xg#Aiv0gU%`^nbAX#1_K-DAoeIUu+TVeX(}fBC*A=KZ)gGzZP2p<9-7DAM63K zrLYggro$c-dlL3%u^F(%V#{D3ip_*QB(@yJeGK|P*l)yE!2TjO8}_i+O4wh;=D?PS zt%7|dHW&7Y*lHN}Pw4+(kBY5A?$In^)T++(Eq`H zE4Bgl53$9tC&V_w{wcNu_N3S**e7C3VNZ!|hH<}${tx!F*cRBQV#{F9hM>C)NY@rPylNa)+)*tqb*m~Fsu>r7uiEV)WL97JEeL4C+*o$JNuDeN7w39uewgJJKAHNtij8wz_*tO>T0SQ%`sSPN`tu{i9HV(qY=VhPy$ zVtLpuVk2OG5}OL^B{mYaPHZ}CSFusB55#7`dW(&Q{aI`#tXOOe>_f3xus&jAVe7?a z!*&xJ2m6cI99Unm@vy&&&4ukQRtNh?Y#wY6u?esZV)J4B#2R5Ai!Ffl7i)t3O>7}- zPq7x*-^CWe_7ZD{Z4_G!+gmIT`-j*P*Z{Gquz!jzh3z9Y9rlUXldyfoX23RyErabR zHWT)#*m78j*euv*Vk=<#i_M08F18XjP;3rtv)C%w0b+AuUx=-Sm5R-SeJQpEcA(gN z*jHj}VF!sVfNc?52OA`|5caj$de~sGMX+zgHo%66Er$I|Y$NPou_dr?#WukX5nBrT zPHZ!5sMwRR@5Q#j4i#Gl`?uJ)uwi1$VOzzv!iI~jfc-~|e_SgQTM7HGST|U?*eci$ zVm)9LVyj^!y+BV`rPvx+OsqF7F18j{B-R&JCAJQ>omhWZwb*)CH?aY*8nF$q?Zrx9 z39*f^?qa2|TCq*A9mEF14ino9>mfE2cDUFU*p6alun}V4!gdmi!;TQ!3foyM0XtHR ze>m(ZHUf5(SU1=%Vk2QA#d^SciH(9CE!GpZtJrARF=D-8y~W1Bjuq<*D;66I8zt5s z)<^QLju-(MQ!;Tj#f%O%ugPkB&3fo<50&KL{VAvjFjj$8NhQj)ZHNj32D}(hH zYk{3C7KiOA)(#sZmVoUgmWQ1pHUhS{*i_i5Vk2P##HPbe6B`BFM{EXctk`JSzG5?B zr;Ck&?I$)1c81tkSc%wd*qLJEVEc>BfsGRz4;v^p7j~9d9qa(Hd9bs^CcsL?=EKer zYlIyrwg5I>tO<6I*h1L3VlA*iVvAtsiM7K9i!FwoFP4W55nBSQ6PpS@Wuu8GDu!&*|U~#c^ut{PIVO3)5VNGI-VAWz9V9jESVKrhKVHb%l zfhEK?!6u6>h1H6Iq^BN#2>&t{E5=7U_ORh&vl+faD>vM^QR>h(+_N(!J-ogHcN-m= z%C=U=ho9j*RpDj~OHXabPpu=0`Jr3xmYr8G{4D)O2R7&ChHNI6nV2sbe8!NHF(;mS zGQJNSQA`b;jhI}WH@P}xa&@7}QF?0H&771?wU!)@dmM8mgQq5{htvg?pWU46NVSxl zneS+9&eTdrp4ZXB*i=ITy46MvS+hgH-Lt1K(8tgNeVZmS!e z$>qlROuHCS#V;{8M{^dlK)8llH9VUWj6e`qA*sqg)b42wMzSboNG+7ruKZ zn)_gdT#N6-LQ52H9}z^^JrVA1gykkut`;YqTD9(Nq}*Ec$d+KI%qO-ATMSbif|5Jw zQU6&?x!1vaX7muG?z~N@sP{l5_l!*DX3O1KgOIjMmuaZ)ASCwcGO-gE6cWX|cAbYB z_eEy!Ak%x8(|bx#)+6sV?t1j&@+c%Xr%yyM{LCp&WH&R4>|ti8S5@~zQom4=@oZ`-68h^2#zTZ$&7OKz_*vE6kg!)cfuC9Bje73@Ll3IT zRx-dEQl4QQh#K|@r@0S`hM#5S{bOHCj@*^Ri*Y|oknitsZZg;(86^=J?yYycr1vkF z;%=t{Ba%Y5QOTSiV98UTO~o~{L~&`CY3_6n>@v~WKMv|T4>j^K8)V7E^?3L3Vcuv4 zTQZcVU}eu8(p46w$7|r=P@ex_Y;d~=?@c(IdAp>nIl1TGy+?s}{-Ju@xl+#Ed+5?S zZ>Wa`na;DceSpJ4$WKG_rZ+q=-e8Q~f}2&Q<|xnDa=bi<8_(MEbSr|mJafwjips$B zXK(u=91p_oGq}7$ssiPEE-cUDa#nSa?u!|aLbqqMjtoG3ngTQX5AALd4EOKvC5brQu#Y*Q-g&qM4F%b#;%r9?P$412QXdti7QTA}?Q9s-VkSIRR zo)&u4j+grJ_ALFuIPP3eh)(4j;BzwbqwPt~!*JY(oM=z*o_rgIl#`-TEDyQy0y){9 zAAZ=4*WH+iH1By7-e6CO$k88f@hcQTtu?<8Dw7ZXW0vQ&m!}RJUb#K^h`1@ z$8!p%g%9Jr+Q-|o{au##m2(T{peLz7)_D2Rmfx9g}8%agSF$wP2>LW7Hv2hC;BEu-p+ef24 zA>8xvGRL<^?;ONCdh&K0N<)2o0G()03_q|e2fRsL=b=WPbW_)vopQ8m-iAcf$s6ZI z5vjqT4m>ZDyUIdsyp~$*dG0gRTvKbI4EI@T-eTMAdA37GCOXwQbnuSaZcp-`vF1(W zC-$7+@RBW%fF-~kQO=&?9f9~zmoJ!tdiXGfpI2;~nRRFj-g>9l^Yz12XGEHJnBq-h zYT+C-kPl|lBC>1;vx_5gtp_s{%i?C+MDaC720vrPQ@z#}LA`uV z@^d4`CoS^jZgvoIo-)>c2;^p6XXJ!`4&<)o`a&6K1a}KJ6w2w8O>9oV6x73O@5YEE z`I(R>bW?!@cR}A=Af;25%iKa4ZcA>_bNDFeZ7JN6TMHzh4nAc6!j|G}FFdpJBEu-p zJ?U+>gz#3wJ>%_NB%vwb9I%|t7yw4Iq8J_d| z)lhg1@p@hq8Fr`nYc;`H-n>*EPy>9p$1VMd;s;gdHNb6OY%nIk2ZD#RfDFgx{ALt- zmY%Eljg~1-+VJc@Yzertzr+Z657Wy&{YYdO<$2S5G&;e342YM-V``Sa!EC4>Sdoc)xzU_KldoU&dpYgoZb#CzZ zJa@(`3m4!Y3;3JP%Uz~nPRfw@O5sFz%kv($=h=I;a0%X0@bF2Z_|5;d6dK3-^;`CGZpXq~=i7xc zxPRfVh->UgN;kvX(mVFNaBsug(z{)zq50g+zE?1j_i=9B+OD!t8=n>a(Vpk`L_Ed! z3+K2s{V6(2wp6ZZUEv&e4nK&_a(g)LW&RwU#S4Mg$!rT82AD1BbrTLVO7jV>R%( z;rDt7!#eO<`*+~(rBY|?2A-9zM$8|>ftSO7EMezyd5-?q9>pjPT=fr@XlNnwjg#)3 z7jCO^-gD*L=$IaM$9mux-%F_!b;o?*h0FI;DzWeg53(=v9hQ+9?idif8u_kETOL2| z%~Rq#FeBnvjoe@J{g_c1&e#y#H}D;r1+!2aw}KeryBFekl;OqZ|~H@GF|}(ds%`qrUW;MZ}?P7^42P2OYp&yZ~Zi*!59;~ z2>AxC0y*xY;hRH^EO*Qaozt)E35G$BUfrLp8!OW(6N#_>NQ~stiscXXbp9YT-1r zm8Zsct{RE5ZSWS$_plmK_sc9V4Zfe%h==as;5zvJR!feIaly-c|LC~8aqyk5Mh))$ zBwPdE1sf4}Yv6lgjSP1T3|)Vjz&&Qr}D$f%6j+Ue`k;-{4W@yDwfc{RahjFyZBW82Q_FwPkCSfIoV0=QxL+b zQy@;(=5B#>o|bLIGhjPF3Vt0q-+ohH@vuqHM1k|qgSr%5esRi&bg z`u0*Iwt4%DQU zMyXO$M)jJM)0LW3&^?+|(leUG>0M2#=)am&(>{Hb7S_~IttJV&K$BX!N|i(zE!L!* z-qECjzS5+Uy6>(`JrSovG^wI-np9IplN!2SlLRf*q?T5zQd>r!X;Mym?V+@%wt^1V zq>?VwBu+ClsiK9NRMWGXV0+diL7!_4q=H`2q>{eUBu=G!DebAKqLVbKrWQ?V=o(ED^r$Aa z^nofk4t}jkIrZ9GnL5Uw9HdDl9id5_&eEicnl-7WOEsyX+cZhggPPRRbE@Dt_?9N+ z^qD3V)MJ1$7x79e)g(?wX;MXXnp9JVCN(rilLS4WNiDso3XX#xYEn+$Yf?e{D2H<< z%x9r>ixopxZU6q$Qff>19o-=r5X7)4w&Tp*|(bd?gZe zh$gi(QWYEr&(Wlu+BB)4%Qe9{k|uFlqDd9Kq6v;En$%Fy{z{u`6Vy+WS~^^j3LFO; zH7TbnG^wD4npD#3n#Ac#O{%E>z;Jsi%BtyTO=_q`lLXzYNi99E3XX$cXi`o)AD~PN z-vn zDq5>aHGQv14efrA(!$CF4bh~QPF4lS!3IsrX}TsAbgL$n^oS;LdQp=qTBk`heWgha z?L0_na~$7OG^wS8DmV_FtVubYuL-`xYEns8X%eUTnpDxFnpD%vn$*yGO%k+4lUnM5 zpO!+~Gme7;H7TcKG^wETG^wP#CULq+6SP^AYI;Qzv{@6hS(94Yd5F?x90yA@!S`-W zD(GZQDru4?ak^5ID!M}x{Jx<{4ZWdBf;MS_?ZN_nMpeE&1t4Rfo)ufUpYJxUv zQbqS^QccS=si8HRBxtiH*ftJP+Kl7iKuyrsX;MMsG^wN(P2zO9CRKE|Ce`$UCN=cF zCTO!JwY1C7aGNV}92~4kIUT17z7J|rNu8R+=|)Ye=pjweW?yiKplEhTsIke>uUu z45>2Y3`4Sp+-S(7hP-76kBQ{Hoc8nzZN82SHDrt-lMK1kkh=}}jUi7P@~$DD8Pa`w zZyvn8sgEH;45=~XEJJdJ+-%6BhP-Xa*M{ubU2pRULsEux7;>i}PaE>KA)gphw1eKB z{S7(Fka|NdHH1e<^j^*u^_U@lGUR(h_UPf&;;rSw3~4ar8bcm6M8@iJD|cG>k&)A5 zM}6w$hVVE{-pi?HvLQDb@{l2~8uBkg`tRgT$y*wS8*+gmml<-qA&(le%8-u?*=oq% zJL@eRVMv`Jml$%FAukxR-Vpi62;2rZ>te5-dV3Btb;ycA8p74 zLoPGqK||g!^YmU$3#$wnYe=ghR~hmvLtZpwqai(U&C`21?HO#yk%pXUNY0R(40+s; z_YC>cknW)$CfpVpGSZN94apgDy&?A+@{}Q~4cTZ&5w3!IFQ?7B8#36Cgdt-LX)t7( zAvYLupCQj0@}?ml8}fr8`{CND_j2a6#*otu$ry5jA@>{dtRZh2veA(L7}5vVPQ91A zMHw>6ka|NdHsnS_78~-iAs-p?gCTq^*Lyi_KGcw74dE-d-peUtBHD*oY<+?XdjMMsmz)ZSr1P| z9vigR;f1>_ueIK9gjYdmPW<6h+nljGy+!G}46Ew4N5SxLs#@HCctUf3_|ymwX3U$C zjG16mXAG0-)h7XC97rV^9v0OP@NlT^hww0{CMm<8`eDnkr+Q3A9@LQ^a#H>+Rd0}6 zd6HZGm&GliU~wtI(39c8Ou0?ehB4I}q=qf^s|o&g=1*UXTWY}b749&l`oz`YNef0p z^;(7_^@{o-^`A<0h9|WSKkAlrh8^`j@NlE<-@L-2HZP7T!;89QjA2Dxm*GU+zx826 zU3P~LbwBY_Se9W!-KaO{*uKH7$vu zVSKbGKQ^urKRIO%qiIXB4xedB^oGr}g+jw+Mu#nj2XEit*80O^T59lO<{m30qlUw@ z)T9oB*;RsldP*JEC9h^g)FQ)N+FD@Qjd?a3;Sp7tJGd0cwb}Cv?D*Jt5yriXWYq!XS zBw(MDh#r$mxuK|XU3aHkNrCQE!V%qRIA(8vKl((zxiy{XFpfe}!?tv`PGX^9AT5i! z>)x5GRkE_SURJs_9^0c}P#NaY-Wu~L5G*!hSVy;tY+4`A(GTduII00}P(G`Mrz_Ps z1G=fXVn$|o7&kSahlw%7C@&+FxoOtn7uA^MYr9)26bU9`#{AC55{f9tUuL~IQA%;3 zKpFd_xKOBrb1LL5Pg_GqK%WwqQPxvXLR(cqz_PZiLEE%KW&P9Cps+I>pR%%KcM3Lw zAQxMPZ34=spmj1id^XRASiRv4y-8b^WI&azLgGM;K~c zXt!_|kXnKB719`XFkFKSH>iVFOBTcBryBCj8UL$*OfBHZ{G>YqLudlZn(>AY^x~mm z15M)LyuzxC-xUso2keUQP>Xq*Zi(>nR9VaC`Iq7U!qt0d$#nevaHXL7pDelB7v$v{8lKK5ByoRO zI&0YfLcqT^D$B#4g3OLL44u6a49n`DpDDx6x#?lkhMV&;^kL?#&cn;u0?x2<_J|B8 z=Y^DE{QqLu=_M!>uXEYhQ+0GnKEaG-Nwk>(zxJCH$B^OB{8F zQ!{E*E;~8PkJE#H)6Fd5jjU#yjDCqOsL_kqN?A5eZUk80I+TYzK3Ley?FN`sD_{&k4t5cr&93`pzGeP_IkrZfmVOe3>zg@K=GL9{FnKtpIb& zQNq@#aR=<5H9GbB!;&d&aL+L8yLu2b_GTrdPl^v!_8Q%YQC;A+x}sK|H>{X4M?h~l GvHt`4AwSmu diff --git a/common/windows/delphi/ext/sentry/sentry.arm64.dll b/common/windows/delphi/ext/sentry/sentry.arm64.dll deleted file mode 100644 index 0cb5924244af1047e14ea716a27a7008499e6356..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146944 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 D**E%{ diff --git a/common/windows/delphi/ext/sentry/sentry.arm64.lib b/common/windows/delphi/ext/sentry/sentry.arm64.lib deleted file mode 100644 index 5c8616d5f594d36ca8d91fb0860df7e70858c432..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79954 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%0D4xJR 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 Jcv036{|}x_)}jCa diff --git a/windows/src/engine/keyman/build.sh b/windows/src/engine/keyman/build.sh index f1054c325d..c13effa338 100755 --- a/windows/src/engine/keyman/build.sh +++ b/windows/src/engine/keyman/build.sh @@ -46,7 +46,6 @@ function do_build() { # Also copy sentry files here cp "$KEYMAN_ROOT/common/windows/delphi/ext/sentry/sentry.dll" \ "$KEYMAN_ROOT/common/windows/delphi/ext/sentry/sentry.x64.dll" \ - "$KEYMAN_ROOT/common/windows/delphi/ext/sentry/sentry.arm64.dll" \ "$KEYMAN_ROOT/common/windows/delphi/ext/sentry/crashpad_handler.exe" \ "$KEYMAN_ROOT/windows/bin/engine/" } @@ -62,7 +61,6 @@ function do_publish() { # Also sign sentry files here wrap-signcode //d "Keyman Engine for Windows" "$WINDOWS_PROGRAM_ENGINE/sentry.dll" wrap-signcode //d "Keyman Engine for Windows" "$WINDOWS_PROGRAM_ENGINE/sentry.x64.dll" - wrap-signcode //d "Keyman Engine for Windows" "$WINDOWS_PROGRAM_ENGINE/sentry.arm64.dll" wrap-signcode //d "Keyman Engine for Windows" "$WINDOWS_PROGRAM_ENGINE/crashpad_handler.exe" wrap-symstore "$WINDOWS_PROGRAM_ENGINE/keyman.exe" //t keyman-engine-windows diff --git a/windows/src/engine/keymanhp/keymanhp.cpp b/windows/src/engine/keymanhp/keymanhp.cpp index 6b0fb183cb..5d5c2985b7 100644 --- a/windows/src/engine/keymanhp/keymanhp.cpp +++ b/windows/src/engine/keymanhp/keymanhp.cpp @@ -22,7 +22,9 @@ 25 Oct 2016 - mcdurdin - I5136 - Remove additional product references from Keyman Engine */ #include "keymanhp.h" // I5136 -#include "../../../../common/windows/cpp/include/keymansentry.h" +#if defined(_M_X64) + #include "../../../../common/windows/cpp/include/keymansentry.h" +#endif // Forward declarations of functions included in this code module @@ -283,7 +285,9 @@ BOOL Fail(HWND hwnd, PWSTR msg) if (WideCharToMultiByte(CP_UTF8, 0, outbuf, -1, buffer, (int) sz, NULL, NULL) != 0) { buffer[sz - 1] = 0; - keyman_sentry_report_message(KEYMAN_SENTRY_LEVEL_ERROR, buffer, true); + #if defined(_M_X64) + keyman_sentry_report_message(KEYMAN_SENTRY_LEVEL_ERROR, buffer, true); + #endif } free(buffer); diff --git a/windows/src/engine/keymanhp/keymanhp.vcxproj b/windows/src/engine/keymanhp/keymanhp.vcxproj index 51ce882690..e42d415885 100644 --- a/windows/src/engine/keymanhp/keymanhp.vcxproj +++ b/windows/src/engine/keymanhp/keymanhp.vcxproj @@ -175,7 +175,7 @@ true - ..\..\..\..\common\windows\delphi\ext\sentry\sentry.arm64.lib;keymanarm64.lib;libcmtd.lib;%(AdditionalDependencies) + keymanarm64.lib;libcmtd.lib;%(AdditionalDependencies) ..\..\..\lib;%(AdditionalLibraryDirectories) false true @@ -247,7 +247,7 @@ true - ..\..\..\..\common\windows\delphi\ext\sentry\sentry.arm64.lib;keymanarm64.lib;libcmt.lib;%(AdditionalDependencies) + keymanarm64.lib;libcmt.lib;%(AdditionalDependencies) ..\..\..\lib;%(AdditionalLibraryDirectories) false true @@ -268,11 +268,17 @@ - + + true + true + - + + true + true + From 33cdb0f54c83f73d905ee4304e5896abc67a507b Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Fri, 21 Nov 2025 11:58:49 +1000 Subject: [PATCH 30/59] feat(windows): fix manifest for each host --- windows/src/engine/keymanhp/build.sh | 6 ++++++ windows/src/engine/keymanhp/{manifest.in => manifesthp.in} | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) rename windows/src/engine/keymanhp/{manifest.in => manifesthp.in} (90%) diff --git a/windows/src/engine/keymanhp/build.sh b/windows/src/engine/keymanhp/build.sh index 156cdb5c3a..c72be7b7d0 100755 --- a/windows/src/engine/keymanhp/build.sh +++ b/windows/src/engine/keymanhp/build.sh @@ -38,19 +38,25 @@ function do_clean_arm64() { function do_build_x64() { create-windows-output-folders build_version.res + sed "s/Keyman Engine HP/Keyman Engine x64/g; + s/arch64/amd64/g" manifesthp.in > manifest.in build_manifest.res vs_msbuild keymanhp.vcxproj //t:Build "//p:Platform=x64" cp "$X64_TARGET" "$WINDOWS_PROGRAM_ENGINE" builder_if_release_build_level cp "$X64_TARGET_PATH/keymanhp.x64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" + rm manifest.in } function do_build_arm64() { create-windows-output-folders build_version.res + sed "s/Keyman Engine HP/Keyman Engine arm64/g; + s/arch64/arm64/g" manifesthp.in > manifest.in build_manifest.res vs_msbuild keymanhp.vcxproj //t:Build "//p:Platform=arm64" cp "$ARM64_TARGET" "$WINDOWS_PROGRAM_ENGINE" builder_if_release_build_level cp "$ARM64_TARGET_PATH/keymanhp.arm64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" + rm manifest.in } function do_publish_x64() { diff --git a/windows/src/engine/keymanhp/manifest.in b/windows/src/engine/keymanhp/manifesthp.in similarity index 90% rename from windows/src/engine/keymanhp/manifest.in rename to windows/src/engine/keymanhp/manifesthp.in index 6b58d64c7d..5fd0c12875 100644 --- a/windows/src/engine/keymanhp/manifest.in +++ b/windows/src/engine/keymanhp/manifesthp.in @@ -1,7 +1,7 @@ - - Keyman Engine x64 + + Keyman Engine HP From bc927bc4c32ef74bea36ced6b8fc32ebf37624aa Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Fri, 21 Nov 2025 14:49:57 +1000 Subject: [PATCH 31/59] feat(windows): fix version rc files to display correct fix the version.rc files to display the correct description and file name for keymanhp.*.exe fix version rc files to display correct Also fix up the Keymanengine arm64 version names. --- windows/src/engine/keyman32/keyman32.vcxproj | 2 +- windows/src/engine/keyman32/keymanarm64.rc | 2 +- windows/src/engine/keyman32/versionarm64.rc | 32 +++++++++++++++++++ windows/src/engine/keymanhp/build.sh | 4 +-- windows/src/engine/keymanhp/keymanarm64.rc | 6 ++++ windows/src/engine/keymanhp/keymanhp.cpp | 2 +- windows/src/engine/keymanhp/keymanhp.vcxproj | 11 ++++++- .../engine/keymanhp/keymanhp.vcxproj.filters | 5 ++- .../keymanhp/{keymanhp.rc => keymanx64.rc} | 2 +- windows/src/engine/keymanhp/versionarm64.rc | 32 +++++++++++++++++++ .../keymanhp/{version.rc => versionx64.rc} | 2 +- 11 files changed, 91 insertions(+), 9 deletions(-) create mode 100644 windows/src/engine/keyman32/versionarm64.rc create mode 100644 windows/src/engine/keymanhp/keymanarm64.rc rename windows/src/engine/keymanhp/{keymanhp.rc => keymanx64.rc} (84%) create mode 100644 windows/src/engine/keymanhp/versionarm64.rc rename windows/src/engine/keymanhp/{version.rc => versionx64.rc} (93%) diff --git a/windows/src/engine/keyman32/keyman32.vcxproj b/windows/src/engine/keyman32/keyman32.vcxproj index 11c7d42496..e437912316 100644 --- a/windows/src/engine/keyman32/keyman32.vcxproj +++ b/windows/src/engine/keyman32/keyman32.vcxproj @@ -157,7 +157,7 @@ $(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\ARM64\$(Configuration);$(VC_LibraryPath_ARM64);$(WindowsSDK_LibraryPath_ARM64) - $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\include;$(IncludePath) + $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\arm64\$(Configuration)\include;$(IncludePath) keymanarm64 diff --git a/windows/src/engine/keyman32/keymanarm64.rc b/windows/src/engine/keyman32/keymanarm64.rc index c4fe9ce92e..e143be7077 100644 --- a/windows/src/engine/keyman32/keymanarm64.rc +++ b/windows/src/engine/keyman32/keymanarm64.rc @@ -1 +1 @@ -#include "version64.rc" +#include "versionarm64.rc" diff --git a/windows/src/engine/keyman32/versionarm64.rc b/windows/src/engine/keyman32/versionarm64.rc new file mode 100644 index 0000000000..a2f3332e59 --- /dev/null +++ b/windows/src/engine/keyman32/versionarm64.rc @@ -0,0 +1,32 @@ +#include "../../../../common/windows/cpp/include/keymanversion.h" + +1 VERSIONINFO + FILEVERSION KV_FILEVERSION + PRODUCTVERSION KV_PRODUCTVERSION + FILEFLAGSMASK 0x3fL + FILEFLAGS 0x0L + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L + BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "0C0904E4" + BEGIN + VALUE "CompanyName", KV_COMPANY_NAME + VALUE "FileDescription", "Keyman Engine Processor Arm64\0" + VALUE "FileVersion", KV_VERSION_STRING + VALUE "InternalName", "KEYMANARM64\0" + VALUE "LegalCopyright", KV_LEGAL_COPYRIGHT + VALUE "LegalTrademarks", KV_LEGAL_TRADEMARKS + VALUE "OriginalFilename", "KEYMANARM64.DLL\0" + VALUE "ProductName", "Keyman Engine\0" + VALUE "ProductVersion", KV_VERSION_STRING + VALUE "Comments", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0xc09, 1252 + END + END diff --git a/windows/src/engine/keymanhp/build.sh b/windows/src/engine/keymanhp/build.sh index c72be7b7d0..89f3a2f163 100755 --- a/windows/src/engine/keymanhp/build.sh +++ b/windows/src/engine/keymanhp/build.sh @@ -37,7 +37,7 @@ function do_clean_arm64() { function do_build_x64() { create-windows-output-folders - build_version.res + run_in_vs_env rc versionx64.rc sed "s/Keyman Engine HP/Keyman Engine x64/g; s/arch64/amd64/g" manifesthp.in > manifest.in build_manifest.res @@ -49,7 +49,7 @@ function do_build_x64() { function do_build_arm64() { create-windows-output-folders - build_version.res + run_in_vs_env rc versionarm64.rc sed "s/Keyman Engine HP/Keyman Engine arm64/g; s/arch64/arm64/g" manifesthp.in > manifest.in build_manifest.res diff --git a/windows/src/engine/keymanhp/keymanarm64.rc b/windows/src/engine/keymanhp/keymanarm64.rc new file mode 100644 index 0000000000..343916115f --- /dev/null +++ b/windows/src/engine/keymanhp/keymanarm64.rc @@ -0,0 +1,6 @@ +// Microsoft Visual C++ generated resource script. +// +#include "versionarm64.rc" +#include "manifest.rc" +1 ICON "..\\..\\desktop\\branding\\keymandesktop90-64.ico" + diff --git a/windows/src/engine/keymanhp/keymanhp.cpp b/windows/src/engine/keymanhp/keymanhp.cpp index 5d5c2985b7..81d386c000 100644 --- a/windows/src/engine/keymanhp/keymanhp.cpp +++ b/windows/src/engine/keymanhp/keymanhp.cpp @@ -70,7 +70,7 @@ BOOL KeymanStarted = FALSE; #define ARCH_LOG_FILE ".keymanhp-x64" #elif defined(_M_ARM64) #define WINDOW_TITLE L"Keymanhp-arm64" - #define EXECUTABLE_TITLE L"Keyman Engine arm64" + #define EXECUTABLE_TITLE L"Keyman Engine Arm64" #define ARCH_LOG_FILE ".keymanhp-arm64" #else #error Unknown architecture diff --git a/windows/src/engine/keymanhp/keymanhp.vcxproj b/windows/src/engine/keymanhp/keymanhp.vcxproj index e42d415885..82fa901a96 100644 --- a/windows/src/engine/keymanhp/keymanhp.vcxproj +++ b/windows/src/engine/keymanhp/keymanhp.vcxproj @@ -283,7 +283,16 @@ - + + true + true + true + true + + + true + true + diff --git a/windows/src/engine/keymanhp/keymanhp.vcxproj.filters b/windows/src/engine/keymanhp/keymanhp.vcxproj.filters index 116cf084a4..7c736dcc17 100644 --- a/windows/src/engine/keymanhp/keymanhp.vcxproj.filters +++ b/windows/src/engine/keymanhp/keymanhp.vcxproj.filters @@ -34,7 +34,10 @@ - + + Resource Files + + Resource Files diff --git a/windows/src/engine/keymanhp/keymanhp.rc b/windows/src/engine/keymanhp/keymanx64.rc similarity index 84% rename from windows/src/engine/keymanhp/keymanhp.rc rename to windows/src/engine/keymanhp/keymanx64.rc index 124704538b..2912156cd3 100644 --- a/windows/src/engine/keymanhp/keymanhp.rc +++ b/windows/src/engine/keymanhp/keymanx64.rc @@ -1,6 +1,6 @@ // Microsoft Visual C++ generated resource script. // -#include "version.rc" +#include "versionx64.rc" #include "manifest.rc" 1 ICON "..\\..\\desktop\\branding\\keymandesktop90-64.ico" diff --git a/windows/src/engine/keymanhp/versionarm64.rc b/windows/src/engine/keymanhp/versionarm64.rc new file mode 100644 index 0000000000..42b56aee6e --- /dev/null +++ b/windows/src/engine/keymanhp/versionarm64.rc @@ -0,0 +1,32 @@ +#include "../../../../common/windows/cpp/include/keymanversion.h" + +1 VERSIONINFO + FILEVERSION KV_FILEVERSION + PRODUCTVERSION KV_PRODUCTVERSION + FILEFLAGSMASK 0x3fL + FILEFLAGS 0x0L + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L + BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "0C0904E4" + BEGIN + VALUE "CompanyName", KV_COMPANY_NAME + VALUE "FileDescription", "Keyman Engine Arm64\0" + VALUE "FileVersion", KV_VERSION_STRING + VALUE "InternalName", "KEYMANARM64\0" + VALUE "LegalCopyright", KV_LEGAL_COPYRIGHT + VALUE "LegalTrademarks", KV_LEGAL_TRADEMARKS + VALUE "OriginalFilename", "KEYMAN.HP.ARM64.EXE\0" + VALUE "ProductName", "Keyman Engine\0" + VALUE "ProductVersion", KV_VERSION_STRING + VALUE "Comments", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0xc09, 1252 + END + END diff --git a/windows/src/engine/keymanhp/version.rc b/windows/src/engine/keymanhp/versionx64.rc similarity index 93% rename from windows/src/engine/keymanhp/version.rc rename to windows/src/engine/keymanhp/versionx64.rc index 80133aa7f2..9baa88c50c 100644 --- a/windows/src/engine/keymanhp/version.rc +++ b/windows/src/engine/keymanhp/versionx64.rc @@ -19,7 +19,7 @@ VALUE "InternalName", "KEYMANX64\0" VALUE "LegalCopyright", KV_LEGAL_COPYRIGHT VALUE "LegalTrademarks", KV_LEGAL_TRADEMARKS - VALUE "OriginalFilename", "KEYMANX64.EXE\0" + VALUE "OriginalFilename", "KEYMAN.HP.64.EXE\0" VALUE "ProductName", "Keyman Engine\0" VALUE "ProductVersion", KV_VERSION_STRING VALUE "Comments", "\0" From 2d800b2008279d5a88d5bd4ccf485309a141b942 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Mon, 24 Nov 2025 16:26:06 +1000 Subject: [PATCH 32/59] feat(windows): address review comments Co-authored-by: Marc Durdin --- resources/build/meson/standard.meson.build | 2 +- windows/src/engine/keyman/UfrmKeyman7Main.pas | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/build/meson/standard.meson.build b/resources/build/meson/standard.meson.build index f93451b610..6345e67fb2 100644 --- a/resources/build/meson/standard.meson.build +++ b/resources/build/meson/standard.meson.build @@ -1,4 +1,4 @@ -#keymanx64 +# # Shared configuration for all meson-based builds # # This file has the master location /resources/build/meson/standard.meson.build, diff --git a/windows/src/engine/keyman/UfrmKeyman7Main.pas b/windows/src/engine/keyman/UfrmKeyman7Main.pas index a5f6e48be1..af812ea321 100644 --- a/windows/src/engine/keyman/UfrmKeyman7Main.pas +++ b/windows/src/engine/keyman/UfrmKeyman7Main.pas @@ -269,7 +269,7 @@ type procedure RecreateTaskbarIcons; function StartKeymanEngine: Boolean; procedure StartKeymanHPX64; - procedure StartKeymanHParm64; // TODO could combine this function + procedure StartKeymanHParm64; // TODO-WIN-ARM: could combine this function procedure OpenTextEditor; //function GetCachedKeymanID(hkl: DWORD): DWORD; procedure ShowLanguageSwitchForm; @@ -1327,7 +1327,7 @@ begin kmint.KeymanEngineControl.RestartEngine; // I1486 StartKeymanHPX64; - StartKeymanHPARM64 + StartKeymanHPARM64; end; From c4b6d06e4319f24f1f045ac6f26e7cd45a03ee7e Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Tue, 25 Nov 2025 12:42:15 +1000 Subject: [PATCH 33/59] feat(windows): combine start host 64 process functions also removed sentry references. Fixed the manifest references. --- windows/src/desktop/inst/keymandesktop.wxs | 3 - windows/src/engine/README.md | 10 +-- windows/src/engine/inst/components.wxs | 3 - windows/src/engine/keyman/UfrmKeyman7Main.pas | 62 ++++--------------- .../engine/keyman32/serialkeyeventserver.cpp | 2 +- windows/src/engine/keymanhp/build.sh | 10 +-- 6 files changed, 23 insertions(+), 67 deletions(-) diff --git a/windows/src/desktop/inst/keymandesktop.wxs b/windows/src/desktop/inst/keymandesktop.wxs index b6329253e4..27e0a02e4d 100644 --- a/windows/src/desktop/inst/keymandesktop.wxs +++ b/windows/src/desktop/inst/keymandesktop.wxs @@ -253,9 +253,6 @@ - - - diff --git a/windows/src/engine/README.md b/windows/src/engine/README.md index 5a4f1ab2b1..77498e4840 100644 --- a/windows/src/engine/README.md +++ b/windows/src/engine/README.md @@ -11,17 +11,17 @@ The installation merge module database for the Keyman Engine. Host application for the Keyman Engine. Shows the Keyman icon, Keyman menu, OSK, and handles language switching etc, as well as running the windows hooks to capture and translate keystrokes. -## keyman32 - keyman32.dll, keyman64.dll +## keyman32 - keyman32.dll | keyman64.dll | keymanarm64.dll -Main keyboard processing library and hook library (x86, x64). +Main keyboard processing library and hook library (x86, x64, arm64). ## keymanmc - keymanmc.dll Message library for Windows events. -## keymanx64 - keymanx64.exe +## keymanhp - keymanhp.x64.exe | keymanhp.arm64.exe -64-bit version of keyman.exe. All UI is in keyman.exe, so this is a thin wrapper around the keyman32 build. +64-bit versions of keyman.exe. All UI is in keyman.exe, so this is a thin wrapper around the keyman32 build. One is for x64 CPU architecture and the other Arm64 ## kmcomapi - kmcomapi.dll | kmcomapi.x64.dll @@ -31,7 +31,7 @@ This is the public COM API library, used by keyman.exe, kmshell.exe, and various A helper app to refresh Windows language settings, due to a bug in Windows; read ../kmrefresh/kmrefresh.cpp for details. -## kmtip - kmtip.dll | kmtip64.dll +## kmtip - kmtip.dll | kmtip64.dll | kmtiparm64.dll Implementation of a Text Service for the Text Services Framework (TSF). This implementation is named Keyman TIP. Architecturally it sits between the TSF Manager and Keyman.exe diff --git a/windows/src/engine/inst/components.wxs b/windows/src/engine/inst/components.wxs index be36d57743..e0ecc65d65 100644 --- a/windows/src/engine/inst/components.wxs +++ b/windows/src/engine/inst/components.wxs @@ -265,9 +265,6 @@ - - - diff --git a/windows/src/engine/keyman/UfrmKeyman7Main.pas b/windows/src/engine/keyman/UfrmKeyman7Main.pas index a5f6e48be1..d05ae354aa 100644 --- a/windows/src/engine/keyman/UfrmKeyman7Main.pas +++ b/windows/src/engine/keyman/UfrmKeyman7Main.pas @@ -268,8 +268,7 @@ type //procedure SnapToolHelp; procedure RecreateTaskbarIcons; function StartKeymanEngine: Boolean; - procedure StartKeymanHPX64; - procedure StartKeymanHParm64; // TODO could combine this function + procedure StartKeymanHostProcess(ProcessName: string); procedure OpenTextEditor; //function GetCachedKeymanID(hkl: DWORD): DWORD; procedure ShowLanguageSwitchForm; @@ -378,6 +377,10 @@ const skSelectHKLOnly = 3; // Select the requested Windows language and turn Keyman keyboard off skTSF = 4; // A TSF TIP +const + KM_HP_X64 = 'keymanhp.x64.exe'; + KM_HP_ARM64 = 'keymanhp.arm64.exe'; + implementation uses @@ -1326,8 +1329,8 @@ begin else kmint.KeymanEngineControl.RestartEngine; // I1486 - StartKeymanHPX64; - StartKeymanHPARM64 + if IsWow64 then StartKeymanHostProcess(KM_HP_X64); // I4374 + if IsNativeMachineArm64 then StartKeymanHostProcess(KM_HP_ARM64); end; @@ -1956,17 +1959,16 @@ begin FLangSwitchRefreshWatcher.Start; end; -procedure TfrmKeyman7Main.StartKeymanHPX64; +procedure TfrmKeyman7Main.StartKeymanHostProcess(ProcessName: string); var cmd, dir, params: string; sei: TShellExecuteInfoW; begin - if not IsWow64 then Exit; // I4374 try - // TODO: use TKeymanPaths to find keymanx64? - dir := ExtractFilePath(ParamStr(0)); - cmd := dir + 'keymanhp.x64.exe'; + dir := TKeymanPaths.KeymanEngineInstallDir; + cmd := TKeymanPaths.KeymanEngineInstallPath(ProcessName); + params := Format('%d %d', [GetCurrentProcessId, Application.Handle]); if not FileExists(cmd) then @@ -1990,47 +1992,7 @@ begin begin // We're going to handle any exceptions here but we'd like to know that // they happened - TKeymanSentryClient.ReportHandledException(E, 'Error starting keymanhp.x64', True); - end; - end; -end; - -procedure TfrmKeyman7Main.StartKeymanHPARM64; -var - cmd, dir, params: string; - sei: TShellExecuteInfoW; -begin - - if not IsNativeMachineArm64 then Exit; - - try - // TODO: use TKeymanPaths to find keymanx64? - dir := ExtractFilePath(ParamStr(0)); - cmd := dir + 'keymanhp.arm64.exe'; - params := Format('%d %d', [GetCurrentProcessId, Application.Handle]); - - if not FileExists(cmd) then - // We'll get notification of the issue but it won't - // crash the process - raise Exception.Create(cmd+' could not be found'); - - FillChar(sei, SizeOf(sei), 0); - sei.cbSize := SizeOf(sei); - sei.Wnd := Handle; - sei.lpVerb := 'open'; - sei.lpFile := PWideChar(cmd); - sei.lpParameters := PChar(params); - sei.lpDirectory := PWideChar(dir); - sei.nShow := SW_SHOW; - - if not ShellExecuteExW(@sei) then - RaiseLastOSError; - except - on E:Exception do - begin - // We're going to handle any exceptions here but we'd like to know that - // they happened - TKeymanSentryClient.ReportHandledException(E, 'Error starting keymanhp.x64', True); + TKeymanSentryClient.ReportHandledException(E, 'Error starting ' + ProcessName, True); end; end; end; diff --git a/windows/src/engine/keyman32/serialkeyeventserver.cpp b/windows/src/engine/keyman32/serialkeyeventserver.cpp index 13e78f3836..2d738a69ad 100644 --- a/windows/src/engine/keyman32/serialkeyeventserver.cpp +++ b/windows/src/engine/keyman32/serialkeyeventserver.cpp @@ -35,7 +35,7 @@ // // Server application functionality -// This runs only in the host applications keyman.exe and keymanx64.exe +// This runs only in the host applications keyman.exe, keymanhp.x64.exe and keymanhp.arm64.exe // // TODO: refactor this into the SerialKeyEventServer class and provide getters for them diff --git a/windows/src/engine/keymanhp/build.sh b/windows/src/engine/keymanhp/build.sh index 89f3a2f163..cd76151210 100755 --- a/windows/src/engine/keymanhp/build.sh +++ b/windows/src/engine/keymanhp/build.sh @@ -60,8 +60,8 @@ function do_build_arm64() { } function do_publish_x64() { - wrap-mt -nologo -inputresource:"$WINDOWS_PROGRAM_ENGINE/keyman.exe" -validate_manifest - wrap-mt -nologo -inputresource:"$WINDOWS_PROGRAM_ENGINE/keyman.exe" -out:temp.manifest + wrap-mt -nologo -inputresource:"$WINDOWS_PROGRAM_ENGINE/keymanhp.x64.exe" -validate_manifest + wrap-mt -nologo -inputresource:"$WINDOWS_PROGRAM_ENGINE/keymanhp.x64.exe" -out:temp.manifest grep -q 'uiAccess="true"' temp.manifest || builder_die 'uiAccess must be set to true in manifest.xml' rm -f temp.manifest @@ -71,8 +71,8 @@ function do_publish_x64() { } function do_publish_arm64() { - wrap-mt -nologo -inputresource:"$WINDOWS_PROGRAM_ENGINE/keyman.exe" -validate_manifest - wrap-mt -nologo -inputresource:"$WINDOWS_PROGRAM_ENGINE/keyman.exe" -out:temp.manifest + wrap-mt -nologo -inputresource:"$WINDOWS_PROGRAM_ENGINE/keymanhp.arm64.exe" -validate_manifest + wrap-mt -nologo -inputresource:"$WINDOWS_PROGRAM_ENGINE/keymanhp.arm64.exe" -out:temp.manifest grep -q 'uiAccess="true"' temp.manifest || builder_die 'uiAccess must be set to true in manifest.xml' rm -f temp.manifest @@ -82,7 +82,7 @@ function do_publish_arm64() { } function do_install_x64() { - cp "$WINDOWS_PROGRAM_ENGINE/keymanhp.x64.exe" "$INSTALLPATH_KEYMANENGINE/keymanx64.exe" + cp "$WINDOWS_PROGRAM_ENGINE/keymanhp.x64.exe" "$INSTALLPATH_KEYMANENGINE/keymanhp.x64.exe" } function do_install_arm64() { From 4c4b0be45629d7143a01fa9f47f27f947534cea6 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Tue, 25 Nov 2025 16:01:52 +1000 Subject: [PATCH 34/59] feat(windows): audit _WIN64 macro --- windows/src/engine/keyman/icons.res | Bin 0 -> 304020 bytes .../src/engine/keyman32/DebugEventTrace.cpp | 21 +++-- windows/src/engine/keyman32/glossary.cpp | 2 +- windows/src/engine/keyman32/keyman32.cpp | 2 +- windows/src/engine/kmtip/debug.cpp | 8 +- windows/src/engine/mcompile/mcompile.sln | 9 +- windows/src/engine/mcompile/mcompile.vcxproj | 86 +----------------- windows/src/engine/testhost/testhost.cpp | 18 ++-- 8 files changed, 39 insertions(+), 107 deletions(-) create mode 100644 windows/src/engine/keyman/icons.res diff --git a/windows/src/engine/keyman/icons.res b/windows/src/engine/keyman/icons.res new file mode 100644 index 0000000000000000000000000000000000000000..6ff2762706353cc39c998d9ba744a7efedc7bfd3 GIT binary patch literal 304020 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 literal 0 HcmV?d00001 diff --git a/windows/src/engine/keyman32/DebugEventTrace.cpp b/windows/src/engine/keyman32/DebugEventTrace.cpp index 43089de363..97bd0bee23 100644 --- a/windows/src/engine/keyman32/DebugEventTrace.cpp +++ b/windows/src/engine/keyman32/DebugEventTrace.cpp @@ -2,12 +2,15 @@ #include "pch.h" #include "keyman-debug-etw.h" -#ifdef _WIN64 -#define DEBUG_PLATFORM_STRING "x64" -#define DEBUG_PLATFORM_STRINGW L"x64" +#if defined(_M_ARM64) + #define DEBUG_PLATFORM_STRING "arm64" + #define DEBUG_PLATFORM_STRINGW L"arm64" +#elif defined(_M_X64) + #define DEBUG_PLATFORM_STRING "x64" + #define DEBUG_PLATFORM_STRINGW L"x64" #else -#define DEBUG_PLATFORM_STRING "x86" -#define DEBUG_PLATFORM_STRINGW L"x86" + #define DEBUG_PLATFORM_STRING "x86" + #define DEBUG_PLATFORM_STRINGW L"x86" #endif #define TAB L"\t" @@ -113,10 +116,12 @@ extern "C" void _declspec(dllexport) WINAPI Keyman_WriteDebugEvent2W(PWCHAR file #define MAX_DESCRIPTORS 12 EVENT_DATA_DESCRIPTOR Descriptors[MAX_DESCRIPTORS]; -#ifdef _WIN64 - DWORD platform = 2; +#if defined(_M_ARM64) + DWORD platform = 3; +#elif defined(_M_X64) + DWORD platform = 2; #else - DWORD platform = 1; + DWORD platform = 1; #endif diff --git a/windows/src/engine/keyman32/glossary.cpp b/windows/src/engine/keyman32/glossary.cpp index 4561aa2671..9d21b81847 100644 --- a/windows/src/engine/keyman32/glossary.cpp +++ b/windows/src/engine/keyman32/glossary.cpp @@ -48,7 +48,7 @@ BOOL HKLIsIME(HKL hkl) // I1498 - fix keyboard switching for shadow keyboards o HKL ForceKeymanIDToHKL(DWORD KeymanID) // I3191 // I3526 { #ifdef _WIN64 - return (HKL) (LONG_PTR) (INT64) (LONG) KeymanID; // Sign extension for x64 + return (HKL) (LONG_PTR) (INT64) (LONG) KeymanID; // Sign extension for 64-bit #else return (HKL) (DWORD_PTR) KeymanID; #endif diff --git a/windows/src/engine/keyman32/keyman32.cpp b/windows/src/engine/keyman32/keyman32.cpp index 505de20175..1992cd5a19 100644 --- a/windows/src/engine/keyman32/keyman32.cpp +++ b/windows/src/engine/keyman32/keyman32.cpp @@ -595,7 +595,7 @@ void HandleRefresh(int code, LONG tag) if (UpdateRefreshTag(tag)) { #ifdef _WIN64 if (Globals::get_InitialisingThread() == GetCurrentThreadId()) { - // If this is the keymanx64 thread, then we should + // If this is the keyman.x64 or keymanarm64 thread, then we should // go ahead and process the refresh immediately so // that global settings are updated RefreshKeyboards(FALSE); diff --git a/windows/src/engine/kmtip/debug.cpp b/windows/src/engine/kmtip/debug.cpp index 764a424898..5493c344e3 100644 --- a/windows/src/engine/kmtip/debug.cpp +++ b/windows/src/engine/kmtip/debug.cpp @@ -49,10 +49,12 @@ #include #include -#ifdef _WIN64 -#define DEBUG_PLATFORM_STRING "x64" +#if defined(_M_ARM64) + #define DEBUG_PLATFORM_STRING "arm64" +#elif defined(_M_X64) + #define DEBUG_PLATFORM_STRING "x64" #else -#define DEBUG_PLATFORM_STRING "x86" + #define DEBUG_PLATFORM_STRING "x86" #endif diff --git a/windows/src/engine/mcompile/mcompile.sln b/windows/src/engine/mcompile/mcompile.sln index 6901b5f8bd..dfac876631 100644 --- a/windows/src/engine/mcompile/mcompile.sln +++ b/windows/src/engine/mcompile/mcompile.sln @@ -1,6 +1,8 @@  -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.14.36705.20 d17.14 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mcompile", "mcompile.vcxproj", "{5C22DDDA-CEAD-45F1-96B0-1473111156AA}" EndProject Global @@ -17,4 +19,7 @@ Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {1C01096C-D29F-482E-BA98-C687726209A4} + EndGlobalSection EndGlobal diff --git a/windows/src/engine/mcompile/mcompile.vcxproj b/windows/src/engine/mcompile/mcompile.vcxproj index 863394cd52..80b0ebbf07 100644 --- a/windows/src/engine/mcompile/mcompile.vcxproj +++ b/windows/src/engine/mcompile/mcompile.vcxproj @@ -1,18 +1,10 @@  - - Debug - ARM64 - Debug Win32 - - Release - ARM64 - Release Win32 @@ -32,12 +24,6 @@ Unicode v143 - - Application - true - Unicode - v143 - Application false @@ -45,28 +31,15 @@ Unicode v143 - - Application - false - true - Unicode - v143 - - - - - - - true @@ -75,25 +48,12 @@ *.cdf;*.cache;*.obj;*.ilk;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.metagen;*.bi $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - true - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - false - *.cdf;*.cache;*.obj;*.ilk;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.metagen;*.bi - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - false $(ProjectDir)bin\$(Platform)\$(Configuration)\ false $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - false - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - false - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - Use @@ -111,23 +71,6 @@ sentry.dll - - - Use - Level3 - Disabled - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreadedDebug - ..\..\..\..\common\windows\delphi\ext\sentry;..\..\global\inc - pch.h - - - Console - true - ..\..\..\..\common\windows\delphi\ext\sentry\sentry.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - sentry.dll - - Level3 @@ -149,27 +92,6 @@ sentry.dll - - - Level3 - Use - MaxSpeed - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreaded - ..\..\..\..\common\windows\delphi\ext\sentry;..\..\global\inc - pch.h - - - Console - true - true - true - ..\..\..\..\common\windows\delphi\ext\sentry\sentry.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - sentry.dll - - @@ -184,9 +106,7 @@ NotUsing - NotUsing NotUsing - NotUsing @@ -197,13 +117,9 @@ Create - Create Create - Create pch.h - pch.h pch.h - pch.h @@ -215,4 +131,4 @@ - + \ No newline at end of file diff --git a/windows/src/engine/testhost/testhost.cpp b/windows/src/engine/testhost/testhost.cpp index ab037b7be1..d8250c055c 100644 --- a/windows/src/engine/testhost/testhost.cpp +++ b/windows/src/engine/testhost/testhost.cpp @@ -306,14 +306,18 @@ Fail(PCWSTR message) { MessageBox(0, buf.c_str(), L"Error starting Keyman", MB_OK | MB_ICONERROR); } -#ifdef _WIN64 -#define KEYMAN32 "keyman64.dll" -#define KEYMAN32_DEBUG "keyman32" / "bin" / "x64" / "Debug" / "keyman64.dll" -#define KEYMAN32_RELEASE "keyman32" / "bin" / "x64" / "Release" / "keyman64.dll" +#if defined(_M_ARM64) + #define KEYMAN32 "keymanarm64.dll" + #define KEYMAN32_DEBUG "keyman32" / "bin" / "arm64" / "Debug" / "keymanarm64.dll" + #define KEYMAN32_RELEASE "keyman32" / "bin" / "arm64" / "Release" / "keyman64.dll" +#elif defined(_M_X64) + #define KEYMAN32 "keyman64.dll" + #define KEYMAN32_DEBUG "keyman32" / "bin" / "x64" / "Debug" / "keyman64.dll" + #define KEYMAN32_RELEASE "keyman32" / "bin" / "x64" / "Release" / "keyman64.dll" #else -#define KEYMAN32 "keyman32.dll" -#define KEYMAN32_DEBUG "keyman32" / "bin" / "Win32" / "Debug" / "keyman32.dll" -#define KEYMAN32_RELEASE "keyman32" / "bin" / "Win32" / "Release" / "keyman32.dll" + #define KEYMAN32 "keyman32.dll" + #define KEYMAN32_DEBUG "keyman32" / "bin" / "Win32" / "Debug" / "keyman32.dll" + #define KEYMAN32_RELEASE "keyman32" / "bin" / "Win32" / "Release" / "keyman32.dll" #endif bool From 928120b23281bc82b32e15ddb3c8cad1f9b9f7bb Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Wed, 26 Nov 2025 11:35:33 +1000 Subject: [PATCH 35/59] feat(windows): add keyman x64 and arm icon Fixes: 15228 Test-bot: skip --- .../desktop/branding/keymandesktop90-arm.ico | Bin 0 -> 288142 bytes .../desktop/branding/keymandesktop90-x64.ico | Bin 0 -> 287934 bytes windows/src/engine/keymanhp/keymanarm64.rc | 2 +- windows/src/engine/keymanhp/keymanx64.rc | 2 +- 4 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 windows/src/desktop/branding/keymandesktop90-arm.ico create mode 100644 windows/src/desktop/branding/keymandesktop90-x64.ico diff --git a/windows/src/desktop/branding/keymandesktop90-arm.ico b/windows/src/desktop/branding/keymandesktop90-arm.ico new file mode 100644 index 0000000000000000000000000000000000000000..f43ba466f0f58c0afe625bc49971cefb6b9b2168 GIT binary patch literal 288142 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 literal 0 HcmV?d00001 diff --git a/windows/src/desktop/branding/keymandesktop90-x64.ico b/windows/src/desktop/branding/keymandesktop90-x64.ico new file mode 100644 index 0000000000000000000000000000000000000000..738084a5bc14c3ef28ec5d43e79d58c61aca21fd GIT binary patch literal 287934 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⩔oNCDn7?Mb{zDBPTpJLLe_f={U3SAwkafV*P& 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 Date: Wed, 26 Nov 2025 15:49:19 +1000 Subject: [PATCH 36/59] feat(windows): remove keymandesktop90-64-ico file --- .../desktop/branding/keymandesktop90-64.ico | Bin 287934 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 windows/src/desktop/branding/keymandesktop90-64.ico diff --git a/windows/src/desktop/branding/keymandesktop90-64.ico b/windows/src/desktop/branding/keymandesktop90-64.ico deleted file mode 100644 index 8e403bfaae9557b1cd8f21d0ca8caf744f577d82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 287934 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 Yx7pg~OYdyY@A9_--wJ#y@J@k$0PSIpJOBUy From 9e7fe64f67b99bfd549d67e2e250067830205bb2 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Wed, 26 Nov 2025 21:38:35 +1000 Subject: [PATCH 37/59] feat(windows): apply review suggestions Co-authored-by: Marc Durdin --- windows/src/engine/README.md | 4 +++- windows/src/engine/keymanhp/versionx64.rc | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/windows/src/engine/README.md b/windows/src/engine/README.md index 77498e4840..745131b5c4 100644 --- a/windows/src/engine/README.md +++ b/windows/src/engine/README.md @@ -21,7 +21,9 @@ Message library for Windows events. ## keymanhp - keymanhp.x64.exe | keymanhp.arm64.exe -64-bit versions of keyman.exe. All UI is in keyman.exe, so this is a thin wrapper around the keyman32 build. One is for x64 CPU architecture and the other Arm64 +64-bit versions of keyman.exe. All UI is in keyman.exe, so this is a thin wrapper around the keyman32 build. One is for x64 CPU architecture and the other Arm64. + +In v18.0 and earlier, this was called keymanx64.exe. ## kmcomapi - kmcomapi.dll | kmcomapi.x64.dll diff --git a/windows/src/engine/keymanhp/versionx64.rc b/windows/src/engine/keymanhp/versionx64.rc index 9baa88c50c..2c159ea87a 100644 --- a/windows/src/engine/keymanhp/versionx64.rc +++ b/windows/src/engine/keymanhp/versionx64.rc @@ -16,10 +16,10 @@ VALUE "CompanyName", KV_COMPANY_NAME VALUE "FileDescription", "Keyman Engine x64\0" VALUE "FileVersion", KV_VERSION_STRING - VALUE "InternalName", "KEYMANX64\0" + VALUE "InternalName", "KEYMANHP.X64\0" VALUE "LegalCopyright", KV_LEGAL_COPYRIGHT VALUE "LegalTrademarks", KV_LEGAL_TRADEMARKS - VALUE "OriginalFilename", "KEYMAN.HP.64.EXE\0" + VALUE "OriginalFilename", "KEYMANHP.X64.EXE\0" VALUE "ProductName", "Keyman Engine\0" VALUE "ProductVersion", KV_VERSION_STRING VALUE "Comments", "\0" From 25e5aff4ccaf4bd50002bb6b1ca1facf298d36c2 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Wed, 26 Nov 2025 22:05:13 +1000 Subject: [PATCH 38/59] feat(windows): update etl2log and Readme --- windows/src/engine/README.md | 3 +++ windows/src/support/etl2log/load.cpp | 1 + 2 files changed, 4 insertions(+) diff --git a/windows/src/engine/README.md b/windows/src/engine/README.md index 745131b5c4..7e5787e43f 100644 --- a/windows/src/engine/README.md +++ b/windows/src/engine/README.md @@ -38,6 +38,9 @@ A helper app to refresh Windows language settings, due to a bug in Windows; read Implementation of a Text Service for the Text Services Framework (TSF). This implementation is named Keyman TIP. Architecturally it sits between the TSF Manager and Keyman.exe +kmtiparm64.dll is built as an Arm64X, file it supports both x64 and arm64 on a +Windows on Arm machine. kmtip64.dll is therefore only used only on Windows x64 Machines. + ## mcompile - mcompile.exe A tool to recompile keyboard layouts after install to map to various European Latin script keyboard layouts diff --git a/windows/src/support/etl2log/load.cpp b/windows/src/support/etl2log/load.cpp index 8e8dc8db53..ccbd02224c 100644 --- a/windows/src/support/etl2log/load.cpp +++ b/windows/src/support/etl2log/load.cpp @@ -203,6 +203,7 @@ void PrintPlatform(int platform) { switch (platform) { case 1: fwprintf(fp, L"\tx86"); break; case 2: fwprintf(fp, L"\tx64"); break; + case 3: fwprintf(fp, L"\tarm64"); break; default: fwprintf(fp, L"\t%d", platform); break; } } From dba3836f2e19c5af0281079e4786e570c3b00054 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Wed, 26 Nov 2025 22:10:33 +1000 Subject: [PATCH 39/59] feat(windows): apply review comments Co-authored-by: Marc Durdin --- windows/src/engine/keymanhp/versionarm64.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/windows/src/engine/keymanhp/versionarm64.rc b/windows/src/engine/keymanhp/versionarm64.rc index 42b56aee6e..b65463f9e5 100644 --- a/windows/src/engine/keymanhp/versionarm64.rc +++ b/windows/src/engine/keymanhp/versionarm64.rc @@ -16,10 +16,10 @@ VALUE "CompanyName", KV_COMPANY_NAME VALUE "FileDescription", "Keyman Engine Arm64\0" VALUE "FileVersion", KV_VERSION_STRING - VALUE "InternalName", "KEYMANARM64\0" + VALUE "InternalName", "KEYMANHP.ARM64\0" VALUE "LegalCopyright", KV_LEGAL_COPYRIGHT VALUE "LegalTrademarks", KV_LEGAL_TRADEMARKS - VALUE "OriginalFilename", "KEYMAN.HP.ARM64.EXE\0" + VALUE "OriginalFilename", "KEYMANHP.ARM64.EXE\0" VALUE "ProductName", "Keyman Engine\0" VALUE "ProductVersion", KV_VERSION_STRING VALUE "Comments", "\0" From d83bd805858e714a6d81d4ad38a5683841da7711 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Thu, 27 Nov 2025 11:26:35 +1000 Subject: [PATCH 40/59] feat(windows): tidy up --- windows/src/.gitignore | 2 ++ windows/src/engine/engine.sln | 10 +++++++--- windows/src/engine/inst/build.sh | 18 ------------------ windows/src/engine/inst/components.wxs | 3 ++- windows/src/engine/inst/keymanengine.wxs | 18 ++++++++---------- windows/src/engine/testhost/build.sh | 4 ++-- 6 files changed, 21 insertions(+), 34 deletions(-) diff --git a/windows/src/.gitignore b/windows/src/.gitignore index 5702b35948..6b0e59d699 100644 --- a/windows/src/.gitignore +++ b/windows/src/.gitignore @@ -8,10 +8,12 @@ **/obj/Win64/ **/obj/x64/ **/obj/arm64/ +**/obj/ARM64EC/ **/bin/Win32/ **/bin/Win64/ **/bin/x64/ **/bin/arm64/ +**/bin/ARM64EC/ # Temporary build files for VC++ **/*.FileListAbsolute.txt diff --git a/windows/src/engine/engine.sln b/windows/src/engine/engine.sln index 5e4fc53ed8..9069e56e35 100644 --- a/windows/src/engine/engine.sln +++ b/windows/src/engine/engine.sln @@ -74,12 +74,16 @@ Global {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Release|x64.ActiveCfg = Release|x64 {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Release|x64.Build.0 = Release|x64 {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Debug|ARM64.ActiveCfg = Debug|Win32 - {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC + {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Debug|ARM64.Build.0 = Debug|Win32 + {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Debug|ARM64EC.ActiveCfg = Debug|Win32 + {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Debug|ARM64EC.Build.0 = Debug|Win32 {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Debug|Win32.ActiveCfg = Debug|Win32 {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Debug|Win32.Build.0 = Debug|Win32 {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Debug|x64.ActiveCfg = Debug|Win32 - {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Release|ARM64.ActiveCfg = Release|ARM64 - {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Release|ARM64EC.ActiveCfg = Release|ARM64EC + {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Release|ARM64.ActiveCfg = Release|Win32 + {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Release|ARM64.Build.0 = Release|Win32 + {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Release|ARM64EC.ActiveCfg = Release|Win32 + {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Release|ARM64EC.Build.0 = Release|Win32 {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Release|Win32.ActiveCfg = Release|Win32 {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Release|Win32.Build.0 = Release|Win32 {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Release|x64.ActiveCfg = Release|Win32 diff --git a/windows/src/engine/inst/build.sh b/windows/src/engine/inst/build.sh index 3007484bf7..3f98ed7688 100755 --- a/windows/src/engine/inst/build.sh +++ b/windows/src/engine/inst/build.sh @@ -39,28 +39,10 @@ function do_publish() { # warning 1072 relates to Error table defined by WixUtilExtension. Doesn't really affect us. "$WIXLIGHT" \ -sw1072 \ - -sice:ICE03 \ - -sice:ICEM10 \ -ext WixUtilExtension \ "$WIXLIGHTCOMPRESSION" \ keymanengine.wixobj components.wixobj \ -o keymanengine.msm - #wix build keymanengine.wxs components.wxs \ - #-ext WixToolset.Util.wixext \ - #-d KEYMAN_VERSION=$KEYMAN_VERSION_WIN \ - #-d RELEASE=$KEYMAN_VERSION_RELEASE \ - #-sw1072 \ - #-out keymanengine.msm - - echo $KEYMAN_VERSION_RELEASE - echo $KEYMAN_VERSION_WIN - echo $KEYMAN_VERSION - #echo $RELEASE - #wix build -d KEYMAN_VERSION=$KEYMAN_VERSION_WIN -d RELEASE=$KEYMAN_VERSION_RELEASE keymanengine.wxs components.wxs -ext WixToolset.Util.wixext -sw1072 -out keymanengine.msm - - - - # # Sign the installation archive diff --git a/windows/src/engine/inst/components.wxs b/windows/src/engine/inst/components.wxs index 459eaa11ac..00fca48b48 100644 --- a/windows/src/engine/inst/components.wxs +++ b/windows/src/engine/inst/components.wxs @@ -236,14 +236,15 @@ + WIX_NATIVE_MACHINE = "34404" - + WIX_NATIVE_MACHINE = "43620" diff --git a/windows/src/engine/inst/keymanengine.wxs b/windows/src/engine/inst/keymanengine.wxs index 0536cecc76..d68f3a3a72 100644 --- a/windows/src/engine/inst/keymanengine.wxs +++ b/windows/src/engine/inst/keymanengine.wxs @@ -8,16 +8,6 @@ - - - - - - - - - - @@ -93,7 +83,15 @@ + + + + + + + + diff --git a/windows/src/engine/testhost/build.sh b/windows/src/engine/testhost/build.sh index 157e71b8b9..c83e7e0300 100755 --- a/windows/src/engine/testhost/build.sh +++ b/windows/src/engine/testhost/build.sh @@ -15,7 +15,7 @@ builder_parse "$@" source "$KEYMAN_ROOT/resources/build/win/environment.inc.sh" WIN32_TARGET="$WIN32_TARGET_PATH/testhost.exe" X64_TARGET="$X64_TARGET_PATH/testhost.exe" -#ARM64_TARGET="$ARM64_TARGET_PATH/testhost.exe" +ARM64_TARGET="$ARM64_TARGET_PATH/testhost.exe" builder_describe_outputs \ configure:project /resources/build/win/delphi_environment_generated.inc.sh \ @@ -32,7 +32,7 @@ function do_build() { create-windows-output-folders vs_msbuild testhost.vcxproj //t:Build "//p:Platform=Win32" vs_msbuild testhost.vcxproj //t:Build "//p:Platform=x64" -# vs_msbuild testhost.vcxproj //t:Build "//p:Platform=arm64" + vs_msbuild testhost.vcxproj //t:Build "//p:Platform=arm64" # Note, we don't copy this to bin } From 6aff22e25931be7a401444e4d9542eb4b67da1b2 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Mon, 1 Dec 2025 17:03:28 +1000 Subject: [PATCH 41/59] feat(windows): update engine solution Update engine.sln and the keyman32, keymanhp, kmtip projects for include and exclude ARM64EC as required. --- windows/src/engine/engine.sln | 12 +- windows/src/engine/keyman32/keyman32.vcxproj | 179 +----------------- windows/src/engine/keymanhp/keymanhp.sln | 12 +- windows/src/engine/keymanhp/keymanhp.vcxproj | 129 +------------ .../src/engine/kmrefresh/kmrefresh.vcxproj | 67 +------ windows/src/engine/kmtip/kmtip.sln | 8 + 6 files changed, 29 insertions(+), 378 deletions(-) diff --git a/windows/src/engine/engine.sln b/windows/src/engine/engine.sln index 9069e56e35..bd032a06be 100644 --- a/windows/src/engine/engine.sln +++ b/windows/src/engine/engine.sln @@ -33,27 +33,27 @@ Global GlobalSection(ProjectConfigurationPlatforms) = postSolution {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Debug|ARM64.ActiveCfg = Debug|ARM64 {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Debug|ARM64.Build.0 = Debug|ARM64 - {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC + {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Debug|ARM64EC.ActiveCfg = Debug|x64 {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Debug|Win32.ActiveCfg = Debug|Win32 {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Debug|Win32.Build.0 = Debug|Win32 {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Debug|x64.ActiveCfg = Debug|x64 {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Debug|x64.Build.0 = Debug|x64 {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Release|ARM64.ActiveCfg = Release|ARM64 {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Release|ARM64.Build.0 = Release|ARM64 - {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Release|ARM64EC.ActiveCfg = Release|ARM64EC + {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Release|ARM64EC.ActiveCfg = Release|x64 {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Release|Win32.ActiveCfg = Release|Win32 {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Release|Win32.Build.0 = Release|Win32 {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Release|x64.ActiveCfg = Release|x64 {BD5564FB-35A5-4A3C-B96A-4A6578E2B593}.Release|x64.Build.0 = Release|x64 {A34650EA-D6E8-4229-8091-6BF1443565B5}.Debug|ARM64.ActiveCfg = Debug|ARM64 {A34650EA-D6E8-4229-8091-6BF1443565B5}.Debug|ARM64.Build.0 = Debug|ARM64 - {A34650EA-D6E8-4229-8091-6BF1443565B5}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC + {A34650EA-D6E8-4229-8091-6BF1443565B5}.Debug|ARM64EC.ActiveCfg = Debug|x64 {A34650EA-D6E8-4229-8091-6BF1443565B5}.Debug|Win32.ActiveCfg = Debug|x64 {A34650EA-D6E8-4229-8091-6BF1443565B5}.Debug|x64.ActiveCfg = Debug|x64 {A34650EA-D6E8-4229-8091-6BF1443565B5}.Debug|x64.Build.0 = Debug|x64 {A34650EA-D6E8-4229-8091-6BF1443565B5}.Release|ARM64.ActiveCfg = Release|ARM64 {A34650EA-D6E8-4229-8091-6BF1443565B5}.Release|ARM64.Build.0 = Release|ARM64 - {A34650EA-D6E8-4229-8091-6BF1443565B5}.Release|ARM64EC.ActiveCfg = Release|ARM64EC + {A34650EA-D6E8-4229-8091-6BF1443565B5}.Release|ARM64EC.ActiveCfg = Release|x64 {A34650EA-D6E8-4229-8091-6BF1443565B5}.Release|Win32.ActiveCfg = Release|x64 {A34650EA-D6E8-4229-8091-6BF1443565B5}.Release|x64.ActiveCfg = Release|x64 {A34650EA-D6E8-4229-8091-6BF1443565B5}.Release|x64.Build.0 = Release|x64 @@ -89,14 +89,14 @@ Global {5C22DDDA-CEAD-45F1-96B0-1473111156AA}.Release|x64.ActiveCfg = Release|Win32 {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Debug|ARM64.ActiveCfg = Debug|ARM64 {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Debug|ARM64.Build.0 = Debug|ARM64 - {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC + {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Debug|ARM64EC.ActiveCfg = Debug|x64 {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Debug|Win32.ActiveCfg = Debug|Win32 {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Debug|Win32.Build.0 = Debug|Win32 {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Debug|x64.ActiveCfg = Debug|x64 {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Debug|x64.Build.0 = Debug|x64 {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Release|ARM64.ActiveCfg = Release|ARM64 {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Release|ARM64.Build.0 = Release|ARM64 - {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Release|ARM64EC.ActiveCfg = Release|ARM64EC + {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Release|ARM64EC.ActiveCfg = Release|x64 {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Release|Win32.ActiveCfg = Release|Win32 {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Release|Win32.Build.0 = Release|Win32 {A3B8F75F-E63E-434E-8A2A-034AD9B66571}.Release|x64.ActiveCfg = Release|x64 diff --git a/windows/src/engine/keyman32/keyman32.vcxproj b/windows/src/engine/keyman32/keyman32.vcxproj index 5ec66a7783..348f938d73 100644 --- a/windows/src/engine/keyman32/keyman32.vcxproj +++ b/windows/src/engine/keyman32/keyman32.vcxproj @@ -5,10 +5,6 @@ Debug ARM64 - - Debug - ARM64EC - Debug Win32 @@ -21,10 +17,6 @@ Release ARM64 - - Release - ARM64EC - Release Win32 @@ -51,11 +43,6 @@ false v143 - - DynamicLibrary - false - v143 - DynamicLibrary false @@ -71,11 +58,6 @@ false v143 - - DynamicLibrary - false - v143 - DynamicLibrary false @@ -92,10 +74,6 @@ - - - - @@ -108,10 +86,6 @@ - - - - @@ -121,51 +95,41 @@ <_ProjectFileVersion>10.0.30319.1 $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ false false - false false $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ true true - true true AllRules.ruleset AllRules.ruleset - AllRules.ruleset AllRules.ruleset - - AllRules.ruleset AllRules.ruleset - AllRules.ruleset AllRules.ruleset - - @@ -178,11 +142,6 @@ $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\include;$(IncludePath) keyman64 - - $(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\x64\$(Configuration);$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64) - $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\include;$(IncludePath) - keyman64 - $(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\ARM64\$(Configuration);$(VC_LibraryPath_ARM64);$(WindowsSDK_LibraryPath_ARM64) $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\arm64\$(Configuration)\include;$(IncludePath) @@ -198,11 +157,6 @@ $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\include;$(IncludePath) keyman64 - - $(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\x64\$(Configuration);$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64) - $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\x64\$(Configuration)\include;$(IncludePath) - keyman64 - $(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\src;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\common;$(ProjectDir)..\..\..\..\core\build\ARM64\$(Configuration)\subprojects\icu\source\i18n;$(ProjectDir)..\..\..\..\core\build\rust\ARM64\$(Configuration);$(VC_LibraryPath_ARM64);$(WindowsSDK_LibraryPath_ARM64) $(ProjectDir)..\..\..\..\common\include;$(ProjectDir)..\..\..\..\core\include;$(ProjectDir)..\..\..\..\core\build\arm64\$(Configuration)\include;$(IncludePath) @@ -322,62 +276,6 @@ - - - NDEBUG;%(PreprocessorDefinitions) - true - true - ./Keyman32.tlb - - - - - MaxSpeed - OnlyExplicitInline - .\;..\..\global\inc;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - - - MultiThreaded - true - Use - pch.h - All - Level4 - true - true - ProgramDatabase - - - NDEBUG;%(PreprocessorDefinitions) - 0x0409 - - - /verbose:lib /section:.SHARDATA,rws %(AdditionalOptions) - libicuuc.a;libicuin.a;libkeymancore.a;psapi.lib;rpcrt4.lib;version.lib;setupapi.lib;iphlpapi.lib;imm32.lib;crypt32.lib;wintrust.lib;imagehlp.lib;ws2_32.lib;%(AdditionalDependencies) - true - keyman64.def - true - true - false - Windows - true - true - 0x140000000 - true - true - ..\..\..\lib\keyman64.lib - - - true - ./Keyman64.bsc - - - - - - NDEBUG;%(PreprocessorDefinitions) @@ -538,57 +436,6 @@ - - - _DEBUG;%(PreprocessorDefinitions) - true - true - ./Keyman32.tlb - - - - - Disabled - .\;..\..\global\inc;.;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - - - MultiThreadedDebug - Use - pch.h - All - true - Level4 - true - true - ProgramDatabase - - - _DEBUG;%(PreprocessorDefinitions) - 0x0409 - - - /verbose:lib /section:.SHARDATA,rws %(AdditionalOptions) - libicuuc.a;libicuin.a;libkeymancore.a;psapi.lib;rpcrt4.lib;version.lib;setupapi.lib;iphlpapi.lib;imm32.lib;crypt32.lib;wintrust.lib;imagehlp.lib;ws2_32.lib;%(AdditionalDependencies) - true - keyman64.def - true - true - Windows - 0x140000000 - true - true - ..\..\..\lib\keyman64.lib - - - true - ./Keyman32.bsc - - - - - - _DEBUG;%(PreprocessorDefinitions) @@ -674,11 +521,9 @@ Create Create - Create Create Create Create - Create Create @@ -699,44 +544,34 @@ Document false false - false false false false - false false mc %(FullPath) mc %(FullPath) - mc %(FullPath) mc %(FullPath) Compiling keyman-debug-etw Compiling keyman-debug-etw - Compiling keyman-debug-etw Compiling keyman-debug-etw %(Filename).rc;%(Filename.h);MSG00001.bin %(Filename).rc;%(Filename.h);MSG00001.bin - %(Filename).rc;%(Filename.h);MSG00001.bin %(Filename).rc;%(Filename.h);MSG00001.bin mc %(FullPath) mc %(FullPath) - mc %(FullPath) mc %(FullPath) Compiling keyman-debug-etw Compiling keyman-debug-etw - Compiling keyman-debug-etw Compiling keyman-debug-etw %(Filename).rc;%(Filename.h);MSG00001.bin %(Filename).rc;%(Filename.h);MSG00001.bin - %(Filename).rc;%(Filename.h);MSG00001.bin %(Filename).rc;%(Filename.h);MSG00001.bin Designer true - true true true - true true @@ -751,9 +586,7 @@ true true true - true true - true @@ -761,17 +594,13 @@ %(PreprocessorDefinitions) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) %(PreprocessorDefinitions) - %(PreprocessorDefinitions) %(PreprocessorDefinitions) true - true true true - true true @@ -784,9 +613,7 @@ true true true - true true - true @@ -825,4 +652,4 @@ - \ No newline at end of file + diff --git a/windows/src/engine/keymanhp/keymanhp.sln b/windows/src/engine/keymanhp/keymanhp.sln index 8cc3fdc129..1444a36031 100644 --- a/windows/src/engine/keymanhp/keymanhp.sln +++ b/windows/src/engine/keymanhp/keymanhp.sln @@ -1,16 +1,24 @@  -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.14.36705.20 d17.14 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "keymanhp", "keymanhp.vcxproj", "{A34650EA-D6E8-4229-8091-6BF1443565B5}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM64 = Debug|ARM64 Debug|x64 = Debug|x64 + Release|ARM64 = Release|ARM64 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A34650EA-D6E8-4229-8091-6BF1443565B5}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {A34650EA-D6E8-4229-8091-6BF1443565B5}.Debug|ARM64.Build.0 = Debug|ARM64 {A34650EA-D6E8-4229-8091-6BF1443565B5}.Debug|x64.ActiveCfg = Debug|x64 {A34650EA-D6E8-4229-8091-6BF1443565B5}.Debug|x64.Build.0 = Debug|x64 + {A34650EA-D6E8-4229-8091-6BF1443565B5}.Release|ARM64.ActiveCfg = Release|ARM64 + {A34650EA-D6E8-4229-8091-6BF1443565B5}.Release|ARM64.Build.0 = Release|ARM64 {A34650EA-D6E8-4229-8091-6BF1443565B5}.Release|x64.ActiveCfg = Release|x64 {A34650EA-D6E8-4229-8091-6BF1443565B5}.Release|x64.Build.0 = Release|x64 EndGlobalSection diff --git a/windows/src/engine/keymanhp/keymanhp.vcxproj b/windows/src/engine/keymanhp/keymanhp.vcxproj index f4fe3ab324..3aedb14b70 100644 --- a/windows/src/engine/keymanhp/keymanhp.vcxproj +++ b/windows/src/engine/keymanhp/keymanhp.vcxproj @@ -5,10 +5,6 @@ Debug ARM64 - - Debug - ARM64EC - Debug x64 @@ -17,10 +13,6 @@ Release ARM64 - - Release - ARM64EC - Release x64 @@ -40,12 +32,6 @@ true v143 - - Application - Unicode - true - v143 - Application Unicode @@ -57,11 +43,6 @@ Unicode v143 - - Application - Unicode - v143 - Application Unicode @@ -73,18 +54,12 @@ - - - - - - @@ -92,66 +67,44 @@ <_ProjectFileVersion>10.0.30319.1 $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ true - true true false - false false $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ - $(ProjectDir)obj\$(Platform)\$(Configuration)\ $(ProjectDir)obj\$(Platform)\$(Configuration)\ false - false false false - false false AllRules.ruleset - AllRules.ruleset AllRules.ruleset - - AllRules.ruleset - AllRules.ruleset AllRules.ruleset - - *.cdf;*.cache;*.obj;*.ilk;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.metagen;*.bi - *.cdf;*.cache;*.obj;*.ilk;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.metagen;*.bi *.cdf;*.cache;*.obj;*.ilk;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.metagen;*.bi *.cdf;*.cache;*.obj;*.ilk;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.metagen;*.bi - *.cdf;*.cache;*.obj;*.ilk;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.metagen;*.bi *.cdf;*.cache;*.obj;*.ilk;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.metagen;*.bi keymanhp.x64 - - keymanhp.x64 - keymanhp.x64 - - keymanhp.x64 - keymanhp.arm64 @@ -161,15 +114,9 @@ keymanhp.x64 - - keymanhp.x64 - keymanhp.x64 - - keymanhp.x64 - X64 @@ -210,43 +157,6 @@ - - - - Disabled - ..\..\global\inc;..\..\..\..\common\windows\delphi\ext\sentry;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - false - true - EnableFastChecks - MultiThreadedDebug - - - Level4 - true - ProgramDatabase - true - - - ..\..\..\..\common\windows\delphi\ext\sentry\sentry.x64.lib;keyman64.lib;libcmtd.lib;%(AdditionalDependencies) - ..\..\..\lib;%(AdditionalLibraryDirectories) - false - true - Windows - true - sentry.dll - - - - - - - - - - - - @@ -322,41 +232,6 @@ - - - - ..\..\global\inc;..\..\..\..\common\windows\delphi\ext\sentry;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - false - MultiThreaded - - - Level4 - true - ProgramDatabase - true - - - ..\..\..\..\common\windows\delphi\ext\sentry\sentry.x64.lib;keyman64.lib;libcmt.lib;%(AdditionalDependencies) - ..\..\..\lib;%(AdditionalLibraryDirectories) - false - true - Windows - true - true - true - true - sentry.dll - - - - - - - - - - @@ -411,8 +286,6 @@ true true - true - true true @@ -422,4 +295,4 @@ - \ No newline at end of file + diff --git a/windows/src/engine/kmrefresh/kmrefresh.vcxproj b/windows/src/engine/kmrefresh/kmrefresh.vcxproj index d38eee355b..447137a859 100644 --- a/windows/src/engine/kmrefresh/kmrefresh.vcxproj +++ b/windows/src/engine/kmrefresh/kmrefresh.vcxproj @@ -5,10 +5,6 @@ Debug ARM64 - - Debug - ARM64EC - Debug Win32 @@ -17,10 +13,6 @@ Release ARM64 - - Release - ARM64EC - Release Win32 @@ -60,12 +52,6 @@ Unicode v143 - - Application - true - Unicode - v143 - Application true @@ -79,13 +65,6 @@ Unicode v143 - - Application - false - true - Unicode - v143 - Application false @@ -107,18 +86,12 @@ - - - - - - @@ -128,11 +101,6 @@ $(ProjectName).x64 $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectName).x64 - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectName).x64 @@ -153,11 +121,6 @@ $(ProjectName).x64 $(ProjectDir)obj\$(Platform)\$(Configuration)\ - - $(ProjectDir)bin\$(Platform)\$(Configuration)\ - $(ProjectName).x64 - $(ProjectDir)obj\$(Platform)\$(Configuration)\ - $(ProjectDir)bin\$(Platform)\$(Configuration)\ $(ProjectName).x64 @@ -187,18 +150,6 @@ Windows - - - Level3 - Disabled - true - true - MultiThreadedDebug - - - Windows - - Level3 @@ -243,22 +194,6 @@ true - - - Level3 - MaxSpeed - true - true - true - true - MultiThreaded - - - Windows - true - true - - Level3 @@ -284,4 +219,4 @@ - \ No newline at end of file + diff --git a/windows/src/engine/kmtip/kmtip.sln b/windows/src/engine/kmtip/kmtip.sln index f37d702b47..4528a5e77f 100644 --- a/windows/src/engine/kmtip/kmtip.sln +++ b/windows/src/engine/kmtip/kmtip.sln @@ -11,10 +11,18 @@ Global Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Debug|ARM64.Build.0 = Debug|ARM64 + {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Release|ARM64EC.ActiveCfg = Release|ARM64EC + {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Release|ARM64EC.Build.0 = Release|ARM64EC {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Debug|Win32.ActiveCfg = Debug|Win32 {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Debug|Win32.Build.0 = Debug|Win32 {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Debug|x64.ActiveCfg = Debug|x64 {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Debug|x64.Build.0 = Debug|x64 + {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Release|ARM64.ActiveCfg = Release|ARM64 + {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Release|ARM64.Build.0 = Release|ARM64 + {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Release|ARM64EC.ActiveCfg = Release|ARM64EC + {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Release|ARM64EC.Build.0 = Release|ARM64EC {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Release|Win32.ActiveCfg = Release|Win32 {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Release|Win32.Build.0 = Release|Win32 {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4}.Release|x64.ActiveCfg = Release|x64 From f385c31ba256f641d55fd61deb0701b7a330372e Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Mon, 1 Dec 2025 19:55:11 +1000 Subject: [PATCH 42/59] feat(windows): sign kmtiparm64x-dll --- windows/src/engine/kmtip/build.sh | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/windows/src/engine/kmtip/build.sh b/windows/src/engine/kmtip/build.sh index 9e89a8a539..52037babe9 100755 --- a/windows/src/engine/kmtip/build.sh +++ b/windows/src/engine/kmtip/build.sh @@ -17,14 +17,12 @@ builder_parse "$@" source "$KEYMAN_ROOT/resources/build/win/environment.inc.sh" WIN32_TARGET="$WIN32_TARGET_PATH/kmtip.dll" X64_TARGET="$X64_TARGET_PATH/kmtip64.dll" -ARM64_TARGET="$ARM64_TARGET_PATH/kmtiparm64.dll" ARM64EC_TARGET="$ARM64EC_TARGET_PATH/kmtiparm64X.dll" builder_describe_outputs \ configure:project /resources/build/win/delphi_environment_generated.inc.sh \ build:x86 /windows/src/engine/kmtip/$WIN32_TARGET \ build:x64 /windows/src/engine/kmtip/$X64_TARGET \ - build:arm64 /windows/src/engine/kmtip/$ARM64_TARGET \ build:arm64ec /windows/src/engine/kmtip/$ARM64EC_TARGET \ #------------------------------------------------------------------------------------------------------------------- @@ -39,14 +37,11 @@ function do_build() { build_version.res vs_msbuild kmtip.vcxproj //t:Build "//p:Platform=Win32" vs_msbuild kmtip.vcxproj //t:Build "//p:Platform=x64" - vs_msbuild kmtip.vcxproj //t:Build "//p:Platform=arm64" vs_msbuild kmtip.vcxproj //t:Build "//p:Platform=arm64EC" cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_ENGINE" builder_if_release_build_level cp "$WIN32_TARGET_PATH/kmtip.pdb" "$WINDOWS_DEBUGPATH_ENGINE" cp "$X64_TARGET" "$WINDOWS_PROGRAM_ENGINE" builder_if_release_build_level cp "$X64_TARGET_PATH/kmtip64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" - cp "$ARM64_TARGET" "$WINDOWS_PROGRAM_ENGINE" - builder_if_release_build_level cp "$ARM64_TARGET_PATH/kmtiparm64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" cp "$ARM64EC_TARGET" "$WINDOWS_PROGRAM_ENGINE" builder_if_release_build_level cp "$ARM64EC_TARGET_PATH/kmtiparm64X.pdb" "$WINDOWS_DEBUGPATH_ENGINE" @@ -55,13 +50,11 @@ function do_build() { function do_publish() { wrap-signcode //d "Keyman Engine for Windows" "$WINDOWS_PROGRAM_ENGINE/kmtip.dll" wrap-signcode //d "Keyman Engine for Windows" "$WINDOWS_PROGRAM_ENGINE/kmtip64.dll" - wrap-signcode //d "Keyman Engine for Windows" "$WINDOWS_PROGRAM_ENGINE/kmtiparm64.dll" + wrap-signcode //d "Keyman Engine for Windows" "$WINDOWS_PROGRAM_ENGINE/kmtiparm64X.dll" wrap-symstore "$WINDOWS_PROGRAM_ENGINE/kmtip.dll" //t keyman-engine-windows wrap-symstore "$WINDOWS_DEBUGPATH_ENGINE/kmtip.pdb" //t keyman-engine-windows wrap-symstore "$WINDOWS_PROGRAM_ENGINE/kmtip64.dll" //t keyman-engine-windows wrap-symstore "$WINDOWS_DEBUGPATH_ENGINE/kmtip64.pdb" //t keyman-engine-windows - wrap-symstore "$WINDOWS_PROGRAM_ENGINE/kmtiparm64.dll" //t keyman-engine-windows - wrap-symstore "$WINDOWS_DEBUGPATH_ENGINE/kmtiparm64.pdb" //t keyman-engine-windows wrap-symstore "$WINDOWS_PROGRAM_ENGINE/kmtiparm64X.dll" //t keyman-engine-windows wrap-symstore "$WINDOWS_DEBUGPATH_ENGINE/kmtiparm64X.pdb" //t keyman-engine-windows } @@ -69,7 +62,6 @@ function do_publish() { function do_install() { cp "$WINDOWS_PROGRAM_ENGINE/kmtip.dll" "$INSTALLPATH_KEYMANENGINE/kmtip.dll" cp "$WINDOWS_PROGRAM_ENGINE/kmtip64.dll" "$INSTALLPATH_KEYMANENGINE/kmtip64.dll" - cp "$WINDOWS_PROGRAM_ENGINE/kmtiparm64.dll" "$INSTALLPATH_KEYMANENGINE/kmtiparm64.dll" cp "$WINDOWS_PROGRAM_ENGINE/kmtiparm64X.dll" "$INSTALLPATH_KEYMANENGINE/kmtiparm64X.dll" } From 8fac9c038e376ee7843174150d52bca46456228d Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Tue, 2 Dec 2025 10:47:59 +1000 Subject: [PATCH 43/59] feat(windows): address review comments Co-authored-by: Marc Durdin --- windows/src/desktop/inst/keymandesktop.wxs | 2 ++ windows/src/engine/inst/keymanengine.wxs | 2 +- windows/src/engine/mcompile/mcompile.vcxproj | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/windows/src/desktop/inst/keymandesktop.wxs b/windows/src/desktop/inst/keymandesktop.wxs index 44056b5c73..cbbe651d3d 100644 --- a/windows/src/desktop/inst/keymandesktop.wxs +++ b/windows/src/desktop/inst/keymandesktop.wxs @@ -81,6 +81,8 @@ + diff --git a/windows/src/engine/inst/keymanengine.wxs b/windows/src/engine/inst/keymanengine.wxs index d68f3a3a72..2aaaf1de9a 100644 --- a/windows/src/engine/inst/keymanengine.wxs +++ b/windows/src/engine/inst/keymanengine.wxs @@ -1,7 +1,7 @@  - diff --git a/windows/src/engine/mcompile/mcompile.vcxproj b/windows/src/engine/mcompile/mcompile.vcxproj index ab29d30abd..ff5f5e9784 100644 --- a/windows/src/engine/mcompile/mcompile.vcxproj +++ b/windows/src/engine/mcompile/mcompile.vcxproj @@ -132,3 +132,4 @@ + From 49fc44caba69301869190ce1382f6847f14dfec6 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Tue, 2 Dec 2025 12:05:01 +1000 Subject: [PATCH 44/59] feat(windows): remove quotes wxs rename lowercase --- windows/src/engine/inst/components.wxs | 8 ++++---- windows/src/engine/kmtip/build.sh | 12 ++++++------ windows/src/engine/kmtip/kmtip.vcxproj | 10 +++++----- windows/src/engine/kmtip/kmtip.vcxproj.filters | 2 +- .../kmtip/{kmtiparm64X.def => kmtiparm64x.def} | 2 +- 5 files changed, 17 insertions(+), 17 deletions(-) rename windows/src/engine/kmtip/{kmtiparm64X.def => kmtiparm64x.def} (89%) diff --git a/windows/src/engine/inst/components.wxs b/windows/src/engine/inst/components.wxs index 00fca48b48..b75ca495bd 100644 --- a/windows/src/engine/inst/components.wxs +++ b/windows/src/engine/inst/components.wxs @@ -237,16 +237,16 @@ - WIX_NATIVE_MACHINE = "34404" + WIX_NATIVE_MACHINE = 34404 - + - WIX_NATIVE_MACHINE = "43620" - + WIX_NATIVE_MACHINE = 43620 + diff --git a/windows/src/engine/kmtip/build.sh b/windows/src/engine/kmtip/build.sh index 52037babe9..69eab410cc 100755 --- a/windows/src/engine/kmtip/build.sh +++ b/windows/src/engine/kmtip/build.sh @@ -17,7 +17,7 @@ builder_parse "$@" source "$KEYMAN_ROOT/resources/build/win/environment.inc.sh" WIN32_TARGET="$WIN32_TARGET_PATH/kmtip.dll" X64_TARGET="$X64_TARGET_PATH/kmtip64.dll" -ARM64EC_TARGET="$ARM64EC_TARGET_PATH/kmtiparm64X.dll" +ARM64EC_TARGET="$ARM64EC_TARGET_PATH/kmtiparm64x.dll" builder_describe_outputs \ configure:project /resources/build/win/delphi_environment_generated.inc.sh \ @@ -43,26 +43,26 @@ function do_build() { cp "$X64_TARGET" "$WINDOWS_PROGRAM_ENGINE" builder_if_release_build_level cp "$X64_TARGET_PATH/kmtip64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" cp "$ARM64EC_TARGET" "$WINDOWS_PROGRAM_ENGINE" - builder_if_release_build_level cp "$ARM64EC_TARGET_PATH/kmtiparm64X.pdb" "$WINDOWS_DEBUGPATH_ENGINE" + builder_if_release_build_level cp "$ARM64EC_TARGET_PATH/kmtiparm64x.pdb" "$WINDOWS_DEBUGPATH_ENGINE" } function do_publish() { wrap-signcode //d "Keyman Engine for Windows" "$WINDOWS_PROGRAM_ENGINE/kmtip.dll" wrap-signcode //d "Keyman Engine for Windows" "$WINDOWS_PROGRAM_ENGINE/kmtip64.dll" - wrap-signcode //d "Keyman Engine for Windows" "$WINDOWS_PROGRAM_ENGINE/kmtiparm64X.dll" + wrap-signcode //d "Keyman Engine for Windows" "$WINDOWS_PROGRAM_ENGINE/kmtiparm64x.dll" wrap-symstore "$WINDOWS_PROGRAM_ENGINE/kmtip.dll" //t keyman-engine-windows wrap-symstore "$WINDOWS_DEBUGPATH_ENGINE/kmtip.pdb" //t keyman-engine-windows wrap-symstore "$WINDOWS_PROGRAM_ENGINE/kmtip64.dll" //t keyman-engine-windows wrap-symstore "$WINDOWS_DEBUGPATH_ENGINE/kmtip64.pdb" //t keyman-engine-windows - wrap-symstore "$WINDOWS_PROGRAM_ENGINE/kmtiparm64X.dll" //t keyman-engine-windows - wrap-symstore "$WINDOWS_DEBUGPATH_ENGINE/kmtiparm64X.pdb" //t keyman-engine-windows + wrap-symstore "$WINDOWS_PROGRAM_ENGINE/kmtiparm64x.dll" //t keyman-engine-windows + wrap-symstore "$WINDOWS_DEBUGPATH_ENGINE/kmtiparm64x.pdb" //t keyman-engine-windows } function do_install() { cp "$WINDOWS_PROGRAM_ENGINE/kmtip.dll" "$INSTALLPATH_KEYMANENGINE/kmtip.dll" cp "$WINDOWS_PROGRAM_ENGINE/kmtip64.dll" "$INSTALLPATH_KEYMANENGINE/kmtip64.dll" - cp "$WINDOWS_PROGRAM_ENGINE/kmtiparm64X.dll" "$INSTALLPATH_KEYMANENGINE/kmtiparm64X.dll" + cp "$WINDOWS_PROGRAM_ENGINE/kmtiparm64x.dll" "$INSTALLPATH_KEYMANENGINE/kmtiparm64x.dll" } builder_run_action clean:project do_clean diff --git a/windows/src/engine/kmtip/kmtip.vcxproj b/windows/src/engine/kmtip/kmtip.vcxproj index f14e86ceb0..20989dd7b6 100644 --- a/windows/src/engine/kmtip/kmtip.vcxproj +++ b/windows/src/engine/kmtip/kmtip.vcxproj @@ -190,10 +190,10 @@ .dll .dll kmtip64 - kmtiparm64X + kmtiparm64x kmtiparm64 kmtip64 - kmtiparm64X + kmtiparm64x kmtiparm64 @@ -319,7 +319,7 @@ ..\..\..\lib\keyman64.lib;..\..\..\lib\keymanarm64.lib;version.lib;wintrust.lib;crypt32.lib;imagehlp.lib;%(AdditionalDependencies) true - .\kmtiparm64X.def + .\kmtiparm64x.def true 0x140000000 true @@ -486,7 +486,7 @@ ..\..\..\lib\keyman64.lib;..\..\..\lib\keymanarm64.lib;version.lib;wintrust.lib;crypt32.lib;imagehlp.lib;%(AdditionalDependencies) true - .\kmtiparm64X.def + .\kmtiparm64x.def true true 0x140000000 @@ -770,7 +770,7 @@ true true - + true true true diff --git a/windows/src/engine/kmtip/kmtip.vcxproj.filters b/windows/src/engine/kmtip/kmtip.vcxproj.filters index 48c8bdf599..013828eb1f 100644 --- a/windows/src/engine/kmtip/kmtip.vcxproj.filters +++ b/windows/src/engine/kmtip/kmtip.vcxproj.filters @@ -86,7 +86,7 @@ Source Files\Framework - + Source Files\Framework diff --git a/windows/src/engine/kmtip/kmtiparm64X.def b/windows/src/engine/kmtip/kmtiparm64x.def similarity index 89% rename from windows/src/engine/kmtip/kmtiparm64X.def rename to windows/src/engine/kmtip/kmtiparm64x.def index 3058feb26a..0c113cc7fc 100644 --- a/windows/src/engine/kmtip/kmtiparm64X.def +++ b/windows/src/engine/kmtip/kmtiparm64x.def @@ -1,4 +1,4 @@ -LIBRARY kmtiparm64X.dll +LIBRARY kmtiparm64x.dll EXPORTS DllGetClassObject PRIVATE From 192a94e6c5e3c5862bca8c3febc0f751252d0bd3 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Tue, 2 Dec 2025 16:07:04 +1000 Subject: [PATCH 45/59] feat(windows): simplify vc config environment With VS2022 the limitations for the -hostarch flag not being available on arm environment and the -arch only having x86 and x64 has been removed. There is now single command that works for 3 builds on either host architecture. Fixes: 15239 Test-bot: skip --- core/build.bat | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/core/build.bat b/core/build.bat index 807ca9ba7d..c726d8592b 100644 --- a/core/build.bat +++ b/core/build.bat @@ -86,23 +86,7 @@ if not exist "!VsDevCmd_Path!" ( echo === Configuring VC++ === set VSCMD_SKIP_SENDTELEMETRY=1 -rem vsdevcmd.bat -arch parameter for 2019 is can only be x86 or amd64. (arm64 is not supported till 2022) -rem -host_arch does support is required for arm64 builds on x86/amd64 hosts. -rem However on arm64 host we cant even use vsdevcmd -arch=arm64 as it fails.(2019) -rem for now we will have workaround this untill updating to VS2022 -if /I "%HOST_ARCH%"=="arm64" ( - if /I "%ARCH%"=="arm64" ( - call "!VsDevCmd_Path!" -no_logo -startdir=none || exit !errorlevel! - ) else ( - call "!VsDevCmd_Path!" -arch=!ARCH! -no_logo -startdir=none || exit !errorlevel! - ) -) else ( - if /I "%ARCH%"=="arm64" ( - call "!VsDevCmd_Path!" -arch=!ARCH! -host_arch=!HOST_ARCH! -no_logo -startdir=none || exit !errorlevel! - ) else ( - call "!VsDevCmd_Path!" -arch=!ARCH! -no_logo -startdir=none || exit !errorlevel! - ) -) +call "!VsDevCmd_Path!" -arch=!ARCH! -host_arch=!HOST_ARCH! -no_logo -startdir=none || exit !errorlevel! cd %KEYMAN_ROOT%\core set BUILDTYPE=%1 From b0d899b76d4eda61fd2889e5d073f93542070c3f Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Wed, 3 Dec 2025 11:25:33 +1000 Subject: [PATCH 46/59] feat(windows): as set native machine property firstvoices Fixes: #15260 --- oem/firstvoices/windows/src/inst/firstvoices.wxs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/oem/firstvoices/windows/src/inst/firstvoices.wxs b/oem/firstvoices/windows/src/inst/firstvoices.wxs index ad5b02e15c..a23285383e 100644 --- a/oem/firstvoices/windows/src/inst/firstvoices.wxs +++ b/oem/firstvoices/windows/src/inst/firstvoices.wxs @@ -1,5 +1,5 @@  - + + + + + @@ -179,6 +184,7 @@ 1 + From 69f2c0dc1ce6d9464d9cd803e369425854c9e3fb Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Wed, 3 Dec 2025 16:12:18 +1000 Subject: [PATCH 47/59] docs(windows): add kmtip readme Add a detailed desctription of kmtiparm64x.dll Fixes:#15237 Test-bot: skip --- windows/src/engine/README.md | 6 ++-- windows/src/engine/kmtip/README.md | 54 ++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 windows/src/engine/kmtip/README.md diff --git a/windows/src/engine/README.md b/windows/src/engine/README.md index 7e5787e43f..23d4c9b5ce 100644 --- a/windows/src/engine/README.md +++ b/windows/src/engine/README.md @@ -33,13 +33,13 @@ This is the public COM API library, used by keyman.exe, kmshell.exe, and various A helper app to refresh Windows language settings, due to a bug in Windows; read ../kmrefresh/kmrefresh.cpp for details. -## kmtip - kmtip.dll | kmtip64.dll | kmtiparm64.dll +## kmtip - kmtip.dll | kmtip64.dll | kmtiparm64x.dll Implementation of a Text Service for the Text Services Framework (TSF). This implementation is named Keyman TIP. Architecturally it sits between the TSF Manager and Keyman.exe -kmtiparm64.dll is built as an Arm64X, file it supports both x64 and arm64 on a -Windows on Arm machine. kmtip64.dll is therefore only used only on Windows x64 Machines. +kmtiparm64x.dll is built as an Arm64X, file it supports both x64 and arm64 on a +Windows on Arm machine. kmtip64.dll is therefore only used only on Windows x64 Machines. See the [kmtip README](kmtip/README.md) for deeper description of kmtiparm64x.dll. ## mcompile - mcompile.exe diff --git a/windows/src/engine/kmtip/README.md b/windows/src/engine/kmtip/README.md new file mode 100644 index 0000000000..da902e0ade --- /dev/null +++ b/windows/src/engine/kmtip/README.md @@ -0,0 +1,54 @@ +This README explains the purpose and architecture of `kmtiparm64x.dll`, for Windows on Arm devices. + +*** + +# kmtiparm64x.dll + +## Overview +`kmtiparm64x.dll` is an **Arm64X** PE (Portable Executable) binary. It is a dual-architecture library capable of servicing both native Arm64 applications and emulated x64 applications on Windows on Arm (WoA) devices. + +This DLL is needed for the Keyman Text Input Processor (TIP) to function correctly across the different binary architectures of applications running on WoA. + +## Background and Problem + +### 1. The "Mixed Architecture" Environment +Windows on Arm devices can run applications of differing architectures simultaneously: +* **Native Arm64 apps:** (e.g., Windows Explorer, Notepad, Edge). +* **Emulated x64 apps:** (e.g., Older desktop applications). +* **Emulated x86 apps:** (32-bit legacy apps). + +A Text Input Processor (TIP) is a plugin that gets **loaded directly into the process space** of the application currently receiving text input. Therefore, the TIP DLL must match the architecture of the application it is running inside. + +### 2. The Single CLSID Problem +On 64-bit Windows, there is typically a single registry entry (COM CLSID) for a 64-bit TIP. +* If we register a standard **Arm64** DLL, x64 apps will crash or fail to load it because they cannot load a pure Arm64 binary. +* If we register a standard **x64** DLL, native Arm64 apps will fail to load it. + +We cannot easily register two different DLLs for the same Class ID to handle this "split" 64-bit world. +Note: For 32-bit there exists a WOW6432Node in windows registry that allows different dlls to registerd for the same Class ID. + +## The Solution: Arm64X +`kmtiparm64x.dll` solves this by using the **Arm64X** format. It contains two complete sets of code within a single file: + +1. **Arm64 Code:** Used when the DLL is loaded by a native Arm64 process. +2. **Arm64EC (Emulation Compatible) Code:** Used when the DLL is loaded by an x64 process. + * *Note: Arm64EC code runs at native speed but uses x64 data structures and calling conventions, allowing it to interoperate seamlessly with the x64 host app.* + +### Runtime Behavior +When an application loads `kmtiparm64x.dll`: +* The Windows loader automatically detects the process architecture. +* **Automatic Selection:** + * If the host process is **x64**, Windows exposes the **Arm64EC** section. The Arm64EC section is built against the **keyman64.dll** keyman engine causing it to be loaded dynamically. + * If the host process is **Arm64**, Windows exposes the **Arm64** section. The **Arm64** section is built against the **keymanarm64.dll** keyman engine causing it to be loaded dynamically. + +* **Transparency:** The host application is unaware that the binary contains code for other platforms; it sees only what it expects + + +## Build Composition +This binary is the result of merging two distinct build targets from the source: +1. **kmtip (arm64)**: The pure native target. +2. **kmtip (arm64EC)**: The hybrid target for x64 compatibility. + +## Usage +* **Registration:** This DLL is registered against the single Keyman TIP CLSID for 64-bit contexts. +* **x86 Support:** Note that 32-bit (x86) applications still require the separate `kmtip.dll` (32-bit x86 build), as they use a completely different registry hive (Wow6432Node). From 7929345340620c2cb3c28041ad4e90b590fbedc3 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Thu, 4 Dec 2025 10:33:24 +1000 Subject: [PATCH 48/59] feat(windows): add WixUtilExtension to light cmd --- oem/firstvoices/windows/src/inst/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oem/firstvoices/windows/src/inst/build.sh b/oem/firstvoices/windows/src/inst/build.sh index cad414d39b..930779e082 100755 --- a/oem/firstvoices/windows/src/inst/build.sh +++ b/oem/firstvoices/windows/src/inst/build.sh @@ -74,7 +74,7 @@ function do_publish() { -sice:ICE82 -sice:ICE80 \ -dWixUILicenseRtf=License.rtf \ -out firstvoices.msi \ - -ext WixUIExtension firstvoices.wixobj desktopui.wixobj + -ext WixUIExtension -ext WixUtilExtension firstvoices.wixobj desktopui.wixobj # # Sign the installation archive From e17e91e2a6fc0480e129664cf76d2dd9c5b9e1cd Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Mon, 8 Dec 2025 16:11:51 +1000 Subject: [PATCH 49/59] docs(windows): apply review suggestion Co-authored-by: Marc Durdin --- windows/src/engine/kmtip/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/windows/src/engine/kmtip/README.md b/windows/src/engine/kmtip/README.md index da902e0ade..7cf6bbea10 100644 --- a/windows/src/engine/kmtip/README.md +++ b/windows/src/engine/kmtip/README.md @@ -38,7 +38,7 @@ Note: For 32-bit there exists a WOW6432Node in windows registry that allows diff When an application loads `kmtiparm64x.dll`: * The Windows loader automatically detects the process architecture. * **Automatic Selection:** - * If the host process is **x64**, Windows exposes the **Arm64EC** section. The Arm64EC section is built against the **keyman64.dll** keyman engine causing it to be loaded dynamically. + * If the host process is **x64**, Windows exposes the **Arm64EC** section. The **Arm64EC** section is built against the **keyman64.dll** keyman engine causing it to be loaded dynamically. * If the host process is **Arm64**, Windows exposes the **Arm64** section. The **Arm64** section is built against the **keymanarm64.dll** keyman engine causing it to be loaded dynamically. * **Transparency:** The host application is unaware that the binary contains code for other platforms; it sees only what it expects From d6568fb8f1afb5a34031789a1e2cc705f1be4618 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Thu, 11 Dec 2025 14:10:41 +1000 Subject: [PATCH 50/59] docs(windows): describe kmtip as well as the arm64X --- windows/src/engine/kmtip/README.md | 110 +++++++++++++++++++++-------- 1 file changed, 79 insertions(+), 31 deletions(-) diff --git a/windows/src/engine/kmtip/README.md b/windows/src/engine/kmtip/README.md index 7cf6bbea10..0c65d06e73 100644 --- a/windows/src/engine/kmtip/README.md +++ b/windows/src/engine/kmtip/README.md @@ -1,54 +1,102 @@ -This README explains the purpose and architecture of `kmtiparm64x.dll`, for Windows on Arm devices. - -*** - -# kmtiparm64x.dll ## Overview -`kmtiparm64x.dll` is an **Arm64X** PE (Portable Executable) binary. It is a dual-architecture library capable of servicing both native Arm64 applications and emulated x64 applications on Windows on Arm (WoA) devices. -This DLL is needed for the Keyman Text Input Processor (TIP) to function correctly across the different binary architectures of applications running on WoA. +`kmtip` is an implementation of a Text Service for the Text Services Framework +(TSF). This implementation is named Keyman TIP. Architecturally it sits between +the TSF Manager and Keyman.exe. -## Background and Problem +## Background ### 1. The "Mixed Architecture" Environment -Windows on Arm devices can run applications of differing architectures simultaneously: + +Windows on both amd64(x86-64) and on Arm devices can run applications of differing architectures simultaneously: + +On amd64 Devices: +* **Native x64 apps:** (e.g., Windows Explorer, Notepad, Edge). +* **x86 apps (WOW64):** (32-bit legacy apps). + +On Arm Devices: * **Native Arm64 apps:** (e.g., Windows Explorer, Notepad, Edge). * **Emulated x64 apps:** (e.g., Older desktop applications). * **Emulated x86 apps:** (32-bit legacy apps). -A Text Input Processor (TIP) is a plugin that gets **loaded directly into the process space** of the application currently receiving text input. Therefore, the TIP DLL must match the architecture of the application it is running inside. +A Text Input Processor (TIP) is a plugin that gets **loaded directly into the +process space** of the application currently receiving text input. Therefore, +the TIP DLL must match the architecture of the application it is running in. +Setting all this up is different on Windows on Arm and Windows on amd64 +devices. -### 2. The Single CLSID Problem -On 64-bit Windows, there is typically a single registry entry (COM CLSID) for a 64-bit TIP. -* If we register a standard **Arm64** DLL, x64 apps will crash or fail to load it because they cannot load a pure Arm64 binary. -* If we register a standard **x64** DLL, native Arm64 apps will fail to load it. -We cannot easily register two different DLLs for the same Class ID to handle this "split" 64-bit world. -Note: For 32-bit there exists a WOW6432Node in windows registry that allows different dlls to registerd for the same Class ID. +## kmtip.dll and kmtip64.dll - On amd64 Devices -## The Solution: Arm64X -`kmtiparm64x.dll` solves this by using the **Arm64X** format. It contains two complete sets of code within a single file: +On 64-bit Windows, there is a single registry entry (COM CLSID) for a 64-bit +TIP: **kmtip64.dll**. -1. **Arm64 Code:** Used when the DLL is loaded by a native Arm64 process. -2. **Arm64EC (Emulation Compatible) Code:** Used when the DLL is loaded by an x64 process. - * *Note: Arm64EC code runs at native speed but uses x64 data structures and calling conventions, allowing it to interoperate seamlessly with the x64 host app.* +For 32-bit applications, there exists a WOW6432Node in the Windows registry +that allows a different DLL to be registered for the same Class ID: +**kmtip.dll**. It is essentially two views of the registry depending on whether +the application is 32-bit or 64-bit. + + +## kmtiparm64x.dll - Arm64 Devices + +### Single Registry Entry Problem + +On Windows on Arm there is a problem because there is only a single registry +entry for the 64-bit CLSID. This means it is not possible to register both an +amd64 DLL and an Arm64 DLL, for example **kmtip64.dll** and +**kmtiparm64.dll**. + +* If we register a standard **Arm64** DLL, x64 apps will crash or fail to load + it because they cannot load a pure Arm64 binary. +* If we register a standard **x64** DLL, native Arm64 apps will fail to load + it. + +### The Solution: Arm64X + +**Arm64X** is a PE (Portable Executable) binary format. It is a dual-architecture +library +capable of servicing both native Arm64 applications and emulated x64 +applications on Windows on Arm (WoA) devices. + +`kmtiparm64x.dll` solves this problem by using the **Arm64X** format. It +contains two complete sets of code within a single file: + +1. **Arm64 Code:** Used when the DLL is loaded by a native Arm64 process. +2. **Arm64EC (Emulation Compatible) Code:** Used when the DLL is loaded by an + x64 process. + * *Note: Arm64EC code runs at native speed but uses x64 data structures and + calling conventions, allowing it to interoperate seamlessly with the x64 + host app.* ### Runtime Behavior + When an application loads `kmtiparm64x.dll`: + * The Windows loader automatically detects the process architecture. * **Automatic Selection:** - * If the host process is **x64**, Windows exposes the **Arm64EC** section. The **Arm64EC** section is built against the **keyman64.dll** keyman engine causing it to be loaded dynamically. - * If the host process is **Arm64**, Windows exposes the **Arm64** section. The **Arm64** section is built against the **keymanarm64.dll** keyman engine causing it to be loaded dynamically. + * If the host process is **x64**, Windows exposes the **Arm64EC** section. + The **Arm64EC** section is built against the **keyman64.dll** Keyman engine, + causing it to be loaded dynamically. + * If the host process is **Arm64**, Windows exposes the **Arm64** section. The + **Arm64** section is built against the **keymanarm64.dll** Keyman engine, + causing it to be loaded dynamically. -* **Transparency:** The host application is unaware that the binary contains code for other platforms; it sees only what it expects +* **Transparency:** The host application is unaware that the binary contains + code for other platforms; it sees only what it expects +### Build Composition -## Build Composition -This binary is the result of merging two distinct build targets from the source: -1. **kmtip (arm64)**: The pure native target. -2. **kmtip (arm64EC)**: The hybrid target for x64 compatibility. +This binary is the result of merging two distinct build targets from the +source: -## Usage -* **Registration:** This DLL is registered against the single Keyman TIP CLSID for 64-bit contexts. -* **x86 Support:** Note that 32-bit (x86) applications still require the separate `kmtip.dll` (32-bit x86 build), as they use a completely different registry hive (Wow6432Node). +1. **kmtip (arm64)**: The pure native target. +2. **kmtip (arm64EC)**: The hybrid target for x64 compatibility. + +### Usage + +* **Registration:** This DLL is registered against the single Keyman TIP CLSID + for 64-bit contexts. +* **x86 Support:** Note that 32-bit (x86) applications still require the + separate `kmtip.dll` (32-bit x86 build), as they use a completely different + registry hive (WOW6432Node). From 4e7d2dddca069ab8824f6dd3590f9d818e4556e6 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Fri, 12 Dec 2025 17:24:29 +1000 Subject: [PATCH 51/59] feat(windows): review comments Co-authored-by: Eberhard Beilharz --- windows/src/engine/README.md | 5 +++-- windows/src/engine/kmtip/README.md | 14 +++++++------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/windows/src/engine/README.md b/windows/src/engine/README.md index 23d4c9b5ce..3436f07b05 100644 --- a/windows/src/engine/README.md +++ b/windows/src/engine/README.md @@ -38,8 +38,9 @@ A helper app to refresh Windows language settings, due to a bug in Windows; read Implementation of a Text Service for the Text Services Framework (TSF). This implementation is named Keyman TIP. Architecturally it sits between the TSF Manager and Keyman.exe -kmtiparm64x.dll is built as an Arm64X, file it supports both x64 and arm64 on a -Windows on Arm machine. kmtip64.dll is therefore only used only on Windows x64 Machines. See the [kmtip README](kmtip/README.md) for deeper description of kmtiparm64x.dll. +kmtiparm64x.dll is built as an Arm64X file. It supports both x64 and arm64 on a +Windows on Arm machine. kmtip64.dll is therefore only used on Windows x64 Machines. +See the [kmtip README](kmtip/README.md) for deeper description of kmtip*.dll. ## mcompile - mcompile.exe diff --git a/windows/src/engine/kmtip/README.md b/windows/src/engine/kmtip/README.md index 0c65d06e73..169a728dbb 100644 --- a/windows/src/engine/kmtip/README.md +++ b/windows/src/engine/kmtip/README.md @@ -2,8 +2,8 @@ ## Overview `kmtip` is an implementation of a Text Service for the Text Services Framework -(TSF). This implementation is named Keyman TIP. Architecturally it sits between -the TSF Manager and Keyman.exe. +(TSF). This implementation is named Keyman Text Input Processor (TIP). Architecturally +it sits between the TSF Manager and Keyman.exe. ## Background @@ -45,7 +45,8 @@ the application is 32-bit or 64-bit. On Windows on Arm there is a problem because there is only a single registry entry for the 64-bit CLSID. This means it is not possible to register both an amd64 DLL and an Arm64 DLL, for example **kmtip64.dll** and -**kmtiparm64.dll**. +**kmtiparm64.dll**. (For 32-bit apps there is still the WOW6432Node that +registers `kmtip.dll`.) * If we register a standard **Arm64** DLL, x64 apps will crash or fail to load it because they cannot load a pure Arm64 binary. @@ -55,8 +56,7 @@ amd64 DLL and an Arm64 DLL, for example **kmtip64.dll** and ### The Solution: Arm64X **Arm64X** is a PE (Portable Executable) binary format. It is a dual-architecture -library -capable of servicing both native Arm64 applications and emulated x64 +library capable of servicing both native Arm64 applications and emulated x64 applications on Windows on Arm (WoA) devices. `kmtiparm64x.dll` solves this problem by using the **Arm64X** format. It @@ -87,8 +87,8 @@ When an application loads `kmtiparm64x.dll`: ### Build Composition -This binary is the result of merging two distinct build targets from the -source: +The `kmtiparm64x.dll` binary is the result of merging two distinct build +targets from the source: 1. **kmtip (arm64)**: The pure native target. 2. **kmtip (arm64EC)**: The hybrid target for x64 compatibility. From be3fbf4845d56b63db0486c519d7bbdb8ff92062 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Fri, 12 Dec 2025 17:41:56 +1000 Subject: [PATCH 52/59] docs(windows): review comments --- windows/src/engine/kmtip/README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/windows/src/engine/kmtip/README.md b/windows/src/engine/kmtip/README.md index 169a728dbb..d82c974e62 100644 --- a/windows/src/engine/kmtip/README.md +++ b/windows/src/engine/kmtip/README.md @@ -31,19 +31,22 @@ devices. On 64-bit Windows, there is a single registry entry (COM CLSID) for a 64-bit TIP: **kmtip64.dll**. +`HKLM\SOFTWARE\Classes\CLSID` For 32-bit applications, there exists a WOW6432Node in the Windows registry that allows a different DLL to be registered for the same Class ID: -**kmtip.dll**. It is essentially two views of the registry depending on whether +**kmtip.dll**. +`HKLM\SOFTWARE\WOW6432Node\Classes\CLSID` +It is essentially two views of the registry depending on whether the application is 32-bit or 64-bit. ## kmtiparm64x.dll - Arm64 Devices -### Single Registry Entry Problem +### Single Registry Entry Problem for the two 64-bit architecture On Windows on Arm there is a problem because there is only a single registry -entry for the 64-bit CLSID. This means it is not possible to register both an +entry for the **64-bit** CLSID. This means it is not possible to register both an amd64 DLL and an Arm64 DLL, for example **kmtip64.dll** and **kmtiparm64.dll**. (For 32-bit apps there is still the WOW6432Node that registers `kmtip.dll`.) From 330f2b8163a434c3d3f36fd82d6f484b1c7581af Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Mon, 15 Dec 2025 15:18:39 +1000 Subject: [PATCH 53/59] feat(windows): no arm binaries on x64 machine kmtiparm64x.dll was correctly not installed on x86-x64 machines however keymanarm64.dll and keymanhp.arm64.exe were still being installed. It will be cleaner if we don't install them. --- windows/src/engine/inst/components.wxs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/windows/src/engine/inst/components.wxs b/windows/src/engine/inst/components.wxs index b75ca495bd..726644d9e8 100644 --- a/windows/src/engine/inst/components.wxs +++ b/windows/src/engine/inst/components.wxs @@ -138,6 +138,8 @@ + + WIX_NATIVE_MACHINE = 43620 @@ -146,6 +148,8 @@ + + WIX_NATIVE_MACHINE = 43620 From 3048705c9bd290d62494c21c9b95dff3a3638217 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Mon, 15 Dec 2025 09:29:48 +1100 Subject: [PATCH 54/59] maint(windows): add GitHub Action for ARM64 test for Keyman Core Add a GitHub action to test Keyman Core on Windows / ARM64. We do not have a TeamCity ARM64 agent for this. There are a number of config challenges in making this work as many deps do not yet support ARM64; however the changes are isolated to the .yml. Test-bot: skip --- .github/workflows/README.md | 123 ++++++++++++++ .github/workflows/core-arm64-test.yml | 158 ++++++++++++++++++ .github/workflows/deb-packaging.README.md | 43 ----- core/build.bat | 18 +- .../ci/cancel-builds/trigger_definitions.mjs | 2 +- resources/build/ci/trigger-definitions.inc.sh | 2 +- 6 files changed, 288 insertions(+), 58 deletions(-) create mode 100644 .github/workflows/README.md create mode 100644 .github/workflows/core-arm64-test.yml delete mode 100644 .github/workflows/deb-packaging.README.md diff --git a/.github/workflows/README.md b/.github/workflows/README.md new file mode 100644 index 0000000000..73e6849c50 --- /dev/null +++ b/.github/workflows/README.md @@ -0,0 +1,123 @@ +# api-verification.yml +TODO + +# auto-merge-keyman-server-pr.yml +TODO + +# build-test-publish-docker.yml +TODO + +# cleanup-ghcr.yml +TODO + +# close-linked-issues-for-merged-prs.yml +TODO + +# core-arm64-test.yml: Test Keyman Core on Windows/ARM64 + +This action allows us to test Keyman Core for Windows on ARM64 architecture with +a GitHub agent, as we do not have any TeamCity Windows build agents with ARM64 +arch. + +It will normally be triggered as part of a test build from the +resources/teamcity/triggers/trigger-test-builds.sh script. + +You can manually trigger a core-arm64-test action on GitHub, e.g. to test changes: + +- push the changes to your fork of keymanapp/keyman: git push myfork HEAD:master +- make sure you have GHA enabled in the settings of your fork and created an + access token on GitHub +- trigger a build with: + + ```bash + curl --write-out '\n' --request POST \ + --header "Accept: application/vnd.github+json" \ + --header "Authorization: token $GITHUB_TOKEN" \ + --data "{ \"event_type\": \"core-arm64-test: master\", \ + \"client_payload\": { \ + \"buildSha\": \"$(git rev-parse refs/heads/master)\", \ + \"branch\": \"master\", \ + \"baseBranch\": \"master\", \ + \"baseRef\": \"$(git rev-parse refs/heads/master^)\", \ + \"user\": \"${USER}\", \ + \"isTestBuild\": \"true\", \ + \"force\": \"true\"}" \ + https://api.github.com/repos//keyman/dispatches + ``` + + To trigger a build for PR #1234 in a branch `pr-1234` this would look similar + to this: + + ```bash + curl --write-out '\n' --request POST \ + --header "Accept: application/vnd.github+json" \ + --header "Authorization: token $GITHUB_TOKEN" \ + --data "{ \"event_type\": \"core-arm64-test: PR #1234\", \ + \"client_payload\": { \ + \"buildSha\": \"$(git rev-parse refs/heads/pr-1234)\", \ + \"branch\": \"pr-1234\", \ + \"baseBranch\": \"master\", \ + \"baseRef\": \"$(git rev-parse refs/heads/master)\", \ + \"user\": \"${USER}\", \ + \"isTestBuild\": \"true\", \ + \"force\": \"true\"}" \ + https://api.github.com/repos//keyman/dispatches + ``` + +.... + +# crowdin.yml +TODO + +# deb-packaging.yml: Ubuntu Packaging GitHub Action + +You can manually trigger a deb-packaging action on GitHub, e.g. to test changes: + +- push the changes to your fork of keymanapp/keyman: git push myfork HEAD:master +- make sure you have GHA enabled in the settings of your fork and created an + access token on GitHub +- trigger a build with: + + ```bash + curl --write-out '\n' --request POST \ + --header "Accept: application/vnd.github+json" \ + --header "Authorization: token $GITHUB_TOKEN" \ + --data "{ \"event_type\": \"deb-pr-packaging: master\", \ + \"client_payload\": { \ + \"buildSha\": \"$(git rev-parse refs/heads/master)\", \ + \"branch\": \"master\", \ + \"baseBranch\": \"master\", \ + \"baseRef\": \"$(git rev-parse refs/heads/master^)\", \ + \"user\": \"${USER}\", \ + \"isTestBuild\": \"true\", \ + \"force\": \"true\"}" \ + https://api.github.com/repos//keyman/dispatches + ``` + + To trigger a build for PR #1234 in a branch `pr-1234` this would look similar + to this: + + ```bash + curl --write-out '\n' --request POST \ + --header "Accept: application/vnd.github+json" \ + --header "Authorization: token $GITHUB_TOKEN" \ + --data "{ \"event_type\": \"deb-pr-packaging: PR #1234\", \ + \"client_payload\": { \ + \"buildSha\": \"$(git rev-parse refs/heads/pr-1234)\", \ + \"branch\": \"pr-1234\", \ + \"baseBranch\": \"master\", \ + \"baseRef\": \"$(git rev-parse refs/heads/master)\", \ + \"user\": \"${USER}\", \ + \"isTestBuild\": \"true\", \ + \"force\": \"true\"}" \ + https://api.github.com/repos//keyman/dispatches + ``` + +# labeler.yml +TODO + +# npm-publish.yml +TODO + +# pr-build-status.yml +TODO diff --git a/.github/workflows/core-arm64-test.yml b/.github/workflows/core-arm64-test.yml new file mode 100644 index 0000000000..77cb795467 --- /dev/null +++ b/.github/workflows/core-arm64-test.yml @@ -0,0 +1,158 @@ +# +# This workflow tests Keyman Core on ARM64; we cannot use our TeamCity agents +# because we have no ARM64 Windows agents. +# +# It is triggered by a repository_dispatch event with the type +# `core-arm64-test:*`. +# + +name: "Keyman Core - ARM64 test" +run-name: "Keyman Core - ARM64 test - ${{ github.event.client_payload.branch }} (branch ${{ github.event.client_payload.baseBranch }}), by @${{ github.event.client_payload.user }}, testbuild: ${{ github.event.client_payload.isTestBuild }}" +on: + repository_dispatch: + types: ['core-arm64-test:*'] + + # pull-request: + +# Input: +# buildSha: The SHA of the commit to build, e.g. of the branch or +# refs/pull/1234/head for PR +# branch: The branch to build, for a PR in the form `PR-1234` +# baseBranch: For a PR the base branch, otherwise the same as `branch` +# user: The user that triggered the build or created the PR +# isTestBuild: false for Releases, otherwise true + +env: + GH_TOKEN: ${{ github.token }} + STATUS_CONTEXT: 'Keyman Core - ARM64 test' + _builder_timings: false + +jobs: + core-arm64-test: + name: Keyman Core ARM64 test + if: github.repository == 'keymanapp/keyman' || github.event.client_payload.force + runs-on: windows-11-arm + + steps: + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2 + with: + ref: '${{ github.event.client_payload.buildSha }}' + + - name: Set pending status on PR builds + id: set_status + if: github.event.client_payload.isTestBuild == 'true' + shell: bash + run: | + gh api \ + --method POST \ + -H "Accept: application/vnd.github+json" \ + /repos/$GITHUB_REPOSITORY/statuses/${{ github.event.client_payload.buildSha }} \ + -f state='pending' \ + -f target_url="$GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID" \ + -f description='Keyman Core - ARM64 test started' \ + -f context="$STATUS_CONTEXT" + + - name: Report initial npm/node versions + run: | + echo "Initial npm/node versions" + npm -v + node -v + + - uses: actions/setup-python@v6 + with: + python-version: '3.13' + + - uses: actions/setup-node@v6 + with: + # This needs to be kept in sync with minimum-versions.sh + node-version: '20.19' + # As of Dec 2025, ngrok not yet supported on ARM Windows, + # google-closure-compiler (and others?) does not support arm64 yet, so + # use the x64 version of node. This is needed to avoid `npm ci` failure, + # even though we don't use ngrok directly; google-closure-compiler is + # used by emscripten + architecture: x64 + + - name: Report on current environment + shell: bash + run: | + echo "-- Environment --" + echo "pythonLocation=$pythonLocation" + echo "-- Current npm/node versions --" + npm -v + node -v + + - name: Setup environment + shell: bash + run: | + # As of Dec 2025, Emscripten does not support Win11 ARM natively + echo "EMSDK_ARCH=x86_64" >> $GITHUB_ENV + echo "EMSDK_KEEP_DOWNLOADS=1" >> $GITHUB_ENV + echo "KEYMAN_USE_EMSDK=1" >> $GITHUB_ENV + + echo "PATH=$PATH:$pythonLocation/Scripts" >> $GITHUB_ENV + + echo "KEYMAN_CI_SKIP_NVM=1" >> $GITHUB_ENV + + + - name: Install emscripten + shell: bash + run: | + source resources/build/minimum-versions.inc.sh + mkdir ../emsdk + pushd ../emsdk + git clone https://github.com/emscripten-core/emsdk.git + cd emsdk + ./emsdk install "${KEYMAN_MIN_VERSION_EMSCRIPTEN}" + ./emsdk activate "${KEYMAN_MIN_VERSION_EMSCRIPTEN}" + cd upstream/emscripten + npm install + echo "EMSCRIPTEN_BASE=$(pwd)" >> $GITHUB_ENV + popd + + - name: Install meson + shell: bash + run: | + pip3 install --user meson + + - name: Run test + shell: bash + run: | + # Run the test + ./core/build.sh configure,build,test:arm64 + + set_status: + name: Set result status on PR builds + needs: [core-arm64-test] + runs-on: windows-arm64 + if: ${{ always() && github.event.client_payload.isTestBuild == 'true' }} + steps: + - name: Set success + if: needs.core-arm64-test.result == 'success' + run: | + echo "RESULT=success" >> $GITHUB_ENV + echo "MSG=Keyman Core ARM64 test succeeded" >> $GITHUB_ENV + + - name: Set cancelled + if: needs.core-arm64-test.result == 'cancelled' + run: | + echo "RESULT=error" >> $GITHUB_ENV + echo "MSG=Keyman Core ARM64 test cancelled" >> $GITHUB_ENV + + - name: Set failure + if: needs.core-arm64-test.result == 'failure' + run: | + echo "RESULT=failure" >> $GITHUB_ENV + echo "MSG=Keyman Core ARM64 test failed" >> $GITHUB_ENV + + - name: Set final status + run: | + gh api \ + --method POST \ + -H "Accept: application/vnd.github+json" \ + /repos/$GITHUB_REPOSITORY/statuses/${{ github.event.client_payload.buildSha }} \ + -f state="$RESULT" \ + -f target_url="$GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID" \ + -f description="$MSG" \ + -f context="$STATUS_CONTEXT" diff --git a/.github/workflows/deb-packaging.README.md b/.github/workflows/deb-packaging.README.md deleted file mode 100644 index 662526a875..0000000000 --- a/.github/workflows/deb-packaging.README.md +++ /dev/null @@ -1,43 +0,0 @@ -# Ubuntu Packaging GitHub Action - -You can manually trigger a deb-packaging action on GitHub, e.g. to test changes: - -- push the changes to your fork of keymanapp/keyman: git push myfork HEAD:master -- make sure you have GHA enabled in the settings of your fork and created an - access token on GitHub -- trigger a build with: - - ```bash - curl --write-out '\n' --request POST \ - --header "Accept: application/vnd.github+json" \ - --header "Authorization: token $GITHUB_TOKEN" \ - --data "{ \"event_type\": \"deb-pr-packaging: master\", \ - \"client_payload\": { \ - \"buildSha\": \"$(git rev-parse refs/heads/master)\", \ - \"branch\": \"master\", \ - \"baseBranch\": \"master\", - \"baseRef\": \"$(git rev-parse refs/heads/master^)\", - \"user\": \"${USER}\", - \"isTestBuild\": \"true\", - \"force\": \"true\"}" \ - https://api.github.com/repos//keyman/dispatches - ``` - - To trigger a build for PR #1234 in a branch `pr-1234` this would look similar - to this: - - ```bash - curl --write-out '\n' --request POST \ - --header "Accept: application/vnd.github+json" \ - --header "Authorization: token $GITHUB_TOKEN" \ - --data "{ \"event_type\": \"deb-pr-packaging: PR #1234\", \ - \"client_payload\": { \ - \"buildSha\": \"$(git rev-parse refs/heads/pr-1234)\", \ - \"branch\": \"pr-1234\", \ - \"baseBranch\": \"master\", - \"baseRef\": \"$(git rev-parse refs/heads/master)\", - \"user\": \"${USER}\", - \"isTestBuild\": \"true\", - \"force\": \"true\"}" \ - https://api.github.com/repos//keyman/dispatches - ``` diff --git a/core/build.bat b/core/build.bat index 807ca9ba7d..e10066ef10 100644 --- a/core/build.bat +++ b/core/build.bat @@ -133,19 +133,11 @@ if "!COMMAND!" == "build" ( ) if "!COMMAND!" == "test" ( - if /I "%HOST_ARCH%"=="arm64" if /I "%ARCH%"=="arm64" ( - echo === Testing Keyman Core for Windows !ARCH! !BUILDTYPE! === - cd build\!ARCH!\!BUILDTYPE! || exit !errorlevel! - meson test --print-errorlogs %1 %2 %3 %4 %5 %6 %7 %8 %9 || exit !errorlevel! - cd ..\..\.. - shift - ) else ( - echo === Testing Keyman Core for Windows !ARCH! !BUILDTYPE! === - cd build\!ARCH!\!BUILDTYPE! || exit !errorlevel! - meson test --print-errorlogs %1 %2 %3 %4 %5 %6 %7 %8 %9 || exit !errorlevel! - cd ..\..\.. - shift - ) + echo === Testing Keyman Core for Windows !ARCH! !BUILDTYPE! === + cd build\!ARCH!\!BUILDTYPE! || exit !errorlevel! + meson test --print-errorlogs %1 %2 %3 %4 %5 %6 %7 %8 %9 || exit !errorlevel! + cd ..\..\.. + shift ) goto :eof diff --git a/resources/build/ci/cancel-builds/trigger_definitions.mjs b/resources/build/ci/cancel-builds/trigger_definitions.mjs index aef0526688..acd6d1c52a 100644 --- a/resources/build/ci/cancel-builds/trigger_definitions.mjs +++ b/resources/build/ci/cancel-builds/trigger_definitions.mjs @@ -4,7 +4,7 @@ export const testBuildConfigurations = { 'ios': ['Keyman_iOS_TestPullRequests', 'Keyman_iOS_TestSamplesAndTestProjects'], 'linux': ['KeymanLinux_TestPullRequests', 'Keyman_Linux_Test_Integration', 'Keyman_Common_KPAPI_TestPullRequests_Linux', 'deb-pr-packaging_GitHub'], 'mac': ['Keyman_KeymanMac_PullRequests', 'Keyman_Common_KPAPI_TestPullRequests_macOS'], - 'windows': ['KeymanDesktop_TestPullRequests', 'KeymanDesktop_TestPrRenderOnScreenKeyboards', 'Keyman_Common_KPAPI_TestPullRequests_Windows'], + 'windows': ['KeymanDesktop_TestPullRequests', 'KeymanDesktop_TestPrRenderOnScreenKeyboards', 'Keyman_Common_KPAPI_TestPullRequests_Windows', 'core-arm64-test_GitHub'], 'web': ['Keymanweb_TestPullRequests', 'Keyman_Common_KPAPI_TestPullRequests_WASM'], 'developer': ['Keyman_Developer_Test', 'npm-publish_GitHub'], diff --git a/resources/build/ci/trigger-definitions.inc.sh b/resources/build/ci/trigger-definitions.inc.sh index ab08734804..ab3d9cb3a4 100644 --- a/resources/build/ci/trigger-definitions.inc.sh +++ b/resources/build/ci/trigger-definitions.inc.sh @@ -87,7 +87,7 @@ bc_test_android=(KeymanAndroid_TestPullRequests KeymanAndroid_TestSamplesAndTest bc_test_ios=(Keyman_iOS_TestPullRequests Keyman_iOS_TestSamplesAndTestProjects) bc_test_linux=(KeymanLinux_TestPullRequests Keyman_Linux_Test_Integration Keyman_Common_KPAPI_TestPullRequests_Linux deb-pr-packaging_GitHub) bc_test_mac=(Keyman_KeymanMac_PullRequests Keyman_Common_KPAPI_TestPullRequests_macOS) -bc_test_windows=(KeymanDesktop_TestPullRequests KeymanDesktop_TestPrRenderOnScreenKeyboards Keyman_Common_KPAPI_TestPullRequests_Windows) +bc_test_windows=(KeymanDesktop_TestPullRequests KeymanDesktop_TestPrRenderOnScreenKeyboards Keyman_Common_KPAPI_TestPullRequests_Windows core-arm64-test_GitHub) bc_test_web=(Keymanweb_TestPullRequests Keyman_Common_KPAPI_TestPullRequests_WASM) bc_test_developer=(Keyman_Developer_Test Keyman_Test_Developer_Mac Keyman_Test_Developer_Linux npm-publish_GitHub) From b26a2f1ad45012ffb6339f3c4354831998bf37d7 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Fri, 12 Dec 2025 06:11:33 +1100 Subject: [PATCH 55/59] fix(windows): use Thai Kedmanee instead of Arabic 101 in RightAltEmulationCheck.tests.cpp Fixes: #15345 Test-bot: skip --- .../keyman32/RightAltEmulationCheck.cpp | 13 +++++++----- .../tests/RightAltEmulationCheck.tests.cpp | 21 ++++++++++++++----- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/windows/src/engine/keyman32/RightAltEmulationCheck.cpp b/windows/src/engine/keyman32/RightAltEmulationCheck.cpp index 7c1caed8aa..ef10d88aa0 100644 --- a/windows/src/engine/keyman32/RightAltEmulationCheck.cpp +++ b/windows/src/engine/keyman32/RightAltEmulationCheck.cpp @@ -65,7 +65,7 @@ typedef PKBDTABLES_WOW64 (WINAPI *PKBDLAYERDESCRIPTORWOW64FUNC)(VOID); #endif HMODULE LoadKbdLibrary(const char* keyboardLayoutName); -BOOL ReadAltGrFlagFromKbdDll(const char *keyboardLayoutName); +BOOL ReadAltGrFlagFromKbdDll(const char *keyboardLayoutName, BOOL& result); typedef PKBDTABLES (WINAPI *PKBDLAYERDESCRIPTORFUNC)(VOID); @@ -92,14 +92,15 @@ BOOL KeyboardGivesCtrlRAltForRAlt() { char keyboardLayoutName[KL_NAMELENGTH+1]; GetKeyboardLayoutName(keyboardLayoutName); - altGrFlag = ReadAltGrFlagFromKbdDll(keyboardLayoutName); + ReadAltGrFlagFromKbdDll(keyboardLayoutName, altGrFlag); } return altGrFlag; } -BOOL ReadAltGrFlagFromKbdDll(const char *keyboardLayoutName) { - BOOL result = FALSE; +BOOL ReadAltGrFlagFromKbdDll(const char *keyboardLayoutName, BOOL& result) { + BOOL success = FALSE; + result = FALSE; HMODULE hKbdLibrary = LoadKbdLibrary(keyboardLayoutName); if(!hKbdLibrary) { @@ -118,6 +119,7 @@ BOOL ReadAltGrFlagFromKbdDll(const char *keyboardLayoutName) { PKBDTABLES_WOW64 KbdTables = (*KbdLayerDescriptorFunc)(); if(KbdTables) { result = (KbdTables->fLocaleFlags & KLLF_ALTGR) ? TRUE : FALSE; + success = TRUE; } } } else { @@ -130,13 +132,14 @@ BOOL ReadAltGrFlagFromKbdDll(const char *keyboardLayoutName) { PKBDTABLES KbdTables = (*KbdLayerDescriptorFunc)(); if(KbdTables) { result = (KbdTables->fLocaleFlags & KLLF_ALTGR) ? TRUE : FALSE; + success = TRUE; } } } FreeLibrary(hKbdLibrary); - return result; + return success; } HMODULE LoadKbdLibrary(const char* keyboardLayoutName) { diff --git a/windows/src/engine/keyman32/tests/RightAltEmulationCheck.tests.cpp b/windows/src/engine/keyman32/tests/RightAltEmulationCheck.tests.cpp index 7cede5bc9a..abee7c5c10 100644 --- a/windows/src/engine/keyman32/tests/RightAltEmulationCheck.tests.cpp +++ b/windows/src/engine/keyman32/tests/RightAltEmulationCheck.tests.cpp @@ -1,6 +1,6 @@ #include "pch.h" -extern BOOL ReadAltGrFlagFromKbdDll(const char *keyboardLayoutName); +extern BOOL ReadAltGrFlagFromKbdDll(const char *keyboardLayoutName, BOOL& result); TEST(RightAltEmulationCheck, ReadAltGrFlagFromKbdDll) { @@ -9,12 +9,23 @@ TEST(RightAltEmulationCheck, ReadAltGrFlagFromKbdDll) { // a known keyboard layout // These keyboards do not use AltGr + BOOL result = FALSE; - EXPECT_EQ(ReadAltGrFlagFromKbdDll("00000409"), FALSE); // kbdus.dll - English (US) - EXPECT_EQ(ReadAltGrFlagFromKbdDll("00000401"), FALSE); // kbda1.dll - Arabic 101 + // kbdus.dll - English (US) + EXPECT_EQ(ReadAltGrFlagFromKbdDll("00000409", result), TRUE); + EXPECT_EQ(result, FALSE); + + // kbda1.dll - Thai Kedmanee + EXPECT_EQ(ReadAltGrFlagFromKbdDll("0000041e", result), TRUE); + EXPECT_EQ(result, FALSE); // These keyboards use AltGr - EXPECT_EQ(ReadAltGrFlagFromKbdDll("0000040C"), TRUE); // kbdfr.dll - French AZERTY (Legacy) - EXPECT_EQ(ReadAltGrFlagFromKbdDll("00000405"), TRUE); // kbdcz.dll - Czech + // kbdfr.dll - French AZERTY (Legacy) + EXPECT_EQ(ReadAltGrFlagFromKbdDll("0000040C", result), TRUE); + EXPECT_EQ(result, TRUE); + + // kbdcz.dll - Czech + EXPECT_EQ(ReadAltGrFlagFromKbdDll("00000405", result), TRUE); + EXPECT_EQ(result, TRUE); } From a9a62254e70a78f2d3d6c443ce40bd9eb29e3722 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Tue, 16 Dec 2025 19:31:58 +1000 Subject: [PATCH 56/59] feat(windows): pr for running some regression tests --- windows/src/engine/kmtip/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/windows/src/engine/kmtip/README.md b/windows/src/engine/kmtip/README.md index d82c974e62..2e4696f007 100644 --- a/windows/src/engine/kmtip/README.md +++ b/windows/src/engine/kmtip/README.md @@ -9,7 +9,7 @@ it sits between the TSF Manager and Keyman.exe. ### 1. The "Mixed Architecture" Environment -Windows on both amd64(x86-64) and on Arm devices can run applications of differing architectures simultaneously: +Windows on both amd64n(x86-64) and on Arm devices can run applications of differing architectures simultaneously: On amd64 Devices: * **Native x64 apps:** (e.g., Windows Explorer, Notepad, Edge). @@ -43,7 +43,7 @@ the application is 32-bit or 64-bit. ## kmtiparm64x.dll - Arm64 Devices -### Single Registry Entry Problem for the two 64-bit architecture +### Single Registry Entry Problem for the two 64-bit architectures On Windows on Arm there is a problem because there is only a single registry entry for the **64-bit** CLSID. This means it is not possible to register both an From 98cc5e88930bb9fca085661070a50eea82cc1a41 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Wed, 17 Dec 2025 04:46:07 +1100 Subject: [PATCH 57/59] maint(windows): rename action and clarify documentation Build-bot: skip --- .github/workflows/README.md | 36 +++++++------- ...4-test.yml => core-arm64-windows-test.yml} | 47 ++++++++++--------- .../ci/cancel-builds/trigger_definitions.mjs | 2 +- resources/build/ci/trigger-definitions.inc.sh | 2 +- 4 files changed, 46 insertions(+), 41 deletions(-) rename .github/workflows/{core-arm64-test.yml => core-arm64-windows-test.yml} (74%) diff --git a/.github/workflows/README.md b/.github/workflows/README.md index 73e6849c50..0c0420c443 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -13,7 +13,7 @@ TODO # close-linked-issues-for-merged-prs.yml TODO -# core-arm64-test.yml: Test Keyman Core on Windows/ARM64 +# core-arm64-windows-test.yml: Test Keyman Core on Windows/ARM64 This action allows us to test Keyman Core for Windows on ARM64 architecture with a GitHub agent, as we do not have any TeamCity Windows build agents with ARM64 @@ -22,42 +22,40 @@ arch. It will normally be triggered as part of a test build from the resources/teamcity/triggers/trigger-test-builds.sh script. -You can manually trigger a core-arm64-test action on GitHub, e.g. to test changes: +You can manually trigger a core-arm64-windows-test action on GitHub on your fork +of keymanapp/keyman. This is normally only needed to test changes to the action +itself: -- push the changes to your fork of keymanapp/keyman: git push myfork HEAD:master -- make sure you have GHA enabled in the settings of your fork and created an - access token on GitHub +- push the changes to your fork of keymanapp/keyman: `git push myfork HEAD:master` +- make sure you have GHA enabled in the settings of your fork +- seet `GITHUB_TOKEN=` - trigger a build with: ```bash curl --write-out '\n' --request POST \ --header "Accept: application/vnd.github+json" \ --header "Authorization: token $GITHUB_TOKEN" \ - --data "{ \"event_type\": \"core-arm64-test: master\", \ + --data "{ \"event_type\": \"core-arm64-windows-test: master\", \ \"client_payload\": { \ \"buildSha\": \"$(git rev-parse refs/heads/master)\", \ \"branch\": \"master\", \ - \"baseBranch\": \"master\", \ - \"baseRef\": \"$(git rev-parse refs/heads/master^)\", \ \"user\": \"${USER}\", \ \"isTestBuild\": \"true\", \ \"force\": \"true\"}" \ https://api.github.com/repos//keyman/dispatches ``` - To trigger a build for PR #1234 in a branch `pr-1234` this would look similar + To trigger a build for PR #1234 in a branch `my-pr-branch` this would look similar to this: ```bash curl --write-out '\n' --request POST \ --header "Accept: application/vnd.github+json" \ --header "Authorization: token $GITHUB_TOKEN" \ - --data "{ \"event_type\": \"core-arm64-test: PR #1234\", \ + --data "{ \"event_type\": \"core-arm64-windows-test: PR #1234\", \ \"client_payload\": { \ - \"buildSha\": \"$(git rev-parse refs/heads/pr-1234)\", \ - \"branch\": \"pr-1234\", \ - \"baseBranch\": \"master\", \ - \"baseRef\": \"$(git rev-parse refs/heads/master)\", \ + \"buildSha\": \"$(git rev-parse refs/heads/my-pr-branch)\", \ + \"branch\": \"my-pr-branch\", \ \"user\": \"${USER}\", \ \"isTestBuild\": \"true\", \ \"force\": \"true\"}" \ @@ -71,11 +69,13 @@ TODO # deb-packaging.yml: Ubuntu Packaging GitHub Action -You can manually trigger a deb-packaging action on GitHub, e.g. to test changes: +You can manually trigger a deb-packaging action on GitHub on your fork +of keymanapp/keyman. This is normally only needed to test changes to the action +itself: -- push the changes to your fork of keymanapp/keyman: git push myfork HEAD:master -- make sure you have GHA enabled in the settings of your fork and created an - access token on GitHub +- push the changes to your fork of keymanapp/keyman: `git push myfork HEAD:master` +- make sure you have GHA enabled in the settings of your fork +- seet `GITHUB_TOKEN=` - trigger a build with: ```bash diff --git a/.github/workflows/core-arm64-test.yml b/.github/workflows/core-arm64-windows-test.yml similarity index 74% rename from .github/workflows/core-arm64-test.yml rename to .github/workflows/core-arm64-windows-test.yml index 77cb795467..aaf9477cdd 100644 --- a/.github/workflows/core-arm64-test.yml +++ b/.github/workflows/core-arm64-windows-test.yml @@ -1,26 +1,31 @@ # -# This workflow tests Keyman Core on ARM64; we cannot use our TeamCity agents -# because we have no ARM64 Windows agents. +# This workflow tests Keyman Core on ARM64/Windows; we cannot use our TeamCity +# agents because we have no ARM64 Windows agents. # # It is triggered by a repository_dispatch event with the type -# `core-arm64-test:*`. +# `core-arm64-windows-test:*`. # -name: "Keyman Core - ARM64 test" -run-name: "Keyman Core - ARM64 test - ${{ github.event.client_payload.branch }} (branch ${{ github.event.client_payload.baseBranch }}), by @${{ github.event.client_payload.user }}, testbuild: ${{ github.event.client_payload.isTestBuild }}" +name: "Keyman Core - ARM64/Windows test" +run-name: "Keyman Core - ARM64/Windows test - ${{ github.event.client_payload.branch }} by @${{ github.event.client_payload.user }}" on: repository_dispatch: - types: ['core-arm64-test:*'] + types: ['core-arm64-windows-test:*'] - # pull-request: - -# Input: -# buildSha: The SHA of the commit to build, e.g. of the branch or -# refs/pull/1234/head for PR -# branch: The branch to build, for a PR in the form `PR-1234` -# baseBranch: For a PR the base branch, otherwise the same as `branch` -# user: The user that triggered the build or created the PR -# isTestBuild: false for Releases, otherwise true +# Inputs: +# +# buildSha: The SHA of the commit to build, e.g. of the branch or +# refs/pull/1234/head for PR +# isTestBuild: true for PR and test builds, false for release builds +# force: true to run this action on a fork of keymanapp/keyman +# +# Descriptive inputs: +# +# branch: Name of the branch to build, generally, `master`, `beta`, +# `stable-x.y`, or for a PR `#1234`. Used only in the action +# title +# user: The user that triggered the build or created the PR. Used +# only in the action title env: GH_TOKEN: ${{ github.token }} @@ -28,8 +33,8 @@ env: _builder_timings: false jobs: - core-arm64-test: - name: Keyman Core ARM64 test + core-arm64-windows-test: + name: Keyman Core ARM64/Windows test if: github.repository == 'keymanapp/keyman' || github.event.client_payload.force runs-on: windows-11-arm @@ -124,24 +129,24 @@ jobs: set_status: name: Set result status on PR builds - needs: [core-arm64-test] + needs: [core-arm64-windows-test] runs-on: windows-arm64 if: ${{ always() && github.event.client_payload.isTestBuild == 'true' }} steps: - name: Set success - if: needs.core-arm64-test.result == 'success' + if: needs.core-arm64-windows-test.result == 'success' run: | echo "RESULT=success" >> $GITHUB_ENV echo "MSG=Keyman Core ARM64 test succeeded" >> $GITHUB_ENV - name: Set cancelled - if: needs.core-arm64-test.result == 'cancelled' + if: needs.core-arm64-windows-test.result == 'cancelled' run: | echo "RESULT=error" >> $GITHUB_ENV echo "MSG=Keyman Core ARM64 test cancelled" >> $GITHUB_ENV - name: Set failure - if: needs.core-arm64-test.result == 'failure' + if: needs.core-arm64-windows-test.result == 'failure' run: | echo "RESULT=failure" >> $GITHUB_ENV echo "MSG=Keyman Core ARM64 test failed" >> $GITHUB_ENV diff --git a/resources/build/ci/cancel-builds/trigger_definitions.mjs b/resources/build/ci/cancel-builds/trigger_definitions.mjs index acd6d1c52a..4c5728f2c4 100644 --- a/resources/build/ci/cancel-builds/trigger_definitions.mjs +++ b/resources/build/ci/cancel-builds/trigger_definitions.mjs @@ -4,7 +4,7 @@ export const testBuildConfigurations = { 'ios': ['Keyman_iOS_TestPullRequests', 'Keyman_iOS_TestSamplesAndTestProjects'], 'linux': ['KeymanLinux_TestPullRequests', 'Keyman_Linux_Test_Integration', 'Keyman_Common_KPAPI_TestPullRequests_Linux', 'deb-pr-packaging_GitHub'], 'mac': ['Keyman_KeymanMac_PullRequests', 'Keyman_Common_KPAPI_TestPullRequests_macOS'], - 'windows': ['KeymanDesktop_TestPullRequests', 'KeymanDesktop_TestPrRenderOnScreenKeyboards', 'Keyman_Common_KPAPI_TestPullRequests_Windows', 'core-arm64-test_GitHub'], + 'windows': ['KeymanDesktop_TestPullRequests', 'KeymanDesktop_TestPrRenderOnScreenKeyboards', 'Keyman_Common_KPAPI_TestPullRequests_Windows', 'core-arm64-windows-test_GitHub'], 'web': ['Keymanweb_TestPullRequests', 'Keyman_Common_KPAPI_TestPullRequests_WASM'], 'developer': ['Keyman_Developer_Test', 'npm-publish_GitHub'], diff --git a/resources/build/ci/trigger-definitions.inc.sh b/resources/build/ci/trigger-definitions.inc.sh index ab3d9cb3a4..aeded92eb4 100644 --- a/resources/build/ci/trigger-definitions.inc.sh +++ b/resources/build/ci/trigger-definitions.inc.sh @@ -87,7 +87,7 @@ bc_test_android=(KeymanAndroid_TestPullRequests KeymanAndroid_TestSamplesAndTest bc_test_ios=(Keyman_iOS_TestPullRequests Keyman_iOS_TestSamplesAndTestProjects) bc_test_linux=(KeymanLinux_TestPullRequests Keyman_Linux_Test_Integration Keyman_Common_KPAPI_TestPullRequests_Linux deb-pr-packaging_GitHub) bc_test_mac=(Keyman_KeymanMac_PullRequests Keyman_Common_KPAPI_TestPullRequests_macOS) -bc_test_windows=(KeymanDesktop_TestPullRequests KeymanDesktop_TestPrRenderOnScreenKeyboards Keyman_Common_KPAPI_TestPullRequests_Windows core-arm64-test_GitHub) +bc_test_windows=(KeymanDesktop_TestPullRequests KeymanDesktop_TestPrRenderOnScreenKeyboards Keyman_Common_KPAPI_TestPullRequests_Windows core-arm64-windows-test_GitHub) bc_test_web=(Keymanweb_TestPullRequests Keyman_Common_KPAPI_TestPullRequests_WASM) bc_test_developer=(Keyman_Developer_Test Keyman_Test_Developer_Mac Keyman_Test_Developer_Linux npm-publish_GitHub) From c1cd17bc571ab51b7e817011d2c81e0cf3ee5f7f Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Thu, 18 Dec 2025 14:46:10 +1000 Subject: [PATCH 58/59] feat(windows): fix typo --- windows/src/engine/kmtip/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/windows/src/engine/kmtip/README.md b/windows/src/engine/kmtip/README.md index 2e4696f007..2d6a515293 100644 --- a/windows/src/engine/kmtip/README.md +++ b/windows/src/engine/kmtip/README.md @@ -9,7 +9,7 @@ it sits between the TSF Manager and Keyman.exe. ### 1. The "Mixed Architecture" Environment -Windows on both amd64n(x86-64) and on Arm devices can run applications of differing architectures simultaneously: +Windows on both amd64(x86-64) and on Arm devices can run applications of differing architectures simultaneously: On amd64 Devices: * **Native x64 apps:** (e.g., Windows Explorer, Notepad, Edge). From 6243afea0c49ea046e0222bd511502c7535693b8 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Mon, 22 Dec 2025 09:44:55 +1100 Subject: [PATCH 59/59] chore(windows): show architecture in support texteditor Test-bot: skip Build-bot: skip build:windows --- windows/src/support/texteditor/Editor.cpp | 9 ++++++++- windows/src/support/texteditor/Editor.rc | Bin 6934 -> 7126 bytes windows/src/support/texteditor/Resource.h | 4 +++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/windows/src/support/texteditor/Editor.cpp b/windows/src/support/texteditor/Editor.cpp index 4a09fd0947..964dce09a7 100644 --- a/windows/src/support/texteditor/Editor.cpp +++ b/windows/src/support/texteditor/Editor.cpp @@ -33,7 +33,14 @@ wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR UNREFERENCED_PARAMETER(lpCmdLine); // Initialize global strings - LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); +#if defined(_M_ARM64) + LoadStringW(hInstance, IDS_APP_TITLE_ARM64, szTitle, MAX_LOADSTRING); +#elif defined(_M_X64) + LoadStringW(hInstance, IDS_APP_TITLE_X64, szTitle, MAX_LOADSTRING); +#else // x86 + LoadStringW(hInstance, IDS_APP_TITLE_X86, szTitle, MAX_LOADSTRING); +#endif + LoadStringW(hInstance, IDC_EDITOR, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); diff --git a/windows/src/support/texteditor/Editor.rc b/windows/src/support/texteditor/Editor.rc index 8dae7dfe618d082dfc25d49abd54e627c908315f..4708984420a87bec37cbe6f09e900d3cd60da97e 100644 GIT binary patch delta 112 zcmbPccFlalKXLYWh6n}=2D8b%eDd513>pj-ARdF}