SVN commit 1304630 by lunakl: support for -rewrite-includes with clang Clang works suboptimally with separate preprocessing step, it e.g. quotes source in warning/error messages, or disables some warnings if they come from macro expansion. Therefore make it possible to do the preprocessing remotely together with compiling and only expand #include directives locally. There exists a Clang patch that implements -rewrite-includes for this, and it's been only recently merged upstream. Currently ICECC_REWRITE_INCLUDE is used to determine if the flag should be used or not. M +16 -6 arg.cpp M +3 -0 cpp.cpp M +15 -0 local.cpp --- trunk/icecream/client/arg.cpp #1304629:1304630 @@ -111,6 +111,8 @@ bool seen_mf = false; bool seen_md = false; bool fno_color_diagnostics = false; + // if rewriting includes and precompiling on remote machine, then cpp args are not local + Argument_Type Arg_Cpp = compiler_only_rewrite_includes( job ) ? Arg_Rest : Arg_Local; if( icerun ) { always_local = true; job.setLanguage( CompileJob::Lang_Custom ); @@ -254,8 +256,14 @@ args.append(argv[i], Arg_Local); } } else if (str_equal("-D", a) - || str_equal("-I", a) - || str_equal("-U", a) + || str_equal("-U", a) ) { + args.append(a, Arg_Cpp); + /* skip next word, being option argument */ + if (argv[i+1]) { + ++i; + args.append( argv[i], Arg_Cpp ); + } + } else if (str_equal("-I", a) || str_equal("-L", a) || str_equal("-l", a) || str_equal("-MF", a) @@ -281,13 +289,15 @@ } } else if (str_startswith("-Wp,", a) || str_startswith("-D", a) - || str_startswith("-U", a) - || str_startswith("-I", a) + || str_startswith("-U", a)) { + args.append(a, Arg_Cpp); + } else if (str_startswith("-I", a) || str_startswith("-l", a) || str_startswith("-L", a)) { args.append(a, Arg_Local); - } else if (str_equal("-undef", a) - || str_equal("-nostdinc", a) + } else if (str_equal("-undef", a)) { + args.append(a, Arg_Cpp); + } else if (str_equal("-nostdinc", a) || str_equal("-nostdinc++", a) || str_equal("-MD", a) || str_equal("-MMD", a) --- trunk/icecream/client/cpp.cpp #1304629:1304630 @@ -116,6 +116,7 @@ int argc = flags.size(); argc++; // the program argc += 2; // -E file.i + argc += 1; // -Wp,-rewrite-includes argv = new char*[argc + 1]; argv[0] = strdup( find_compiler( job ).c_str() ); int i = 1; @@ -125,6 +126,8 @@ } argv[i++] = strdup( "-E" ); argv[i++] = strdup( job.inputFile().c_str() ); + if ( compiler_only_rewrite_includes( job )) + argv[i++] = strdup( "-Wp,-rewrite-includes" ); argv[i++] = 0; } --- trunk/icecream/client/local.cpp #1304629:1304630 @@ -122,6 +122,21 @@ return job.compilerName().find("clang") != string::npos; } +/* +Clang works suboptimally when handling an already preprocessed source file, +for example error messages quote (already preprocessed) parts of the source. +Therefore it is better to only locally merge all #include files into the source +file and do the actual preprocessing remotely together with compiling. +There exists a Clang patch to implement option -rewrite-includes that does +such #include rewritting, and it's been only recently merged upstream. +*/ +bool compiler_only_rewrite_includes( const CompileJob& job ) +{ + if ( compiler_is_clang( job )) + return getenv( "ICECC_REWRITE_INCLUDES" ) != NULL; + return false; +} + static volatile int lock_fd = 0; static volatile int user_break_signal = 0; static volatile pid_t child_pid;