diff --git a/mjit_worker.c b/mjit_worker.c index 145ad54383..49903f2cd4 100644 --- a/mjit_worker.c +++ b/mjit_worker.c @@ -855,30 +855,45 @@ make_pch(void) } // Compile .c file to .so file. It returns true if it succeeds. (non-mswin) +// Not compiling .c to .so directly because it fails on MinGW. static bool compile_c_to_so(const char *c_file, const char *so_file) { - const char *options[] = { - "-o", so_file, c_file, + char* o_file = alloca(strlen(c_file) + 1); + strcpy(o_file, c_file); + o_file[strlen(c_file) - 1] = 'o'; + + const char *o_args[] = { + "-o", o_file, c_file, # ifdef __clang__ "-include-pch", pch_file, # endif + "-c", NULL + }; + char **args = form_args(5, cc_common_args, CC_CODEFLAG_ARGS, cc_added_args, o_args, CC_LINKER_ARGS); + if (args == NULL) return false; + int exit_code = exec_process(cc_path, args); + free(args); + if (exit_code != 0) { + verbose(2, "compile_c_to_so: failed to compile .c to .o: %d", exit_code); + return false; + } + + const char *so_args[] = { + "-o", so_file, # ifdef _WIN32 libruby_pathflag, # endif - NULL + o_file, NULL }; - - char **args = form_args(7, CC_LDSHARED_ARGS, CC_CODEFLAG_ARGS, cc_added_args, - options, CC_LIBS, CC_DLDFLAGS_ARGS, CC_LINKER_ARGS); - if (args == NULL) - return false; - - int exit_code = exec_process(cc_path, args); + args = form_args(6, CC_LDSHARED_ARGS, CC_CODEFLAG_ARGS, so_args, CC_LIBS, CC_DLDFLAGS_ARGS, CC_LINKER_ARGS); + if (args == NULL) return false; + exit_code = exec_process(cc_path, args); free(args); - - if (exit_code != 0) - verbose(2, "compile_c_to_so: compile error: %d", exit_code); + if (!mjit_opts.save_temps) remove_file(o_file); + if (exit_code != 0) { + verbose(2, "compile_c_to_so: failed to link .o to .so: %d", exit_code); + } return exit_code == 0; } diff --git a/test/lib/jit_support.rb b/test/lib/jit_support.rb index 60944527f3..4232f01a8e 100644 --- a/test/lib/jit_support.rb +++ b/test/lib/jit_support.rb @@ -56,7 +56,7 @@ module JITSupport return @supported if defined?(@supported) @supported = RbConfig::CONFIG["MJIT_SUPPORT"] != 'no' && UNSUPPORTED_COMPILERS.all? do |regexp| !regexp.match?(RbConfig::CONFIG['MJIT_CC']) - end && !appveyor_pdb_corrupted? && !PENDING_RUBYCI_NICKNAMES.include?(ENV['RUBYCI_NICKNAME']) && /mingw/ !~ RUBY_PLATFORM # TODO: remove mingw exclusion after investigation + end && !appveyor_pdb_corrupted? && !PENDING_RUBYCI_NICKNAMES.include?(ENV['RUBYCI_NICKNAME']) end # AppVeyor's Visual Studio 2013 / 2015 are known to spuriously generate broken pch / pdb, like: