Why does this compile?
Mark Millard
markmi at dsl-only.net
Tue Sep 26 05:03:24 UTC 2017
On 2017-Sep-25, at 9:38 PM, Russell Haley <russ.haley at gmail.com> wrote:
> I'm trying to compile the new dotnet core 2.0 and I've run into a C
> problem I don't understand. Since I ran the code to check it on my arm
> board, I'm going to ask here (the most knowledgeable fbsd C people I
> could ask).
>
> The cmake file is trying to test for a linux struct in_pktinfo:
>
> check_c_source_compiles(
> "
> #include <${SOCKET_INCLUDES}>
> int main()
> {
> struct in_pktinfo;
> return 0;
> }
> "
> HAVE_IN_PKTINFO)
>
> SOCKET_INCLUDES resolves to netinet/in.h so the final source is:
>
> #include <netinet/in.h>
>
> int main()
> {
> struct in_pktinfo;
> return 0;
> }
>
> This compiles on FreeBSD current and apparently on 11 too. That's a
> bad thing because it's supposed to fail. I checked in.h and there is
> no struct for in_pktinfo. Not surprisingly, if I remove the include
> altogether, it still compiles.
struct in_pktinfo;
declares but does not define the struct type. Not even
the size is known --but nothing is done that needs
to use even the size.
By contrast the below would need the definition
of the struct type in question:
#include <netinet/in.h>
int main()
{
struct in_pktinfo struct_instance;
return 0;
}
> I assume then that the original author made a mistake? My C is too
> weak and most of my searches don't turn up anything close to what I'm
> looking for.
The program needs to have something that requires
seeing the definition of the type, such as needing
its size.
> Any suggestions would be awesome. :)
check_c_source_compiles(
"
#include <${SOCKET_INCLUDES}>
int main()
{
struct in_pktinfo struct_instance;
return 0;
}
"
HAVE_IN_PKTINFO)
===
Mark Millard
markmi at dsl-only.net
More information about the freebsd-arm
mailing list