On 13 Nov 2023, at 16:18, Arnaud Charlet <[email protected]> wrote:
>
>>>>> OK, I thought there would be some defines that we could use for that, too
>>>>> bad if there isn't
>>>>> and indeed we might need to perform another runtime check then as
>>>>> suggested by Iain.
>>>>
>>>> I can see a possible interface, operatingSystemVersion in NSProcessInfo.h
>>>> - Objective C
>>>> needed, I think
>>>
>>> Some of the NS interfaces are available to regular C (e.g. stuff in
>>> CoreFoundation), and I am
>>> fairly/very sure that we will be able to find a machanism that does not
>>> involve introducing an
>>> ObjC dep. [I am obvioulsy not in any way against ObjC - since i’m the
>>> maintainer ;) .. but it
>>> seems heavyweight for solving this issue].
>>
>> It certainly would be heavyweight, since TargetConditionals.h includes
>> TARGET_OS_OSX,
>> which is 1 if we’re compiling for macOS and 0 otherwise (there’s a useful
>> chart at :83 in the
>> MacOSX13.1 SDK).
>>
>> Two ways ahead here:
>> (1) just replace the current __arm__, __arm64__ test with this
>
> That would be fine here (replace refs to *arm* by TARGET_OS_OSX), since this
> was my original
> suggestion (copied at the top of this email).
>
>> (2) as 1, but implement the runtime test for case sensitivity only for macOS
>>
>> Whether (2) is acceptable depends, I suppose, on what issues Iain
>> encountered on Darwin 9
>> & Darwin 17. I’ll be content to go with (1).
I'm not sure whether this should have been a new [PATCH V2] thread?
Also, should the test code below (between %%%) be included in the
testsuite?
--8<--
In gcc/ada/adaint.c(__gnat_get_file_names_case_sensitive), the
current assumption for __APPLE__ is that file names are
case-insensitive unless __arm__ or __arm64__ are defined, in which
case file names are declared case-sensitive.
The associated comment is
"By default, we suppose filesystems aren't case sensitive on
Windows and Darwin (but they are on arm-darwin)."
This means that on aarch64-apple-darwin, file names are treated as
case-sensitive, which is not the default case.
Apple provide a header file <TargetConditionals.h> which permits a
compile-time check for the compiler target (e.g. OSX vs IOS). At Darwin
10.5 (Xcode 3) iOS wasn't supported, so it was adequate to check
TARGET_OS_MAC; nowadays, that covers many variants including macOS
and iOS, so one needs to check whether TARGET_OS_OSX is defined, and
if so whether it's set.
Bootstrapped on x86_64-apple-darwin with languages c,c++,ada and regression
tested (check-ada).
Likewise bootstrapped on aarch64-apple-darwin from the Github sources
corresponding to GCC 2023-11-05.
__gnat_get_file_names_case_sensitive() isn't exported to user code, so
implemented check code as below: each compiler (x86_64-apple-darwin and
aarch64-apple-darwin) reported that file names were not case sensitive.
%%%
with Ada.Text_IO;
with Interfaces.C;
procedure Check_Case_Sensitivity is
type C_Boolean is (False, True)
with Convention => C;
function Get_File_Names_Case_Sensitive return C_Boolean
with
Import,
Convention => C,
External_Name => "__gnat_get_file_names_case_sensitive";
begin
Ada.Text_IO.Put_Line ("GNAT thinks file names are " &
(case Get_File_Names_Case_Sensitive is
when False => "not case sensitive",
when True => "case sensitive"));
end Check_Case_Sensitivity;
%%%
gcc/ada/Changelog:
2023-11-16 Simon Wright <[email protected]>
* gcc/ada/adaint.c
(__gnat_get_file_names_case_sensitive): Split out the __APPLE__
check and remove the checks for __arm__, __arm64__.
File names are by default case sensitive unless TARGET_OS_OSX
(or if this is an older OS release, in which case TARGET_OS_OSX
is undefined, TARGET_OS_MAC) is set.
Signed-off-by: Simon Wright <[email protected]>
---
gcc/ada/adaint.c | 21 +++++++++++++++++----
1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/gcc/ada/adaint.c b/gcc/ada/adaint.c
index bb4ed2607e5..1ef529ec20b 100644
--- a/gcc/ada/adaint.c
+++ b/gcc/ada/adaint.c
@@ -84,7 +84,7 @@
#endif /* VxWorks */
#if defined (__APPLE__)
-#include <unistd.h>
+#include <TargetConditionals.h>
#endif
#if defined (__hpux__)
@@ -613,12 +613,25 @@ __gnat_get_file_names_case_sensitive (void)
else
{
/* By default, we suppose filesystems aren't case sensitive on
- Windows and Darwin (but they are on arm-darwin). */
-#if defined (WINNT) || defined (__DJGPP__) \
- || (defined (__APPLE__) && !(defined (__arm__) || defined (__arm64__)))
+ Windows or DOS. */
+#if defined (WINNT) || defined (__DJGPP__)
+ file_names_case_sensitive_cache = 0;
+#elif defined (__APPLE__)
+ /* By default, macOS volumes are case-insensitive, iOS
+ volumes are case-sensitive. */
+#if defined (TARGET_OS_OSX) /* In recent SDK. */
+#if TARGET_OS_OSX /* macOS. */
file_names_case_sensitive_cache = 0;
#else
file_names_case_sensitive_cache = 1;
+#endif
+#elif TARGET_OS_MAC /* macOS, in older SDK. */
+ file_names_case_sensitive_cache = 0;
+#else
+ file_names_case_sensitive_cache = 1;
+#endif
+#else /* Neither Windows nor Apple. */
+ file_names_case_sensitive_cache = 1;
#endif
}
}
--
2.39.3 (Apple Git-145)