[Adding libtool to the CC: list, since Bob indicates there are libtool and autoconf implications as well. The thread starts at <http://lists.gnu.org/archive/html/bug-gnulib/2010-12/msg00283.html>.] On 12/26/2010 09:51 AM, Bruno Haible wrote: > So, when libposix becomes reality, it may be compiled with "gcc", thus > with a setting of > #define LINK_FOLLOWS_SYMLINKS 0 > But when it gets linked to a program that was compiled with "c99" or > "cc -xc99=all", then the link() function _will_ follow symlinks, > thus the link_immediate function will not perform as expected. Given the other problems that ensue on Solaris when one compiles and links to different standards, the simplest answer may be just "don't do that". It's not just the __xpg4 and __xpg6 stuff; it's also the _lib_version stuff: scanf behaves differently depending on which flavor of the -X option one passes to cc. It's quite a mess. If (despite the above) we do want to support compiling an application with cc -xwhatever or cc -Xwhatever, while linking to a library built in the default mode, the proposed change would appear to place a significant performance penalty for the (presumably more common) case of compiling and linking in the default mode. I would suggest something like the following patch instead, with a similar patch for link_follow, and with the appropriate m4 magic to make LINK_FOLLOWS_SYMLINKS a runtime test (__xpg4) on hosts like Solaris that have the __xpg4 variable. (Overall, though, it may be better not to poke a stick at this particular beehive. :-) diff --git a/lib/linkat.c b/lib/linkat.c index 73b1e3e..9b3550a 100644 --- a/lib/linkat.c +++ b/lib/linkat.c @@ -48,13 +48,17 @@ /* Create a link. If FILE1 is a symlink, either create a hardlink to that symlink, or fake it by creating an identical symlink. */ -# if LINK_FOLLOWS_SYMLINKS == 0 -# define link_immediate link -# else + static int link_immediate (char const *file1, char const *file2) { - char *target = areadlink (file1); + char *target = NULL; + int target_errno = 0; + if (LINK_FOLLOWS_SYMLINKS) + { + target = areadlink (file1); + target_errno = errno; + } if (target) { /* A symlink cannot be modified in-place. Therefore, creating @@ -89,11 +93,10 @@ link_immediate (char const *file1, char const *file2) free (target); free (dir); } - if (errno == ENOMEM) + if (target_errno == ENOMEM) return -1; return link (file1, file2); } -# endif /* LINK_FOLLOWS_SYMLINKS == 0 */ /* Create a link. If FILE1 is a symlink, create a hardlink to the canonicalized file. */ _______________________________________________ Autoconf mailing list Autoconf@xxxxxxx http://lists.gnu.org/mailman/listinfo/autoconf