When compiling SVN 1752 on macOS, an error is thrown by src/Command.cc:

g++ -DHAVE_CONFIG_H -I. -I..    -Wall  -I sql -I 
/Volumes/MyPassport/paulrockwell/Documents/apl/trunk          
-I/opt/local/include -std=c++11 -I 
/Volumes/MyPassport/paulrockwell/Documents/apl/trunk -MT apl-Command.o -MD -MP 
-MF .deps/apl-Command.Tpo -c -o apl-Command.o `test -f 'Command.cc' || echo 
'./'`Command.cc
Command.cc:2033:49: error: no member named 'st_mtim' in 'stat'
             if (sort == SORT_TIME)   return st.st_mtim.tv_sec;
                                             ~~ ^
Evidently on macOS the system-defined definition of struct stat is defined 
differently than on Linux (from "man 1 stat" on macOS):

The buf argument is a pointer to a stat structure as defined by ⟨sys/stat.h⟩ 
and into which information is
placed concerning the file.  When the macro _DARWIN_FEATURE_64_BIT_INODE is not 
defined (see below for more
information about this macro), the stat structure is defined as:

struct stat { /* when _DARWIN_FEATURE_64_BIT_INODE is NOT defined */
         dev_t    st_dev;    /* device inode resides on */
         ino_t    st_ino;    /* inode's number */
         mode_t   st_mode;   /* inode protection mode */
         nlink_t  st_nlink;  /* number of hard links to the file */
         uid_t    st_uid;    /* user-id of owner */
         gid_t    st_gid;    /* group-id of owner */
         dev_t    st_rdev;   /* device type, for special file inode */
         struct timespec st_atimespec;  /* time of last access */
         struct timespec st_mtimespec;  /* time of last data modification */
         struct timespec st_ctimespec;  /* time of last file status change */
         off_t    st_size;   /* file size, in bytes */
         quad_t   st_blocks; /* blocks allocated for file */
         u_long   st_blksize;/* optimal file sys I/O ops blocksize */
         u_long   st_flags;  /* user defined flags for file */
         u_long   st_gen;    /* file generation number */
     };
However, when the macro _DARWIN_FEATURE_64_BIT_INODE is defined, the stat 
structure will now be defined as:

     struct stat { /* when _DARWIN_FEATURE_64_BIT_INODE is defined */
         dev_t           st_dev;           /* ID of device containing file */
         mode_t          st_mode;          /* Mode of file (see below) */
         nlink_t         st_nlink;         /* Number of hard links */
         ino_t           st_ino;           /* File serial number */
         uid_t           st_uid;           /* User ID of the file */
         gid_t           st_gid;           /* Group ID of the file */
         dev_t           st_rdev;          /* Device ID */
         struct timespec st_atimespec;     /* time of last access */
         struct timespec st_mtimespec;     /* time of last data modification */
         struct timespec st_ctimespec;     /* time of last status change */
         struct timespec st_birthtimespec; /* time of file creation(birth) */
         off_t           st_size;          /* file size, in bytes */
         blkcnt_t        st_blocks;        /* blocks allocated for file */
         blksize_t       st_blksize;       /* optimal blocksize for I/O */
         uint32_t        st_flags;         /* user defined flags for file */
         uint32_t        st_gen;           /* file generation number */
         int32_t         st_lspare;        /* RESERVED: DO NOT USE! */
         int64_t         st_qspare[2];     /* RESERVED: DO NOT USE! */
     };

On Linux, the struct is defined as:

      struct stat {
           dev_t      st_dev;      /* ID of device containing file */
           ino_t      st_ino;      /* Inode number */
           mode_t     st_mode;     /* File type and mode */
           nlink_t    st_nlink;    /* Number of hard links */
           uid_t      st_uid;      /* User ID of owner */
           gid_t      st_gid;      /* Group ID of owner */
           dev_t      st_rdev;     /* Device ID (if special file) */
           off_t      st_size;     /* Total size, in bytes */
           blksize_t  st_blksize;  /* Block size for filesystem I/O */
           blkcnt_t   st_blocks;   /* Number of 512 B blocks allocated */

           /* Since POSIX.1-2008, this structure supports nanosecond
              precision for the following timestamp fields.
              For the details before POSIX.1-2008, see VERSIONS. */

           struct timespec  st_atim;  /* Time of last access */
           struct timespec  st_mtim;  /* Time of last modification */
           struct timespec  st_ctim;  /* Time of last status change */

       #define st_atime  st_atim.tv_sec  /* Backward compatibility */
       #define st_mtime  st_mtim.tv_sec
       #define st_ctime  st_ctim.tv_sec
       };


struct timespec seems to be defined the same on both platforms.

struct stat seems to contain the same information as available on Linux, but 
the fields for st_atime, st_mtime, and st_ctime are named differently on the 
Mac. It appears that the Mac definitions may pre-date POSIX.1-2008. Maybe 
that's why the differences - perhaps Apple anticipated the updated standard but 
never went back to update the definitions once approved?

 I've modified the source of Command.cc to change line 2033 from

             if (sort == SORT_TIME)   return st.st_mtim.tv_sec;
to
             if (sort == SORT_TIME)   return st.st_mtimespec.tv_sec;
and the module compiles successfully. I can conditionalize this with #ifdef 
__APPLE__ like I did with my changes to
Backtrace.cc, but thought I'd defer to you to determine how you want to handle 
this.

- Paul Rockwell 



.

Reply via email to