nuttx-apps/Make.defs

177 lines
5.4 KiB
Plaintext
Raw Normal View History

############################################################################
# apps/Make.defs
#
# 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.
#
############################################################################
TOPDIR ?= $(APPDIR)/import
include $(TOPDIR)/Make.defs
# Application Directories
# BUILDIRS is the list of top-level directories containing Make.defs files
# CLEANDIRS is the list of all top-level directories containing Makefiles.
# It is used only for cleaning.
BUILDIRS := $(dir $(wildcard $(APPDIR)/*/Make.defs))
BUILDIRS := $(filter-out $(APPDIR)/import/,$(BUILDIRS))
CONFIGDIRS := $(filter-out $(APPDIR)/builtin/,$(BUILDIRS))
CONFIGDIRS := $(filter-out $(dir $(wildcard $(APPDIR)/*/Kconfig)),$(CONFIGDIRS))
CLEANDIRS := $(dir $(wildcard $(APPDIR)/*/Makefile))
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
BUILDIRS := $(subst /,\,$(BUILDIRS))
CONFIGDIRS := $(subst /,\,$(CONFIGDIRS))
CLEANDIRS := $(subst /,\,$(CLEANDIRS))
endif
# CONFIGURED_APPS is the application directories that should be built in
# the current configuration.
CONFIGURED_APPS :=
define Add_Application
include $(1)Make.defs
endef
$(foreach BDIR, $(BUILDIRS), $(eval $(call Add_Application,$(BDIR))))
# File extensions
CXXEXT ?= .cxx
2022-02-18 17:19:12 +01:00
RUSTEXT ?= .rs
ZIGEXT ?= .zig
# Library path
LIBPATH ?= $(TOPDIR)$(DELIM)staging
# The install path
BINDIR ?= $(APPDIR)$(DELIM)bin
# The final build target
interpreters/wamr: add compile role of WebAssembly Add compilation rules to support WebAssembly(WASM/WAMR): 1. Compile Toolchain 1> Download WASI sdk and export the WASI_SDK_PATH path: $ wget https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-19/wasi-sdk-19.0-linux.tar.gz $ tar xf wasi-sdk-19.0-linux.tar.gz Put wasi-sdk-19.0 to your host WASI_SDK_PATH environment variable, like: $ export WASI_SDK_PATH=`pwd`/wasi-sdk-19.0 2> Download Wamr "wamrc" AOT compiler and export to the PATH: $ mkdir wamrc $ wget https://github.com/bytecodealliance/wasm-micro-runtime/releases/download/WAMR-1.1.2/wamrc-1.1.2-x86_64-ubuntu-20.04.tar.gz $ tar xf wamrc-1.1.2-x86_64-ubuntu-20.04.tar.gz $ export PATH=$PATH:$PWD 2. Configuring and running 1> Configuring sim/wamr and compile: nuttx$ ./tools/configure.sh sim/wamr nuttx$ make ... Wamrc Generate AoT: /home/archer/code/nuttx/n5/apps/wasm/hello.aot Wamrc Generate AoT: /home/archer/code/nuttx/n5/apps/wasm/coremark.aot LD: nuttx 2> Copy the generated wasm file(Interpreter/AoT) nuttx$ cp ../apps/wasm/hello.aot . nuttx$ cp ../apps/wasm/hello.wasm . nuttx$ cp ../apps/wasm/coremark.wasm . 3> Run iwasm nuttx$ ./nuttx NuttShell (NSH) NuttX-10.4.0 nsh> iwasm /data/hello.wasm Hello, World!! nsh> iwasm /data/hello.aot Hello, World!! nsh> iwasm /data/coremark.wasm 2K performance run parameters for coremark. CoreMark Size : 666 Total ticks : 12000 Total time (secs): 12.000000 Iterations/Sec : 5.000000 Iterations : 60 Compiler version : Clang 15.0.7 Compiler flags : Using NuttX compilation options Memory location : Defined by the NuttX configuration seedcrc : 0xe9f5 [0]crclist : 0xe714 [0]crcmatrix : 0x1fd7 [0]crcstate : 0x8e3a [0]crcfinal : 0xa14c Correct operation validated. See README.md for run and reporting rules. CoreMark 1.0 : 5.000000 / Clang 15.0.7 Using NuttX compilation options / Defined by the NuttX configuration Co-Authored-By: Huang Qi <huangqi3@xiaomi.com> Signed-off-by: chao an <anchao@xiaomi.com>
2023-03-02 04:46:37 +01:00
BIN ?= $(APPDIR)$(DELIM)libapps$(LIBEXT)
WBIN ?= $(APPDIR)$(DELIM)wasm$(DELIM)libwasm$(LIBEXT)
# Tools
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
MKKCONFIG ?= $(APPDIR)$(DELIM)tools$(DELIM)mkkconfig.bat
else
MKKCONFIG ?= $(APPDIR)$(DELIM)tools$(DELIM)mkkconfig.sh
endif
# Builtin Registration
BUILTIN_REGISTRY = $(APPDIR)$(DELIM)builtin$(DELIM)registry
DEPCONFIG = $(TOPDIR)$(DELIM).config
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
ifeq ($(CONFIG_SCHED_USER_IDENTITY),y)
define REGISTER
$(Q) echo Register: $1
$(Q) echo { "$(subst ",,$(1))", $2, $3, $(patsubst ,0,$(subst ",,$(4))), $(patsubst ,0,$(5)), $(patsubst ,0,$(6)), $(patsubst ,0555,$(7))}, > "$(BUILTIN_REGISTRY)$(DELIM)$1.bdat"
$(Q) echo int $(subst ",,$(4))(int argc, char *argv[]); > "$(BUILTIN_REGISTRY)$(DELIM)$1.pdat"
$(Q) touch $(BUILTIN_REGISTRY)$(DELIM).updated"
endef
else
define REGISTER
$(Q) echo Register: $1
$(Q) echo { "$(subst ",,$(1))", $2, $3, $(subst ",,$(4)) }, > "$(BUILTIN_REGISTRY)$(DELIM)$1.bdat"
$(Q) echo int $(subst ",,$(4))(int argc, char *argv[]); > "$(BUILTIN_REGISTRY)$(DELIM)$1.pdat"
$(Q) touch $(BUILTIN_REGISTRY)$(DELIM).updated"
endef
endif
else
ifeq ($(CONFIG_SCHED_USER_IDENTITY),y)
define REGISTER
$(Q) echo "{ \"$1\", $2, $3, $(patsubst ,0,$(4)), $(patsubst ,0,$(5)), $(patsubst ,0,$(6)), $(patsubst ,0555,$(7)) }," > "$(BUILTIN_REGISTRY)$(DELIM)$1.bdat"
$(Q) if [ ! -z $4 ]; then \
echo "int $4(int argc, char *argv[]);" > "$(BUILTIN_REGISTRY)$(DELIM)$1.pdat"; \
fi;
$(Q) touch "$(BUILTIN_REGISTRY)$(DELIM).updated"
endef
else
define REGISTER
$(Q) echo "Register: $1"
$(Q) echo "{ \"$1\", $2, $3, $4 }," > "$(BUILTIN_REGISTRY)$(DELIM)$1.bdat"
$(Q) if [ ! -z $4 ]; then \
echo "int $4(int argc, char *argv[]);" > "$(BUILTIN_REGISTRY)$(DELIM)$1.pdat"; \
fi;
$(Q) touch "$(BUILTIN_REGISTRY)$(DELIM).updated"
endef
endif
endif
2016-06-02 16:34:00 +02:00
# Standard include path
CFLAGS += ${INCDIR_PREFIX}"$(APPDIR)$(DELIM)include"
CXXFLAGS += ${INCDIR_PREFIX}"$(APPDIR)$(DELIM)include"
NUTTXLIB ?= $(call CONVERT_PATH,$(TOPDIR)$(DELIM)staging)
interpreters/wamr: add compile role of WebAssembly Add compilation rules to support WebAssembly(WASM/WAMR): 1. Compile Toolchain 1> Download WASI sdk and export the WASI_SDK_PATH path: $ wget https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-19/wasi-sdk-19.0-linux.tar.gz $ tar xf wasi-sdk-19.0-linux.tar.gz Put wasi-sdk-19.0 to your host WASI_SDK_PATH environment variable, like: $ export WASI_SDK_PATH=`pwd`/wasi-sdk-19.0 2> Download Wamr "wamrc" AOT compiler and export to the PATH: $ mkdir wamrc $ wget https://github.com/bytecodealliance/wasm-micro-runtime/releases/download/WAMR-1.1.2/wamrc-1.1.2-x86_64-ubuntu-20.04.tar.gz $ tar xf wamrc-1.1.2-x86_64-ubuntu-20.04.tar.gz $ export PATH=$PATH:$PWD 2. Configuring and running 1> Configuring sim/wamr and compile: nuttx$ ./tools/configure.sh sim/wamr nuttx$ make ... Wamrc Generate AoT: /home/archer/code/nuttx/n5/apps/wasm/hello.aot Wamrc Generate AoT: /home/archer/code/nuttx/n5/apps/wasm/coremark.aot LD: nuttx 2> Copy the generated wasm file(Interpreter/AoT) nuttx$ cp ../apps/wasm/hello.aot . nuttx$ cp ../apps/wasm/hello.wasm . nuttx$ cp ../apps/wasm/coremark.wasm . 3> Run iwasm nuttx$ ./nuttx NuttShell (NSH) NuttX-10.4.0 nsh> iwasm /data/hello.wasm Hello, World!! nsh> iwasm /data/hello.aot Hello, World!! nsh> iwasm /data/coremark.wasm 2K performance run parameters for coremark. CoreMark Size : 666 Total ticks : 12000 Total time (secs): 12.000000 Iterations/Sec : 5.000000 Iterations : 60 Compiler version : Clang 15.0.7 Compiler flags : Using NuttX compilation options Memory location : Defined by the NuttX configuration seedcrc : 0xe9f5 [0]crclist : 0xe714 [0]crcmatrix : 0x1fd7 [0]crcstate : 0x8e3a [0]crcfinal : 0xa14c Correct operation validated. See README.md for run and reporting rules. CoreMark 1.0 : 5.000000 / Clang 15.0.7 Using NuttX compilation options / Defined by the NuttX configuration Co-Authored-By: Huang Qi <huangqi3@xiaomi.com> Signed-off-by: chao an <anchao@xiaomi.com>
2023-03-02 04:46:37 +01:00
# SPLITVARIABLE - Split long variables into specified batches
# Usage: $(call SPLITVARIABLE, variable-def, variable-ref, batch-size)
#
# Example: VAR:= a b c x y z foo bar
# $(call SPLITVARIABLE, VAR, $(VAR), 3)
# $(foreach, num, $(VAR_TOTAL), $(shell echo $(VAR_$(num))))
# Return new variable definition:
# $(variable-def)_TOTAL : total split sequence , start with 1.
# $(variable-def)_$(num) : newly defined variable , ended with batch num.
# In the case above:
# $(VAR_TOTAL) = 1 2 3
# $(VAR_1) = a b c
# $(VAR_2) = x y z
# $(VAR_3) = foo bar
define SPLITVARIABLE
$(eval PREFIX = $(1))
$(eval BATCH_SIZE = $(3))
$(eval TOTAL_BATCH = $(shell expr $(words $(2)) / $(BATCH_SIZE) + 1))
$(eval $(PREFIX)_TOTAL = $(shell seq 1 $(TOTAL_BATCH)))
$(foreach idx, $($(PREFIX)_TOTAL), \
$(eval FROMINDEX=$(shell expr 1 + $(idx) \* $(BATCH_SIZE) - $(BATCH_SIZE))) \
$(eval $(PREFIX)_$(idx)=$(wordlist $(FROMINDEX), $(shell expr $(FROMINDEX) + $(BATCH_SIZE) - 1), $(2))) \
)
endef
apps/build: Restore ARLOCK to improve compile speed in incremental case 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 18137c0fec3cea30871f29238e11ea0f4e8523da | 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>
2023-09-11 05:54:19 +02:00
define ARLOCK
flock $1.lock $(call ARCHIVE, $1, $(2))
endef
# dynamic AR target
define AROBJSRULES
$(1) : $(2)
cp $(2) $(1)
endef
# CLEANAROBJS - del AR target files exclusively
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
define CLEANAROBJS
$(call DELFILE,$(subst /,\,$(AROBJS)))
endef
else
define CLEANAROBJS
$(Q) rm -f $(AROBJS)
endef
endif