[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-08 15:25:37
Message-ID: 20120708152537.97A00AC7A9 () svn ! kde ! org
[Download RAW message or body]
SVN commit 1304629 by lunakl:
Hack for compiling with clang even on older icecream remotes.
Older icecream versions had /usr/bin/{gcc|g++} hardcoded when
invoking the compiler from the environment on the remote. In order
to build on such remotes, if the environment also contains clang,
include a wrapper around /usr/bin/{gcc|g++} that will either
invoke real gcc or clang, depending on an argument added by icecream.
Not entirely elegant, but it works, and the usual gcc-only case should
be unaffected.
M +1 -1 Makefile.am
M +19 -1 client/icecc-create-env
M +10 -1 client/main.cpp
M +1 -0 configure.in
M +12 -0 services/comm.cpp
--- trunk/icecream/Makefile.am #1304628:1304629
@@ -1,5 +1,5 @@
-SUBDIRS = minilzo services daemon client doc suse
+SUBDIRS = minilzo services daemon client doc suse compilerwrapper
AUTOMAKE_OPTIONS = foreign 1.6
.PHONY: changes
--- trunk/icecream/client/icecc-create-env #1304628:1304629
@@ -14,7 +14,7 @@
usage ()
{
echo "usage: $0 <gcc_path> <g++_path>"
- echo "usage: $0 [<gcc_path>|] [<g++_path>|] <clang_path>"
+ echo "usage: $0 [<gcc_path>|] [<g++_path>|] <clang_path> <compiler_wrapper>"
}
is_contained ()
@@ -112,7 +112,13 @@
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
@@ -122,8 +128,15 @@
tempdir=`mktemp -d /tmp/iceccenvXXXXXX`
if test -n "$gcc"; then
+ if test -z "$clang"; then
add_file $added_gcc /usr/bin/gcc
add_file $added_gxx /usr/bin/g++
+ else
+ # HACK: The clang case below will add a wrapper in place of gcc, so add the real
+ # gcc under a different name that the wrapper will call.
+ add_file $added_gcc /usr/bin/gcc.bin
+ add_file $added_gxx /usr/bin/g++.bin
+ fi
add_file `$added_gcc -print-prog-name=cc1` /usr/bin/cc1
add_file `$added_gxx -print-prog-name=cc1plus` /usr/bin/cc1plus
specfile=`$added_gcc -print-file-name=specs`
@@ -144,6 +157,11 @@
if test -n "$clang"; then
add_file $added_clang /usr/bin/clang
+ # HACK: Older icecream remotes have /usr/bin/{gcc|g++} hardcoded and wouldn't
+ # call /usr/bin/clang at all. So include a wrapper binary that will call gcc or clang
+ # depending on an extra argument added by icecream.
+ add_file $added_compilerwrapper /usr/bin/gcc
+ add_file $added_compilerwrapper /usr/bin/g++
# clang requires /tmp
mkdir "$tempdir"/tmp/
chmod 1777 "$tempdir"/tmp/
--- trunk/icecream/client/main.cpp #1304628:1304629
@@ -185,12 +185,21 @@
return 1;
}
+ if ( !clang.empty() && lstat( PLIBDIR "/compilerwrapper", &st ) ) {
+ log_error() << PLIBDIR "/compilerwrapper does not exist\n";
+ return 1;
+ }
+
char **argv = new char*[5];
argv[0] = strdup( PLIBDIR "/icecc-create-env" );
argv[1] = strdup( gcc.c_str() );
argv[2] = strdup( gpp.c_str() );
+ argv[3] = NULL;
+ if( !clang.empty()) {
argv[3] = strdup( clang.c_str() );
- argv[4] = NULL;
+ argv[4] = strdup( PLIBDIR "/compilerwrapper" );
+ argv[5] = NULL;
+ }
return execv(argv[0], argv);
--- trunk/icecream/configure.in #1304628:1304629
@@ -230,6 +230,7 @@
AC_CONFIG_FILES([ services/Makefile ])
AC_CONFIG_FILES([ services/icecc.pc ])
AC_CONFIG_FILES([ suse/Makefile ])
+AC_CONFIG_FILES([ compilerwrapper/Makefile ])
AC_OUTPUT([ suse/icecream.spec ])
if test "$prefix" = NONE; then
prefix=$ac_default_prefix
--- trunk/icecream/services/comm.cpp #1304628:1304629
@@ -1352,7 +1352,19 @@
Msg::send_to_channel (c);
*c << (uint32_t) job->language();
*c << job->jobID();
+ if (IS_PROTOCOL_30(c))
*c << job->remoteFlags();
+ else
+ {
+ if (job->compilerName().find("clang") != string::npos)
+ { // Hack for compilerwrapper.
+ std::list<std::string> flags = job->remoteFlags();
+ flags.push_front("clang");
+ *c << flags;
+ }
+ else
+ *c << job->remoteFlags();
+ }
*c << job->restFlags();
*c << job->environmentVersion();
*c << job->targetPlatform();
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic