[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    icecream
From:       Luboš Luňák <l.lunak () kde ! org>
Date:       2012-07-30 17:52:16
Message-ID: 20120730175216.C051BAC7A9 () svn ! kde ! org
[Download RAW message or body]

SVN commit 1308592 by lunakl:

do not create environments containing both gcc and clang

Now that there can be more than one native environment, this doesn't
make much sense. Bigger environments would more likely fill up
cache size on remotes, especially with more environments because
of using compiler plugins, leading to environments getting discarded.
This commit partially breaks backwards compatibility with previous
clang-capable icecream from svn, but not with the last icecream release.



 M  +27 -15    client/icecc-create-env  
 M  +40 -30    client/main.cpp  
 M  +10 -9     daemon/environment.cpp  
 M  +2 -1      daemon/environment.h  
 M  +3 -3      daemon/main.cpp  
 M  +6 -2      services/comm.cpp  
 M  +3 -2      services/comm.h  


--- trunk/icecream/client/icecc-create-env #1308591:1308592
@@ -13,8 +13,8 @@
 
 usage ()
 {
-    echo "usage: $0 <gcc_path> <g++_path>"
-    echo "usage: $0 [<gcc_path>|] [<g++_path>|] <clang_path> <compiler_wrapper>"
+    echo "usage: $0 --gcc <gcc_path> <g++_path>"
+    echo "usage: $0 --clang <clang_path> <compiler_wrapper>"
     echo "usage: Use --addfile <file> to add extra files."
 }
 
@@ -83,13 +83,35 @@
   shift
 fi
 
+if test "$1" != "--gcc" -a "$1" != "--clang"; then
+    # backward compat
 added_gcc=$1
 shift
 added_gxx=$1
 shift
+    gcc=1
+else
+    if test "$1" = "--gcc"; then
+        shift
+        added_gcc=$1
+        shift
+        added_gxx=$1
+        shift
+        gcc=1
+    elif test "$1" = "--clang"; then
+        shift
+        added_clang=$1
+        shift
+        added_compilerwrapper=$1
+        shift
+        clang=1
+    else
+        usage
+        exit 1
+    fi
+fi
 
-if test -n "$added_gcc" || test -n "$added_gxx"; then
-    gcc=1
+if test -n "$gcc"; then
     if test -z "$added_gcc" || test -z "$added_gxx"; then
         usage
         exit 1
@@ -104,27 +126,17 @@
     fi
 fi
 
-if test -n "$1" -a "x$1" != "x--addfile"; then
-    added_clang=$1
-    shift
-    clang=1
+if test -n "$clang"; then
     if ! test -x "$added_clang" ; then
         echo "'$added_clang' is no executable."
         exit 1
     fi
-    added_compilerwrapper=$1
-    shift
     if ! test -x "$added_compilerwrapper" ; then
         echo "'$added_compilerwrapper' is no executable."
         exit 1
     fi
 fi
 
-if test -z "$gcc" && test -z "$clang"; then
-    usage
-    exit 1
-fi
-
 extrafiles=
 while test "x$1" = "x--addfile"; do
     shift
--- trunk/icecream/client/main.cpp #1308591:1308592
@@ -70,12 +70,13 @@
     printf(
 "Usage:\n"
 "   icecc [compiler] [compile options] -o OBJECT -c SOURCE\n"
+"   icecc --build-native [compilertype] [file...]\n"
 "   icecc --help\n"
 "\n"
 "Options:\n"
 "   --help                     explain usage and exit\n"
 "   --version                  show version and exit\n"
-"   --build-native [file]...   create icecc environment\n"
+"   --build-native             create icecc environment\n"
 "Environment Variables:\n"
 "   ICECC                      if set to \"no\", just exec the real gcc\n"
 "   ICECC_VERSION              use a specific icecc environment, see \
icecc-create-env\n" @@ -157,11 +158,43 @@
     return output.substr(0, output.length()-1);
 }
 
-static int create_native( char* extrafiles[] )
+static int create_native( char** args )
 {
+    // args are [compiler] [files...]
+    const char *compiler = args[ 0 ];
+    char **extrafiles;
+    if( args[ 0 ] )
+        extrafiles = args + 1;
+    else // there were no arguments, set to null list
+        extrafiles = args;
+    int extracount = 0;
+    while ( extrafiles[ extracount ] )
+        ++extracount;
+    char **argv = new char*[4+extracount*2];
+    int pos = 0;
     struct stat st;
-    string gcc, gpp, clang;
+    if ( lstat( PLIBDIR "/icecc-create-env", &st ) ) {
+	log_error() << PLIBDIR "/icecc-create-env does not exist\n";
+        return 1;
+    }
+    argv[pos++] = strdup( PLIBDIR "/icecc-create-env"  );
 
+    if ( strcmp( compiler, "clang" ) == 0 ) {
+        string clang = compiler_path_lookup( "clang" );
+        if ( clang.empty()) {
+            log_error() << "clang compiler not found\n";
+	    return 1;
+	}
+        if ( lstat( PLIBDIR "/compilerwrapper", &st ) ) {
+            log_error() << PLIBDIR "/compilerwrapper does not exist\n";
+            return 1;
+        }
+        argv[pos++] = strdup( "--clang" );
+        argv[pos++] = strdup( clang.c_str() );
+        argv[pos++] = strdup( PLIBDIR "/compilerwrapper"  );
+    } else { // "gcc" (default)
+        string gcc, gpp;
+
     // perhaps we're on gentoo
     if ( !lstat("/usr/bin/gcc-config", &st) ) {
         string gccpath=read_output("/usr/bin/gcc-config -B") + "/";
@@ -171,48 +204,25 @@
         gcc = compiler_path_lookup( "gcc" );
         gpp = compiler_path_lookup( "g++" );
     }
-
-    clang = compiler_path_lookup( "clang" );
-
     // both C and C++ compiler are required
     if ( gcc.empty())
         gpp.clear();
     if ( gpp.empty())
         gcc.clear();
-
-    if ( gcc.empty() && gpp.empty() && clang.empty())
+        if ( gcc.empty() && gpp.empty()) {
+            log_error() << "gcc compiler not found\n";
 	return 1;
-
-    if ( lstat( PLIBDIR "/icecc-create-env", &st ) ) {
-	log_error() << PLIBDIR "/icecc-create-env does not exist\n";
-        return 1;
     }
-
-    if ( !clang.empty() && lstat( PLIBDIR "/compilerwrapper", &st ) ) {
-	log_error() << PLIBDIR "/compilerwrapper does not exist\n";
-        return 1;
-    }
-
-    int extracount = 0;
-    while ( extrafiles[ extracount ] )
-        ++extracount;
-    char **argv = new char*[5+extracount*2];
-    int pos = 0;
-    argv[pos++] = strdup( PLIBDIR "/icecc-create-env"  );
+        argv[pos++] = strdup( "--gcc" );
     argv[pos++] = strdup( gcc.c_str() );
     argv[pos++] = strdup( gpp.c_str() );
-    if( !clang.empty()) {
-        argv[pos++] = strdup( clang.c_str() );
-        argv[pos++] = strdup( PLIBDIR "/compilerwrapper"  );
     }
     for ( extracount = 0; extrafiles[ extracount ]; ++extracount ) {
         argv[pos++] = strdup( "--addfile" );
         argv[pos++] = strdup( extrafiles[ extracount ] );
     }
     argv[pos++] = NULL;
-
     return execv(argv[0], argv);
-
 }
 
 int main(int argc, char **argv)
@@ -327,7 +337,7 @@
             log_warning() << "Local daemon is too old to handle compiler \
plugins.\n";  local = true;
         } else {
-            if ( !local_daemon->send_msg( GetNativeEnvMsg( extrafiles ) ) ) {
+            if ( !local_daemon->send_msg( GetNativeEnvMsg( compiler_is_clang( job ) \
                ? "clang" : "gcc", extrafiles ) ) ) {
                 log_warning() << "failed to write get native environment\n";
 		goto do_local_error;
             }
--- trunk/icecream/daemon/environment.cpp #1308591:1308592
@@ -230,19 +230,19 @@
 }
 
 size_t setup_env_cache(const string &basedir, string &native_environment, uid_t \
                nobody_uid, gid_t nobody_gid,
-                       const list<string>& extrafiles)
+                       const std::string &compiler, const list<string> &extrafiles)
 {
     native_environment = "";
     string nativedir = basedir + "/native/";
 
-    // Either both gcc and g++ are needed, and/or clang.
-    bool ok = false;
-    if ( ::access( "/usr/bin/gcc", X_OK ) == 0 && ::access( "/usr/bin/g++", X_OK ) \
                == 0 ) 
-        ok = true;
-    if ( ::access( "/usr/bin/clang", X_OK ) == 0 )
-        ok = true;
-    if ( !ok )
+    if (compiler == "clang") {
+        if ( ::access( "/usr/bin/clang", X_OK ) != 0 )
 	return 0;
+    } else { // "gcc" (the default)
+        // Both gcc and g++ are needed in the gcc case.
+        if ( ::access( "/usr/bin/gcc", X_OK ) != 0 || ::access( "/usr/bin/g++", X_OK \
) != 0 ) +	    return 0;
+    }
 
     if ( mkdir( nativedir.c_str(), 0775 ) && errno != EEXIST )
    	return 0; 
@@ -303,10 +303,11 @@
     close( pipes[ 1 ] );
 
     const char ** argv;
-    argv = new const char*[ 3 + extrafiles.size() ];
+    argv = new const char*[ 4 + extrafiles.size() ];
     int pos = 0;
     argv[ pos++ ] = BINDIR "/icecc";
     argv[ pos++ ] = "--build-native";
+    argv[ pos++ ] = strdup( compiler.c_str());
     for( list<string>::const_iterator it = extrafiles.begin();
          it != extrafiles.end(); ++it )
         argv[ pos++ ] = strdup( it->c_str());
--- trunk/icecream/daemon/environment.h #1308591:1308592
@@ -29,7 +29,8 @@
 class MsgChannel;
 extern bool cleanup_cache( const std::string &basedir );
 extern size_t setup_env_cache(const std::string &basedir, std::string \
                &native_environment,
-                    uid_t nobody_uid, gid_t nobody_gid, const std::list<std::string> \
&extrafiles); +                    uid_t nobody_uid, gid_t nobody_gid,
+                    const std::string &compiler, const std::list<std::string> \
&extrafiles);  Environments available_environmnents(const std::string &basename);
 extern void save_compiler_timestamps(time_t &gcc_bin_timestamp, time_t \
&gpp_bin_timestamp, time_t &clang_bin_timestamp);  bool compilers_uptodate(time_t \
                gcc_bin_timestamp, time_t gpp_bin_timestamp, time_t \
                clang_bin_timestamp);
--- trunk/icecream/daemon/main.cpp #1308591:1308592
@@ -914,9 +914,9 @@
 {
     string env_key;
     map<string, time_t> extrafilestimes;
+    env_key = msg->compiler;
     for( list<string>::const_iterator it = msg->extrafiles.begin();
          it != msg->extrafiles.end(); ++it ) {
-        if (!env_key.empty())
             env_key += ':';
         env_key += *it;
         struct stat st;
@@ -941,12 +941,12 @@
     }
 
     trace() << "get_native_env " << native_environments[ env_key ].name
-        << ( !env_key.empty() ? " (" + env_key + ")" : "" ) << endl;
+        << " (" << env_key << ")" << endl;
 
     if ( !native_environments[ env_key ].name.length()) {
         NativeEnvironment& env = native_environments[ env_key ]; // also inserts it
         size_t installed_size = setup_env_cache( envbasedir, env.name,
-                                                 nobody_uid, nobody_gid, \
msg->extrafiles ); +                                                 nobody_uid, \
nobody_gid, msg->compiler, msg->extrafiles );  // we only clean out cache on next \
target install  cache_size += installed_size;
         trace() << "cache_size = " << cache_size << endl;
--- trunk/icecream/services/comm.cpp #1308591:1308592
@@ -1627,17 +1627,21 @@
 GetNativeEnvMsg::fill_from_channel (MsgChannel *c)
 {
   Msg::fill_from_channel (c);
-  if (IS_PROTOCOL_32(c))
+  if (IS_PROTOCOL_32(c)) {
+    *c >> compiler;
     *c >> extrafiles;
 }
+}
 
 void
 GetNativeEnvMsg::send_to_channel (MsgChannel *c) const
 {
   Msg::send_to_channel (c);
-  if (IS_PROTOCOL_32(c))
+  if (IS_PROTOCOL_32(c)) {
+    *c << compiler;
     *c << extrafiles;
 }
+}
 
 void
 UseNativeEnvMsg::fill_from_channel (MsgChannel *c)
--- trunk/icecream/services/comm.h #1308591:1308592
@@ -325,8 +325,9 @@
 class GetNativeEnvMsg : public Msg {
 public:
   GetNativeEnvMsg () : Msg(M_GET_NATIVE_ENV) {}
-  GetNativeEnvMsg (const std::list<std::string>& e)
-    : Msg(M_GET_NATIVE_ENV), extrafiles(e) {}
+  GetNativeEnvMsg (const std::string &c, const std::list<std::string>& e)
+    : Msg(M_GET_NATIVE_ENV), compiler(c), extrafiles(e) {}
+  std::string compiler; // "gcc" or "clang" right now
   std::list<std::string> extrafiles;
   virtual void fill_from_channel (MsgChannel * c);
   virtual void send_to_channel (MsgChannel * c) const;


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic