summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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
4 files changed, 44 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
// };
//}