[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: present but cannot be compiled (Was: sys/ucred.h on NetBSD)
From: |
Thomas Klausner |
Subject: |
Re: present but cannot be compiled (Was: sys/ucred.h on NetBSD) |
Date: |
Wed, 7 May 2003 16:28:16 +0200 |
I'll forward the mail you sent me to the coreutils maintainers.
Btw, re:
> If you have some knowledge in C compilation, then there is something
> more you can do to help: find out what are the prerequisite headers on
> your system.
I included the headers that are needed according to the man page in the
original mail (see bottom).
Cheers,
Thomas
On Tue, May 06, 2003 at 06:00:44PM +0200, Akim Demaille wrote:
>
> Thanks for the bug report!
>
> Unfortunately, the problem comes from the package itself, not from
> Autoconf. The configure.ac script needs to be updated. Please, send
> all this message (which your output attached) to the bug list (or the
> authors) of the package you were trying to configure.
>
> Below two parts of the Autoconf documentation are included: 1. the
> documentation of AC_CHECK_HEADER(S), and 2. what's to be done to
> upgrade configure.ac.
>
> If you have some knowledge in C compilation, then there is something
> more you can do to help: find out what are the prerequisite headers on
> your system.
>
> For instance, if the error message is:
>
> sys/socket.h: present but cannot be compiled
> sys/socket.h: check for missing prerequisite headers?
> sys/socket.h: proceeding with the preprocessor's result
>
> then try to compile the program sample.c:
>
> #include <sys/socket.h>
>
> with `cc -c sample.c'. It will fail. Then try to understand what
> other headers are needed. For instance, on Darwin, one needs:
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <sys/socket.h>
> #include <sys/socket.h>
>
> to get a successful compilation. Then, send this additional
> information to the package maintainers, together with a description of
> your machine.
>
> Thanks!
>
> ----------------------------------------------------------------------
>
> Generic Header Checks
> ---------------------
>
> These macros are used to find system header files not covered by the
> "particular" test macros. If you need to check the contents of a header
> as well as find out whether it is present, you have to write your own
> test for it (*note Writing Tests::).
>
> - Macro: AC_CHECK_HEADER (HEADER-FILE, [ACTION-IF-FOUND],
> [ACTION-IF-NOT-FOUND], [INCLUDES = `default-includes'])
> If the system header file HEADER-FILE is compilable, execute shell
> commands ACTION-IF-FOUND, otherwise execute ACTION-IF-NOT-FOUND.
> If you just want to define a symbol if the header file is
> available, consider using `AC_CHECK_HEADERS' instead.
>
> For compatibility issues with older versions of Autoconf, please
> read below.
>
> - Macro: AC_CHECK_HEADERS (HEADER-FILE..., [ACTION-IF-FOUND],
> [ACTION-IF-NOT-FOUND], [INCLUDES = `default-includes'])
> For each given system header file HEADER-FILE in the
> whitespace-separated argument list that exists, define
> `HAVE_HEADER-FILE' (in all capitals). If ACTION-IF-FOUND is
> given, it is additional shell code to execute when one of the
> header files is found. You can give it a value of `break' to
> break out of the loop on the first match. If ACTION-IF-NOT-FOUND
> is given, it is executed when one of the header files is not found.
>
> For compatibility issues with older versions of Autoconf, please
> read below.
>
> Previous versions of Autoconf merely checked whether the header was
> accepted by the preprocessor. This was changed because the old test was
> inappropriate for typical uses. Headers are typically used to compile,
> not merely to preprocess, and the old behavior sometimes accepted
> headers that clashed at compile-time. If you need to check whether a
> header is preprocessable, you can use `AC_PREPROC_IFELSE' (*note
> Running the Preprocessor::).
>
> This scheme, which improves the robustness of the test, also requires
> that you make sure that headers that must be included before the
> HEADER-FILE be part of the INCLUDES, (*note Default Includes::). If
> looking for `bar.h', which requires that `foo.h' be included before if
> it exists, we suggest the following scheme:
>
>
> AC_CHECK_HEADERS([foo.h])
> AC_CHECK_HEADERS([bar.h], [], [],
> [#if HAVE_FOO_H
> # include <foo.h>
> # endif
> ])
>
> ----------------------------------------------------------------------
>
> Header Present But Cannot Be Compiled
> =====================================
>
> The most important guideline to bear in mind when checking for
> features is to mimic as much as possible the intended use.
> Unfortunately, old versions of `AC_CHECK_HEADER' and `AC_CHECK_HEADERS'
> failed to follow this idea, and called the preprocessor, instead of the
> compiler, to check for headers. As a result, incompatibilities between
> headers went unnoticed during configuration, and maintainers finally
> had to deal with this issue elsewhere.
>
> As of Autoconf 2.56 both checks are performed, and `configure'
> complains loudly if the compiler and the preprocessor do not agree.
> For the time being the result used is that of the preprocessor, to give
> maintainers time to adjust their `configure.ac', but in the near
> future, only the compiler will be considered.
>
> Consider the following example:
>
> $ cat number.h
> typedef int number;
> $ cat pi.h
> const number pi = 3;
> $ cat configure.ac
> AC_INIT
> AC_CHECK_HEADERS(pi.h)
> $ autoconf -Wall
> $ ./configure
> checking for gcc... gcc
> checking for C compiler default output... a.out
> checking whether the C compiler works... yes
> checking whether we are cross compiling... no
> checking for suffix of executables...
> checking for suffix of object files... o
> checking whether we are using the GNU C compiler... yes
> checking whether gcc accepts -g... yes
> checking for gcc option to accept ANSI C... none needed
> checking how to run the C preprocessor... gcc -E
> checking for egrep... grep -E
> checking for ANSI C header files... yes
> checking for sys/types.h... yes
> checking for sys/stat.h... yes
> checking for stdlib.h... yes
> checking for string.h... yes
> checking for memory.h... yes
> checking for strings.h... yes
> checking for inttypes.h... yes
> checking for stdint.h... yes
> checking for unistd.h... yes
> checking pi.h usability... no
> checking pi.h presence... yes
> configure: WARNING: pi.h: present but cannot be compiled
> configure: WARNING: pi.h: check for missing prerequisite headers?
> configure: WARNING: pi.h: proceeding with the preprocessor's result
> configure: WARNING: ## ------------------------------------ ##
> configure: WARNING: ## Report this to address@hidden ##
> configure: WARNING: ## ------------------------------------ ##
> checking for pi.h... yes
>
> The proper way the handle this case is using the fourth argument (*note
> Generic Headers::):
>
> $ cat configure.ac
> AC_INIT
> AC_CHECK_HEADERS(number.h pi.h,,,
> [[#if HAVE_NUMBER_H
> # include <number.h>
> #endif
> ]])
> $ autoconf -Wall
> $ ./configure
> checking for gcc... gcc
> checking for C compiler default output... a.out
> checking whether the C compiler works... yes
> checking whether we are cross compiling... no
> checking for suffix of executables...
> checking for suffix of object files... o
> checking whether we are using the GNU C compiler... yes
> checking whether gcc accepts -g... yes
> checking for gcc option to accept ANSI C... none needed
> checking for number.h... yes
> checking for pi.h... yes
>
> See *Note Particular Headers::, for a list of headers with their
> prerequisite.
>
> ----------------------------------------------------------------------
>
> Portability of Headers
> ----------------------
>
> This section tries to collect knowledge about common headers, and the
> problems they cause. By definition, this list will always require
> additions. Please help us keeping it as complete as possible.
>
> `inttypes.h' vs. `stdint.h'
> Paul Eggert notes that: ISO C 1999 says that `inttypes.h' includes
> `stdint.h', so there's no need to include `stdint.h' separately in
> a standard environment. Many implementations have `inttypes.h'
> but not `stdint.h' (e.g., Solaris 7), but I don't know of any
> implementation that has `stdint.h' but not `inttypes.h'. Nor do I
> know of any free software that includes `stdint.h'; `stdint.h'
> seems to be a creation of the committee.
>
> `net/if.h'
> On Darwin, this file requires that `sys/socket.h' be included
> beforehand. One should run:
>
> AC_CHECK_HEADERS([sys/socket.h])
> AC_CHECK_HEADERS([net/if.h], [], [],
> [#include <stdio.h>
> #if STDC_HEADERS
> # include <stdlib.h>
> # include <stddef.h>
> #else
> # if HAVE_STDLIB_H
> # include <stdlib.h>
> # endif
> #endif
> #if HAVE_SYS_SOCKET_H
> # include <sys/socket.h>
> #endif
> ])
>
> `stdlib.h'
> On many systems (e.g., Darwin), `stdio.h' is a prerequisite.
>
> `sys/socket.h'
> On Darwin, `stdlib.h' is a prerequisite.
> Hi!
> I just read the coretools configure script output on NetBSD-1.6K,
> and it said:
> checking sys/ucred.h presence... yes
> configure: WARNING: sys/ucred.h: present but cannot be compiled
> configure: WARNING: sys/ucred.h: check for missing prerequisite headers?
> configure: WARNING: sys/ucred.h: proceeding with the preprocessor's result
> configure: WARNING: ## ------------------------------------ ##
> configure: WARNING: ## Report this to address@hidden ##
> configure: WARNING: ## ------------------------------------ ##
>
> config.log says:
> configure:5204: cc -c -O2 -I/usr/pkg/include -I/usr/pkg/include conftest.c
> >&5
> In file included from /usr/include/sys/mount.h:42,
> from conftest.c:75:
> /usr/include/sys/ucred.h:51: `NGROUPS' undeclared here (not in a function)
> /usr/include/sys/ucred.h:59: `NGROUPS' undeclared here (not in a function)
>
>
> The getmntinfo(3) man page on NetBSD says:
> SYNOPSIS
> #include <sys/param.h>
> #include <sys/ucred.h>
> #include <sys/mount.h>
>
> int
> getmntinfo(struct statfs **mntbufp, int flags);
>
>
> Cheers,
> Thomas
>
>
--
Thomas Klausner - address@hidden
What is wanted is not the will to believe, but the will to find
out, which is the exact opposite. -- Bertrand Russell