system/libffi: Add libffi package integration

Add Kconfig, build rules, and ignore entries required to build and
package libffi as a standalone system component.

Signed-off-by: Tiago Medicci <tiago.medicci@espressif.com>
This commit is contained in:
Tiago Medicci 2026-05-21 14:29:22 +02:00 committed by Xiang Xiao
parent c9c5c75d08
commit 965cddfa36
4 changed files with 191 additions and 0 deletions

4
system/libffi/.gitignore vendored Normal file
View file

@ -0,0 +1,4 @@
/*.zip
/build/
/install/
/libffi/

24
system/libffi/Kconfig Normal file
View file

@ -0,0 +1,24 @@
#
# For a description of the syntax of this configuration file,
# see the file kconfig-language.txt in the NuttX tools repository.
#
config LIB_LIBFFI
bool "libffi"
default n
---help---
Enable the libffi Foreign Function Interface library. libffi
provides a portable way to call C functions with arguments
determined at runtime. It is required by CPython's _ctypes module.
if LIB_LIBFFI
config LIB_LIBFFI_VERSION
string "libffi commit hash"
default "9760868682cc9a33008761f158d86481d56738aa"
---help---
Git commit hash of the libffi repository to download and build.
The source is fetched from https://github.com/libffi/libffi at
the specified commit.
endif # LIB_LIBFFI

28
system/libffi/Make.defs Normal file
View file

@ -0,0 +1,28 @@
############################################################################
# apps/system/libffi/Make.defs
#
# SPDX-License-Identifier: Apache-2.0
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership. The
# ASF licenses this file to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance with the
# License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
############################################################################
ifneq ($(CONFIG_LIB_LIBFFI),)
CONFIGURED_APPS += $(APPDIR)/system/libffi
EXTRA_LIBPATHS += -L$(APPDIR)/system/libffi/install/lib
EXTRA_LIBS += -lffi
endif

135
system/libffi/Makefile Normal file
View file

@ -0,0 +1,135 @@
############################################################################
# apps/system/libffi/Makefile
#
# SPDX-License-Identifier: Apache-2.0
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership. The
# ASF licenses this file to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance with the
# License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
############################################################################
include $(APPDIR)/Make.defs
LIBFFI_URL = https://github.com/libffi/libffi/archive
LIBFFI_COMMIT = $(patsubst "%",%,$(strip $(CONFIG_LIB_LIBFFI_VERSION)))
LIBFFI_ZIP = libffi-$(LIBFFI_COMMIT).zip
LIBFFI_SRC = libffi
LIBFFI_BUILDDIR = $(CURDIR)/build
LIBFFI_INSTALLDIR = $(CURDIR)/install
APPS_INCDIR = $(APPDIR)$(DELIM)include
UNPACK ?= unzip -q -o
# ---------------------------------------------------------------------------
# Derive the autotools --host triplet from the NuttX configuration.
#
# libffi's configure.host matches on patterns such as:
# riscv*-*-* arm*-*-* aarch64*-*-* xtensa*-*-*
# mips*-*-* i?86-*-* x86_64-*-*
#
# We map CONFIG_ARCH (and, for RISC-V, the word-size selectors) to the
# CPU part that libffi expects, then append "-nuttx-elf" as vendor-os.
# ---------------------------------------------------------------------------
ifeq ($(CONFIG_ARCH),risc-v)
ifeq ($(CONFIG_ARCH_RV64),y)
LIBFFI_CPU = riscv64
else
LIBFFI_CPU = riscv32
endif
else ifeq ($(CONFIG_ARCH),arm64)
LIBFFI_CPU = aarch64
else ifeq ($(CONFIG_ARCH),arm)
LIBFFI_CPU = arm
else ifeq ($(CONFIG_ARCH),xtensa)
LIBFFI_CPU = xtensa
else ifeq ($(CONFIG_ARCH),mips)
LIBFFI_CPU = mips
else ifeq ($(CONFIG_ARCH),x86_64)
LIBFFI_CPU = x86_64
else ifeq ($(CONFIG_ARCH),x86)
LIBFFI_CPU = i686
else
LIBFFI_CPU = $(subst -,,$(CONFIG_ARCH))
endif
LIBFFI_HOST = $(LIBFFI_CPU)-nuttx-elf
# ---------------------------------------------------------------------------
# CFLAGS for the libffi build itself.
#
# We start from the NuttX-provided CFLAGS (which already carry -march,
# -mabi, -isystem paths, -D__NuttX__, etc.) and add a few flags that the
# library needs. We deliberately strip -nostdlib because autoconf link
# checks need the default startfiles/libs to succeed.
# ---------------------------------------------------------------------------
LIBFFI_CFLAGS = $(filter-out -nostdlib -Werror -Werror=% -Wno-cpp,$(CFLAGS))
LIBFFI_CFLAGS += -ffunction-sections -fdata-sections -O2
# ---------------------------------------------------------------------------
# Download, autoreconf, configure, build, install
# ---------------------------------------------------------------------------
ifeq ($(wildcard $(LIBFFI_SRC)/.git),)
$(LIBFFI_ZIP):
@echo "Downloading: $(LIBFFI_URL)/$(LIBFFI_COMMIT).zip"
$(Q) curl -L $(LIBFFI_URL)/$(LIBFFI_COMMIT).zip -o $(LIBFFI_ZIP)
$(LIBFFI_SRC): $(LIBFFI_ZIP)
@echo "Unpacking: $(LIBFFI_ZIP) -> $(LIBFFI_SRC)"
$(Q) $(UNPACK) $(LIBFFI_ZIP)
$(Q) mv libffi-$(LIBFFI_COMMIT) $(LIBFFI_SRC)
endif
$(LIBFFI_SRC)/configure: $(LIBFFI_SRC)
@echo "Generating libffi configure script (autoreconf)"
$(Q) (cd $(LIBFFI_SRC) && autoreconf -v -i)
$(LIBFFI_INSTALLDIR)/lib/libffi.a: $(LIBFFI_SRC)/configure
$(Q) mkdir -p $(LIBFFI_BUILDDIR)
$(Q) ( \
cd $(LIBFFI_BUILDDIR) && \
$(CURDIR)/$(LIBFFI_SRC)/configure \
--host=$(LIBFFI_HOST) \
--prefix=$(LIBFFI_INSTALLDIR) \
--disable-shared \
--enable-static \
--disable-docs \
--disable-exec-static-tramp \
--disable-multi-os-directory \
CC="$(CC)" \
CFLAGS="$(LIBFFI_CFLAGS)" \
AR="$(CROSSDEV)ar" \
RANLIB="$(CROSSDEV)ranlib" \
)
$(MAKE) -C $(LIBFFI_BUILDDIR) -j$(shell nproc)
$(MAKE) -C $(LIBFFI_BUILDDIR) install
context:: $(LIBFFI_INSTALLDIR)/lib/libffi.a
$(Q) mkdir -p $(APPS_INCDIR)
$(Q) cp $(LIBFFI_INSTALLDIR)/include/*.h $(APPS_INCDIR)
distclean::
$(call DELDIR, $(LIBFFI_BUILDDIR))
$(call DELDIR, $(LIBFFI_INSTALLDIR))
$(call DELDIR, $(LIBFFI_SRC))
$(call DELFILE, $(LIBFFI_ZIP))
$(call DELFILE, $(APPS_INCDIR)/ffi.h)
$(call DELFILE, $(APPS_INCDIR)/ffitarget.h)
include $(APPDIR)/Application.mk