Support for different compilers

Magnus Ihse Bursie magnus.ihse.bursie at oracle.com
Tue Feb 4 09:22:15 UTC 2014


On 2014-02-04 04:49, Martin Buchholz wrote:
> I'll concede that when determining default compiler flags, those are 
> highly dependent on something like a "compiler family" and cannot be 
> done in the C/C++ sources themselves.  But even then, for many of the 
> compiler flags there should be feature based autoconf tests instead of 
> relying on guessing based on compiler family, e.g. does -Wl,-rpath work?

I object strongly to this. From time to time, "feature based tests" is 
popped into the discussion. While it might sound good in theory, let's 
look at what that actually mean in practice.

Let's take your example, "does -Wl,-rpath work?" What do you mean by 
"work"?
* That the compiler accept the argument without failing? Sure, that's 
not so hard to test, but what does it tell you?
* That it produces output with certain characterstics? How do you 
determine if that is the case? Analyze the resulting binary with a tool? 
Does that tool work properly? How do you test *that*, if you don't trust 
anything? Otherwise you're just shifting your assumption from how the 
compiler works to how the tool works.

And the complexity! Let's go real life. Look at the value of 
$SET_SHARED_LIBRARY_ORIGIN. It's ...
for gcc on macosx:
'-Xlinker -rpath -Xlinker @loader_path/.'
for gcc on linux:
'-Xlinker -z -Xlinker origin -Xlinker -rpath -Xlinker \$$$$ORIGIN[$]1'
for oracle solaris studio:
'-R\$$$$ORIGIN[$]1'

Now, how would you go along to arrive at that by feature based testing? 
I can't even start to imagine.

Secondly, we *do* have some "feature based tests". But I'd rather get 
rid of them, because they behave (and typically are) more like 
workarounds. Look at this code, for instance.

   # Check for broken SuSE 'ld' for which 'Only anonymous version tag is 
allowed in executable.'
   USING_BROKEN_SUSE_LD=no
   if test "x$OPENJDK_TARGET_OS" = xlinux && test "x$GCC" = xyes; then
     AC_MSG_CHECKING([for broken SuSE 'ld' which only understands 
anonymous version tags in executables])
     echo "SUNWprivate_1.1 { local: *; };" > version-script.map
     echo "int main() { }" > main.c
     if $CXX -Xlinker -version-script=version-script.map main.c 
2>&AS_MESSAGE_LOG_FD >&AS_MESSAGE_LOG_FD; then
       AC_MSG_RESULT(no)
       USING_BROKEN_SUSE_LD=no
     else
       AC_MSG_RESULT(yes)
       USING_BROKEN_SUSE_LD=yes
     fi
     rm -rf version-script.map main.c
   fi
   AC_SUBST(USING_BROKEN_SUSE_LD)


It's probably a very good example of what feature based tests would look 
like. I'd be horrified if we were do that for all flags. The build 
system would blow up tenfold in size and complexity, for no or little gain.

/Magnus



More information about the build-dev mailing list