# directly use attributes already defined by gnulib.
# TODO: move the check for _GL... attributes to gnulib.
sc_prohibit-gl-attributes:
- @cd $(srcdir) && GIT_PAGER= git grep -En \
- "__attribute |__(unused|pure|const)__" src gl/lib/*.[ch] \
- && { echo '$(ME): Use _GL... attribute macros' 1>&2; exit 1; } \
- || :
+ @prohibit='__attribute |__(unused|pure|const)__' \
+ in_vc_files='\.[ch]$$' \
+ halt='Use _GL... attribute macros' \
+ $(_sc_search_regexp)
# Look for lines longer than 80 characters, except omit:
# - program-generated long lines in diff headers,
exclude_file_name_regexp--sc_error_message_uppercase = ^src/factor\.c$$
exclude_file_name_regexp--sc_prohibit_atoi_atof = ^src/make-prime-list\.c$$
+# Exception here as we don't want __attribute elided on non GCC
+exclude_file_name_regexp--sc_prohibit-gl-attributes = ^src/libstdbuf\.c$$
+
# Augment AM_CFLAGS to include our per-directory options:
AM_CFLAGS += $($(@D)_CFLAGS)
gl_ADD_PROG([optional_bin_progs], [df])
fi
-# Limit stdbuf to ELF systems with GCC
-AC_MSG_CHECKING([whether this is an ELF system])
-AC_EGREP_CPP([yes], [#if __ELF__
-yes
-#endif], [elf_sys=yes], [elf_sys=no])
-AC_MSG_RESULT([$elf_sys])
-if test "$elf_sys" = "yes" && \
- test "$GCC" = "yes"; then
+AC_MSG_CHECKING([whether this is system supports stdbuf])
+AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[
+ static int stdbuf = 0;
+
+ /* Restrict to ELF systems with compilers
+ that support the constructor attribute. */
+ void __attribute__ ((constructor))
+ stdbuf_init (void)
+ {
+ #if __ELF__
+ stdbuf = 1;
+ #endif
+ }]],[[
+ return !(stdbuf == 1);]])
+ ],
+ [stdbuf_supported=yes],
+ [stdbuf_supported=no])
+AC_MSG_RESULT([$stdbuf_supported])
+if test "$stdbuf_supported" = "yes"; then
gl_ADD_PROG([optional_bin_progs], [stdbuf])
fi
}
}
-__attribute__ ((constructor)) static void
+/* Use __attribute to avoid elision of __attribute__ on SUNPRO_C etc. */
+static void __attribute ((constructor))
stdbuf (void)
{
char *e_mode = getenv ("_STDBUF_E");
However we want the lookup done for the exec'd command not stdbuf.
Since we don't link against libstdbuf.so add it to PKGLIBEXECDIR
- rather than to LIBDIR. */
+ rather than to LIBDIR.
+
+ Note we could add "" as the penultimate item in the following list
+ to enable searching for libstdbuf.so in the default system lib paths.
+ However that would not indicate an error if libstdbuf.so was not found.
+ Also while this could support auto selecting the right arch in a multilib
+ environment, what we really want is to auto select based on the arch of the
+ command being run, rather than that of stdbuf itself. This is currently
+ not supported due to the unusual need for controlling the stdio buffering
+ of programs that are a different architecture to the default on the
+ system (and that of stdbuf itself). */
char const *const search_path[] = {
program_path,
PKGLIBEXECDIR,