52353a7eb2
To solve the issue of carrying object files from previous builds,
Matias changed the archiving process to re-archive libapps.a on every compilation,
if libapps.a carries more object files, incremental compilation will waste too
many time in re-archiving, compared with the previous implement, this is a degradation
of the build system. Referring to mature engineering projects such as cmake, if there
is configuration or source file changed, the best solution should be to reconfigure
the environment.
Revert this PR to ensure the compilation speed during incremental compilation.
| commit 18137c0fec
| Author: Matias N <matias@protobits.dev>
| Date: Sat Sep 12 00:36:23 2020 -0300
|
| Fix: ensure archive files do not carry object files from prior builds
|
| This is the corresponding change to the one on main NuttX repo. In this
| case this involves splitting the build of libapps.a into: a) building
| all applications (which is safely parallelizable), b) adding each
| application's object files to the archive in turns (serial by nature).
|
| This removes the need for the flock used to protect the parallel build.
Testing:
sim:nsh
-------------------------------
| Patched | Current
-------------------------------
|$ time make | $ time make
|real 0m1.270s | real 0m1.728s
|user 0m0.971s | user 0m1.276s
|sys 0m0.363s | sys 0m0.530s
-------------------------------
Private project (20+ 3rd library needs archive to libapps.a)
-------------------------------
| Patched | Current
-------------------------------
|$ time make | $ time make
|real 0m21.181s | real 0m39.721s
|user 0m14.638s | user 0m24.837s
|sys 0m6.919s | sys 0m14.394s
-------------------------------
Signed-off-by: chao an <anchao@xiaomi.com>
208 lines
6.4 KiB
Makefile
208 lines
6.4 KiB
Makefile
############################################################################
|
|
# apps/Makefile
|
|
#
|
|
# 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.
|
|
#
|
|
############################################################################
|
|
|
|
export APPDIR = $(CURDIR)
|
|
include $(APPDIR)/Make.defs
|
|
include $(APPDIR)/tools/Wasm.mk
|
|
|
|
# The GNU make CURDIR will always be a POSIX-like path with forward slashes
|
|
# as path segment separators. This is fine for the above inclusions but
|
|
# will cause problems later for the native build. If we know that this is
|
|
# a native build, then we need to fix up the APPDIR path for subsequent
|
|
# use
|
|
|
|
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
|
|
export APPDIR = $(subst /,\,$(CURDIR))
|
|
endif
|
|
|
|
# Symbol table for loadable apps.
|
|
|
|
SYMTABSRC = symtab_apps.c
|
|
SYMTABOBJ = $(SYMTABSRC:.c=$(OBJEXT))
|
|
|
|
# Build targets
|
|
|
|
# We first remove libapps.a before letting the other rules add objects to it
|
|
# so that we ensure libapps.a does not contain objects from prior build
|
|
|
|
all: $(BIN)
|
|
|
|
.PHONY: import install dirlinks export .depdirs preconfig depend clean distclean
|
|
.PHONY: context clean_context context_all register register_all
|
|
.PRECIOUS: $(BIN)
|
|
|
|
$(foreach SDIR, $(CONFIGURED_APPS), $(eval $(call SDIR_template,$(SDIR),all)))
|
|
$(foreach SDIR, $(CONFIGURED_APPS), $(eval $(call SDIR_template,$(SDIR),install)))
|
|
$(foreach SDIR, $(CONFIGURED_APPS), $(eval $(call SDIR_template,$(SDIR),context)))
|
|
$(foreach SDIR, $(CONFIGURED_APPS), $(eval $(call SDIR_template,$(SDIR),register)))
|
|
$(foreach SDIR, $(CONFIGURED_APPS), $(eval $(call SDIR_template,$(SDIR),depend)))
|
|
$(foreach SDIR, $(CLEANDIRS), $(eval $(call SDIR_template,$(SDIR),clean)))
|
|
$(foreach SDIR, $(CLEANDIRS), $(eval $(call SDIR_template,$(SDIR),distclean)))
|
|
|
|
$(MKDEP): $(TOPDIR)/tools/mkdeps.c
|
|
$(HOSTCC) $(HOSTINCLUDES) $(HOSTCFLAGS) $< -o $@
|
|
|
|
$(INCDIR): $(TOPDIR)/tools/incdir.c
|
|
$(HOSTCC) $(HOSTINCLUDES) $(HOSTCFLAGS) $< -o $@
|
|
|
|
IMPORT_TOOLS = $(MKDEP) $(INCDIR)
|
|
|
|
# In the KERNEL build, we must build and install all of the modules. No
|
|
# symbol table is needed
|
|
|
|
ifeq ($(CONFIG_BUILD_KERNEL),y)
|
|
|
|
install: $(foreach SDIR, $(CONFIGURED_APPS), $(SDIR)_install)
|
|
|
|
$(BIN): $(foreach SDIR, $(CONFIGURED_APPS), $(SDIR)_all)
|
|
|
|
.import: $(BIN)
|
|
$(Q) install libapps.a $(APPDIR)$(DELIM)import$(DELIM)libs
|
|
$(Q) $(MAKE) install
|
|
|
|
import: $(IMPORT_TOOLS)
|
|
$(Q) $(MAKE) context TOPDIR="$(APPDIR)$(DELIM)import"
|
|
$(Q) $(MAKE) register TOPDIR="$(APPDIR)$(DELIM)import"
|
|
$(Q) $(MAKE) depend TOPDIR="$(APPDIR)$(DELIM)import"
|
|
$(Q) $(MAKE) .import TOPDIR="$(APPDIR)$(DELIM)import"
|
|
|
|
else
|
|
|
|
# In FLAT and protected modes, the modules have already been created. A
|
|
# symbol table is required.
|
|
|
|
ifeq ($(CONFIG_BUILD_LOADABLE),)
|
|
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
|
|
$(BIN): $(foreach SDIR, $(CONFIGURED_APPS), $(SDIR)_all)
|
|
else
|
|
$(BIN): $(foreach SDIR, $(CONFIGURED_APPS), $(SDIR)_all)
|
|
$(call LINK_WASM)
|
|
endif
|
|
|
|
else
|
|
|
|
$(SYMTABSRC): $(foreach SDIR, $(CONFIGURED_APPS), $(SDIR)_all)
|
|
$(Q) $(MAKE) install
|
|
$(Q) $(APPDIR)$(DELIM)tools$(DELIM)mksymtab.sh $(BINDIR) >$@.tmp
|
|
$(Q) $(call TESTANDREPLACEFILE, $@.tmp, $@)
|
|
|
|
$(SYMTABOBJ): %$(OBJEXT): %.c
|
|
$(call COMPILE, $<, $@, -fno-lto -fno-builtin)
|
|
|
|
$(BIN): $(SYMTABOBJ)
|
|
$(call ARLOCK, $(call CONVERT_PATH,$(BIN)), $^)
|
|
$(call LINK_WASM)
|
|
|
|
endif # !CONFIG_BUILD_LOADABLE
|
|
|
|
install: $(foreach SDIR, $(CONFIGURED_APPS), $(SDIR)_install)
|
|
|
|
# Link nuttx
|
|
|
|
HEAD_OBJ += $(wildcard $(APPDIR)$(DELIM)import$(DELIM)startup$(DELIM)*$(OBJEXT))
|
|
HEAD_OBJ += $(wildcard $(APPDIR)$(DELIM)builtin$(DELIM)*$(OBJEXT))
|
|
|
|
.import: $(BIN) install
|
|
$(Q) echo "LD: nuttx"
|
|
$(Q) $(LD) --entry=__start $(LDFLAGS) $(LDLIBPATH) $(EXTRA_LIBPATHS) \
|
|
-L$(APPDIR)$(DELIM)import$(DELIM)scripts -T$(LDNAME) \
|
|
-o nuttx$(EXEEXT) $(HEAD_OBJ) $(EXTRA_OBJS) $(LDSTARTGROUP) \
|
|
$(BIN) $(LDLIBS) $(EXTRA_LIBS) $(LDENDGROUP)
|
|
ifeq ($(CONFIG_INTELHEX_BINARY),y)
|
|
$(Q) echo "CP: nuttx.hex"
|
|
$(Q) $(OBJCOPY) $(OBJCOPYARGS) -O ihex nuttx$(EXEEXT) nuttx.hex
|
|
endif
|
|
ifeq ($(CONFIG_RAW_BINARY),y)
|
|
$(Q) echo "CP: nuttx.bin"
|
|
$(Q) $(OBJCOPY) $(OBJCOPYARGS) -O binary nuttx$(EXEEXT) nuttx.bin
|
|
endif
|
|
$(call POSTBUILD, $(APPDIR))
|
|
|
|
import: $(IMPORT_TOOLS)
|
|
$(Q) $(MAKE) context TOPDIR="$(APPDIR)$(DELIM)import"
|
|
$(Q) $(MAKE) register TOPDIR="$(APPDIR)$(DELIM)import"
|
|
$(Q) $(MAKE) depend TOPDIR="$(APPDIR)$(DELIM)import"
|
|
$(Q) $(MAKE) .import TOPDIR="$(APPDIR)$(DELIM)import"
|
|
|
|
endif # CONFIG_BUILD_KERNEL
|
|
|
|
dirlinks:
|
|
$(Q) $(MAKE) -C platform dirlinks
|
|
|
|
context_all: $(foreach SDIR, $(CONFIGURED_APPS), $(SDIR)_context)
|
|
register_all: $(foreach SDIR, $(CONFIGURED_APPS), $(SDIR)_register)
|
|
|
|
staging:
|
|
$(Q) mkdir -p $@
|
|
|
|
context: | staging
|
|
$(Q) $(MAKE) context_all
|
|
$(Q) $(MAKE) register_all
|
|
|
|
Kconfig:
|
|
$(foreach SDIR, $(CONFIGDIRS), $(call MAKE_template,$(SDIR),preconfig))
|
|
$(Q) $(MKKCONFIG)
|
|
|
|
preconfig: Kconfig
|
|
|
|
export:
|
|
ifneq ($(EXPORTDIR),)
|
|
$(Q) mkdir -p "${EXPORTDIR}"$(DELIM)registry || exit 1;
|
|
ifneq ($(CONFIG_BUILD_KERNEL),y)
|
|
ifneq ($(BUILTIN_REGISTRY),)
|
|
for f in "${BUILTIN_REGISTRY}"$(DELIM)*.bdat "${BUILTIN_REGISTRY}"$(DELIM)*.pdat ; do \
|
|
if [ -f "$${f}" ]; then \
|
|
cp -f "$${f}" "${EXPORTDIR}"$(DELIM)registry ; \
|
|
fi \
|
|
done
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
.depdirs: $(foreach SDIR, $(CONFIGURED_APPS), $(SDIR)_depend)
|
|
|
|
.depend: Makefile .depdirs
|
|
$(Q) touch $@
|
|
|
|
depend: .depend
|
|
|
|
clean_context:
|
|
$(Q) $(MAKE) -C platform clean_context
|
|
$(Q) $(MAKE) -C builtin clean_context
|
|
|
|
clean: $(foreach SDIR, $(CLEANDIRS), $(SDIR)_clean)
|
|
$(call DELFILE, $(SYMTABSRC))
|
|
$(call DELFILE, $(SYMTABOBJ))
|
|
$(call DELFILE, $(BIN))
|
|
$(call DELFILE, Kconfig)
|
|
$(call DELDIR, $(BINDIR))
|
|
$(call CLEAN)
|
|
|
|
distclean: $(foreach SDIR, $(CLEANDIRS), $(SDIR)_distclean)
|
|
$(call DELFILE, *.lock)
|
|
$(call DELFILE, .depend)
|
|
$(call DELFILE, $(SYMTABSRC))
|
|
$(call DELFILE, $(SYMTABOBJ))
|
|
$(call DELFILE, $(BIN))
|
|
$(call DELFILE, Kconfig)
|
|
$(call DELDIR, $(BINDIR))
|
|
$(call DELDIR, wasm)
|
|
$(call CLEAN)
|