the Compartmented Robust Posix C++ Unit Test system

Chapter 1. crpcut Requirements

The minimum requirement for installing and using crpcut is a modern C++ compiler, a highly POSIX compliant operating system and CMake. The short version is that any modern Linux will do fine.

In addition to the minimum, you are encouraged to build on a machine with valgrind and Ruby.

Compiler requirements

Your C++ compiler must support:

Variadic macros

Variadic macros are required by C99, and are available on most C++ compilers. They are required by C++-2011.

decltype or typeof

decltype is a new keyword in C++-2011 that gives the type of an expression, similarly to how sizeof gives the size of the type of an expression. GCC has since long had another extension, typeof, which doesn't quite do the same thing, but it's close enough to work.

_Exit()

A function standardized for C99, and C++-2011. It is similar to exit() except that it exits immediately, without running any at-exit handlers or static destructors.

uint64_t and uint32_t
typedef's mandated by C99 and C++-2011.

GCC supports these since long, and crpcut has been verified to work with versions 4.2.4, 4.3.6, 4.4.7, 4.5.5, 4.6.4, 4.7.4 and 4.8.5, 4.9.3, 5.1.0 and 5.2.0

Clang is verified to work with versions 3.6 and 3.7

Operating system requirements

POSIX.1

  • EEXIST
  • EINTR

POSIX.1-2001

  • alloca()
  • chdir()
  • clock_gettime(CLOCK_MONOTONIC)[5]
  • clock_gettime(CLOCK_PROCESS_CPUTIME_ID)[6]
  • close()
  • closedir()
  • dup2()
  • fork()
  • getcwd()
  • getenv()
  • gethostname()
  • getpgid()
  • getrusage()
  • iconv()
  • iconv_close()
  • iconv_open()
  • killpg()
  • mkdir()
  • open()
  • opendir()
  • pipe()
  • read()
  • readdir_r()
  • remove[7]
  • regcomp(), regexec(), regerror() and regfree()[8]
  • rmdir()
  • select()
  • setpgid()
  • signal()
  • waitid()
  • write()

POSIX.1-2008

  • mkdtemp()


[5] Otherwise, mach_timebase_info() and mach_absolute_time() will be used.

If those too are unavailable, setitimer(ITIMER_REAL) and getitimer(ITIMER_REAL) will be used.

If even that fails, gettimeofday() will be used.

[6] If unavailable, setitimer(ITIMER_PROF) and getitimer(ITIMER_PROF) will be used.

If even that fails, setitimer(ITIMER_VIRT) and getitimer(ITIMER_VIRT) will be used.

[7] A runtime dependency that is only required when using the WIPE_WORKING_DIR function with either the EXPECT_EXIT(num, action?) or the EXPECT_SIGNAL_DEATH(signo, action?) test case modifier.

[8] A runtime dependency that is only required when actually using the supported match functionality for regular expressions.