############################################################################ # 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