diff --git a/Cabal/src/Distribution/Compat/Environment.hs b/Cabal/src/Distribution/Compat/Environment.hs index ffe278bcc54..8cc9d582ad9 100644 --- a/Cabal/src/Distribution/Compat/Environment.hs +++ b/Cabal/src/Distribution/Compat/Environment.hs @@ -63,7 +63,7 @@ setEnv_ key value = withCWString key $ \k -> withCWString value $ \v -> do {- FOURMOLU_DISABLE -} # if defined(i386_HOST_ARCH) # define WINDOWS_CCONV stdcall -# elif defined(x86_64_HOST_ARCH) +# elif defined(x86_64_HOST_ARCH) || defined(aarch64_HOST_ARCH) # define WINDOWS_CCONV ccall # else # error Unknown mingw32 arch diff --git a/Cabal/src/Distribution/Simple/Build/PathsModule.hs b/Cabal/src/Distribution/Simple/Build/PathsModule.hs index 892e5bd384f..dc8348f6396 100644 --- a/Cabal/src/Distribution/Simple/Build/PathsModule.hs +++ b/Cabal/src/Distribution/Simple/Build/PathsModule.hs @@ -51,6 +51,7 @@ generatePathsModule pkg_descr lbi clbi = , Z.zIsWindows = isWindows , Z.zIsI386 = buildArch == I386 , Z.zIsX8664 = buildArch == X86_64 + , Z.zIsAarch64 = buildArch == AArch64 , Z.zNot = not , Z.zManglePkgName = showPkgName , Z.zPrefix = show flat_prefix diff --git a/Cabal/src/Distribution/Simple/Build/PathsModule/Z.hs b/Cabal/src/Distribution/Simple/Build/PathsModule/Z.hs index ad979c42951..7c36c4ce507 100644 --- a/Cabal/src/Distribution/Simple/Build/PathsModule/Z.hs +++ b/Cabal/src/Distribution/Simple/Build/PathsModule/Z.hs @@ -12,6 +12,7 @@ data Z zIsWindows :: Bool, zIsI386 :: Bool, zIsX8664 :: Bool, + zIsAarch64 :: Bool, zPrefix :: FilePath, zBindir :: FilePath, zLibdir :: FilePath, @@ -284,9 +285,16 @@ render z_root = execWriter $ do tell " c_GetModuleFileName :: Ptr () -> CWString -> Int32 -> IO Int32\n" return () else do - tell "-- win32 supported only with I386, X86_64\n" - tell "c_GetModuleFileName :: Ptr () -> CWString -> Int32 -> IO Int32\n" - tell "c_GetModuleFileName = _\n" + if (zIsAarch64 z_root) + then do + tell "foreign import ccall unsafe \"windows.h GetModuleFileNameW\"\n" + tell " c_GetModuleFileName :: Ptr () -> CWString -> Int32 -> IO Int32\n" + return () + else do + tell "-- win32 supported only with I386, X86_64, Aarch64\n" + tell "c_GetModuleFileName :: Ptr () -> CWString -> Int32 -> IO Int32\n" + tell "c_GetModuleFileName = _\n" + return () return () return () tell "\n" diff --git a/cabal-dev-scripts/src/GenPathsModule.hs b/cabal-dev-scripts/src/GenPathsModule.hs index 46ef779e2af..ca7380c74df 100644 --- a/cabal-dev-scripts/src/GenPathsModule.hs +++ b/cabal-dev-scripts/src/GenPathsModule.hs @@ -32,6 +32,7 @@ $(capture "decls" [d| , zIsWindows :: Bool , zIsI386 :: Bool , zIsX8664 :: Bool + , zIsAarch64 :: Bool , zPrefix :: FilePath , zBindir :: FilePath diff --git a/cabal-install/src/Distribution/Client/Compat/ExecutablePath.hs b/cabal-install/src/Distribution/Client/Compat/ExecutablePath.hs index e805c110d60..fa989a6bd0f 100644 --- a/cabal-install/src/Distribution/Client/Compat/ExecutablePath.hs +++ b/cabal-install/src/Distribution/Client/Compat/ExecutablePath.hs @@ -123,7 +123,7 @@ getExecutablePath = readSymbolicLink $ "/proc/self/exe" # if defined(i386_HOST_ARCH) # define WINDOWS_CCONV stdcall -# elif defined(x86_64_HOST_ARCH) +# elif defined(x86_64_HOST_ARCH) || defined(aarch64_HOST_ARCH) # define WINDOWS_CCONV ccall # else # error Unknown mingw32 arch diff --git a/changelog.d/pr-10705 b/changelog.d/pr-10705 new file mode 100644 index 00000000000..e150428ca27 --- /dev/null +++ b/changelog.d/pr-10705 @@ -0,0 +1,8 @@ +--- +synopsis: 'Add support for Windows Aarch64' +packages: [Cabal, cabal-install] +prs: 10705 +--- + +Adds to preprocessor branches the option to support `aarch64_HOST_ARCH` platform on Windows Aarch64 target. +`ccall` convention is used at Aarch64, same as for `x86_64_HOST_ARCH`. Introduce `zIsAarch64` to make paths generation support Windows Aarch64 target. diff --git a/templates/Paths_pkg.template.hs b/templates/Paths_pkg.template.hs index bea7d6813e3..0f0017868ae 100644 --- a/templates/Paths_pkg.template.hs +++ b/templates/Paths_pkg.template.hs @@ -152,10 +152,13 @@ getPrefixDirRel dirRel = try_size 2048 -- plenty, PATH_MAX is 512 under Win32. foreign import stdcall unsafe "windows.h GetModuleFileNameW" c_GetModuleFileName :: Ptr () -> CWString -> Int32 -> IO Int32 {% elif isX8664 %} +foreign import ccall unsafe "windows.h GetModuleFileNameW" + c_GetModuleFileName :: Ptr () -> CWString -> Int32 -> IO Int32 +{% elif isAarch64 %} foreign import ccall unsafe "windows.h GetModuleFileNameW" c_GetModuleFileName :: Ptr () -> CWString -> Int32 -> IO Int32 {% else %} --- win32 supported only with I386, X86_64 +-- win32 supported only with I386, X86_64, Aarch64 c_GetModuleFileName :: Ptr () -> CWString -> Int32 -> IO Int32 c_GetModuleFileName = _ {% endif %}