X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/62cade03b8f704f3f01ad1356c4bca1d197b39a4..aaca845659c047aadcb6ffc473ab3b69f78b0707:/package/base-files/Makefile diff --git a/package/base-files/Makefile b/package/base-files/Makefile index 8138f1cd4..03016ba4c 100644 --- a/package/base-files/Makefile +++ b/package/base-files/Makefile @@ -1,5 +1,6 @@ # -# Copyright (C) 2007-2009 OpenWrt.org +# Copyright (C) 2007-2011 OpenWrt.org +# Copyright (C) 2010 Vertical Communications # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. @@ -9,9 +10,10 @@ include $(TOPDIR)/rules.mk include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=base-files -PKG_RELEASE:=33 +PKG_RELEASE:=86 PKG_FILE_DEPENDS:=$(PLATFORM_DIR)/ $(GENERIC_PLATFORM_DIR)/base-files/ +PKG_BUILD_DEPENDS:=opkg/host include $(INCLUDE_DIR)/package.mk @@ -21,10 +23,7 @@ ifneq ($(DUMP),1) TARGET:=$(TARGET)-$(PROFILE) endif LIBGCC_VERSION:=$(GCC_VERSION) - ifeq ($(ARCH),x86_64) - LIB_SUFFIX:=64 - endif - ifneq ($(findstring mips64,$(ARCH)),) + ifneq ($(findstring $(ARCH) , mips64 x86_64 ),) LIB_SUFFIX:=64 endif else @@ -35,6 +34,7 @@ endif define Package/base-files SECTION:=base CATEGORY:=Base system + DEPENDS:=+!USE_NETIFD:base-files-network +USE_NETIFD:netifd TITLE:=Base filesystem for OpenWrt URL:=http://openwrt.org/ VERSION:=$(PKG_RELEASE)-$(REVISION) @@ -46,14 +46,19 @@ define Package/base-files endef define Package/base-files/conffiles -/etc/banner /etc/hosts /etc/inittab /etc/group /etc/passwd +/etc/shadow /etc/profile /etc/shells /etc/sysctl.conf +/etc/rc.local +/etc/sysupgrade.conf +/etc/config/ +/etc/dropbear/ +/etc/crontabs/ $(call $(TARGET)/conffiles) endef @@ -61,6 +66,11 @@ define Package/base-files/description This package contains a base filesystem and system scripts for OpenWrt. endef +define Package/base-files/config + config USE_NETIFD + bool "Use netifd instead of the old network init scripts (experimental!)" + default n +endef define Package/gcc/Default SECTION:=libs @@ -160,6 +170,7 @@ ifneq ($(TARGET_avr32)$(TARGET_coldfire),) DEPENDS:=+libgcc endif URL:=$(LIBC_URL) + PKG_FLAGS:=hold essential endef @@ -192,7 +203,6 @@ endef define Package/libpthread $(call Package/libc/Default) TITLE:=POSIX thread library - DEPENDS:= +librt endef define Package/libpthread/config @@ -219,6 +229,7 @@ endef define Package/librt $(call Package/libc/Default) TITLE:=POSIX.1b RealTime extension library + DEPENDS:=+libpthread endef define Package/librt/config @@ -242,6 +253,32 @@ define Package/librt/config endef +define Package/libgfortran +$(call Package/gcc/Default) + TITLE:=GFortran support library + DEPENDS+=@!(TARGET_avr32||TARGET_coldfire) @INSTALL_GFORTRAN +endef + +define Package/libgfortran/config + menu "Configuration" + depends EXTERNAL_TOOLCHAIN && PACKAGE_libgfortran + + config LIBGFORTRAN_ROOT_DIR + string + prompt "libgfortran shared library base directory" + depends EXTERNAL_TOOLCHAIN && PACKAGE_libgfortran + default TOOLCHAIN_ROOT if !NATIVE_TOOLCHAIN + default "/" if NATIVE_TOOLCHAIN + + config LIBGFORTRAN_FILE_SPEC + string + prompt "libgfortran shared library files (use wildcards)" + depends EXTERNAL_TOOLCHAIN && PACKAGE_libgfortran + default "./usr/lib/libgfortran.so.*" + + endmenu +endef + define Package/ldd $(call Package/libc/Default) SECTION:=utils @@ -298,16 +335,98 @@ define Package/ldconfig/config endef +ifneq ($(CONFIG_PREINITOPT),) +define ImageConfigOptions + mkdir -p $(1)/lib/preinit + echo 'pi_suppress_stderr="$(CONFIG_TARGET_PREINIT_SUPPRESS_STDERR)"' >$(1)/lib/preinit/00_preinit.conf + echo 'fs_failsafe_wait_timeout=$(if $(CONFIG_TARGET_PREINIT_TIMEOUT),$(CONFIG_TARGET_PREINIT_TIMEOUT),2)' >>$(1)/lib/preinit/00_preinit.conf + echo 'pi_init_path=$(if $(CONFIG_TARGET_INIT_PATH),$(CONFIG_TARGET_INIT_PATH),"/bin:/sbin:/usr/bin:/usr/sbin")' >>$(1)/lib/preinit/00_preinit.conf + echo 'pi_init_env=$(if $(CONFIG_TARGET_INIT_ENV),$(CONFIG_TARGET_INIT_ENV),"")' >>$(1)/lib/preinit/00_preinit.conf + echo 'pi_init_cmd=$(if $(CONFIG_TARGET_INIT_CMD),$(CONFIG_TARGET_INIT_CMD),"/sbin/init")' >>$(1)/lib/preinit/00_preinit.conf + echo 'pi_init_suppress_stderr="$(CONFIG_TARGET_INIT_SUPPRESS_STDERR)"' >>$(1)/lib/preinit/00_preinit.conf + echo 'pi_ifname=$(if $(CONFIG_TARGET_PREINIT_IFNAME),$(CONFIG_TARGET_PREINIT_IFNAME),"")' >>$(1)/lib/preinit/00_preinit.conf + echo 'pi_ip=$(if $(CONFIG_TARGET_PREINIT_IP),$(CONFIG_TARGET_PREINIT_IP),"192.168.1.1")' >>$(1)/lib/preinit/00_preinit.conf + echo 'pi_netmask=$(if $(CONFIG_TARGET_PREINIT_NETMASK),$(CONFIG_TARGET_PREINIT_NETMASK),"255.255.255.0")' >>$(1)/lib/preinit/00_preinit.conf + echo 'pi_broadcast=$(if $(CONFIG_TARGET_PREINIT_BROADCAST),$(CONFIG_TARGET_PREINIT_BROADCAST),"192.168.1.255")' >>$(1)/lib/preinit/00_preinit.conf + echo 'pi_preinit_net_messages="$(CONFIG_TARGET_PREINIT_SHOW_NETMSG)"' >>$(1)/lib/preinit/00_preinit.conf + echo 'pi_preinit_no_failsafe_netmsg="$(CONFIG_TARGET_PREINIT_SUPPRESS_FAILSAFE_NETMSG)"' >>$(1)/lib/preinit/00_preinit.conf +endef +endif + define Build/Prepare mkdir -p $(PKG_BUILD_DIR) endef -define Build/Compile/Default -endef +LIBGCC_A=$(wildcard $(TOOLCHAIN_DIR)/lib/gcc/*/*/libgcc_pic.a) +LIBGCC_MAP=$(wildcard $(TOOLCHAIN_DIR)/lib/gcc/*/*/libgcc.map) +LIBGCC_SO=$(wildcard $(TOOLCHAIN_DIR)/lib/libgcc_s.so.*) +ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),) + ifneq ($(if $(CONFIG_USE_UCLIBC),$(CONFIG_GCC_VERSION_LINARO)),) + BUILD_LIBGCC:=$(if $(CONFIG_avr32)$(CONFIG_m68k)$(CONFIG_powerpc),,$(PKG_BUILD_DIR)/libgcc_s.so.*) + endif +endif + +ifneq ($(BUILD_LIBGCC),) + define Build/Compile/uClibc + $(SCRIPT_DIR)/relink-lib.sh \ + "$(TARGET_CROSS)" \ + "$(wildcard $(TOOLCHAIN_DIR)/lib/libc_so.a)" \ + "$(wildcard $(TOOLCHAIN_DIR)/lib/libc_so.a)" \ + "$(patsubst $(TOOLCHAIN_DIR)/lib/%,$(PKG_BUILD_DIR)/%,$(wildcard $(TOOLCHAIN_DIR)/lib/libuClibc-*.so))" \ + -Wl,-init,__uClibc_init -Wl,-soname=libc.so.0 \ + $(BUILD_LIBGCC) + $(SCRIPT_DIR)/relink-lib.sh \ + "$(TARGET_CROSS)" \ + "$(wildcard $(TOOLCHAIN_DIR)/lib/libcrypt-*.so)" \ + "$(wildcard $(TOOLCHAIN_DIR)/lib/libcrypt_pic.a)" \ + "$(patsubst $(TOOLCHAIN_DIR)/lib/%,$(PKG_BUILD_DIR)/%,$(wildcard $(TOOLCHAIN_DIR)/lib/libcrypt-*.so))" \ + $(BUILD_LIBGCC) \ + -Wl,-soname=libcrypt.so.0 + $(SCRIPT_DIR)/relink-lib.sh \ + "$(TARGET_CROSS)" \ + "$(wildcard $(TOOLCHAIN_DIR)/lib/libm-*.so)" \ + "$(wildcard $(TOOLCHAIN_DIR)/lib/libm_pic.a)" \ + "$(patsubst $(TOOLCHAIN_DIR)/lib/%,$(PKG_BUILD_DIR)/%,$(wildcard $(TOOLCHAIN_DIR)/lib/libm-*.so))" \ + $(BUILD_LIBGCC) \ + -Wl,-soname=libm.so.0 + $(SCRIPT_DIR)/relink-lib.sh \ + "$(TARGET_CROSS)" \ + "$(wildcard $(TOOLCHAIN_DIR)/lib/libpthread-*.so)" \ + "$(wildcard $(TOOLCHAIN_DIR)/lib/libpthread_so.a)" \ + "$(patsubst $(TOOLCHAIN_DIR)/lib/%,$(PKG_BUILD_DIR)/%,$(wildcard $(TOOLCHAIN_DIR)/lib/libpthread-*.so))" \ + -Wl,-z,nodelete,-z,initfirst,-init=__pthread_initialize_minimal_internal \ + -ldl -lc $(BUILD_LIBGCC) \ + -Wl,-soname=libpthread.so.0 + endef + define Build/Compile/libgcc + $(SCRIPT_DIR)/relink-lib.sh \ + "$(TARGET_CROSS)" \ + "$(LIBGCC_SO)" \ + "$(LIBGCC_A)" \ + "$(patsubst $(TOOLCHAIN_DIR)/lib/%,$(PKG_BUILD_DIR)/%,$(LIBGCC_SO))" \ + -Wl,--version-script=$(LIBGCC_MAP) -Wl,-soname=libgcc_s.so.1 + endef +else + define Build/Compile/uClibc + $(CP) \ + $(TOOLCHAIN_DIR)/lib/libuClibc-*.so \ + $(TOOLCHAIN_DIR)/lib/libcrypt-*.so \ + $(TOOLCHAIN_DIR)/lib/libm-*.so \ + $(TOOLCHAIN_DIR)/lib/libpthread-*.so \ + $(PKG_BUILD_DIR)/ + endef + ifneq ($(LIBGCC_SO),) + define Build/Compile/libgcc + $(CP) $(LIBGCC_SO) $(PKG_BUILD_DIR)/ + endef + endif +endif -define Build/Compile - $(call Build/Compile/Default) +define Build/Compile/Default + $(call Build/Compile/libgcc) + $(call Build/Compile/$(LIBC)) endef +Build/Compile = $(Build/Compile/Default) define Package/base-files/install $(CP) ./files/* $(1)/ @@ -345,7 +464,7 @@ define Package/base-files/install mkdir -p $(1)/dev mkdir -p $(1)/etc/crontabs mkdir -p $(1)/etc/rc.d - mkdir -p $(1)/jffs + mkdir -p $(1)/overlay mkdir -p $(1)/lib/firmware $(if $(LIB_SUFFIX),-ln -s lib $(1)/lib$(LIB_SUFFIX)) mkdir -p $(1)/mnt @@ -362,6 +481,7 @@ define Package/base-files/install ln -sf /tmp $(1)/var mkdir -p $(1)/etc ln -sf /tmp/resolv.conf /tmp/fstab /tmp/TZ $(1)/etc/ + $(call ImageConfigOptions,$(1)) $(call Package/base-files/install-target,$(1)) for conffile in $(1)/etc/config/*; do \ if [ -f "$$$$conffile" ]; then \ @@ -375,17 +495,22 @@ ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),) define Package/libgcc/install $(INSTALL_DIR) $(1)/lib - $(CP) $(TOOLCHAIN_DIR)/lib$(LIB_SUFFIX)/libgcc_s.so.* $(1)/lib/ + $(CP) $(TOOLCHAIN_DIR)/lib/libgcc_s.so.* $(1)/lib/ + endef + + define Package/libgfortran/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(TOOLCHAIN_DIR)/lib/libgfortran.so.* $(1)/usr/lib/ endef define Package/libssp/install $(INSTALL_DIR) $(1)/lib - $(CP) $(TOOLCHAIN_DIR)/lib$(LIB_SUFFIX)/libssp.so.* $(1)/lib/ + $(CP) $(TOOLCHAIN_DIR)/lib/libssp.so.* $(1)/lib/ endef define Package/libstdcpp/install $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(TOOLCHAIN_DIR)/usr/lib$(LIB_SUFFIX)/libstdc++.so.* $(1)/usr/lib/ + $(CP) $(TOOLCHAIN_DIR)/lib/libstdc++.so.* $(1)/usr/lib/ endef use_libutil=$(if $(CONFIG_USE_GLIBC)$(CONFIG_EGLIBC_OPTION_EGLIBC_UTMP),libutil) @@ -393,12 +518,20 @@ ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),) use_nsswitch=$(if $(CONFIG_USE_GLIBC)$(CONFIG_EGLIBC_OPTION_EGLIBC_NSSWITCH),libnss_dns libnss_files) define Package/glibc/install + $(CP) ./glibc-files/* $(1)/ + rm -f $(1)/etc/localtime + ln -sf /tmp/localtime $(1)/etc/localtime $(INSTALL_DIR) $(1)/lib - $(CP) $(TOOLCHAIN_DIR)/lib/ld*.so.* $(1)/lib/ - $(CP) $(TOOLCHAIN_DIR)/lib/ld-$(LIBC_SO_VERSION).so $(1)/lib/ + $(CP) \ + $(TOOLCHAIN_DIR)/lib/ld*.so.* \ + $(TOOLCHAIN_DIR)/lib/ld-$(LIBC_SO_VERSION).so \ + $(1)/lib/ for file in libanl libc libcidn libcrypt libdl libm $(use_libnsl) $(use_nsswitch) libresolv $(use_libutil); do \ - $(CP) $(TOOLCHAIN_DIR)/lib/$$$$file.so.* $(1)/lib/; \ - $(CP) $(TOOLCHAIN_DIR)/lib/$$$$file-$(LIBC_SO_VERSION).so $(1)/lib/; \ + for file in $(TOOLCHAIN_DIR)/lib/$$$$file.so.* $(TOOLCHAIN_DIR)/lib/$$$$file-$(LIBC_SO_VERSION).so; do \ + if [ -e "$$$$file" ]; then \ + $(CP) $$$$file $(1)/lib/; \ + fi; \ + done; \ done endef @@ -408,10 +541,26 @@ ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),) define Package/uClibc/install $(INSTALL_DIR) $(1)/lib - for file in ld$(LIB_SUFFIX)-uClibc libc libcrypt libdl libm libnsl libresolv libuClibc libutil; do \ - $(CP) $(TOOLCHAIN_DIR)/lib/$$$$file.so.* $(1)/lib/; \ - $(CP) $(TOOLCHAIN_DIR)/lib/$$$$file-$(LIBC_SO_VERSION).so $(1)/lib/; \ + $(CP) \ + $(TOOLCHAIN_DIR)/lib/ld*-uClibc.so.* \ + $(TOOLCHAIN_DIR)/lib/ld*-uClibc-$(LIBC_SO_VERSION).so \ + $(1)/lib/ + $(CP) \ + $(TOOLCHAIN_DIR)/lib/libc.so.* \ + $(TOOLCHAIN_DIR)/lib/libuClibc-$(LIBC_SO_VERSION).so \ + $(1)/lib/ + for file in libcrypt libdl libm libutil; do \ + $(CP) \ + $(TOOLCHAIN_DIR)/lib/$$$$file.so.* \ + $(TOOLCHAIN_DIR)/lib/$$$$file-$(LIBC_SO_VERSION).so \ + $(1)/lib/; \ done + + $(CP) \ + $(PKG_BUILD_DIR)/libuClibc-* \ + $(PKG_BUILD_DIR)/libm-* \ + $(PKG_BUILD_DIR)/libcrypt-* \ + $(1)/lib/ endef define Package/libc/install @@ -419,33 +568,40 @@ ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),) endef define Package/libc/install_lib - $(CP) $(filter-out %/libdl_pic.a %/libpthread_pic.a %/libresolv_pic.a,$(wildcard $(TOOLCHAIN_DIR)/usr/lib/lib*.a)) $(1)/lib/ - $(if $(wildcard $(TOOLCHAIN_DIR)/usr/lib/libc_so.a),$(CP) $(TOOLCHAIN_DIR)/usr/lib/libc_so.a $(1)/lib/libc_pic.a) - $(if $(wildcard $(TOOLCHAIN_DIR)/usr/lib/gcc/*/*/libgcc.map), \ - $(CP) $(TOOLCHAIN_DIR)/usr/lib/gcc/*/*/libgcc_pic.a $(1)/lib/libgcc_s_pic.a; \ - $(CP) $(TOOLCHAIN_DIR)/usr/lib/gcc/*/*/libgcc.map $(1)/lib/libgcc_s_pic.map \ + $(CP) $(filter-out %/libdl_pic.a %/libpthread_pic.a %/libresolv_pic.a,$(wildcard $(TOOLCHAIN_DIR)/lib/lib*.a)) $(1)/lib/ + $(if $(wildcard $(TOOLCHAIN_DIR)/lib/libc_so.a),$(CP) $(TOOLCHAIN_DIR)/lib/libc_so.a $(1)/lib/libc_pic.a) + $(if $(LIBGCC_MAP), \ + $(CP) $(LIBGCC_A) $(1)/lib/libgcc_s_pic.a; \ + $(CP) $(LIBGCC_MAP) $(1)/lib/libgcc_s_pic.map \ ) endef define Package/libpthread/install $(INSTALL_DIR) $(1)/lib - $(CP) $(TOOLCHAIN_DIR)/lib/libpthread.so.* $(1)/lib/ - $(CP) $(TOOLCHAIN_DIR)/lib/libpthread-$(LIBC_SO_VERSION).so $(1)/lib/ + $(CP) \ + $(TOOLCHAIN_DIR)/lib/libpthread.so.* \ + $(if $(BUILD_LIBGCC),\ + $(PKG_BUILD_DIR)/libpthread-$(LIBC_SO_VERSION).so, \ + $(TOOLCHAIN_DIR)/lib/libpthread-$(LIBC_SO_VERSION).so \ + ) \ + $(1)/lib/ endef define Package/libpthread/install_lib - $(if $(wildcard $(TOOLCHAIN_DIR)/usr/lib/libc_so.a),$(CP) $(TOOLCHAIN_DIR)/usr/lib/libpthread_so.a $(1)/lib/libpthread_pic.a) + $(if $(wildcard $(TOOLCHAIN_DIR)/lib/libpthread_so.a),$(CP) $(TOOLCHAIN_DIR)/lib/libpthread_so.a $(1)/lib/libpthread_pic.a) endef define Package/librt/install $(INSTALL_DIR) $(1)/lib - $(CP) $(TOOLCHAIN_DIR)/lib/librt.so.* $(1)/lib/ - $(CP) $(TOOLCHAIN_DIR)/lib/librt-$(LIBC_SO_VERSION).so $(1)/lib/ + $(CP) \ + $(TOOLCHAIN_DIR)/lib/librt.so.* \ + $(TOOLCHAIN_DIR)/lib/librt-$(LIBC_SO_VERSION).so \ + $(1)/lib/ endef define Package/ldd/install $(INSTALL_DIR) $(1)/usr/bin/ - $(CP) $(TOOLCHAIN_DIR)/usr/bin/ldd $(1)/usr/bin/ + $(CP) $(TOOLCHAIN_DIR)/bin/ldd $(1)/usr/bin/ endef define Package/ldconfig/install @@ -460,6 +616,15 @@ else dir=`dirname $$$$file` ; \ $(INSTALL_DIR) $(1)/$$$$dir ; \ $(CP) $(call qstrip,$(CONFIG_LIBGCC_ROOT_DIR))/$$$$file $(1)/$$$$dir/ ; \ + done ; \ + exit 0 + endef + + define Package/libgfortran/install + for file in $(call qstrip,$(CONFIG_LIBGFORTRAN_FILE_SPEC)); do \ + dir=`dirname $$$$file` ; \ + $(INSTALL_DIR) $(1)/$$$$dir ; \ + $(CP) $(call qstrip,$(CONFIG_LIBGFORTRAN_ROOT_DIR))/$$$$file $(1)/$$$$dir/ ; \ done endef @@ -468,7 +633,8 @@ else dir=`dirname $$$$file` ; \ $(INSTALL_DIR) $(1)/$$$$dir ; \ $(CP) $(call qstrip,$(CONFIG_LIBSSP_ROOT_DIR))/$$$$file $(1)/$$$$dir/ ; \ - done + done ; \ + exit 0 endef define Package/libstdcpp/install @@ -476,7 +642,8 @@ else dir=`dirname $$$$file` ; \ $(INSTALL_DIR) $(1)/$$$$dir ; \ $(CP) $(call qstrip,$(CONFIG_LIBSTDCPP_ROOT_DIR))/$$$$file $(1)/$$$$dir/ ; \ - done + done ; \ + exit 0 endef define Package/libc/install @@ -484,7 +651,8 @@ else dir=`dirname $$$$file` ; \ $(INSTALL_DIR) $(1)/$$$$dir ; \ $(CP) $(call qstrip,$(CONFIG_LIBC_ROOT_DIR))/$$$$file $(1)/$$$$dir/ ; \ - done + done ; \ + exit 0 endef define Package/libpthread/install @@ -492,7 +660,8 @@ else dir=`dirname $$$$file` ; \ $(INSTALL_DIR) $(1)/$$$$dir ; \ $(CP) $(call qstrip,$(CONFIG_LIBPTHREAD_ROOT_DIR))/$$$$file $(1)/$$$$dir/ ; \ - done + done ; \ + exit 0 endef define Package/librt/install @@ -500,7 +669,8 @@ else dir=`dirname $$$$file` ; \ $(INSTALL_DIR) $(1)/$$$$dir ; \ $(CP) $(call qstrip,$(CONFIG_LIBRT_ROOT_DIR))/$$$$file $(1)/$$$$dir/ ; \ - done + done ; \ + exit 0 endef define Package/ldd/install @@ -508,7 +678,8 @@ else dir=`dirname $$$$file` ; \ $(INSTALL_DIR) $(1)/$$$$dir ; \ $(CP) $(call qstrip,$(CONFIG_LDD_ROOT_DIR))/$$$$file $(1)/$$$$dir/ ; \ - done + done ; \ + exit 0 endef define Package/ldconfig/install @@ -516,7 +687,8 @@ else dir=`dirname $$$$file` ; \ $(INSTALL_DIR) $(1)/$$$$dir ; \ $(CP) $(call qstrip,$(CONFIG_LDCONFIG_ROOT_DIR))/$$$$file $(1)/$$$$dir/ ; \ - done + done ; \ + exit 0 endef endif @@ -532,5 +704,6 @@ $(eval $(call BuildPackage,libssp)) $(eval $(call BuildPackage,libstdcpp)) $(eval $(call BuildPackage,libpthread)) $(eval $(call BuildPackage,librt)) +$(eval $(call BuildPackage,libgfortran)) $(eval $(call BuildPackage,ldd)) $(eval $(call BuildPackage,ldconfig))