On Sat, 10 Aug 2013 18:37:15 +0200 Irek Szczesniak wrote: > On Sat, Aug 10, 2013 at 7:46 AM, Glenn Fowler <[email protected]> wrote: > > > > On Fri, 9 Aug 2013 21:30:32 +0200 Irek Szczesniak wrote: > >> On Fri, Aug 9, 2013 at 9:07 PM, Irek Szczesniak <[email protected]> > >> wrote: > >> > Fedora 19 is *again* missing the #define O_SEARCH to define O_SEARCH > >> > as alias to O_PATH. > > > >> This broke a while ago when #define __USE_GNU 1 was moved to > >> src/lib/libast/features/standards. Nice attempt but won't work because > >> __USE_GNU is an internal flag of the Linux kernel headers and is unset > >> by the normal includes in /usr/include. Worst of all the Linux > >> includes are broken and only reveal O_PATH if used with __USE_GNU=1. > > > >> What I don't understand: Roland added a safeguard against malfunctions: > >> /* > >> * Make sure _GNU_SOURCE is active on Linux. Some versions > >> * give us serious trouble in this case so we have this > >> * assert to *abort* early instead of let us hunt for "ghost > >> * bugs" > >> */ > >> #ifdef __linux__ > >> #ifndef __USE_GNU > >> #error "ASSERT: __USE_GNU should be defined by now" > >> #endif > >> #endif > > > >> This had been introduced to *prevent* this from happening. WTF was > >> this assertion removed? This is really the kind of regression which > >> should NEVER happen because it fucks up the rest of the applications.
> I have to apologies for the explicit language. Imagine being under > pressure and then find a regression. A regression for which was > considered impossible because multiple layers of safeguards had been > established to make the AST build fail the hard way in case of a > regression. > >> Wasted time: 2h 17 minutes to find out that O_SEARCH was unavailable > >> in our application. Anyone wanna pay? > > > > please illuminate the list on what would happen to the build on a linux > > system > > that provides neither O_SEARCH nor O_PATH > Nothing? We're talking about setting __USE_GNU and later checking with > #error whether __USE_GNU is still set in case of a programming error > later. The goal is to obtain access to O_PATH (and O_DIRECT), which is > available in Linux since 3.0.x (stable branch, it wasn't working until > fixes were backported into the 3.0.x stable branch). > IMO what would be good is to have a check which tests Linux >=3.1 && > !defined(O_PATH) == build error because that's impossible. > > use this to check your system > > > > tw -Pid /usr/include -e "name=='*.h'" egrep -w 'O_PATH|O_SEARCH' > > > > this shows nada on our master source system > > version 2.6.32-358.11.1.el6.x86_64 > > ([email protected]) > > (gcc version 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC) ) > > #1 SMP Wed Jun 12 03:34:52 UTC 2013 > > > > also it was my impression that __USE_GNU was hacked to workaround buggy > > headers > > on at least one linux implementation > That is the problem in Linux 3.0.x. The root of all evil is that > _GNU_SOURCE is not compatible to all other standards flags you are > setting, which forces /usr/include/features.h to undefine __USE_GNU. > > a more constructive post would specify how to get O_PATH visible on your > > system > > one would assume that defining _GNU_SOURCE should be sufficient > > but that should be defined in <ast_standards.h> which also should have been > > included first in features/fcntl.c > That may well be impossible because you enable all standard flags you > know about at the same time. Which is promptly rewarded by a #undef > __USE_GNU in /usr/include/features.h there is no portable way to enable standards + extensions the standard doesn't help here either on some systems if you don't specify the exact date in _POSIX_foo_bar it fails this iffe script src/lib/libast/features/standards attempts to find a combination that works in general ast wants "the latest posix + native extensions" if _GNU_SOURCE does that for linux then try adding this at the top of src/lib/libast/features/standards and we will trust this /usr/include/features.h comment: _GNU_SOURCE All of the above, plus GNU extensions. -- set stdio if tst note{ _GNU_SOURCE works }end compile{ #define _GNU_SOURCE 1 #include <sys/types.h> #include <sys/stat.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #if !defined(__linux__) || !defined( __USE_GNU) ( #endif }end { #ifndef _GNU_SOURCE #define _GNU_SOURCE 1 #endif } elif ... -- _______________________________________________ ast-developers mailing list [email protected] http://lists.research.att.com/mailman/listinfo/ast-developers
