fix: build PIP on Pico and arbitrary flag combinations

- guard console subsystem (PIScreen/PIScreenTile/tiles/PITerminal/
  PIKbdListener) by PIP_HAS_THREADS plus a TTY or Windows console
  (new PIP_HAS_TTY platform macro) - termios is not available on
  bare-metal newlib
- guard cloud subsystem (PICloudBase/Client/Server/TCP) by
  PIP_HAS_SOCKET and PIP_HAS_THREADS
- add PIP_BUILD_CONSOLE/PIP_BUILD_CLOUD to the auto-disable flag
  dependencies in CMake
- PIP_CAN (SocketCAN) is Linux-only, exclude other platforms
- on Pico keep sockets/MQTT off by default: pico-sdk lwip provides
  only a partial POSIX socket layer (no netinet/in.h, poll.h)
- PITranslator: inline no-op definitions when PIP_HAS_FILESYSTEM is
  off so the _tr literal links
- PIIODevice: guard read_func/write_func EVENT_HANDLERs (no-threads)
- piwaitevent_p.cpp: drop unused sys/ioctl.h include (missing on
  arm-none-eabi, broke Pico builds)
This commit is contained in:
2026-08-22 15:49:05 +03:00
parent 32066e3a8c
commit 8828aa3f81
16 changed files with 92 additions and 32 deletions
+17 -4
View File
@@ -248,10 +248,11 @@ if(DEFINED PICO_BOARD OR PIP_FREERTOS)
if(NOT DEFINED PICO_FREERTOS)
set(PIP_HAS_THREADS OFF CACHE BOOL "" FORCE)
endif()
if(NOT DEFINED PICO_LWIP)
set(PIP_HAS_SOCKET OFF CACHE BOOL "" FORCE)
set(PIP_BUILD_MQTT_CLIENT OFF CACHE BOOL "" FORCE)
endif()
# pico-sdk lwip provides only a partial POSIX socket layer (no netinet/in.h,
# poll.h), so PIEthernet/PICAN and the paho.mqtt.c library cannot be built
# on Pico yet; keep sockets off by default
set(PIP_HAS_SOCKET OFF CACHE BOOL "" FORCE)
set(PIP_BUILD_MQTT_CLIENT OFF CACHE BOOL "" FORCE)
message(STATUS "Building PIP for Pi Pico SDK ${PICO_SDK_VERSION_STRING}")
else()
if(NOT DEFINED LWIP)
@@ -278,6 +279,18 @@ if(NOT PIP_HAS_THREADS)
message(STATUS "INTROSPECTION requires PIP_HAS_THREADS, disabling INTROSPECTION")
set(INTROSPECTION OFF CACHE BOOL "" FORCE)
endif()
if(PIP_BUILD_CONSOLE)
message(STATUS "PIP_BUILD_CONSOLE requires PIP_HAS_THREADS, disabling PIP_BUILD_CONSOLE")
set(PIP_BUILD_CONSOLE OFF CACHE BOOL "" FORCE)
endif()
if(PIP_BUILD_CLOUD)
message(STATUS "PIP_BUILD_CLOUD requires PIP_HAS_THREADS and PIP_HAS_SOCKET, disabling PIP_BUILD_CLOUD")
set(PIP_BUILD_CLOUD OFF CACHE BOOL "" FORCE)
endif()
endif()
if(PIP_BUILD_CLOUD AND NOT PIP_HAS_SOCKET)
message(STATUS "PIP_BUILD_CLOUD requires PIP_HAS_SOCKET, disabling PIP_BUILD_CLOUD")
set(PIP_BUILD_CLOUD OFF CACHE BOOL "" FORCE)
endif()
if(PIP_HAS_FILESYSTEM)
+17 -1
View File
@@ -5,7 +5,7 @@
//! \~russian Поддержка перевода
/*
PIP - Platform Independent Primitives
Translation support
Translation support
Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
@@ -107,6 +107,22 @@ private:
static PITranslator * instance();
};
#ifndef PIP_HAS_FILESYSTEM
// no-filesystem build: translations cannot be loaded from disk, all strings pass through unchanged
inline PIString PITranslator::tr(const PIString & in, const PIString &) {
return in;
}
inline void PITranslator::clear() {}
inline void PITranslator::loadLang(const PIString &, PIString) {}
inline void PITranslator::loadConfig(const PIString &) {}
inline bool PITranslator::load(const PIByteArray &) {
return false;
}
inline bool PITranslator::loadFile(const PIString &) {
return false;
}
#endif // PIP_HAS_FILESYSTEM
//! \~\ingroup Application
//! \~\brief
+2
View File
@@ -33,6 +33,7 @@
//! \brief
//! \~english Base class for cloud client and server.
//! \~russian Базовый класс для облачного клиента и сервера.
#if defined(PIP_HAS_SOCKET) && defined(PIP_HAS_THREADS)
class PIP_CLOUD_EXPORT PICloudBase {
public:
//! \~english Constructs the shared PICloud transport state.
@@ -48,5 +49,6 @@ protected:
PIStreamPacker streampacker;
PICloud::TCP tcp;
};
#endif // PIP_HAS_SOCKET && PIP_HAS_THREADS
#endif // PICLOUDBASE_H
+2
View File
@@ -32,6 +32,7 @@
//! \~\brief
//! \~english %PIIODevice implementation for a logical PICloud client.
//! \~russian Реализация %PIIODevice для логического клиента PICloud.
#if defined(PIP_HAS_SOCKET) && defined(PIP_HAS_THREADS)
class PIP_CLOUD_EXPORT PICloudClient
: public PIIODevice
, public PICloudBase {
@@ -102,5 +103,6 @@ private:
std::atomic_bool is_connected;
std::atomic_bool is_deleted;
};
#endif // PIP_HAS_SOCKET && PIP_HAS_THREADS
#endif // PICLOUDCLIENT_H
+2
View File
@@ -32,6 +32,7 @@
//! \~\brief
//! \~english %PIIODevice implementation for a logical PICloud server.
//! \~russian Реализация %PIIODevice для логического сервера PICloud.
#if defined(PIP_HAS_SOCKET) && defined(PIP_HAS_THREADS)
class PIP_CLOUD_EXPORT PICloudServer
: public PIIODevice
, public PICloudBase {
@@ -127,5 +128,6 @@ private:
mutable PIMutex clients_mutex;
std::atomic_bool is_deleted;
};
#endif // PIP_HAS_SOCKET && PIP_HAS_THREADS
#endif // PICLOUDSERVER_H
+7 -5
View File
@@ -43,13 +43,14 @@ namespace PICloud {
//! \~\brief
//! \~english Builds and parses PICloud frames on top of %PIStreamPacker.
//! \~russian Формирует и разбирает кадры PICloud поверх %PIStreamPacker.
#if defined(PIP_HAS_SOCKET) && defined(PIP_HAS_THREADS)
class PIP_CLOUD_EXPORT TCP {
public:
//! \~english Supported PICloud frame versions.
//! \~russian Поддерживаемые версии кадров PICloud.
enum Version {
Version_1 = 1 /** \~english First protocol version \~russian Первая версия протокола */,
Version_2 = 2 /** \~english Current protocol version \~russian Текущая версия протокола */
Version_2 = 2 /** \~english Current protocol version \~russian Текущая версия протокола */
};
//! \~english Logical destination role of a PICloud frame.
@@ -64,10 +65,10 @@ public:
//! \~russian Вид полезной нагрузки кадра PICloud.
enum Type {
InvalidType = 0 /** \~english Invalid or unknown frame \~russian Некорректный или неизвестный кадр */,
Connect = 1 /** \~english Connect or registration frame \~russian Кадр подключения или регистрации */,
Disconnect = 2 /** \~english Disconnect notification frame \~russian Кадр уведомления об отключении */,
Data = 3 /** \~english Payload data frame \~russian Кадр с полезными данными */,
Ping = 4 /** \~english Keepalive frame \~russian Кадр поддержания соединения */
Connect = 1 /** \~english Connect or registration frame \~russian Кадр подключения или регистрации */,
Disconnect = 2 /** \~english Disconnect notification frame \~russian Кадр уведомления об отключении */,
Data = 3 /** \~english Payload data frame \~russian Кадр с полезными данными */,
Ping = 4 /** \~english Keepalive frame \~russian Кадр поддержания соединения */
};
@@ -154,6 +155,7 @@ private:
PIStreamPacker * streampacker;
PIMutex mutex_send;
};
#endif // PIP_HAS_SOCKET && PIP_HAS_THREADS
} // namespace PICloud
+1 -1
View File
@@ -18,7 +18,7 @@
*/
#include "pikbdlistener.h"
#ifdef PIP_HAS_THREADS
#if defined(PIP_HAS_THREADS) && (defined(WINDOWS) || defined(PIP_HAS_TTY))
# include "piincludes_p.h"
# include "piliterals.h"
+1 -1
View File
@@ -27,7 +27,7 @@
#include "pibase.h"
#ifdef PIP_HAS_THREADS
#if defined(PIP_HAS_THREADS) && (defined(WINDOWS) || defined(PIP_HAS_TTY))
# include "pithread.h"
# include "pitime.h"
+2
View File
@@ -34,6 +34,7 @@
//! \~\brief
//! \~english Console screen manager with tile layout, drawing, and input routing.
//! \~russian Менеджер консольного экрана с раскладкой тайлов, отрисовкой и маршрутизацией ввода.
#if defined(PIP_HAS_THREADS) && (defined(WINDOWS) || defined(PIP_HAS_TTY))
class PIP_CONSOLE_EXPORT PIScreen
: public PIThread
, public PIScreenTypes::PIScreenBase {
@@ -214,6 +215,7 @@ private:
PIScreenTile root;
PIScreenTile *tile_focus, *tile_dialog;
};
#endif // PIP_HAS_THREADS
#endif // PISCREEN_H
+2
View File
@@ -38,6 +38,7 @@ class PIScreenDrawer;
//! \details
//! \~english Base class for all screen tiles providing layout and event handling.
//! \~russian Базовый класс для всех экранных тайлов, обеспечивающий компоновку и обработку событий.
#if defined(PIP_HAS_THREADS) && (defined(WINDOWS) || defined(PIP_HAS_TTY))
class PIP_CONSOLE_EXPORT PIScreenTile: public PIObject {
friend class PIScreen;
PIOBJECT_SUBCLASS(PIScreenTile, PIObject);
@@ -237,6 +238,7 @@ protected:
private:
int pw, ph;
};
#endif // PIP_HAS_THREADS
#endif // PISCREENTILE_H
+8 -3
View File
@@ -36,6 +36,7 @@
//! \~\brief
//! \~english Simple text tile with per-row formatting.
//! \~russian Простой текстовый тайл с форматированием по строкам.
#if defined(PIP_HAS_THREADS) && (defined(WINDOWS) || defined(PIP_HAS_TTY))
class PIP_CONSOLE_EXPORT TileSimple: public PIScreenTile {
PIOBJECT_SUBCLASS(TileSimple, PIScreenTile);
@@ -147,7 +148,8 @@ public:
//! \~russian События, генерируемые тайлом списка.
enum EventType {
SelectionChanged /** \~english Selection set changed. \~russian Изменился набор выбранных строк. */,
RowPressed /** \~english Current row was activated; event data stores the row index. \~russian Текущая строка была активирована; данные события содержат индекс строки. */
RowPressed /** \~english Current row was activated; event data stores the row index. \~russian Текущая строка была активирована;
данные события содержат индекс строки. */
};
//! \~english Constructs a list tile with the specified selection mode.
@@ -259,7 +261,8 @@ public:
//! \~english Events emitted by the button group.
//! \~russian События, генерируемые группой кнопок.
enum EventType {
ButtonSelected /** \~english A button was selected; event data stores the button index. \~russian Кнопка была выбрана; данные события содержат индекс кнопки. */
ButtonSelected /** \~english A button was selected; event data stores the button index. \~russian Кнопка была выбрана; данные
события содержат индекс кнопки. */
};
//! \~english Button caption with cell format.
@@ -310,7 +313,8 @@ public:
//! \~english Events emitted by the check box.
//! \~russian События, генерируемые флажком.
enum EventType {
Toggled /** \~english Check state changed; event data stores the new boolean value. \~russian Состояние флажка изменилось; данные события содержат новое логическое значение. */
Toggled /** \~english Check state changed; event data stores the new boolean value. \~russian Состояние флажка изменилось; данные
события содержат новое логическое значение. */
};
//! \~english Text format of the caption.
@@ -442,6 +446,7 @@ protected:
bool inv;
PITimeMeasurer tm_blink;
};
#endif // PIP_HAS_THREADS
#endif // PISCREENTILES_H
+4 -2
View File
@@ -39,6 +39,7 @@
//! and text formatting.
//! \~russian Обеспечивает эмуляцию терминала для чтения ввода и вывода консоли. Поддерживает ANSI escape-последовательности для перемещения
//! курсора, цветов и форматирования текста.
#if defined(PIP_HAS_THREADS) && (defined(WINDOWS) || defined(PIP_HAS_TTY))
class PIP_CONSOLE_EXPORT PITerminal: public PIThread {
PIOBJECT_SUBCLASS(PITerminal, PIThread);
@@ -97,13 +98,13 @@ private:
void getCursor(int & x, int & y);
uchar invertColor(uchar c);
void run() override;
#ifndef WINDOWS
# ifndef WINDOWS
void parseInput(const PIString & s);
bool isCompleteEscSeq(const PIString & es);
void applyEscSeq(PIString es);
void moveCursor(int dx, int dy);
int termType(const PIString & t);
#endif
# endif
PRIVATE_DECLARATION(PIP_CONSOLE_EXPORT)
int dsize_x, dsize_y;
@@ -112,6 +113,7 @@ private:
PITimeMeasurer cursor_tm;
PIVector<PIVector<PIScreenTypes::Cell>> cells;
};
#endif // PIP_HAS_THREADS
#endif // PITERMINAL_H
-1
View File
@@ -27,7 +27,6 @@
#else
# include <errno.h>
# include <fcntl.h>
# include <sys/ioctl.h>
#endif
#include "pistring.h"
+1 -1
View File
@@ -20,7 +20,7 @@
#include "pipropertystorage.h"
#include "piwaitevent_p.h"
#if !defined(WINDOWS) && !defined(MAC_OS) && defined(PIP_HAS_SOCKET)
#if defined(LINUX) && defined(PIP_HAS_SOCKET)
# define PIP_CAN
#endif
#ifdef PIP_CAN
+21 -13
View File
@@ -59,20 +59,26 @@ typedef std::function<bool(const uchar *, int, void *)> ReadRetFunc;
#else
# define REGISTER_DEVICE(name) \
STATIC_INITIALIZER_BEGIN \
PIIODevice::registerDevice(name::fullPathPrefixS(), #name, []() -> PIIODevice * { return new name(); }); \
STATIC_INITIALIZER_END
# define REGISTER_DEVICE(name) \
STATIC_INITIALIZER_BEGIN \
PIIODevice::registerDevice(name::fullPathPrefixS(), #name, []() -> PIIODevice * { return new name(); }); \
STATIC_INITIALIZER_END
# define PIIODEVICE(name, prefix) \
PIOBJECT_SUBCLASS(name, PIIODevice) \
PIIODevice * copy() const override { return new name(); } \
\
public: \
PIConstChars fullPathPrefix() const override { return prefix; } \
static PIConstChars fullPathPrefixS() { return prefix; } \
\
private:
# define PIIODEVICE(name, prefix) \
PIOBJECT_SUBCLASS(name, PIIODevice) \
PIIODevice * copy() const override { \
return new name(); \
} \
\
public: \
PIConstChars fullPathPrefix() const override { \
return prefix; \
} \
static PIConstChars fullPathPrefixS() { \
return prefix; \
} \
\
private:
#endif
@@ -598,8 +604,10 @@ protected:
void * ret_data_ = nullptr;
private:
#ifdef PIP_HAS_THREADS
EVENT_HANDLER(void, read_func);
EVENT_HANDLER(void, write_func);
#endif
virtual PIIODevice * copy() const { return nullptr; }
PIString fullPathOptions() const;
+5
View File
@@ -205,4 +205,9 @@
# define POSIX_SIGNALS
#endif
// Platform provides a text terminal (termios TTY) for console keyboard I/O
#if defined(LINUX) || defined(MAC_OS) || defined(ANDROID) || defined(QNX) || defined(FREE_BSD)
# define PIP_HAS_TTY
#endif
#endif // PIPLATFORM_H