Problems with time.h from an inexperienced user?

Csaba Raduly
Fri Jul 4 08:43:00 GMT 2014

Hi Hal,

On Thu, Jul 3, 2014 at 11:37 PM, Hal Wills  wrote:
> Apparently there is a discrepancy between how Cygwin handles timeval.h
> and how most Linux distributions handle it, because I am unable to
> build htop and ncmpcpp with visualizer support on Cygwin.
> Here are the errors when I attempt to 'make' ncmpcpp and './configure' htop:
> then mv -f ".deps/cmdargs.Tpo" ".deps/cmdargs.Po"; else rm -f
> ".deps/cmdargs.Tpo"; exit 1; fi
> In file included from cmdargs.cpp:41:0:
> visualizer.h:72:2: error: 'timeval' does not name a type
>   timeval m_timer;
>   ^
> Makefile:444: recipe for target 'cmdargs.o' failed
> make[2]: *** [cmdargs.o] Error 1
> make[2]: Leaving directory '/home/ullr/ncmpcpp/src'
> Makefile:305: recipe for target 'all-recursive' failed
> make[1]: *** [all-recursive] Error 1
> make[1]: Leaving directory '/home/ullr/ncmpcpp'
> Makefile:217: recipe for target 'all' failed
> make: *** [all] Error 2
> In file included from Header.h:13:0,
>                  from Settings.h:15,
>                  from AvailableMetersPanel.h:12,
>                  from AvailableMetersPanel.c:8:
> Meter.h:88:19: error: field 'time' has incomplete type
>     struct timeval time;
>                    ^

At least for htop, this is due to the very Linux-centric nature of
htop, and the different way system headers include each other.

htop's Meter.h uses timeval, but does not include sys/time.h
This is incorrect, but htop on Linux gets away with it, because
Meter.h includes Process.h, which also doesn't include sys/time.h, but
includes sys/types.h

On my Ubuntu 12.04 LTS, /usr/include/x86_64-linux-gnu/sys/types.h
includes time.h, which drags in the declaration of timeval.

Here's a report from include-what-you-use (a tool based on clang) for Meter.h:

$ make CC=iwyu Meter.o
iwyu -DHAVE_CONFIG_H -I.  -DNDEBUG   -g -O2 -MT Meter.o -MD -MP -MF
.deps/Meter.Tpo -c -o Meter.o Meter.c

Meter.h should add these lines:
#include <ncursesw/curses.h>            // for attrset, mvaddch
#include <sys/time.h>                   // for timeval
#include "Object.h"                     // for Object, ObjectClass
#include "Panel.h"                      // for MAX
#include "RichString.h"                 // for MIN
struct Meter_;

Meter.h should remove these lines:

The full include-list for Meter.h:
#include <ncursesw/curses.h>            // for attrset, mvaddch
#include <sys/time.h>                   // for timeval
#include "ListItem.h"                   // for ListItem
#include "Object.h"                     // for Object, ObjectClass
#include "Panel.h"                      // for MAX
#include "ProcessList.h"                // for ProcessList
#include "RichString.h"                 // for MIN
struct Meter_;

Meter.c should add these lines:
#include <stddef.h>                     // for size_t
#include <stdio.h>                      // for snprintf

Meter.c should remove these lines:
- #include <stdarg.h>  // lines 29-29
- #include "String.h"  // lines 22-22


You should #include <sys/time.h> in your local copy of Meter.h (and
similar fixes elsewhere, if needed).
Then you could try convincing the author of htop to fix his program by
sending the necessary diffs.

GCS a+ e++ d- C++ ULS$ L+$ !E- W++ P+++$ w++$ tv+ b++ DI D++ 5++
The Tao of math: The numbers you can count are not the real numbers.
Life is complex, with real and imaginary parts.
"Ok, it boots. Which means it must be bug-free and perfect. " -- Linus Torvalds
"People disagree with me. I just ignore them." -- Linus Torvalds

Problem reports:
Unsubscribe info:

More information about the Cygwin mailing list