diff --git a/src/spider/runtime/native/distro.hpp b/src/spider/runtime/native/distro.hpp index 45dcbb0..3c490ed 100644 --- a/src/spider/runtime/native/distro.hpp +++ b/src/spider/runtime/native/distro.hpp @@ -1,3 +1,130 @@ #pragma once +// ========================================================== // +// Compiling or Writing? // +// ========================================================== // + +#ifdef SPIDER_WRITING + #error "[Spider Distro] Please do not set this macro." +#endif + +#ifndef SPIDER_COMPILING + #define SPIDER_WRITING +#endif + +// ========================================================== // +// Distro // +// ========================================================== // + +#if !defined(SPIDER_DISTRO_DESKTOP) && !defined(SPIDER_DISTRO_MOBILE) && !defined(SPIDER_DISTRO_MICRO) && !defined(SPIDER_DISTRO_BROWSER) + // Autodetect distribution and OS + #if defined(__EMSCRIPTEN__) || defined(__wasm__) + #define SPIDER_DISTRO_BROWSER + #define SPIDER_OS_WASM + #elif defined(__ANDROID__) + #define SPIDER_DISTRO_MOBILE + #define SPIDER_OS_ANDROID + #elif defined(__APPLE__) && defined(__MACH__) + #include + #if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR + #define SPIDER_DISTRO_MOBILE + #define SPIDER_OS_IOS + #else + #define SPIDER_DISTRO_DESKTOP + #define SPIDER_OS_MACOS + #endif + #elif defined(_WIN32) || defined(_WIN64) + #define SPIDER_DISTRO_DESKTOP + #define SPIDER_OS_WINDOWS + #elif defined(__linux__) && !defined(__ANDROID__) + #define SPIDER_DISTRO_DESKTOP + #define SPIDER_OS_LINUX + #elif defined(__unix__) || defined(__unix) + #define SPIDER_DISTRO_DESKTOP + #define SPIDER_OS_LINUX + #else + // ========================================================== // + // MUST be a microcontroller! // + // ========================================================== // + #include + #ifdef SPIDER_DISTRO_MICRO + #error "[Spider Distro] Could not autodetect. Please select a distro and OS manually." + #endif + #endif +#endif + +// ========================================================== // +// Distro and OS specific configuration // +// ========================================================== // + +#if defined(SPIDER_DISTRO_DESKTOP) + + #define SPIDER_DISTRO_NAME "Desktop" + + #if !defined(SPIDER_USE_ICU) && !defined(SPIDER_NO_ICU) + #define SPIDER_USE_ICU + #endif + + #if defined(SPIDER_OS_WINDOWS) + #define SPIDER_OS_NAME "Windows" + #elif defined(SPIDER_OS_MACOS) + #define SPIDER_OS_NAME "Mac OS" + #elif defined(SPIDER_OS_LINUX) + #define SPIDER_OS_NAME "Linux" + #elif + #error "[Spider Distro] Unsupported OS" + #endif + +#elif defined(SPIDER_DISTRO_MOBILE) + + #define SPIDER_DISTRO_NAME "Mobile" + + #if !defined(SPIDER_USE_ICU) && !defined(SPIDER_NO_ICU) + #define SPIDER_no_ICU + #endif + + #if defined(SPIDER_OS_ANDROID) + #define SPIDER_OS_NAME "Android" + #elif defined(SPIDER_OS_IOS) + #define SPIDER_OS_NAME "iOS" + #elif + #error "[Spider Distro] Unsupported OS" + #endif + +#elif defined(SPIDER_DISTRO_BROWSER) + + #define SPIDER_DISTRO_NAME "Browser" + + #if !defined(SPIDER_USE_ICU) && !defined(SPIDER_NO_ICU) + #define SPIDER_NO_ICU + #endif + + #if defined(SPIDER_OS_WASM) + #define SPIDER_OS_NAME "WASM" + #elif + #error "[Spider Distro] Unsupported OS" + #endif + +#elif defined(SPIDER_DISTRO_MICRO) + + #include + + #define SPIDER_DISTRO_NAME "Micro" + + #if !defined(SPIDER_USE_ICU) && !defined(SPIDER_NO_ICU) + #define SPIDER_NO_ICU + #endif + + #if define(SPIDER_OS_NONE) + #define SPIDER_OS_NAME "None" + #elif !defined(SPIDER_OS_MCU) + #error "[Spider Distro] Unsupported MCU OS" + #endif + +#else + + #error "[Spider Distro] Unsupported Distro" + +#endif + diff --git a/src/spider/runtime/native/distro_mcu.hpp b/src/spider/runtime/native/distro_mcu.hpp new file mode 100644 index 0000000..ffb3362 --- /dev/null +++ b/src/spider/runtime/native/distro_mcu.hpp @@ -0,0 +1,112 @@ +#pragma once + +// ========================================================== // +// SPIDER MICROCONTROLLER AUTODETECT // +// ========================================================== // + +// Automatically enable configurations for the microcontroller // +// so long as we can detect it or the user has already configured // +// the corresponding macros. // + +#define SPIDER_MCU_FAM_GENERIC 0 +#define SPIDER_MCU_FAM_AVR 1 +#define SPIDER_MCU_FAM_ARM_CM 2 +#define SPIDER_MCU_FAM_ARM_MBED 3 +#define SPIDER_MCU_FAM_PIC 4 +#define SPIDER_MCU_FAM_PIC32 5 +#define SPIDER_MCU_FAM_ESP8266 6 +#define SPIDER_MCU_FAM_ESP32 7 +#define SPIDER_MCU_FAM_RISCV 8 +#define SPIDER_MCU_FAM_RP2040 9 + +#if defined(SPIDER_MCU_AVR) || defined(__avr__) || defined(__AVR__) +// ========================================================== // +// AVR (Atmel / Microchip) // +// ========================================================== // + #define SPIDER_MCU_FAMILY SPIDER_MCU_FAM_AVR + #define SPIDER_MCU_NAME "AVR" + +#elif defined(SPIDER_MCU_ARM) || defined(__arm__) || defined(__ARM_ARCH) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_6M__) +// ========================================================== // +// ARM Cortex-M (most STM32, nRF, etc.) // +// ========================================================== // + #define SPIDER_MCU_FAMILY SPIDER_MCU_FAM_ARM_CM + #define SPIDER_MCU_NAME "ARM Cortex-M" + +#elif defined(SPIDER_MCU_MBED) || defined(TARGET_LIKE_MBED) +// ========================================================== // +// Mbed OS special detection // +// ========================================================== // + #define SPIDER_MCU_FAMILY SPIDER_MCU_FAM_ARM_MBED + #define SPIDER_MCU_NAME "ARM MBED" + #define SPIDER_OS_NAME "MBED OS" + +#elif defined(SPIDER_MCU_PIC8) || defined(__XC) && (defined(_PIC14) || defined(_PIC16)) +// ========================================================== // +// PIC (8-bit) // +// ========================================================== // + #define SPIDER_MCU_FAMILY SPIDER_MCU_FAM_PIC + #define SPIDER_MCU_NAME "PIC (8-bit)" + +#elif defined(SPIDER_MCU_PIC32) || defined(__XC32__) +// ========================================================== // +// PIC32 (MIPS) // +// ========================================================== // + #define SPIDER_MCU_FAMILY SPIDER_MCU_FAM_PIC32 + #define SPIDER_MCU_NAME "PIC (32-bit)" + +#elif defined(SPIDER_MCU_ESP8266) || defined(ESP8266) +// ========================================================== // +// ESP8266 // +// ========================================================== // + #define SPIDER_MCU_FAMILY SPIDER_MCU_FAM_ESP8266 + #define SPIDER_MCU_NAME "ESP-8266" + +#elif defined(SPIDER_MCU_ESP32) || defined(ESP32) +// ========================================================== // +// ESP32 // +// ========================================================== // + #define SPIDER_MCU_FAMILY SPIDER_MCU_FAM_ESP32 + #define SPIDER_MCU_NAME "ESP-32" + +#elif defined(SPIDER_MCU_PICO) || defined(PICO_PLATFORM) || defined(PICO_BOARD) || defined(RP2040) || defined(__RP2040__) +// ========================================================== // +// Raspberry Pi Pico (RP2040) // +// ========================================================== // + #define SPIDER_MCU_FAM_FAMILY SPIDER_MCU_FAM_RP2040 + #define SPIDER_MCU_NAME "ESP-32" + +#elif defined(SPIDER_MCU_RISCV) || defined(__riscv) || defined(__riscv__) +// ========================================================== // +// RISC-V MCUs // +// ========================================================== // + #define SPIDER_MCU_FAMILY SPIDER_MCU_FAM_RISCV + #define SPIDER_MCU_NAME "RISC-V MCU" + +#elif defined(SPIDER_MCU_GENERIC) +// ========================================================== // +// GENERIC MICRO // +// ========================================================== // + #define SPIDER_MCU_FAMILY SPIDER_MCU_FAM_GENERIC + #define SPIDER_MCU_NAME "Generic MCU" +#endif + +#ifdef SPIDER_MCU_FAMILY + + #ifndef SPIDER_DISTRO_MICRO + #define SPIDER_DISTRO_MICRO + #endif + + // If SPIDER_OS_NAME was already defined, implies the SPIDER_MCU_FAM has an OS + #if defined(SPIDER_OS_NAME) && !defined(SPIDER_OS_MCU) + #define SPIDER_OS_MCU + #endif + + // If no SPIDER_MCU_FAM OS defined, then it is NONE + #ifndef SPIDER_OS_MCU + #define SPIDER_OS_NONE + #endif + +#elif defined(SPIDER_DISTRO_MICRO) + #error "[Spider Distro] Unsupported SPIDER_MCU_FAM. Define SPIDER_MCU_GENERIC and see if works." +#endif diff --git a/src/spider/runtime/native/machine.hpp b/src/spider/runtime/native/machine.hpp index 13ff024..2509368 100644 --- a/src/spider/runtime/native/machine.hpp +++ b/src/spider/runtime/native/machine.hpp @@ -5,7 +5,10 @@ * things like alignment and type juggling */ -// === ENDIANESS === // +// ========================================================== // +// ENDIANNESS // +// ========================================================== // + // Used by GCC/Clang/WASM/ESP32/RP2040 and most compilers #if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && defined(__ORDER_BIG_ENDIAN__) #define SPIDER_LITTLE_ENDIAN (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) @@ -31,6 +34,8 @@ #define SPIDER_LITTLE_ENDIAN 1 #define SPIDER_BIG_ENDIAN 0 // Likely will never use this clause + // ...but keeps compatibility with the one (1) + // guy who uses MSVC. #elif defined(_WIN32) || defined(_M_IX86) || defined(_M_X64) #define SPIDER_LITTLE_ENDIAN 1 #define SPIDER_BIG_ENDIAN 0 @@ -47,31 +52,23 @@ #warning "Mixed endian machine detected, unsupported! Be cautious adventurer!" #endif -// === PACKING === // -// TODO: move somewhere else -#if defined(__clang__) - #define SPIDER_COMPILER_CLANG 1 - #define SPIDER_COMPILER_GCC_LIKE 1 -#elif defined(__GNUC__) - #define SPIDER_COMPILER_GCC 1 - #define SPIDER_COMPILER_GCC_LIKE 1 -#elif defined(_MSC_VER) - #define SPIDER_COMPILER_MSVC 1 -#else - #define SPIDER_COMPILER_UNKNOWN 1 -#endif -// TODO: Ditto of whatever I already have -#if defined(__EMSCRIPTEN__) || defined(__wasm__) - #define SPIDER_PLATFORM_WASM 1 -#elif defined(__AVR_ATmega328P__) || defined(__AVR__) - #define SPIDER_PLATFORM_AVR 1 // ATmega328 -#elif defined(ARDUINO_ARCH_RP2040) || defined(PICO_BOARD) - #define SPIDER_PLATFORM_RP2040 1 -#elif defined(ESP32) || defined(ARDUINO_ARCH_ESP32) - #define SPIDER_PLATFORM_ESP32 1 -#elif defined(STM32) || defined(ARDUINO_ARCH_STM32) - #define SPIDER_PLATFORM_STM32 1 +// ========================================================== // +// PACKING // +// ========================================================== // + + +// Find out what compiler the user is using +#if defined(__clang__) + #define SPIDER_COMPILER_CLANG + #define SPIDER_COMPILER_GCC_LIKE +#elif defined(__GNUC__) + #define SPIDER_COMPILER_GCC + #define SPIDER_COMPILER_GCC_LIKE +#elif defined(_MSC_VER) + #define SPIDER_COMPILER_MSVC +#else + #define SPIDER_COMPILER_UNKNOWN #endif // Macros...