SVN commit 1305557 by lunakl: rebuild environment if the compiler changes Otherwise updating the compiler does not in practice take effect until daemon restart. M +1 -0 NEWS M +66 -1 daemon/environment.cpp M +2 -0 daemon/environment.h M +7 -0 daemon/main.cpp --- trunk/icecream/NEWS #1305556:1305557 @@ -4,6 +4,7 @@ Clang with -Wp,-rewrite-includes option is recommended (3.2+ or patched). - support 'icecc ' properly - try to avoid compiling on the local machine if it is busy +- do not use old compiler if it was changed while icecream daemon was running 0.9.7 (1232780) - bug fix for -MD and -MF --- trunk/icecream/daemon/environment.cpp #1305556:1305557 @@ -209,6 +209,60 @@ return envs; } +// Timestamps for compiler binaries, if they have changed since the time +// native env was built, it needs to be rebuilt. +static time_t gcc_bin_timestamp = 0; +static time_t gpp_bin_timestamp = 0; +static time_t clang_bin_timestamp = 0; + +static void save_native_env_timestamp() +{ + struct stat st; + if( stat( "/usr/bin/gcc", &st ) == 0 ) + gcc_bin_timestamp = st.st_mtime; + else + gcc_bin_timestamp = 0; + if( stat( "/usr/bin/gcc", &st ) == 0 ) + gcc_bin_timestamp = st.st_mtime; + else + gcc_bin_timestamp = 0; + if( stat( "/usr/bin/g++", &st ) == 0 ) + gpp_bin_timestamp = st.st_mtime; + else + gpp_bin_timestamp = 0; + if( stat( "/usr/bin/clang", &st ) == 0 ) + clang_bin_timestamp = st.st_mtime; + else + clang_bin_timestamp = 0; +} + +bool native_env_uptodate() +{ + struct stat st; + if( stat( "/usr/bin/gcc", &st ) == 0 ) { + if( st.st_mtime != gcc_bin_timestamp ) + return false; + } else { + if( gcc_bin_timestamp != 0 ) + return false; + } + if( stat( "/usr/bin/g++", &st ) == 0 ) { + if( st.st_mtime != gpp_bin_timestamp ) + return false; + } else { + if( gpp_bin_timestamp != 0 ) + return false; + } + if( stat( "/usr/bin/clang", &st ) == 0 ) { + if( st.st_mtime != clang_bin_timestamp ) + return false; + } else { + if( clang_bin_timestamp != 0 ) + return false; + } + return true; +} + size_t setup_env_cache(const string &basedir, string &native_environment, uid_t nobody_uid, gid_t nobody_gid) { native_environment = ""; @@ -223,7 +277,7 @@ if ( !ok ) return 0; - if ( mkdir( nativedir.c_str(), 0775 ) ) + if ( mkdir( nativedir.c_str(), 0775 ) && errno != EEXIST ) return 0; if ( chown( nativedir.c_str(), 0, nobody_gid ) || @@ -251,6 +305,7 @@ return 0; } else { + save_native_env_timestamp(); return sumup_dir( nativedir ); } } @@ -440,3 +495,13 @@ _exit(execv(argv[0], argv)); } + +size_t remove_native_environment( const string &basedir, const string &env ) +{ + if ( env.empty() ) + return 0; + string nativedir = basedir + "/native/"; + size_t size = sumup_dir( nativedir ); + unlink( env.c_str()); + return size; +} --- trunk/icecream/daemon/environment.h #1305556:1305557 @@ -30,6 +30,7 @@ extern size_t setup_env_cache(const std::string &basedir, std::string &native_environment, uid_t nobody_uid, gid_t nobody_gid); Environments available_environmnents(const std::string &basename); +extern bool native_env_uptodate(); extern pid_t start_install_environment( const std::string &basename, const std::string &target, const std::string &name, @@ -39,5 +40,6 @@ extern size_t finalize_install_environment( const std::string &basename, const std::string& target, pid_t pid, gid_t nobody_gid ); extern size_t remove_environment( const std::string &basedir, const std::string &env); +extern size_t remove_native_environment( const std::string &basedir, const std::string &env ); #endif --- trunk/icecream/daemon/main.cpp #1305556:1305557 @@ -872,6 +872,13 @@ bool Daemon::handle_get_native_env( Client *client ) { + if ( !native_env_uptodate()) + { + trace() << "native_env needs rebuild" << endl; + cache_size -= remove_native_environment( envbasedir, native_environment ); + native_environment.clear(); + } + trace() << "get_native_env " << native_environment << endl; if ( !native_environment.length() ) {