makefiles: Support building files for x86-64 architecture on ARM64EC.

Based on a patch by Jacek Caban.
This commit is contained in:
Alexandre Julliard 2024-04-30 14:52:35 +02:00
parent 27f5470ff4
commit 3e2a999013
3 changed files with 51 additions and 8 deletions

19
configure vendored
View file

@ -10310,7 +10310,16 @@ saved_CC=$CC
saved_CFLAGS=$CFLAGS
saved_LDFLAGS=$LDFLAGS
for wine_arch in $cross_archs
{ extra_arch=; unset extra_arch;}
for arch in $cross_archs
do
case $arch in
arm64ec) test ${extra_arch+y} || extra_arch=x86_64 ;;
x86_64) extra_arch="" ;;
esac
done
for wine_arch in $cross_archs $extra_arch
do
case "x$with_mingw" in
xclang|x*/clang) eval "${wine_arch}_CC=\$with_mingw" ;;
@ -10840,7 +10849,13 @@ fi
fi
fi
as_fn_append PE_ARCHS " $wine_arch"
if test "x$wine_arch" = x$extra_arch
then :
else $as_nop
as_fn_append PE_ARCHS " $wine_arch"
fi
{ as_ac_var=`printf "%s\n" "ac_cv_${wine_arch}_cflags_-fno-strict-aliasing" | $as_tr_sh`
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -fno-strict-aliasing" >&5
printf %s "checking whether $CC supports -fno-strict-aliasing... " >&6; }

View file

@ -793,7 +793,16 @@ saved_CC=$CC
saved_CFLAGS=$CFLAGS
saved_LDFLAGS=$LDFLAGS
for wine_arch in $cross_archs
AS_UNSET(extra_arch)
for arch in $cross_archs
do
case $arch in
arm64ec) test ${extra_arch+y} || extra_arch=x86_64 ;;
x86_64) extra_arch="" ;;
esac
done
for wine_arch in $cross_archs $extra_arch
do
case "x$with_mingw" in
xclang|x*/clang) AS_VAR_SET(${wine_arch}_CC,$with_mingw) ;;
@ -925,7 +934,8 @@ This is an error since --enable-archs=$wine_arch was requested.])])
This is an error since --enable-archs=$wine_arch was requested.])])
continue])])
AS_VAR_APPEND([PE_ARCHS],[" $wine_arch"])
AS_VAR_IF([wine_arch],[$extra_arch],[],[AS_VAR_APPEND([PE_ARCHS],[" $wine_arch"])])
WINE_TRY_PE_CFLAGS([-fno-strict-aliasing])
dnl clang needs to be told to fail on unknown options
WINE_TRY_PE_CFLAGS([-Werror=unknown-warning-option],[CFLAGS="$CFLAGS -Werror=unknown-warning-option"])

View file

@ -101,6 +101,7 @@ struct incl_file
#define FLAG_C_IMPLIB 0x040000 /* file is part of an import library */
#define FLAG_C_UNIX 0x080000 /* file is part of a Unix library */
#define FLAG_SFD_FONTS 0x100000 /* sfd file generated bitmap fonts */
#define FLAG_ARM64EC_X64 0x200000 /* use x86_64 object on ARM64EC */
static const struct
{
@ -984,6 +985,7 @@ static void parse_pragma_directive( struct file *source, char *str )
{
if (!strcmp( flag, "implib" )) source->flags |= FLAG_C_IMPLIB;
if (!strcmp( flag, "unix" )) source->flags |= FLAG_C_UNIX;
if (!strcmp( flag, "arm64ec_x64" )) source->flags |= FLAG_ARM64EC_X64;
}
}
}
@ -3185,7 +3187,8 @@ static void output_source_one_arch( struct makefile *make, struct incl_file *sou
struct strarray defines, struct strarray *targets,
unsigned int arch )
{
const char *obj_name;
const char *obj_name, *var_cc, *var_cflags;
struct strarray arch_cflags = empty_strarray;
if (make->disabled[arch] && !(source->file->flags & FLAG_C_IMPLIB)) return;
@ -3216,11 +3219,26 @@ static void output_source_one_arch( struct makefile *make, struct incl_file *sou
else
strarray_add( &make->clean_files, obj_name );
if ((source->file->flags & FLAG_ARM64EC_X64) && !strcmp( archs.str[arch], "arm64ec" ))
{
var_cc = "$(x86_64_CC)";
var_cflags = "$(x86_64_CFLAGS)";
strarray_add( &arch_cflags, "-D__arm64ec_x64__" );
strarray_addall( &arch_cflags, get_expanded_make_var_array( top_makefile, "x86_64_EXTRACFLAGS" ));
}
else
{
var_cc = arch_make_variable( "CC", arch );
var_cflags = arch_make_variable( "CFLAGS", arch );
strarray_addall( &arch_cflags, make->extlib ? extra_cflags_extlib[arch] : extra_cflags[arch] );
}
output( "%s: %s\n", obj_dir_path( make, obj_name ), source->filename );
output( "\t%s%s -c -o $@ %s", cmd_prefix( "CC" ), arch_make_variable( "CC", arch ), source->filename );
output( "\t%s%s -c -o $@ %s", cmd_prefix( "CC" ), var_cc, source->filename );
output_filenames( defines );
if (!source->use_msvcrt) output_filenames( make->unix_cflags );
output_filenames( make->extlib ? extra_cflags_extlib[arch] : extra_cflags[arch] );
output_filenames( arch_cflags );
if (!arch)
{
if (source->file->flags & FLAG_C_UNIX)
@ -3241,7 +3259,7 @@ static void output_source_one_arch( struct makefile *make, struct incl_file *sou
}
output_filenames( cpp_flags );
output_filename( arch_make_variable( "CFLAGS", arch ));
output_filename( var_cflags );
output( "\n" );
if (make->testdll && strendswith( source->name, ".c" ) &&