diff options
-rw-r--r-- | src/main.cpp | 31 | ||||
-rw-r--r-- | src/trans/codegen_c.cpp | 7 | ||||
-rw-r--r-- | src/trans/main_bindings.hpp | 1 | ||||
-rw-r--r-- | src/trans/target.cpp | 12 | ||||
-rw-r--r-- | tools/minicargo/build.cpp | 4 |
5 files changed, 48 insertions, 7 deletions
diff --git a/src/main.cpp b/src/main.cpp index 2b5b2234..b53bb087 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -183,6 +183,9 @@ struct ProgramParams bool full_validate = false; bool full_validate_early = false; } debug; + struct { + ::std::string emit_build_command; + } codegen; ProgramParams(int argc, char *argv[]); }; @@ -561,6 +564,7 @@ int main(int argc, char *argv[]) // - MIR Exportable (public generic, #[inline], or used by a either of those) // - Require codegen (public or used by an exported function) TransOptions trans_opt; + trans_opt.build_command_file = params.codegen.emit_build_command; trans_opt.opt_level = params.opt_level; for(const char* libdir : params.lib_search_dirs ) { // Store these paths for use in final linking. @@ -705,6 +709,33 @@ ProgramParams::ProgramParams(int argc, char *argv[]) this->libraries.push_back( arg+1 ); } continue ; + case 'C': { + ::std::string optname; + ::std::string optval; + if( arg[1] == '\0' ) { + if( i == argc - 1) { + ::std::cerr << "Option " << arg << " requires an argument" << ::std::endl; + exit(1); + } + optname = argv[++i]; + } + else { + optname = arg+1; + } + auto eq_pos = optname.find('='); + if( eq_pos != ::std::string::npos ) { + optval = optname.substr(eq_pos+1); + optname.resize(eq_pos); + } + + if( optname == "emit-build-command" ) { + this->codegen.emit_build_command = optval; + } + else { + ::std::cerr << "Unknown codegen option: '" << optname << "'" << ::std::endl; + exit(1); + } + } continue; case 'Z': { ::std::string optname; if( arg[1] == '\0' ) { diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp index f970d518..6f728d8f 100644 --- a/src/trans/codegen_c.cpp +++ b/src/trans/codegen_c.cpp @@ -581,7 +581,12 @@ namespace { } //DEBUG("- " << cmd_ss.str()); ::std::cout << "Running comamnd - " << cmd_ss.str() << ::std::endl; - if( system(cmd_ss.str().c_str()) != 0 ) + if( opt.build_command_file != "" ) + { + ::std::cerr << "INVOKE CC: " << cmd_ss.str() << ::std::endl; + ::std::ofstream(opt.build_command_file) << cmd_ss.str() << ::std::endl; + } + else if( system(cmd_ss.str().c_str()) != 0 ) { ::std::cerr << "C Compiler failed to execute" << ::std::endl; abort(); diff --git a/src/trans/main_bindings.hpp b/src/trans/main_bindings.hpp index 59933863..9c3bfd45 100644 --- a/src/trans/main_bindings.hpp +++ b/src/trans/main_bindings.hpp @@ -17,6 +17,7 @@ struct TransOptions { unsigned int opt_level = 0; bool emit_debug_info = false; + ::std::string build_command_file; ::std::vector< ::std::string> library_search_dirs; ::std::vector< ::std::string> libraries; diff --git a/src/trans/target.cpp b/src/trans/target.cpp index 600a8981..a29bbb0e 100644 --- a/src/trans/target.cpp +++ b/src/trans/target.cpp @@ -48,42 +48,42 @@ namespace else if(target_name == "i586-linux-gnu") { return TargetSpec { - "unix", "linux", "gnu", CodegenMode::Gnu11, + "unix", "linux", "gnu", CodegenMode::Gnu11, //"i586-pc-linux-gnu" ARCH_X86 }; } else if(target_name == "x86_64-linux-gnu") { return TargetSpec { - "unix", "linux", "gnu", CodegenMode::Gnu11, + "unix", "linux", "gnu", CodegenMode::Gnu11, //"x86_64-pc-linux-gnu", ARCH_X86_64 }; } else if(target_name == "arm-linux-gnu") { return TargetSpec { - "unix", "linux", "gnu", CodegenMode::Gnu11, + "unix", "linux", "gnu", CodegenMode::Gnu11, //"arm-elf-eabi" ARCH_ARM32 }; } else if(target_name == "x86_64-windows-gnu") { return TargetSpec { - "windows", "windows", "gnu", CodegenMode::Gnu11, + "windows", "windows", "gnu", CodegenMode::Gnu11, //"gcc" ARCH_X86_64 }; } else if (target_name == "x86-windows-msvc") { return TargetSpec { - "windows", "windows", "msvc", CodegenMode::Msvc, + "windows", "windows", "msvc", CodegenMode::Msvc,// "x86", ARCH_X86 }; } //else if (target_name == "x86_64-windows-msvc") //{ // return TargetSpec { - // "windows", "windows", "msvc", CodegenMode::Msvc, + // "windows", "windows", "msvc", CodegenMode::Msvc, // "amd64" // ARCH_X86_64 // }; //} diff --git a/tools/minicargo/build.cpp b/tools/minicargo/build.cpp index 10e17e9c..df897965 100644 --- a/tools/minicargo/build.cpp +++ b/tools/minicargo/build.cpp @@ -585,6 +585,7 @@ bool Builder::build_target(const PackageManifest& manifest, const PackageTarget& } else { args.push_back("--target"); args.push_back(m_opts.target_name); + args.push_back("-C"); args.push_back(format("emit-build-command=",outfile,".sh")); } } args.push_back("-o"); args.push_back(outfile); @@ -650,6 +651,9 @@ bool Builder::build_target(const PackageManifest& manifest, const PackageTarget& } } + // TODO: If emitting command files (i.e. cross-compiling), concatenate the contents of `outfile + ".sh"` onto a + // master file. + // - Will probably want to do this as a final stage after building everything. return this->spawn_process_mrustc(args, ::std::move(env), outfile + "_dbg.txt"); } ::helpers::path Builder::build_build_script(const PackageManifest& manifest, bool is_for_host, bool* out_is_rebuilt) const |