Changes in driver/cfa.cc [36de20d:67bfc50]
- File:
-
- 1 edited
-
driver/cfa.cc (modified) (17 diffs)
Legend:
- Unmodified
- Added
- Removed
-
driver/cfa.cc
r36de20d r67bfc50 10 10 // Created On : Tue Aug 20 13:44:49 2002 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Aug 16 23:05:59202013 // Update Count : 4 4712 // Last Modified On : Thu Aug 13 17:22:02 2020 13 // Update Count : 435 14 14 // 15 15 16 16 #include <iostream> 17 #include <cstdio> // perror 18 #include <cstdlib> // putenv, exit 19 #include <climits> // PATH_MAX 20 #include <string> // STL version 21 #include <algorithm> // find 22 23 #include <unistd.h> // execvp 17 #include <cstdio> // perror 18 #include <cstdlib> // putenv, exit 19 #include <climits> // PATH_MAX 20 #include <unistd.h> // execvp 21 #include <string> // STL version 22 #include <string.h> // strcmp 23 #include <algorithm> // find 24 24 25 #include <sys/types.h> 25 26 #include <sys/stat.h> … … 33 34 using std::to_string; 34 35 35 //#define __DEBUG_H__ 36 37 #define xstr(s) str(s) 38 #define str(s) #s 39 40 static string __CFA_FLAGPREFIX__( "__CFA_FLAG" ); // "__CFA_FLAG__=" suffix 41 42 static void Putenv( char * argv[], string arg ) { 36 // #define __DEBUG_H__ 37 38 // "N__=" suffix 39 static string __CFA_FLAGPREFIX__( "__CFA_FLAG" ); 40 41 void Putenv( char * argv[], string arg ) { 43 42 // environment variables must have unique names 44 43 static int flags = 0; … … 50 49 } // Putenv 51 50 52 static bool prefix( const string & arg, const string & pre ) { // check if string has prefix 51 // check if string has prefix 52 bool prefix( const string & arg, const string & pre ) { 53 53 return arg.substr( 0, pre.size() ) == pre; 54 54 } // prefix 55 55 56 staticinline bool ends_with(const string & str, const string & sfix) {56 inline bool ends_with(const string & str, const string & sfix) { 57 57 if (sfix.size() > str.size()) return false; 58 58 return std::equal(str.rbegin(), str.rbegin() + sfix.size(), sfix.rbegin(), sfix.rend()); … … 60 60 61 61 // check if string has suffix 62 staticbool suffix( const string & arg ) {62 bool suffix( const string & arg ) { 63 63 enum { NumSuffixes = 3 }; 64 64 static const string suffixes[NumSuffixes] = { "cfa", "hfa", "ifa" }; … … 70 70 } // suffix 71 71 72 72 73 static inline bool dirExists( const string & path ) { // check if directory exists 73 74 struct stat info; … … 78 79 static inline string dir(const string & path) { 79 80 return path.substr(0, path.find_last_of('/')); 80 } // dir81 } 81 82 82 83 // Different path modes … … 117 118 } 118 119 120 121 #define xstr(s) str(s) 122 #define str(s) #s 119 123 120 124 int main( int argc, char * argv[] ) { … … 154 158 PathMode path = FromProc(); 155 159 156 const char * args[argc + 100]; // cfa command line values, plus some space for additional flags160 const char *args[argc + 100]; // cfa command line values, plus some space for additional flags 157 161 int sargs = 1; // starting location for arguments in args list 158 162 int nargs = sargs; // number of arguments in args list; 0 => command name 159 163 160 const char * libs[argc + 20]; // non-user libraries must come separately, plus some added libraries and flags164 const char *libs[argc + 20]; // non-user libraries must come separately, plus some added libraries and flags 161 165 int nlibs = 0; 162 166 … … 181 185 args[nargs++] = argv[i]; // pass argument along 182 186 if ( arg == "-o" ) o_file = i; // remember file 183 184 // CFA specific arguments185 186 187 } else if ( strncmp(arg.c_str(), "-XCFA", 5) == 0 ) { // CFA pass through 187 188 if ( arg.size() == 5 ) { … … 202 203 } else if ( arg == "-nodebug" ) { 203 204 debug = false; // strip the nodebug flag 205 } else if ( arg == "-nolib" ) { 206 nolib = true; // strip the nodebug flag 204 207 } else if ( arg == "-quiet" ) { 205 208 quiet = true; // strip the quiet flag 206 209 } else if ( arg == "-noquiet" ) { 207 210 quiet = false; // strip the noquiet flag 208 } else if ( arg == "-no-include-stdhdr" ) {209 noincstd_flag = true; // strip the no-include-stdhdr flag210 } else if ( arg == "-nolib" ) {211 nolib = true; // strip the nolib flag212 211 } else if ( arg == "-help" ) { 213 212 help = true; // strip the help flag 214 213 } else if ( arg == "-nohelp" ) { 215 214 help = false; // strip the nohelp flag 215 } else if ( arg == "-no-include-stdhdr" ) { 216 noincstd_flag = true; // strip the no-include-stdhdr flag 216 217 } else if ( arg == "-cfalib") { 217 218 compiling_libs = true; … … 335 336 string libbase; 336 337 switch(path) { 337 case Installed:338 case Installed: 338 339 args[nargs++] = "-I" CFA_INCDIR; 339 340 // do not use during build … … 345 346 libbase = CFA_LIBDIR; 346 347 break; 347 case BuildTree:348 case Distributed:348 case BuildTree: 349 case Distributed: 349 350 args[nargs++] = "-I" TOP_SRCDIR "libcfa/src"; 350 351 // do not use during build … … 380 381 string libdir = libbase + arch + "-" + config; 381 382 382 if ( path != Distributed) {383 if (path != Distributed) { 383 384 if ( ! nolib && ! dirExists( libdir ) ) { 384 385 cerr << argv[0] << " internal error, configuration " << config << " not installed." << endl; … … 400 401 string preludedir; 401 402 switch(path) { 402 case Installed : preludedir = libdir; break;403 case BuildTree : preludedir = libdir + "/prelude"; break;404 case Distributed : preludedir = dir(argv[0]); break;405 } // switch403 case Installed : preludedir = libdir; break; 404 case BuildTree : preludedir = libdir + "/prelude"; break; 405 case Distributed : preludedir = dir(argv[0]); break; 406 } 406 407 407 408 Putenv( argv, "--prelude-dir=" + preludedir ); … … 475 476 if ( bprefix.length() == 0 ) { 476 477 switch(path) { 477 case Installed : bprefix = installlibdir; break;478 case BuildTree : bprefix = srcdriverdir ; break;479 case Distributed : bprefix = dir(argv[0]) ; break;480 } // switch481 } // if482 if ( bprefix[bprefix.length() - 1] != '/' ) bprefix += '/';483 Putenv( argv, string("-B=") + bprefix );478 case Installed : bprefix = installlibdir; break; 479 case BuildTree : bprefix = srcdriverdir ; break; 480 case Distributed : bprefix = dir(argv[0]) ; break; 481 } 482 if ( bprefix[bprefix.length() - 1] != '/' ) bprefix += '/'; 483 Putenv( argv, string("-B=") + bprefix ); 484 } // if 484 485 485 486 args[nargs++] = "-Xlinker"; // used by backtrace … … 503 504 args[nargs++] = "-Wno-cast-function-type"; 504 505 #endif // HAVE_CAST_FUNCTION_TYPE 505 if ( ! std_flag && ! x_flag ) {506 args[nargs++] = "-std=gnu11"; // default c11, if none specified506 if ( ! std_flag ) { // default c11, if none specified 507 args[nargs++] = "-std=gnu11"; 507 508 } // if 508 509 args[nargs++] = "-fgnu89-inline"; … … 554 555 // execute the command and return the result 555 556 556 execvp( args[0], (char * const *)args );// should not return557 execvp( args[0], (char *const *)args ); // should not return 557 558 perror( "CFA Translator error: execvp" ); 558 559 exit( EXIT_FAILURE );
Note:
See TracChangeset
for help on using the changeset viewer.