This is an automated email from the ASF dual-hosted git repository.

acassis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git


The following commit(s) were added to refs/heads/master by this push:
     new 5e057f38b build: add declarative shared library support
5e057f38b is described below

commit 5e057f38b989a49554282e4c071f836564ce2dbd
Author: aviralgarg05 <[email protected]>
AuthorDate: Sun Aug 2 22:52:39 2026 +0530

    build: add declarative shared library support
    
    Add Library.mk for declarative shared-library builds. Reuse the 
compiler-runtime lookup shared with Application.mk and cover multi-source 
libraries with sotest.
    
    Signed-off-by: aviralgarg05 <[email protected]>
---
 Application.mk                           |   9 +-
 Library.mk                               | 185 +++++++++++++++++++++++++++++++
 Make.defs                                |  15 +++
 examples/sotest/modprint/Makefile        |   9 +-
 examples/sotest/sotest/CMakeLists.txt    |   9 +-
 examples/sotest/sotest/Makefile          |   9 +-
 examples/sotest/sotest/sotest.c          |   8 --
 examples/sotest/sotest/sotest_messages.c |  40 +++++++
 8 files changed, 257 insertions(+), 27 deletions(-)

diff --git a/Application.mk b/Application.mk
index bc83121a9..8606e5d3a 100644
--- a/Application.mk
+++ b/Application.mk
@@ -62,14 +62,7 @@ LDLIBS += $(call CONVERT_PATH,$(BIN))
 # This should be linked after libapps. Consider that mbedtls in libapps
 # uses __udivdi3.
 ifeq ($(BUILD_MODULE),y)
-  # Revisit: This only works for gcc and clang.
-  # Do other compilers have similar?
-  COMPILER_RT_LIB = $(shell $(CC) $(ARCHCPUFLAGS) --print-libgcc-file-name)
-  ifeq ($(wildcard $(COMPILER_RT_LIB)),)
-    # if "--print-libgcc-file-name" unable to find the correct libgcc PATH
-    # then go ahead and try "--print-file-name"
-    COMPILER_RT_LIB := $(wildcard $(shell $(CC) $(ARCHCPUFLAGS) 
--print-file-name $(notdir $(COMPILER_RT_LIB))))
-  endif
+  COMPILER_RT_LIB := $(call FIND_COMPILER_RT_LIB)
   LDLIBS += $(COMPILER_RT_LIB)
 endif
 
diff --git a/Library.mk b/Library.mk
new file mode 100644
index 000000000..9dd7ca197
--- /dev/null
+++ b/Library.mk
@@ -0,0 +1,185 @@
+############################################################################
+# apps/Library.mk
+#
+# 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.
+#
+############################################################################
+
+# Library.mk is the NuttX equivalent of Android's BUILD_SHARED_LIBRARY.  A
+# component Makefile includes Make.defs, declares LOCAL_MODULE and
+# LOCAL_SRC_FILES, then includes this file.  NuttX invokes each component in
+# a separate recursive make, so module variables cannot leak between
+# components and an equivalent of Android's CLEAR_VARS is not needed.
+
+LOCAL_PATH ?= $(CURDIR)
+
+ifeq ($(strip $(LOCAL_MODULE)),)
+  $(error LOCAL_MODULE must name the shared library)
+endif
+
+ifeq ($(strip $(LOCAL_SRC_FILES)),)
+  $(error LOCAL_SRC_FILES must list at least one C or C++ source file)
+endif
+
+LOCAL_C_SRCS   := $(filter %.c,$(LOCAL_SRC_FILES))
+LOCAL_CC_SRCS  := $(filter %.cc,$(LOCAL_SRC_FILES))
+LOCAL_CPP_SRCS := $(filter %.cpp,$(LOCAL_SRC_FILES))
+LOCAL_CXX_SRCS := $(filter %.cxx,$(LOCAL_SRC_FILES))
+LOCAL_SRCS     := $(LOCAL_C_SRCS) $(LOCAL_CC_SRCS) $(LOCAL_CPP_SRCS) \
+                  $(LOCAL_CXX_SRCS)
+
+ifneq ($(words $(LOCAL_SRCS)),$(words $(LOCAL_SRC_FILES)))
+  $(error LOCAL_SRC_FILES currently supports only .c, .cc, .cpp, and .cxx)
+endif
+
+# The GNU make CURDIR always uses forward slashes.  Convert it for native
+# Windows builds before deriving the suffix used for intermediate objects.
+
+ifeq ($(CONFIG_WINDOWS_NATIVE),y)
+  LOCAL_CWD := $(strip ${shell echo %CD% | cut -d: -f2})
+else
+  LOCAL_CWD := $(CURDIR)
+endif
+
+LOCAL_SUFFIX := $(subst $(DELIM),.,$(LOCAL_CWD))
+LOCAL_PREFIX ?=
+
+LOCAL_C_OBJS   := $(LOCAL_C_SRCS:%=$(LOCAL_PREFIX)%$(LOCAL_SUFFIX)$(OBJEXT))
+LOCAL_CC_OBJS  := $(LOCAL_CC_SRCS:%=$(LOCAL_PREFIX)%$(LOCAL_SUFFIX)$(OBJEXT))
+LOCAL_CPP_OBJS := $(LOCAL_CPP_SRCS:%=$(LOCAL_PREFIX)%$(LOCAL_SUFFIX)$(OBJEXT))
+LOCAL_CXX_OBJS := $(LOCAL_CXX_SRCS:%=$(LOCAL_PREFIX)%$(LOCAL_SUFFIX)$(OBJEXT))
+LOCAL_OBJS     := $(LOCAL_C_OBJS) $(LOCAL_CC_OBJS) $(LOCAL_CPP_OBJS) \
+                  $(LOCAL_CXX_OBJS)
+
+# Keep the historical NuttX module filename by default.  A component may set
+# LOCAL_MODULE_FILENAME (for example, libexample.so) when a suffix is part of
+# its external interface.
+
+LOCAL_MODULE_FILENAME ?= $(LOCAL_MODULE)
+LOCAL_MODULE_PATH     := $(BINDIR)$(DELIM)$(LOCAL_MODULE_FILENAME)
+
+LOCAL_CFLAGS   ?=
+LOCAL_CXXFLAGS ?=
+LOCAL_LDFLAGS  ?=
+LOCAL_LDLIBS   ?=
+
+LOCAL_COMPILER_RT_LIB := $(call FIND_COMPILER_RT_LIB)
+
+DEPPATH += --dep-path $(LOCAL_PATH)
+DEPPATH += --obj-path .
+
+VPATH += :$(LOCAL_PATH)
+
+.PHONY: all clean context depend distclean install postinstall register
+
+all:: $(LOCAL_PREFIX).built
+       @:
+
+define LOCAL_COMPILE_C
+       $(ECHO_BEGIN)"CC: $1 "
+       $(Q) $(MODULECC) -c $(CMODULEFLAGS) $(LOCAL_CFLAGS) \
+               $($(strip $1)_CELFFLAGS) $1 -o $2
+       $(ECHO_END)
+endef
+
+define LOCAL_COMPILE_CXX
+       $(ECHO_BEGIN)"CXX: $1 "
+       $(Q) $(CXX) -c $(CXXMODULEFLAGS) $(LOCAL_CXXFLAGS) \
+               $($(strip $1)_CXXELFFLAGS) $1 -o $2
+       $(ECHO_END)
+endef
+
+$(LOCAL_C_OBJS): $(LOCAL_PREFIX)%.c$(LOCAL_SUFFIX)$(OBJEXT): %.c
+       $(call LOCAL_COMPILE_C,$<,$@)
+
+$(LOCAL_CC_OBJS): $(LOCAL_PREFIX)%.cc$(LOCAL_SUFFIX)$(OBJEXT): %.cc
+       $(call LOCAL_COMPILE_CXX,$<,$@)
+
+$(LOCAL_CPP_OBJS): $(LOCAL_PREFIX)%.cpp$(LOCAL_SUFFIX)$(OBJEXT): %.cpp
+       $(call LOCAL_COMPILE_CXX,$<,$@)
+
+$(LOCAL_CXX_OBJS): $(LOCAL_PREFIX)%.cxx$(LOCAL_SUFFIX)$(OBJEXT): %.cxx
+       $(call LOCAL_COMPILE_CXX,$<,$@)
+
+$(LOCAL_PREFIX).built: $(LOCAL_OBJS)
+       $(Q) touch $@
+
+$(LOCAL_MODULE_PATH): $(LOCAL_OBJS)
+       $(ECHO_BEGIN)"LD: $@ "
+       $(Q) mkdir -p $(BINDIR)
+       $(Q) $(MODULELD) $(LDMODULEFLAGS) $(LDMAP) $(LDLIBPATH) \
+               $(LOCAL_LDFLAGS) $^ $(LDSTARTGROUP) $(LOCAL_LDLIBS) \
+               $(LOCAL_COMPILER_RT_LIB) $(LDENDGROUP) -o \
+               $(call CONVERT_PATH,$@)
+       $(ECHO_END)
+ifneq ($(CONFIG_DEBUG_SYMBOLS),)
+       $(Q) mkdir -p $(BINDIR_DEBUG)
+       $(Q) cp $@ $(BINDIR_DEBUG)
+       $(Q) $(MODULESTRIP) $(NX_KEEP) $@
+endif
+
+install:: $(LOCAL_MODULE_PATH)
+       @:
+
+context::
+       @:
+
+register::
+       @:
+
+postinstall::
+       @:
+
+$(LOCAL_PREFIX).depend: Makefile $(LOCAL_SRC_FILES) $(DEPCONFIG)
+       $(shell echo "# Gen Make.dep automatically" >$(LOCAL_PREFIX)Make.dep)
+       $(if $(LOCAL_C_SRCS), \
+         $(shell $(MKDEP) $(DEPPATH) \
+           --obj-suffix .c$(LOCAL_SUFFIX)$(OBJEXT) "$(MODULECC)" -- \
+           $(CMODULEFLAGS) $(LOCAL_CFLAGS) -- $(LOCAL_C_SRCS) \
+           >>$(LOCAL_PREFIX)Make.dep))
+       $(if $(LOCAL_CC_SRCS), \
+         $(shell $(MKDEP) $(DEPPATH) \
+           --obj-suffix .cc$(LOCAL_SUFFIX)$(OBJEXT) "$(CXX)" -- \
+           $(CXXMODULEFLAGS) $(LOCAL_CXXFLAGS) -- $(LOCAL_CC_SRCS) \
+           >>$(LOCAL_PREFIX)Make.dep))
+       $(if $(LOCAL_CPP_SRCS), \
+         $(shell $(MKDEP) $(DEPPATH) \
+           --obj-suffix .cpp$(LOCAL_SUFFIX)$(OBJEXT) "$(CXX)" -- \
+           $(CXXMODULEFLAGS) $(LOCAL_CXXFLAGS) -- $(LOCAL_CPP_SRCS) \
+           >>$(LOCAL_PREFIX)Make.dep))
+       $(if $(LOCAL_CXX_SRCS), \
+         $(shell $(MKDEP) $(DEPPATH) \
+           --obj-suffix .cxx$(LOCAL_SUFFIX)$(OBJEXT) "$(CXX)" -- \
+           $(CXXMODULEFLAGS) $(LOCAL_CXXFLAGS) -- $(LOCAL_CXX_SRCS) \
+           >>$(LOCAL_PREFIX)Make.dep))
+       $(Q) touch $@
+
+depend:: $(LOCAL_PREFIX).depend
+       @:
+
+clean::
+       $(call DELFILE,$(LOCAL_PREFIX).built)
+       $(call DELFILE,$(LOCAL_OBJS))
+       $(call DELFILE,$(LOCAL_MODULE_PATH))
+       $(call DELFILE,$(BINDIR_DEBUG)$(DELIM)$(LOCAL_MODULE_FILENAME))
+
+distclean:: clean
+       $(call DELFILE,$(LOCAL_PREFIX)Make.dep)
+       $(call DELFILE,$(LOCAL_PREFIX).depend)
+
+-include $(LOCAL_PREFIX)Make.dep
diff --git a/Make.defs b/Make.defs
index ab79ce71c..416099d7a 100644
--- a/Make.defs
+++ b/Make.defs
@@ -68,6 +68,21 @@ LIBPATH ?= $(TOPDIR)$(DELIM)staging
 BINDIR ?= $(APPDIR)$(DELIM)bin
 BINDIR_DEBUG ?= $(APPDIR)$(DELIM)bin_debug
 
+# Android.mk-style shared library build primitive
+
+BUILD_SHARED_LIBRARY ?= $(APPDIR)$(DELIM)Library.mk
+
+# Locate the compiler runtime used by loadable modules.  GCC and Clang
+# support these queries; other compilers may need an equivalent lookup.
+
+define FIND_COMPILER_RT_LIB
+$(or $(wildcard $(shell $(CC) $(ARCHCPUFLAGS) \
+       --print-libgcc-file-name)), \
+       $(wildcard $(shell $(CC) $(ARCHCPUFLAGS) --print-file-name \
+       $(notdir $(shell $(CC) $(ARCHCPUFLAGS) \
+       --print-libgcc-file-name)))))
+endef
+
 # The final build target
 
 BIN  ?= $(APPDIR)$(DELIM)libapps$(LIBEXT)
diff --git a/examples/sotest/modprint/Makefile 
b/examples/sotest/modprint/Makefile
index 81f5c2c53..85720dec0 100644
--- a/examples/sotest/modprint/Makefile
+++ b/examples/sotest/modprint/Makefile
@@ -22,9 +22,8 @@
 
 include $(APPDIR)/Make.defs
 
-PROGNAME = modprint
-DYNLIB = y
+LOCAL_PATH := $(CURDIR)
+LOCAL_MODULE := modprint
+LOCAL_SRC_FILES := modprint.c
 
-MAINSRC = modprint.c
-
-include $(APPDIR)/Application.mk
+include $(BUILD_SHARED_LIBRARY)
diff --git a/examples/sotest/sotest/CMakeLists.txt 
b/examples/sotest/sotest/CMakeLists.txt
index d4f30c1c5..cee83b15b 100644
--- a/examples/sotest/sotest/CMakeLists.txt
+++ b/examples/sotest/sotest/CMakeLists.txt
@@ -21,5 +21,12 @@
 # 
##############################################################################
 
 if(CONFIG_EXAMPLES_SOTEST)
-  nuttx_add_application(NAME sotest SRCS sotest.c DYNLIB y)
+  nuttx_add_application(
+    NAME
+    sotest
+    SRCS
+    sotest.c
+    sotest_messages.c
+    DYNLIB
+    y)
 endif()
diff --git a/examples/sotest/sotest/Makefile b/examples/sotest/sotest/Makefile
index dfbec74a1..f3c706db2 100644
--- a/examples/sotest/sotest/Makefile
+++ b/examples/sotest/sotest/Makefile
@@ -22,9 +22,8 @@
 
 include $(APPDIR)/Make.defs
 
-PROGNAME = sotest
-DYNLIB = y
+LOCAL_PATH := $(CURDIR)
+LOCAL_MODULE := sotest
+LOCAL_SRC_FILES := sotest.c sotest_messages.c
 
-MAINSRC = sotest.c
-
-include $(APPDIR)/Application.mk
+include $(BUILD_SHARED_LIBRARY)
diff --git a/examples/sotest/sotest/sotest.c b/examples/sotest/sotest/sotest.c
index ff825cbac..089dfb76e 100644
--- a/examples/sotest/sotest/sotest.c
+++ b/examples/sotest/sotest/sotest.c
@@ -46,14 +46,6 @@ void modprint(FAR const char *fmt, ...) printf_like(1, 2);
  * Private Function Prototypes
  ****************************************************************************/
 
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-visibility_default const char g_msg1[] = "Hello to you too!";
-visibility_default const char g_msg2[] = "Not so bad so far.";
-visibility_default const char g_msg3[] = "Yes, don't be a stranger!";
-
 /****************************************************************************
  * Private Functions
  ****************************************************************************/
diff --git a/examples/sotest/sotest/sotest_messages.c 
b/examples/sotest/sotest/sotest_messages.c
new file mode 100644
index 000000000..d867c1c77
--- /dev/null
+++ b/examples/sotest/sotest/sotest_messages.c
@@ -0,0 +1,40 @@
+/****************************************************************************
+ * apps/examples/sotest/sotest/sotest_messages.c
+ *
+ * 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.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <nuttx/compiler.h>
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+visibility_default const char g_msg1[] = "Hello to you too!";
+visibility_default const char g_msg2[] = "Not so bad so far.";
+visibility_default const char g_msg3[] = "Yes, don't be a stranger!";
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/

Reply via email to