summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main.cpp31
-rw-r--r--src/trans/codegen_c.cpp7
-rw-r--r--src/trans/main_bindings.hpp1
-rw-r--r--src/trans/target.cpp12
-rw-r--r--tools/minicargo/build.cpp4
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