hyperic / sigar

System Information Gatherer And Reporter

Home Page:http://sigar.hyperic.com/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

MacOS Monteray Xcode 13 build failure incomplete type 'struct nfsstats'

MarekR22 opened this issue · comments

Apparently system library header files has been changed for latest Xcode hiding definition of struct nfsstats.
As a result sigar fails to compile.

Xcode Version 13.2.1 (13C100)
MacOS Monteray 12.1 (21C52)

Steps I used:

git clone https://github.com/hyperic/sigar.git
cd sigar
mkdir build
cd build
cmake -G Xcode ..
cmake --build . -j 4

Outcome:

/Users/marekR22/Downloads/sigar/src/os/darwin/darwin_sigar.c:3233:24: error: invalid application of 'sizeof' to an incomplete type 'struct nfsstats'
    size_t len = sizeof(*stats);
                       ^~~~~~~~
/Users/marekR22/Downloads/sigar/src/os/darwin/darwin_sigar.c:3231:32: note: forward declaration of 'struct nfsstats'
static int get_nfsstats(struct nfsstats *stats)
                               ^
/Users/marekR22/Downloads/sigar/src/os/darwin/darwin_sigar.c:3303:21: error: variable has incomplete type 'struct nfsstats'
    struct nfsstats stats;
                    ^
/Users/marekR22/Downloads/sigar/src/os/darwin/darwin_sigar.c:3303:12: note: forward declaration of 'struct nfsstats'
    struct nfsstats stats;
           ^
/Users/marekR22/Downloads/sigar/src/os/darwin/darwin_sigar.c:3329:21: error: variable has incomplete type 'struct nfsstats'
    struct nfsstats stats;
                    ^
/Users/marekR22/Downloads/sigar/src/os/darwin/darwin_sigar.c:3329:12: note: forward declaration of 'struct nfsstats'
    struct nfsstats stats;
           ^

I'm still trying to find proper header file to include, but no luck so far.
I will provide pull request when I find solution.

Looks like meaning of constant NFS_NFSSTATS has changed.
It is used here.

Old version of NFS_NFSSTATS is defined here.

#define NFS_NFSSTATS        1       /* struct: struct nfsstats */

Now when I jump to this constant when using new Xcode (new SDK) this defintion has following comment

#define NFS_NFSSTATS        1       /* struct: struct nfsclntstats */

Now old definition of struct nfsstats:

/*
 * Stats structure
 */
struct nfsstats {
	uint64_t        attrcache_hits;
	uint64_t        attrcache_misses;
	uint64_t        lookupcache_hits;
	uint64_t        lookupcache_misses;
	uint64_t        direofcache_hits;
	uint64_t        direofcache_misses;
	uint64_t        biocache_reads;
	uint64_t        read_bios;
	uint64_t        read_physios;
	uint64_t        biocache_writes;
	uint64_t        write_bios;
	uint64_t        write_physios;
	uint64_t        biocache_readlinks;
	uint64_t        readlink_bios;
	uint64_t        biocache_readdirs;
	uint64_t        readdir_bios;
	uint64_t        rpccnt[NFS_NPROCS];
	uint64_t        rpcretries;
	uint64_t        srvrpccnt[NFS_NPROCS];
	uint64_t        srvrpc_errs;
	uint64_t        srv_errs;
	uint64_t        rpcrequests;
	uint64_t        rpctimeouts;
	uint64_t        rpcunexpected;
	uint64_t        rpcinvalid;
	uint64_t        srvcache_inproghits;
	uint64_t        srvcache_idemdonehits;
	uint64_t        srvcache_nonidemdonehits;
	uint64_t        srvcache_misses;
	uint64_t        srvvop_writes;
	uint64_t        pageins;
	uint64_t        pageouts;
};

New struct nfsclntstats:

/*
 * Stats structure
 */
struct nfsclntstats {
	uint64_t        attrcache_hits;
	uint64_t        attrcache_misses;
	uint64_t        lookupcache_hits;
	uint64_t        lookupcache_misses;
	uint64_t        direofcache_hits;
	uint64_t        direofcache_misses;
	uint64_t        biocache_reads;
	uint64_t        read_bios;
	uint64_t        read_physios;
	uint64_t        biocache_writes;
	uint64_t        write_bios;
	uint64_t        write_physios;
	uint64_t        biocache_readlinks;
	uint64_t        readlink_bios;
	uint64_t        biocache_readdirs;
	uint64_t        readdir_bios;
	uint64_t        rpccntv3[NFS_NPROCS];
	uint64_t        opcntv4[NFS_OP_COUNT];
	uint64_t        rpcretries;
	uint64_t        rpcrequests;
	uint64_t        rpctimeouts;
	uint64_t        rpcunexpected;
	uint64_t        rpcinvalid;
	uint64_t        pageins;
	uint64_t        pageouts;
};

So they are look similar, but not same.
Note this breaks binary compatibility :/ so this this Apple bug :(.