Couche d'abstraction de portabilité (PAL)¶
Ce document décrit les composants de la couche de portabilité qui permettent au projet de fonctionner sur Linux, macOS et Windows.
Vue d'ensemble¶
La PAL (Portability Abstraction Layer) est organisée en trois modules dans src/platform/ :
| Module | Fichier | Responsabilité |
|---|---|---|
platform_utils |
platform_utils.c/.h |
Détection de plateforme, macros |
platform_time |
platform_time.c/.h |
Mesure du temps haute résolution |
platform_fs |
platform_fs.c/.h |
Opérations sur le système de fichiers |
Composant : platform_utils¶
Détection de plateforme¶
#if defined(_WIN32)
#define PLATFORM_WINDOWS 1
#elif defined(__APPLE__)
#define PLATFORM_MACOS 1
#elif defined(__linux__)
#define PLATFORM_LINUX 1
#endif
Macros utilitaires¶
// Attributs portables
#define MAYBE_UNUSED __attribute__((unused))
#define INLINE static inline __attribute__((always_inline))
// Séparateur de chemin
#ifdef PLATFORM_WINDOWS
#define PATH_SEP '\\'
#else
#define PATH_SEP '/'
#endif
Composant : platform_time¶
Fournit un chronomètre haute résolution indépendant de la plateforme :
typedef struct { uint64_t value; } PlatformTime;
PlatformTime platform_time_now(void);
double platform_time_elapsed_ms(PlatformTime start, PlatformTime end);
double platform_time_elapsed_s(PlatformTime start, PlatformTime end);
Implémentation :
- Linux : clock_gettime(CLOCK_MONOTONIC)
- macOS : mach_absolute_time()
- Windows : QueryPerformanceCounter()
Composant : platform_fs¶
Listage de répertoires basé sur le callback¶
L'API de listage de répertoires utilise une architecture callback pour éviter l'allocation dynamique et permettre un traitement streaming :
typedef void (*fs_dir_entry_callback)(const char* path, void* user_data);
int platform_fs_list_dir(const char* dir,
fs_dir_entry_callback callback,
void* user_data);
Usage :
// Lister tous les fichiers .hdr dans le dossier assets
void on_hdr_found(const char* path, void* ctx) {
if (str_ends_with(path, ".hdr")) {
add_environment(ctx, path);
}
}
platform_fs_list_dir("assets/environments", on_hdr_found, &env_list);
Opérations courantes¶
// Vérifier l'existence d'un fichier
bool platform_fs_exists(const char* path);
// Obtenir la taille d'un fichier
int64_t platform_fs_size(const char* path);
// Lire un fichier entier en mémoire
uint8_t* platform_fs_read_all(const char* path, size_t* out_size);
Support Windows (cross-compilation)¶
La compilation Windows s'effectue via la toolchain MinGW :
# Configurer pour Windows
just configure-win
# Compiler
just build-win
# Exécuter via Wine
just run-win
La toolchain est définie dans toolchain-mingw.cmake :
Voir aussi¶
- build.md — Guide de compilation
- project_structure.md — Structure du projet