Replace monolithic MICRO_PIP/PIP_MICRO with granular flags: Feature flags (CMake options + platform auto-detection): - PIP_NO_FILESYSTEM, PIP_NO_THREADS, PIP_NO_SOCKET - PIP_NO_PROCESS, PIP_NO_DYNLIB, PIP_NO_FFT, PIP_NO_SERIAL Embedded optimization flag: - PIP_EMBEDDED (auto-set for Pico SDK and FreeRTOS) Controls buffer sizes, time stubs, terminal fallback, init stubs Platform blocks in CMakeLists.txt: - Pico SDK: auto-disables FS, PROCESS, DYNLIB, FFT, SERIAL; conditionally disables THREADS (no FreeRTOS) and SOCKET (no LWIP) - FreeRTOS: auto-disables FS, PROCESS, DYNLIB, FFT, SERIAL; conditionally disables SOCKET (no LWIP) - Android: auto-disables PROCESS, DYNLIB, FFT Updated 96 files across libs/, utils/, tests/, and CMakeLists.txt. Builds verified for Linux (547 tests pass) and Pico SDK (100%). Removed all MICRO_PIP and PIP_MICRO references (0 remaining).
7.4 KiB
7.4 KiB
План миграции MICRO_PIP → тонкозернистые макросы
Архитектура
CMakeLists.txt — центр логики:
- Опции
PIP_NO_*(можно переопределить вручную) - Platform-блоки (Pico SDK, FreeRTOS) устанавливают опции автоматически
add_definitions(-DPIP_NO_*)передаёт флаги в компилятор
piplatform.h — минимальная логика:
PIP_MIN_MSLEEPотPIP_NO_THREADSPISERIAL_NO_PINSдля embedded- Определение
LINUX(без MICRO_PIP)
Код — использует feature flags: #ifndef PIP_NO_THREADS, #ifndef PIP_NO_FILESYSTEM и т.д.
Флаг-карта по платформам
| Платформа | FS | Threads | Socket | Process | Dynlib | FFT | Serial |
|---|---|---|---|---|---|---|---|
| Linux/Desktop | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Windows | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| macOS | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Android | ✓ | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ |
| QNX | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| FreeBSD | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| FreeRTOS (+LWIP) | ✗ | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ |
| FreeRTOS (no LWIP) | ✗ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ |
| Pico SDK (+FreeRTOS+LWIP) | ✗ | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ |
| Pico SDK (bare metal) | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
Пошаговый план
Шаг 1. CMakeLists.txt — опции + platform-логика
Добавить опции:
option(PIP_NO_SOCKET "Disable socket/network support" OFF)
option(PIP_NO_PROCESS "Disable process management" OFF)
option(PIP_NO_DYNLIB "Disable dynamic library loading" OFF)
option(PIP_NO_FFT "Disable FFT support" OFF)
option(PIP_NO_SERIAL "Disable serial port support" OFF)
Pico SDK блок:
if(DEFINED PICO_BOARD)
add_definitions(-DPICO_SDK)
set(PIP_NO_FILESYSTEM ON CACHE BOOL "" FORCE)
if(NOT DEFINED PICO_FREERTOS)
set(PIP_NO_THREADS ON CACHE BOOL "" FORCE)
endif()
if(NOT DEFINED PICO_LWIP)
set(PIP_NO_SOCKET ON CACHE BOOL "" FORCE)
endif()
set(PIP_NO_PROCESS ON CACHE BOOL "" FORCE)
set(PIP_NO_DYNLIB ON CACHE BOOL "" FORCE)
set(PIP_NO_FFT ON CACHE BOOL "" FORCE)
set(PIP_NO_SERIAL ON CACHE BOOL "" FORCE)
message(STATUS "Building PIP for Pi Pico SDK ${PICO_SDK_VERSION_STRING}")
endif()
FreeRTOS блок:
if(PIP_FREERTOS)
add_definitions(-DPIP_FREERTOS)
set(PIP_NO_FILESYSTEM ON CACHE BOOL "" FORCE)
if(NOT DEFINED LWIP)
set(PIP_NO_SOCKET ON CACHE BOOL "" FORCE)
endif()
set(PIP_NO_PROCESS ON CACHE BOOL "" FORCE)
set(PIP_NO_DYNLIB ON CACHE BOOL "" FORCE)
set(PIP_NO_FFT ON CACHE BOOL "" FORCE)
set(PIP_NO_SERIAL ON CACHE BOOL "" FORCE)
endif()
Android блок (если нет):
if(DEFINED ANDROID_PLATFORM)
set(PIP_NO_PROCESS ON CACHE BOOL "" FORCE)
set(PIP_NO_DYNLIB ON CACHE BOOL "" FORCE)
set(PIP_NO_FFT ON CACHE BOOL "" FORCE)
endif()
add_definitions для всех флагов:
if(PIP_NO_FILESYSTEM) add_definitions(-DPIP_NO_FILESYSTEM) endif()
if(PIP_NO_THREADS) add_definitions(-DPIP_NO_THREADS) endif()
if(PIP_NO_SOCKET) add_definitions(-DPIP_NO_SOCKET) endif()
if(PIP_NO_PROCESS) add_definitions(-DPIP_NO_PROCESS) endif()
if(PIP_NO_DYNLIB) add_definitions(-DPIP_NO_DYNLIB) endif()
if(PIP_NO_FFT) add_definitions(-DPIP_NO_FFT) endif()
if(PIP_NO_SERIAL) add_definitions(-DPIP_NO_SERIAL) endif()
PIP_MIN_MSLEEP:
if(PIP_NO_THREADS)
add_definitions(-DPIP_MIN_MSLEEP=10)
else()
add_definitions(-DPIP_MIN_MSLEEP=1)
endif()
Убрать: блок PIP_MICRO / MICRO_PIP.
Шаг 2. piplatform.h
Заменить блок MICRO_PIP (строки 156-163) на:
#ifdef PICO_SDK
#define PISERIAL_NO_PINS
#endif
#ifdef FREERTOS
#ifndef PISERIAL_NO_PINS
#define PISERIAL_NO_PINS
#endif
#endif
Linux определение (строки 165-179): убрать MICRO_PIP из цепочки.
Убрать doxygen-документацию MICRO_PIP (строка 77-81).
Шаг 3. pibase_macros.h
Убрать doxygen MICRO_PIP (строки 119-121, 171).
__PIP_TYPENAME__ (строки 226-232): уже перенесено на RTTI check.
PIP_MIN_MSLEEP (строка ~402): убрать, теперь задается CMake.
Шаг 4. Файлы целиком под MICRO_PIP
4a. PIProcess → PIP_NO_PROCESS
libs/main/system/piprocess.h/.cpp:#ifndef MICRO_PIP→#ifndef PIP_NO_PROCESS
4b. PILibrary → PIP_NO_DYNLIB
libs/main/system/pilibrary.h/.cpp:#ifndef MICRO_PIP→#ifndef PIP_NO_DYNLIB
4c. PIPluginLoader → PIP_NO_DYNLIB
libs/main/system/piplugin.h/.cpp:#ifndef MICRO_PIP→#ifndef PIP_NO_DYNLIB
4d. PIKbdListener → PIP_NO_THREADS
libs/main/console/pikbdlistener.h/.cpp:#ifndef MICRO_PIP→#ifndef PIP_NO_THREADS
4e. PISerial → PIP_NO_SERIAL
libs/main/io_devices/piserial.cpp:#ifndef MICRO_PIP→#ifndef PIP_NO_SERIAL
4f. PIWaitEvent → PIP_NO_THREADS
libs/main/core/piwaitevent_p.h/.cpp:#ifndef MICRO_PIP→#ifndef PIP_NO_THREADS
4g. PIFFT → PIP_NO_FFT
libs/main/math/pifft.h/.cpp:#ifndef MICRO_PIP→#ifndef PIP_NO_FFT
4h. PITerminal → PIP_NO_PROCESS
libs/console/piterminal.cpp:#ifndef MICRO_PIP→#ifndef PIP_NO_PROCESS
4i. PIInit → композитная проверка
piinit.h: композитный макрос_PIP_INIT_STUB_piinit.cpp,piinit.h,piincludes.h:MICRO_PIP→_PIP_INIT_STUB_
Шаг 5. Частичные MICRO_PIP
5a. __PIThreadCollection → PIP_NO_THREADS
pithread.h/.cpp: всеMICRO_PIP→PIP_NO_THREADS
5b. PIObject diagnostics
piobject.h:PIIntrospectionfriend →PIP_INTROSPECTION, убратьPIObjectManager,dumpApplicationбез guardpiobject.cpp: includes по фичам, mutex →PIP_NO_THREADS
5c. Buffer sizes → убрать ветки, оставить дефолтные
5d. piscreen → PIP_NO_PROCESS
5e. PISystemMonitor → PIP_NO_PROCESS / PIP_NO_FILESYSTEM
5f. PIFile → PICO_SDK / LINUX / FREE_BSD
5g. Time functions → PICO_SDK / FREERTOS / PIP_NO_FILESYSTEM
5h. Variants → RTTI check / PIP_NO_FILESYSTEM
5i. System tests → PIP_NO_FILESYSTEM
5j. PIIODevice stop → PIP_NO_THREADS
5k. PICAN → PIP_NO_SOCKET (уже сделано)
Шаг 6. Doxygen/документация
Убрать MICRO_PIP из piplatform.h, pibase_macros.h.
Шаг 7. Финальная очистка
grep -r MICRO_PIP → 0. Убрать PIP_MICRO из CMakeLists.txt.
Порядок выполнения
- CMakeLists.txt — опции + platform-блоки + add_definitions
- piplatform.h — убрать MICRO_PIP, оставить PISERIAL_NO_PINS
- pibase_macros.h — убрать MICRO_PIP, PIP_MIN_MSLEEP (теперь CMake)
- Файлы целиком (шаг 4)
- Частичные (шаг 5)
- Doxygen (шаг 6)
- grep-проверка (шаг 7)