#if defined(WINDOWS)
  #if defined(WINNT)
    #include "os-windows.hpp"
    #if defined(FACTOR_AMD64)
      #include "os-windows.64.hpp"
    #elif defined(FACTOR_X86)
      #include "os-windows.32.hpp"
    #else
      #error "Unsupported Windows flavor"
    #endif
  #else
    #error "Unsupported Windows flavor"
  #endif
#else
  #include "os-unix.hpp"

  #ifdef __APPLE__
    #include "os-macosx.hpp"
    #include "mach_signal.hpp"

    #ifdef FACTOR_X86
      #include "os-macosx-x86.32.hpp"
    #elif defined(FACTOR_AMD64)
      #include "os-macosx-x86.64.hpp"
    #else
      #error "Unsupported Mac OS X flavor"
    #endif
  #else
    #include "os-genunix.hpp"
    #if defined(__linux__)
      #define FACTOR_OS_STRING "linux"
      #include "os-linux.hpp"

      #if defined(FACTOR_X86)
        #include "os-linux-x86.32.hpp"
      #elif defined(FACTOR_PPC64)
        #include "os-linux-ppc.64.hpp"
      #elif defined(FACTOR_PPC32)
        #include "os-linux-ppc.32.hpp"
      #elif defined(FACTOR_ARM)
        #include "os-linux-arm.hpp"
      #elif defined(FACTOR_AMD64)
        #include "os-linux-x86.64.hpp"
      #else
        #error "Unsupported Linux flavor"
      #endif
    #else
      #error "Unsupported OS"
    #endif
  #endif
#endif

#if defined(FACTOR_X86)
  #include "cpu-x86.32.hpp"
  #include "cpu-x86.hpp"
#elif defined(FACTOR_AMD64)
  #include "cpu-x86.64.hpp"
  #include "cpu-x86.hpp"
#elif defined(FACTOR_PPC)
  #include "cpu-ppc.hpp"
#elif defined(FACTOR_ARM)
  #include "cpu-arm.hpp"
#else
  #error "Unsupported CPU"
#endif