[PATCH 0/1] MR9635: makedep: Allow building modules with C++ sources.
Used in Proton, could be useful in the future for fluidsynth and others. The flags used for compilation are taken from CXXFLAGS + extern libs EXTRACFLAGS (which is CFLAGS without the warnings I think). Some warnings are C-only and we would need to duplicate a lot of WINE_TRY_*FLAGS to make sure whether they work or not with the C++ compiler. The other EXTRACFLAGS are assumed to work with it and it seems that they do. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/9635
From: Rémi Bernon <rbernon(a)codeweavers.com> --- configure.ac | 30 ++++++++++++++++++++++++------ tools/makedep.c | 28 +++++++++++++++++++--------- 2 files changed, 43 insertions(+), 15 deletions(-) diff --git a/configure.ac b/configure.ac index 06a3a820e4c..83de7b5172d 100644 --- a/configure.ac +++ b/configure.ac @@ -94,9 +94,9 @@ AC_ARG_WITH(wine64, AS_HELP_STRING([--with-wine64=DIR],[use the 64-bit Wine i AC_CANONICAL_HOST AC_SUBST(srcdir) -AS_IF([test "x$enable_sast" = xyes],[CC=${CC:-clang} -with_mingw=${with_mingw:-clang} -AC_CHECK_PROGS(SARIF_CONVERTER,sarif-converter,false)]) +AS_IF([test "x$enable_sast" = xyes],[CC=${CC:-clang}; CXX=${CXX:-clang++} + with_mingw=${with_mingw:-clang} + AC_CHECK_PROGS(SARIF_CONVERTER,sarif-converter,false)]) dnl **** Check for some programs **** @@ -147,8 +147,10 @@ case $host in if test x"$wine_cv_thumb2" = xyes then CFLAGS="$CFLAGS -mthumb" + CXXFLAGS="$CXXFLAGS -mthumb" else CFLAGS="$CFLAGS -marm" + CXXFLAGS="$CXXFLAGS -marm" fi AC_CACHE_CHECK([whether $CC supports floating point instructions],wine_cv_float_abi, [WINE_TRY_ASM_LINK(["vmrs r2,fpscr"],,,[wine_cv_float_abi=yes],[wine_cv_float_abi=no])]) @@ -184,7 +186,7 @@ case "$host_cpu" in x86_64) HOST_ARCH=x86_64 ;; esac m4_set_add_all([_AC_SUBST_VARS],[HOST_ARCH]m4_foreach([cpu],[aarch64,arm,arm64ec,i386,x86_64], - [m4_foreach([var],[CC,CFLAGS,EXTRACFLAGS,LDFLAGS,DEBUG,TARGET,STRIP,DELAYLOADFLAG,DISABLED_SUBDIRS],[,cpu[_]var])])) + [m4_foreach([var],[CC,CFLAGS,CXX,CXXFLAGS,EXTRACFLAGS,LDFLAGS,DEBUG,TARGET,STRIP,DELAYLOADFLAG,DISABLED_SUBDIRS],[,cpu[_]var])])) AC_SUBST(toolsdir,[$with_wine_tools]) AC_MSG_CHECKING([for the directory containing the Wine tools]) @@ -387,7 +389,9 @@ AS_VAR_SET_IF([enable_archs], AS_VAR_IF([PE_ARCHS],[none],[cross_archs=]) saved_CC=$CC +saved_CXX=$CXX saved_CFLAGS=$CFLAGS +saved_CXXFLAGS=$CXXFLAGS saved_CPPFLAGS=$CPPFLAGS saved_LDFLAGS=$LDFLAGS @@ -408,27 +412,36 @@ do *) mingw_cpu=$wine_arch ;; esac case "x$with_mingw" in - xclang|x*/clang) AS_VAR_SET(${wine_arch}_CC,$with_mingw) ;; - xllvm-mingw) AS_VAR_SET(${wine_arch}_CC,${mingw_cpu}-w64-mingw32-clang) ;; + xclang|x*/clang) AS_VAR_SET(${wine_arch}_CC,$with_mingw) + AS_VAR_SET(${wine_arch}_CXX,${with_mingw}++) ;; + xllvm-mingw) AS_VAR_SET(${wine_arch}_CC,${mingw_cpu}-w64-mingw32-clang) + AS_VAR_SET(${wine_arch}_CXX,${mingw_cpu}-w64-mingw32-clang++) ;; esac AS_VAR_IF([${wine_arch}_CC],[], [case $wine_arch in aarch64) AC_CHECK_PROGS(aarch64_CC,[aarch64-w64-mingw32-clang aarch64-w64-mingw32-gcc clang],[false]) + AC_CHECK_PROGS(aarch64_CXX,[aarch64-w64-mingw32-clang++ aarch64-w64-mingw32-g++ clang++],[false]) ;; arm64ec) AC_CHECK_PROGS(arm64ec_CC,[arm64ec-w64-mingw32-clang arm64ec-w64-mingw32-gcc clang],[false]) + AC_CHECK_PROGS(arm64ec_CXX,[arm64ec-w64-mingw32-clang++ arm64ec-w64-mingw32-g++ clang++],[false]) ;; arm) AC_CHECK_PROGS(arm_CC,[armv7-w64-mingw32-clang armv7-w64-mingw32-gcc clang],[false]) + AC_CHECK_PROGS(arm_CXX,[armv7-w64-mingw32-clang++ armv7-w64-mingw32-g++ clang++],[false]) ;; i386) ac_prefix_list="m4_foreach([cc],[gcc,clang],m4_foreach([cpu],[i686,i586,i486,i386],[cpu-w64-mingw32-cc ]))" AC_CHECK_PROGS(i386_CC,[$ac_prefix_list clang],[false]) + ac_prefix_list="m4_foreach([cc],[g++,clang++],m4_foreach([cpu],[i686,i586,i486,i386],[cpu-w64-mingw32-cc ]))" + AC_CHECK_PROGS(i386_CXX,[$ac_prefix_list clang++],[false]) ;; x86_64) ac_prefix_list="m4_foreach([cc],[gcc,clang],m4_foreach([cpu],[x86_64,amd64],[cpu-w64-mingw32-cc ]))" AC_CHECK_PROGS(x86_64_CC,[$ac_prefix_list clang],[false]) + ac_prefix_list="m4_foreach([cc],[g++,clang++],m4_foreach([cpu],[x86_64,amd64],[cpu-w64-mingw32-cc ]))" + AC_CHECK_PROGS(x86_64_CXX,[$ac_prefix_list clang++],[false]) ;; esac wine_try_msvc=yes], @@ -436,9 +449,12 @@ do CPPFLAGS="" AS_VAR_SET_IF([${wine_arch}_CFLAGS],[],[AS_VAR_SET([${wine_arch}_CFLAGS],[${CROSSCFLAGS:-"-g -O2"}])]) + AS_VAR_SET_IF([${wine_arch}_CXXFLAGS],[],[AS_VAR_SET([${wine_arch}_CXXFLAGS],[${CROSSCFLAGS:-"-g -O2"}])]) AS_VAR_SET_IF([${wine_arch}_LDFLAGS],[],[AS_VAR_SET([${wine_arch}_LDFLAGS],[$CROSSLDFLAGS])]) AS_VAR_COPY([CC],[${wine_arch}_CC]) + AS_VAR_COPY([CXX],[${wine_arch}_CXX]) AS_VAR_COPY([CFLAGS],[${wine_arch}_CFLAGS]) + AS_VAR_COPY([CXXFLAGS],[${wine_arch}_CXXFLAGS]) AS_VAR_COPY([LDFLAGS],[${wine_arch}_LDFLAGS]) AS_VAR_SET([${wine_arch}_EXTRACFLAGS],["-D__WINE_PE_BUILD -Wall"]) @@ -636,7 +652,9 @@ This is an error since --enable-archs=$wine_arch was requested.])]) done CC=$saved_CC +CXX=$saved_CXX CFLAGS=$saved_CFLAGS +CXXFLAGS=$saved_CXXFLAGS CPPFLAGS=$saved_CPPFLAGS LDFLAGS=$saved_LDFLAGS diff --git a/tools/makedep.c b/tools/makedep.c index 4e73894c933..52e8baf1403 100644 --- a/tools/makedep.c +++ b/tools/makedep.c @@ -165,6 +165,7 @@ static const char *make_xftmpl; static const char *sfnt2fon; static const char *winebuild; static const char *winegcc; +static const char *winegxx; static const char *widl; static const char *wrc; static const char *wmc; @@ -214,6 +215,7 @@ struct makefile const char *staticlib; const char *importlib; const char *unixlib; + int has_cxx; int data_only; int is_win16; int is_exe; @@ -1236,6 +1238,7 @@ static const struct } parse_functions[] = { { ".c", parse_c_file }, + { ".cpp", parse_c_file }, { ".h", parse_c_file }, { ".inl", parse_c_file }, { ".l", parse_c_file }, @@ -2621,7 +2624,7 @@ static const char *cmd_prefix( const char *cmd ) */ static void output_winegcc_command( struct makefile *make, unsigned int arch ) { - output( "\t%s%s -o $@", cmd_prefix( "CCLD" ), winegcc ); + output( "\t%s%s -o $@", cmd_prefix( "CCLD" ), make->has_cxx ? winegxx : winegcc ); output_filename( "--wine-objdir ." ); if (tools_dir) { @@ -3281,7 +3284,7 @@ static void output_source_testdll( struct makefile *make, struct incl_file *sour if (res_name) output_filename( res_name ); output_filenames( dep_libs ); output_filename( winebuild ); - output_filename( winegcc ); + output_filename( make->has_cxx ? winegxx : winegcc ); output( "\n" ); output_winegcc_command( make, link_arch ); output_filename( "-s" ); @@ -3333,11 +3336,13 @@ 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, *var_cc, *var_cflags; + const int is_cxx = strendswith( source->name, ".cpp" ); + const char *obj_name, *var_cc, *var_cxx, *var_cflags, *var_cxxflags; struct compile_command *cmd; struct strarray cflags = empty_strarray; if (make->disabled[arch] && !(source->file->flags & FLAG_C_IMPLIB)) return; + make->has_cxx |= is_cxx; if (arch) { @@ -3373,15 +3378,19 @@ static void output_source_one_arch( struct makefile *make, struct incl_file *sou if ((source->file->flags & FLAG_ARM64EC_X64) && !strcmp( archs.str[arch], "arm64ec" )) { var_cc = "$(x86_64_CC)"; + var_cxx = "$(x86_64_CXX)"; var_cflags = "$(x86_64_CFLAGS)"; + var_cxxflags = "$(x86_64_CXXFLAGS)"; strarray_add( &cflags, "-D__arm64ec_x64__" ); strarray_addall( &cflags, get_expanded_make_var_array( top_makefile, "x86_64_EXTRACFLAGS" )); } else { var_cc = arch_make_variable( "CC", arch ); + var_cxx = arch_make_variable( "CXX", arch ); var_cflags = arch_make_variable( "CFLAGS", arch ); - strarray_addall( &cflags, make->extlib ? extra_cflags_extlib[arch] : extra_cflags[arch] ); + var_cxxflags = arch_make_variable( "CXXFLAGS", arch ); + strarray_addall( &cflags, make->extlib || is_cxx ? extra_cflags_extlib[arch] : extra_cflags[arch] ); } if (!arch) @@ -3409,10 +3418,10 @@ static void output_source_one_arch( struct makefile *make, struct incl_file *sou } output( "%s: %s\n", obj_dir_path( make, obj_name ), source->filename ); - output( "\t%s%s -c -o $@ %s", cmd_prefix( "CC" ), var_cc, source->filename ); + output( "\t%s%s -c -o $@ %s", cmd_prefix( is_cxx ? "CXX" : "CC" ), is_cxx ? var_cxx : var_cc, source->filename ); output_filenames( defines ); output_filenames( cflags ); - output_filename( var_cflags ); + output_filename( is_cxx ? var_cxxflags : var_cflags ); output( "\n" ); if (make->testdll && strendswith( source->name, ".c" ) && @@ -3559,7 +3568,7 @@ static void output_fake_module( struct makefile *make, const char *spec_file ) if (spec_file) output_filename( spec_file ); output_filenames_obj_dir( make, make->res_files[arch] ); output_filename( winebuild ); - output_filename( winegcc ); + output_filename( make->has_cxx ? winegxx : winegcc ); output( "\n" ); output_winegcc_command( make, arch ); output_filename( "-Wb,--fake-module" ); @@ -3639,7 +3648,7 @@ static void output_module( struct makefile *make, unsigned int arch ) output_filenames_obj_dir( make, make->res_files[arch] ); output_filenames( dep_libs ); output_filename( winebuild ); - output_filename( winegcc ); + output_filename( make->has_cxx ? winegxx : winegcc ); output( "\n" ); output_winegcc_command( make, link_arch ); if (arch) output_filename( "-Wl,--wine-builtin" ); @@ -3714,7 +3723,7 @@ static void output_unix_lib( struct makefile *make ) output_filenames_obj_dir( make, make->unixobj_files ); output_filenames( unix_deps ); output( "\n" ); - output( "\t%s$(CC) -o $@", cmd_prefix( "CCLD" )); + output( "\t%s%s -o $@", cmd_prefix( "CCLD" ), make->has_cxx ? "$(CXX)" : "$(CC)" ); output_filenames( get_expanded_make_var_array( make, "UNIXLDFLAGS" )); output_filenames_obj_dir( make, make->unixobj_files ); output_filenames( unix_libs ); @@ -4770,6 +4779,7 @@ int main( int argc, char *argv[] ) sfnt2fon = tools_path( "sfnt2fon" ); winebuild = tools_path( "winebuild" ); winegcc = tools_path( "winegcc" ); + winegxx = strmake( "%s/%s%s", tools_dir_path( "winegcc" ), "wineg++", tools_ext ); widl = tools_path( "widl" ); wrc = tools_path( "wrc" ); wmc = tools_path( "wmc" ); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9635
participants (1)
-
Rémi Bernon