748 lines
22 KiB
Makefile
748 lines
22 KiB
Makefile
############################################################################
|
|
# tools/Config.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.
|
|
#
|
|
############################################################################
|
|
|
|
# Disable all built-in rules
|
|
|
|
.SUFFIXES:
|
|
|
|
# Control build verbosity
|
|
#
|
|
# V=0: Exit silent mode
|
|
# V=1,2: Enable echo of commands
|
|
# V=2: Enable bug/verbose options in tools and scripts
|
|
|
|
ifeq ($(V),1)
|
|
export Q :=
|
|
else ifeq ($(V),2)
|
|
export Q :=
|
|
else
|
|
export Q := @
|
|
endif
|
|
|
|
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
|
|
export SHELL=cmd
|
|
else
|
|
BASHCMD := $(shell command -v bash 2> /dev/null)
|
|
ifneq ($(BASHCMD),)
|
|
export SHELL=$(BASHCMD)
|
|
ifeq ($(V),)
|
|
export ECHO_BEGIN=@echo -ne "\033[1K\r"
|
|
export ECHO_END=$(ECHO_BEGIN)
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(ECHO_BEGIN),)
|
|
export ECHO_BEGIN=@echo # keep a trailing space here
|
|
export ECHO_END=
|
|
endif
|
|
|
|
# These are configuration variables that are quoted by configuration tool
|
|
# but which must be unquoted when used in the build system.
|
|
|
|
CONFIG_ARCH := $(patsubst "%",%,$(strip $(CONFIG_ARCH)))
|
|
CONFIG_ARCH_CHIP := $(patsubst "%",%,$(strip $(CONFIG_ARCH_CHIP)))
|
|
CONFIG_ARCH_BOARD := $(patsubst "%",%,$(strip $(CONFIG_ARCH_BOARD)))
|
|
|
|
# Some defaults.
|
|
# $(TOPDIR)/Make.defs can override these appropriately.
|
|
|
|
MODULECC ?= $(CC)
|
|
MODULELD ?= $(LD)
|
|
MODULESTRIP ?= $(STRIP)
|
|
|
|
# ccache configuration.
|
|
|
|
ifeq ($(CONFIG_CCACHE),y)
|
|
CCACHE ?= ccache
|
|
endif
|
|
|
|
# Define HOSTCC on the make command line if it differs from these defaults
|
|
# Define HOSTCFLAGS with -g on the make command line to build debug versions
|
|
|
|
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
|
|
|
|
# In the Windows native environment, the MinGW GCC compiler is used
|
|
|
|
HOSTCC ?= mingw32-gcc.exe
|
|
HOSTCFLAGS ?= -O2 -Wall -Wstrict-prototypes -Wshadow -DCONFIG_WINDOWS_NATIVE=y
|
|
|
|
else
|
|
|
|
# GCC or clang is assumed in all other POSIX environments
|
|
# (Linux, Cygwin, MSYS2, macOS).
|
|
# strtok_r is used in some tools, but does not seem to be available in
|
|
# the MinGW environment.
|
|
|
|
HOSTCC ?= cc
|
|
HOSTCFLAGS ?= -O2 -Wall -Wstrict-prototypes -Wshadow
|
|
HOSTCFLAGS += -DHAVE_STRTOK_C=1
|
|
|
|
ifeq ($(CONFIG_WINDOWS_CYGWIN),y)
|
|
HOSTCFLAGS += -DHOST_CYGWIN=1
|
|
endif
|
|
endif
|
|
|
|
# Some defaults just to prohibit some bad behavior if for some reason they
|
|
# are not defined
|
|
|
|
ASMEXT ?= .S
|
|
OBJEXT ?= .o
|
|
LIBEXT ?= .a
|
|
|
|
ifeq ($(CONFIG_WINDOWS_CYGWIN),y)
|
|
EXEEXT ?= .exe
|
|
endif
|
|
|
|
ifeq ($(CONFIG_HOST_WINDOWS),y)
|
|
HOSTEXEEXT ?= .exe
|
|
HOSTDYNEXT ?= .dll
|
|
else ifeq ($(CONFIG_HOST_LINUX),y)
|
|
HOSTDYNEXT ?= .so
|
|
endif
|
|
|
|
# This define is passed as EXTRAFLAGS for kernel-mode builds. It is also passed
|
|
# during PASS1 (but not PASS2) context and depend targets.
|
|
|
|
KDEFINE ?= ${DEFINE_PREFIX}__KERNEL__
|
|
|
|
# DELIM - Path segment delimiter character
|
|
#
|
|
# Depends on this settings defined in board-specific defconfig file installed
|
|
# at $(TOPDIR)/.config:
|
|
#
|
|
# CONFIG_WINDOWS_NATIVE - Defined for a Windows native build
|
|
|
|
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
|
|
DELIM ?= $(strip \)
|
|
else
|
|
DELIM ?= $(strip /)
|
|
endif
|
|
|
|
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
|
|
EMPTYFILE := "NUL"
|
|
else
|
|
EMPTYFILE := "/dev/null"
|
|
endif
|
|
|
|
# Process chip-specific directories
|
|
|
|
ifeq ($(CONFIG_ARCH_CHIP_CUSTOM),y)
|
|
CUSTOM_CHIP_DIR = $(patsubst "%",%,$(CONFIG_ARCH_CHIP_CUSTOM_DIR))
|
|
ifeq ($(CONFIG_ARCH_CHIP_CUSTOM_DIR_RELPATH),y)
|
|
CHIP_DIR ?= $(TOPDIR)$(DELIM)$(CUSTOM_CHIP_DIR)
|
|
CHIP_KCONFIG = $(TOPDIR)$(DELIM)$(CUSTOM_CHIP_DIR)$(DELIM)Kconfig
|
|
else
|
|
CHIP_DIR ?= $(CUSTOM_CHIP_DIR)
|
|
CHIP_KCONFIG = $(CUSTOM_CHIP_DIR)$(DELIM)Kconfig
|
|
endif
|
|
else
|
|
CHIP_DIR ?= $(TOPDIR)$(DELIM)arch$(DELIM)$(CONFIG_ARCH)$(DELIM)src$(DELIM)$(CONFIG_ARCH_CHIP)
|
|
CHIP_KCONFIG = $(TOPDIR)$(DELIM)arch$(DELIM)dummy$(DELIM)dummy_kconfig
|
|
endif
|
|
|
|
# Process board-specific directories
|
|
|
|
ifeq ($(CONFIG_ARCH_BOARD_CUSTOM),y)
|
|
CUSTOM_DIR = $(patsubst "%",%,$(CONFIG_ARCH_BOARD_CUSTOM_DIR))
|
|
ifeq ($(CONFIG_ARCH_BOARD_CUSTOM_DIR_RELPATH),y)
|
|
BOARD_DIR ?= $(TOPDIR)$(DELIM)$(CUSTOM_DIR)
|
|
else
|
|
BOARD_DIR ?= $(CUSTOM_DIR)
|
|
endif
|
|
CUSTOM_BOARD_KPATH = $(BOARD_DIR)$(DELIM)Kconfig
|
|
else
|
|
BOARD_DIR ?= $(TOPDIR)$(DELIM)boards$(DELIM)$(CONFIG_ARCH)$(DELIM)$(CONFIG_ARCH_CHIP)$(DELIM)$(CONFIG_ARCH_BOARD)
|
|
endif
|
|
ifeq (,$(wildcard $(CUSTOM_BOARD_KPATH)))
|
|
BOARD_KCONFIG = $(TOPDIR)$(DELIM)boards$(DELIM)dummy$(DELIM)dummy_kconfig
|
|
else
|
|
BOARD_KCONFIG = $(CUSTOM_BOARD_KPATH)
|
|
endif
|
|
|
|
ifeq (,$(wildcard $(BOARD_DIR)$(DELIM)..$(DELIM)common))
|
|
ifeq ($(CONFIG_ARCH_BOARD_COMMON),y)
|
|
BOARD_COMMON_DIR ?= $(wildcard $(TOPDIR)$(DELIM)boards$(DELIM)$(CONFIG_ARCH)$(DELIM)$(CONFIG_ARCH_CHIP)$(DELIM)common)
|
|
endif
|
|
else
|
|
BOARD_COMMON_DIR ?= $(wildcard $(BOARD_DIR)$(DELIM)..$(DELIM)common)
|
|
endif
|
|
BOARD_DRIVERS_DIR ?= $(wildcard $(BOARD_DIR)$(DELIM)..$(DELIM)drivers)
|
|
ifeq ($(BOARD_DRIVERS_DIR),)
|
|
BOARD_DRIVERS_DIR = $(TOPDIR)$(DELIM)drivers$(DELIM)dummy
|
|
endif
|
|
|
|
# DIRLINK - Create a directory link in the portable way
|
|
|
|
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
|
|
ifeq ($(CONFIG_WINDOWS_MKLINK),y)
|
|
DIRLINK ?= $(TOPDIR)$(DELIM)tools$(DELIM)link.bat
|
|
else
|
|
DIRLINK ?= $(TOPDIR)$(DELIM)tools$(DELIM)copydir.bat
|
|
endif
|
|
DIRUNLINK ?= $(TOPDIR)$(DELIM)tools$(DELIM)unlink.bat
|
|
else
|
|
ifeq ($(CONFIG_CYGWIN_WINTOOL),y)
|
|
DIRLINK ?= $(TOPDIR)$(DELIM)tools$(DELIM)copydir.sh
|
|
else ifeq ($(CONFIG_WINDOWS_MSYS),y)
|
|
DIRLINK ?= $(TOPDIR)$(DELIM)tools$(DELIM)copydir.sh
|
|
else
|
|
DIRLINK ?= $(TOPDIR)$(DELIM)tools$(DELIM)link.sh
|
|
endif
|
|
DIRUNLINK ?= $(TOPDIR)$(DELIM)tools$(DELIM)unlink.sh
|
|
endif
|
|
|
|
# MKDEP - Create the depend rule in the portable way
|
|
|
|
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
|
|
MKDEP ?= $(TOPDIR)$(DELIM)tools$(DELIM)mkdeps$(HOSTEXEEXT) --winnative
|
|
else ifeq ($(CONFIG_CYGWIN_WINTOOL),y)
|
|
MKDEP ?= $(TOPDIR)$(DELIM)tools$(DELIM)mkwindeps.sh
|
|
else
|
|
MKDEP ?= $(TOPDIR)$(DELIM)tools$(DELIM)mkdeps$(HOSTEXEEXT)
|
|
endif
|
|
|
|
# Per-file dependency generation rules
|
|
|
|
OBJPATH ?= .
|
|
|
|
%.dds: %.S
|
|
$(Q) $(MKDEP) --obj-path $(OBJPATH) --obj-suffix $(OBJEXT) $(DEPPATH) "$(CC)" -- $(CFLAGS) -- $< > $@
|
|
|
|
%.ddc: %.c
|
|
$(Q) $(MKDEP) --obj-path $(OBJPATH) --obj-suffix $(OBJEXT) $(DEPPATH) "$(CC)" -- $(CFLAGS) -- $< > $@
|
|
|
|
%.ddp: %.cpp
|
|
$(Q) $(MKDEP) --obj-path $(OBJPATH) --obj-suffix $(OBJEXT) $(DEPPATH) "$(CXX)" -- $(CXXFLAGS) -- $< > $@
|
|
|
|
%.ddx: %.cxx
|
|
$(Q) $(MKDEP) --obj-path $(OBJPATH) --obj-suffix $(OBJEXT) $(DEPPATH) "$(CXX)" -- $(CXXFLAGS) -- $< > $@
|
|
|
|
%.ddh: %.c
|
|
$(Q) $(MKDEP) --obj-path $(OBJPATH) --obj-suffix $(OBJEXT) $(DEPPATH) "$(CC)" -- $(HOSTCFLAGS) -- $< > $@
|
|
|
|
# INCDIR - Convert a list of directory paths to a list of compiler include
|
|
# directories
|
|
# Example: CFFLAGS += ${shell $(INCDIR) [options] "compiler" "dir1" "dir2" "dir2" ...}
|
|
#
|
|
# Note that the compiler string and each directory path string must quoted if
|
|
# they contain spaces or any other characters that might get mangled by the
|
|
# shell
|
|
#
|
|
# Depends on this setting passed as a make command line definition from the
|
|
# toplevel Makefile:
|
|
#
|
|
# TOPDIR - The path to the top level NuttX directory in the form
|
|
# appropriate for the current build environment
|
|
#
|
|
# Depends on this settings defined in board-specific defconfig file installed
|
|
# at $(TOPDIR)/.config:
|
|
#
|
|
# CONFIG_WINDOWS_NATIVE - Defined for a Windows native build
|
|
|
|
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
|
|
DEFINE ?= $(TOPDIR)\tools\define.bat
|
|
INCDIR ?= $(TOPDIR)\tools\incdir.bat
|
|
else ifeq ($(CONFIG_CYGWIN_WINTOOL),y)
|
|
DEFINE ?= "$(TOPDIR)/tools/define.sh" -w
|
|
INCDIR ?= "$(TOPDIR)/tools/incdir$(HOSTEXEEXT)" -w
|
|
else
|
|
DEFINE ?= "$(TOPDIR)/tools/define.sh"
|
|
INCDIR ?= "$(TOPDIR)/tools/incdir$(HOSTEXEEXT)"
|
|
endif
|
|
|
|
# PREPROCESS - Default macro to run the C pre-processor
|
|
# Example: $(call PREPROCESS, in-file, out-file)
|
|
#
|
|
# Depends on these settings defined in board-specific Make.defs file
|
|
# installed at $(TOPDIR)/Make.defs:
|
|
#
|
|
# CPP - The command to invoke the C pre-processor
|
|
# CPPFLAGS - Options to pass to the C pre-processor
|
|
#
|
|
# '<filename>.c_CPPFLAGS += <options>' may also be used, as an example, to
|
|
# change the options used with the single file <filename>.c (or
|
|
# <filename>.S)
|
|
|
|
define PREPROCESS
|
|
$(ECHO_BEGIN)"CPP: $1->$2 "
|
|
$(Q) $(CPP) $(CPPFLAGS) $($(strip $1)_CPPFLAGS) $1 -o $2
|
|
$(ECHO_END)
|
|
endef
|
|
|
|
# COMPILE - Default macro to compile one C file
|
|
# Example: $(call COMPILE, in-file, out-file, flags)
|
|
#
|
|
# Depends on these settings defined in board-specific Make.defs file
|
|
# installed at $(TOPDIR)/Make.defs:
|
|
#
|
|
# CC - The command to invoke the C compiler
|
|
# CFLAGS - Options to pass to the C compiler
|
|
#
|
|
# '<filename>.c_CFLAGS += <options>' may also be used, as an example, to
|
|
# change the options used with the single file <filename>.c
|
|
|
|
define COMPILE
|
|
$(ECHO_BEGIN)"CC: $1 "
|
|
$(Q) $(CCACHE) $(CC) -c $(CFLAGS) $3 $($(strip $1)_CFLAGS) $1 -o $2
|
|
$(ECHO_END)
|
|
endef
|
|
|
|
# COMPILEXX - Default macro to compile one C++ file
|
|
# Example: $(call COMPILEXX, in-file, out-file, flags)
|
|
#
|
|
# Depends on these settings defined in board-specific Make.defs file
|
|
# installed at $(TOPDIR)/Make.defs:
|
|
#
|
|
# CXX - The command to invoke the C++ compiler
|
|
# CXXFLAGS - Options to pass to the C++ compiler
|
|
#
|
|
# '<filename>.cxx_CXXFLAGS += <options>' may also be used, as an example, to
|
|
# change the options used with the single file <filename>.cxx. The
|
|
# extension .cpp could also be used. The same applies mutatis mutandis.
|
|
|
|
define COMPILEXX
|
|
$(ECHO_BEGIN)"CXX: $1 "
|
|
$(Q) $(CCACHE) $(CXX) -c $(CXXFLAGS) $3 $($(strip $1)_CXXFLAGS) $1 -o $2
|
|
$(ECHO_END)
|
|
endef
|
|
|
|
# COMPILERUST - Default macro to compile one Rust file
|
|
# Example: $(call COMPILERUST, in-file, out-file)
|
|
#
|
|
# Depends on these settings defined in board-specific Make.defs file
|
|
# installed at $(TOPDIR)/Make.defs:
|
|
#
|
|
# RUST - The command to invoke the Rust compiler
|
|
# RUSTFLAGS - Options to pass to the Rust compiler
|
|
#
|
|
# '<filename>.rs_RUSTFLAGS += <options>' may also be used, as an example, to
|
|
# change the options used with the single file <filename>.rs. The same
|
|
# applies mutatis mutandis.
|
|
|
|
define COMPILERUST
|
|
$(ECHO_BEGIN)"RUSTC: $1 "
|
|
$(Q) $(RUSTC) --emit obj $(RUSTFLAGS) $($(strip $1)_RUSTFLAGS) $1 -o $2
|
|
$(ECHO_END)
|
|
endef
|
|
|
|
# COMPILEZIG - Default macro to compile one Zig file
|
|
# Example: $(call COMPILEZIG, in-file, out-file)
|
|
#
|
|
# Depends on these settings defined in board-specific Make.defs file
|
|
# installed at $(TOPDIR)/Make.defs:
|
|
#
|
|
# ZIG - The command to invoke the Zig compiler
|
|
# ZIGFLAGS - Options to pass to the Zig compiler
|
|
#
|
|
# '<filename>.zig_ZIGFLAGS += <options>' may also be used, as an example, to
|
|
# change the options used with the single file <filename>.zig. The same
|
|
# applies mutatis mutandis.
|
|
|
|
define COMPILEZIG
|
|
$(ECHO_BEGIN)"ZIG: $1 "
|
|
$(Q) $(ZIG) build-obj $(ZIGFLAGS) $($(strip $1)_ZIGFLAGS) --name $(basename $2) $1
|
|
$(ECHO_END)
|
|
endef
|
|
|
|
# COMPILED - Default macro to compile one D file
|
|
# Example: $(call COMPILED, in-file, out-file)
|
|
#
|
|
# Depends on these settings defined in board-specific Make.defs file
|
|
# installed at $(TOPDIR)/Make.defs:
|
|
#
|
|
# DC - The command to invoke the D compiler
|
|
# DFLAGS - Options to pass to the D compiler
|
|
#
|
|
# '<filename>.d_DFLAGS += <options>' may also be used, as an example, to
|
|
# change the options used with the single file <filename>.d. The same
|
|
# applies mutatis mutandis.
|
|
|
|
define COMPILED
|
|
$(ECHO_BEGIN)"DC: $1 "
|
|
$(Q) $(DC) -c $(DFLAGS) $($(strip $1)_DFLAGS) $1 -of $2
|
|
$(ECHO_END)
|
|
endef
|
|
|
|
# COMPILESWIFT - Default macro to compile one Swift file
|
|
# Example: $(call COMPILESWIFT, in-file, out-file)
|
|
#
|
|
# Depends on these settings defined in board-specific Make.defs file
|
|
# installed at $(TOPDIR)/Make.defs:
|
|
#
|
|
# SWIFTC - The command to invoke the Swift compiler
|
|
# SWIFTFLAGS - Options to pass to the Swift compiler
|
|
#
|
|
# '<filename>.swift_SWIFTFLAGS += <options>' may also be used, as an example, to
|
|
# change the options used with the single file <filename>.swift. The same
|
|
# applies mutatis mutandis.
|
|
|
|
define COMPILESWIFT
|
|
$(ECHO_BEGIN)"SWIFTC: $1 "
|
|
$(Q) $(SWIFTC) -c $(SWIFTFLAGS) $($(strip $1)_SWIFTFLAGS) $1 -o $2
|
|
$(ECHO_END)
|
|
endef
|
|
|
|
# ASSEMBLE - Default macro to assemble one assembly language file
|
|
# Example: $(call ASSEMBLE, in-file, out-file)
|
|
#
|
|
# NOTE that the most common toolchain, GCC, uses the compiler to assemble
|
|
# files because this has the advantage of running the C Pre-Processor against
|
|
# the assembly language files. This is not possible with other toolchains;
|
|
# platforms using those other tools should define AS and over-ride this
|
|
# definition in order to use the assembler directly.
|
|
#
|
|
# Depends on these settings defined in board-specific Make.defs file
|
|
# installed at $(TOPDIR)/Make.defs:
|
|
#
|
|
# CC - By default, the C compiler is used to compile assembly language
|
|
# files
|
|
# AFLAGS - Options to pass to the C+compiler
|
|
#
|
|
# '<filename>.s_AFLAGS += <options>' may also be used, as an example, to change
|
|
# the options used with the single file <filename>.s. The extension .asm
|
|
# is used by some toolchains. The same applies mutatis mutandis.
|
|
|
|
define ASSEMBLE
|
|
$(ECHO_BEGIN)"AS: $1 "
|
|
$(Q) $(CCACHE) $(CC) -c $(AFLAGS) $1 $($(strip $1)_AFLAGS) -o $2
|
|
$(ECHO_END)
|
|
endef
|
|
|
|
# INSTALL_LIB - Install a library $1 into target $2
|
|
# Example: $(call INSTALL_LIB, libabc.a, $(TOPDIR)/staging/)
|
|
|
|
define INSTALL_LIB
|
|
$(ECHO_BEGIN)"IN: $1 -> $2 "
|
|
$(Q) install -m 0644 $1 $2
|
|
$(ECHO_END)
|
|
endef
|
|
|
|
# ARCHIVE - Add a list of files to an archive
|
|
# Example: $(call ARCHIVE, archive-file, "file1 file2 file3 ...")
|
|
#
|
|
# Note: The fileN strings may not contain spaces or characters that may be
|
|
# interpreted strangely by the shell
|
|
#
|
|
# Depends on these settings defined in board-specific Make.defs file
|
|
# installed at $(TOPDIR)/Make.defs:
|
|
#
|
|
# AR - The command to invoke the archiver (includes any options)
|
|
#
|
|
# Depends on this settings defined in board-specific defconfig file installed
|
|
# at $(TOPDIR)/.config:
|
|
#
|
|
# CONFIG_WINDOWS_NATIVE - Defined for a Windows native build
|
|
|
|
define ARCHIVE
|
|
$(AR) $1 $2
|
|
endef
|
|
|
|
# PRELINK - Prelink a list of files
|
|
# This is useful when files were compiled with fvisibility=hidden.
|
|
# Any symbol which was not explicitly made global is invisible outside the
|
|
# prelinked file.
|
|
#
|
|
# Example: $(call PRELINK, prelink-file, "file1 file2 file3 ...")
|
|
#
|
|
# Note: The fileN strings may not contain spaces or characters that may be
|
|
# interpreted strangely by the shell
|
|
#
|
|
# Depends on these settings defined in board-specific Make.defs file
|
|
# installed at $(TOPDIR)/Make.defs:
|
|
#
|
|
# LD - The command to invoke the linker (includes any options)
|
|
# OBJCOPY - The command to invoke the object cop (includes any options)
|
|
#
|
|
# Depends on this settings defined in board-specific defconfig file installed
|
|
# at $(TOPDIR)/.config:
|
|
#
|
|
# CONFIG_WINDOWS_NATIVE - Defined for a Windows native build
|
|
|
|
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
|
|
define PRELINK
|
|
@echo PRELINK: $1
|
|
$(Q) $(LD) -Ur -o $1 $2 && $(OBJCOPY) --localize-hidden $1
|
|
endef
|
|
else
|
|
define PRELINK
|
|
@echo "PRELINK: $1"
|
|
$(Q) $(LD) -Ur -o $1 $2 && $(OBJCOPY) --localize-hidden $1
|
|
endef
|
|
endif
|
|
|
|
# PREBUILD -- Perform pre build operations
|
|
# Some architectures require the use of special tools and special handling
|
|
# BEFORE building NuttX. The `Make.defs` files for those architectures
|
|
# should override the following define with the correct operations for
|
|
# that platform.
|
|
|
|
define PREBUILD
|
|
endef
|
|
|
|
# POSTBUILD -- Perform post build operations
|
|
# Some architectures require the use of special tools and special handling
|
|
# AFTER building the NuttX binary. Make.defs files for those architectures
|
|
# should override the following define with the correct operations for
|
|
# that platform
|
|
|
|
define POSTBUILD
|
|
endef
|
|
|
|
# DELFILE - Delete one file
|
|
|
|
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
|
|
define NEWLINE
|
|
|
|
|
|
endef
|
|
define DELFILE
|
|
$(foreach FILE, $(1), $(NEWLINE) $(Q) if exist $(FILE) (del /f /q $(FILE)))
|
|
endef
|
|
else
|
|
define DELFILE
|
|
$(Q) rm -f $1
|
|
endef
|
|
endif
|
|
|
|
# DELDIR - Delete one directory
|
|
|
|
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
|
|
define DELDIR
|
|
$(Q) if exist $1 (rmdir /q /s $1) $(NEWLINE)
|
|
endef
|
|
else
|
|
define DELDIR
|
|
$(Q) rm -rf $1
|
|
endef
|
|
endif
|
|
|
|
# MOVEFILE - Move one file
|
|
|
|
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
|
|
define MOVEFILE
|
|
$(Q) if exist $1 (move /Y $1 $2)
|
|
endef
|
|
else
|
|
define MOVEFILE
|
|
$(Q) mv -f $1 $2
|
|
endef
|
|
endif
|
|
|
|
# COPYFILE - Copy one file
|
|
|
|
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
|
|
define COPYFILE
|
|
$(Q) if exist $1 (copy /y /b $1 $2)
|
|
endef
|
|
else
|
|
define COPYFILE
|
|
$(Q) cp -f $1 $2
|
|
endef
|
|
endif
|
|
|
|
# CATFILE - Cat a list of files
|
|
#
|
|
# USAGE: $(call CATFILE,dest,src1,src2,src3,...)
|
|
|
|
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
|
|
define CATFILE
|
|
$(foreach FILE, $(2), $(NEWLINE) $(Q) type $(FILE) >> $1)
|
|
endef
|
|
else
|
|
define CATFILE
|
|
$(Q) if [ -z "$(strip $(2))" ]; then echo '' > $(1); else cat $(2) > $1; fi
|
|
endef
|
|
endif
|
|
|
|
# RWILDCARD - Recursive wildcard used to get lists of files from directories
|
|
#
|
|
# USAGE: FILELIST = $(call RWILDCARD,<dir>,<wildcard-filename)
|
|
#
|
|
# This is functionally equivalent to the following, but has the advantage in
|
|
# that it is portable
|
|
#
|
|
# FILELIST = ${shell find <dir> -name <wildcard-file>}
|
|
|
|
define RWILDCARD
|
|
$(foreach d,$(wildcard $1/*),$(call RWILDCARD,$d,$2)$(filter $(subst *,%,$2),$d))
|
|
endef
|
|
|
|
# FINDSCRIPT - Find a given linker script. Prioritize the version from currently
|
|
# configured board. If not provided, use the linker script from the
|
|
# board common directory.
|
|
# Example: $(call FINDSCRIPT,script.ld)
|
|
|
|
define FINDSCRIPT
|
|
$(if $(wildcard $(BOARD_DIR)$(DELIM)scripts$(DELIM)$(1)),$(BOARD_DIR)$(DELIM)scripts$(DELIM)$(1),$(BOARD_COMMON_DIR)$(DELIM)scripts$(DELIM)$(1))
|
|
endef
|
|
|
|
# DOWNLOAD - Download file. The URL base is joined with TARBALL by '/' and
|
|
# downloaded to the TARBALL file.
|
|
# The third argument is an output path. The second argument is used
|
|
# if it is not provided or is empty.
|
|
# Example: $(call DOWNLOAD,$(FOO_URL_BASE),$(FOO_TARBALL),foo.out,foo-)
|
|
|
|
define DOWNLOAD
|
|
$(ECHO_BEGIN)"Downloading: $(if $3,$3,$2) "
|
|
$(Q) curl -L $(if $(V),,-Ss) $(1)/$(2) -o $(if $(3),$(3),$(2))
|
|
$(ECHO_END)
|
|
endef
|
|
|
|
# CLEAN - Default clean target
|
|
|
|
ifeq ($(CONFIG_ARCH_COVERAGE),y)
|
|
EXTRA = *.gcno *.gcda
|
|
endif
|
|
|
|
ifeq ($(CONFIG_STACK_USAGE),y)
|
|
EXTRA += *.su
|
|
endif
|
|
|
|
ifeq ($(CONFIG_ARCH_TOOLCHAIN_TASKING),y)
|
|
EXTRA += *.d
|
|
EXTRA += *.src
|
|
endif
|
|
|
|
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
|
|
define CLEAN
|
|
$(Q) if exist *$(OBJEXT) (del /f /q *$(OBJEXT))
|
|
$(Q) if exist *$(LIBEXT) (del /f /q *$(LIBEXT))
|
|
$(Q) if exist *~ (del /f /q *~)
|
|
$(Q) if exist (del /f /q .*.swp)
|
|
$(call DELFILE,$(subst /,\,$(OBJS)))
|
|
$(Q) if exist $(BIN) (del /f /q $(subst /,\,$(BIN)))
|
|
$(Q) if exist $(BIN).lock (del /f /q $(subst /,\,$(BIN).lock))
|
|
$(Q) if exist $(EXTRA) (del /f /q $(subst /,\,$(EXTRA)))
|
|
endef
|
|
else
|
|
define CLEAN
|
|
$(Q) rm -f *$(OBJEXT) *$(LIBEXT) *~ .*.swp $(OBJS) $(BIN) $(BIN).lock $(EXTRA)
|
|
endef
|
|
endif
|
|
|
|
# TESTANDREPLACEFILE - Test if two files are different. If so replace the
|
|
# second with the first. Otherwise, delete the first.
|
|
#
|
|
# USAGE: $(call TESTANDREPLACEFILE, newfile, oldfile)
|
|
#
|
|
# args: $1 - newfile: Temporary file to test
|
|
# $2 - oldfile: File to replace
|
|
|
|
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
|
|
define TESTANDREPLACEFILE
|
|
$(Q) move /Y $1 $2
|
|
endef
|
|
else
|
|
define TESTANDREPLACEFILE
|
|
if [ -f $2 ]; then \
|
|
if cmp -s $1 $2; then \
|
|
rm -f $1; \
|
|
else \
|
|
mv $1 $2; \
|
|
fi \
|
|
else \
|
|
mv $1 $2; \
|
|
fi
|
|
endef
|
|
endif
|
|
|
|
# Invoke make
|
|
|
|
define MAKE_template
|
|
+$(Q) $(MAKE) -C $(1) $(2) APPDIR="$(APPDIR)"
|
|
|
|
endef
|
|
|
|
define SDIR_template
|
|
$(1)_$(2):
|
|
+$(Q) $(MAKE) -C $(1) $(2) APPDIR="$(APPDIR)"
|
|
|
|
endef
|
|
|
|
export DEFINE_PREFIX ?= $(subst X,,${shell $(DEFINE) "$(CC)" X 2> ${EMPTYFILE}})
|
|
export INCDIR_PREFIX ?= $(subst "X",,${shell $(INCDIR) "$(CC)" X 2> ${EMPTYFILE}})
|
|
export INCSYSDIR_PREFIX ?= $(subst "X",,${shell $(INCDIR) -s "$(CC)" X 2> ${EMPTYFILE}})
|
|
|
|
# ARCHxxx means the predefined setting(either toolchain, arch, or system specific)
|
|
ARCHDEFINES += ${DEFINE_PREFIX}__NuttX__
|
|
ifeq ($(CONFIG_NDEBUG),y)
|
|
ARCHDEFINES += ${DEFINE_PREFIX}NDEBUG
|
|
endif
|
|
|
|
# The default C/C++ search path
|
|
|
|
ARCHINCLUDES += ${INCSYSDIR_PREFIX}$(TOPDIR)$(DELIM)include
|
|
|
|
ifeq ($(CONFIG_LIBCXX),y)
|
|
ARCHXXINCLUDES += ${INCSYSDIR_PREFIX}$(TOPDIR)$(DELIM)include$(DELIM)libcxx
|
|
else ifeq ($(CONFIG_UCLIBCXX),y)
|
|
ARCHXXINCLUDES += ${INCSYSDIR_PREFIX}$(TOPDIR)$(DELIM)include$(DELIM)uClibc++
|
|
else
|
|
ARCHXXINCLUDES += ${INCSYSDIR_PREFIX}$(TOPDIR)$(DELIM)include$(DELIM)cxx
|
|
ifeq ($(CONFIG_ETL),y)
|
|
ARCHXXINCLUDES += ${INCSYSDIR_PREFIX}$(TOPDIR)$(DELIM)include$(DELIM)etl
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(CONFIG_LIBCXXABI),y)
|
|
ARCHXXINCLUDES += ${INCSYSDIR_PREFIX}$(TOPDIR)$(DELIM)include$(DELIM)libcxxabi
|
|
endif
|
|
|
|
ifeq ($(CONFIG_LIBM_NEWLIB),y)
|
|
ARCHINCLUDES += ${INCSYSDIR_PREFIX}$(TOPDIR)$(DELIM)include$(DELIM)newlib
|
|
ARCHXXINCLUDES += ${INCSYSDIR_PREFIX}$(TOPDIR)$(DELIM)include$(DELIM)newlib
|
|
endif
|
|
|
|
#libmcs`s math.h should include after libcxx, or it will override libcxx/include/math.h and build error
|
|
ifeq ($(CONFIG_LIBM_LIBMCS),y)
|
|
ARCHDEFINES += ${DEFINE_PREFIX}LIBMCS_LONG_DOUBLE_IS_64BITS
|
|
ARCHINCLUDES += ${INCSYSDIR_PREFIX}$(TOPDIR)$(DELIM)include$(DELIM)libmcs
|
|
ARCHXXINCLUDES += ${INCSYSDIR_PREFIX}$(TOPDIR)$(DELIM)include$(DELIM)libmcs
|
|
endif
|
|
|
|
ifeq ($(CONFIG_LIBM_OPENLIBM),y)
|
|
ARCHINCLUDES += ${INCSYSDIR_PREFIX}$(TOPDIR)$(DELIM)include$(DELIM)openlibm
|
|
ARCHXXINCLUDES += ${INCSYSDIR_PREFIX}$(TOPDIR)$(DELIM)include$(DELIM)openlibm
|
|
endif
|
|
|
|
ARCHXXINCLUDES += ${INCSYSDIR_PREFIX}$(TOPDIR)$(DELIM)include
|
|
|
|
# Convert filepaths to their proper system format (i.e. Windows/Unix)
|
|
|
|
ifeq ($(CONFIG_CYGWIN_WINTOOL),y)
|
|
CONVERT_PATH = $(foreach FILE,$1,${shell cygpath -w $(FILE)})
|
|
else
|
|
CONVERT_PATH = $1
|
|
endif
|
|
|
|
# Upper/Lower case string, add the `UL` prefix to private function
|
|
|
|
ULPOP = $(wordlist 3,$(words $(1)),$(1))
|
|
ULSUB = $(subst $(word 1,$(1)),$(word 2,$(1)),$(2))
|
|
ULMAP = $(if $(1),$(call ULSUB,$(1),$(call ULMAP,$(call ULPOP,$(1)),$(2))),$(2))
|
|
UPPERMAP = a A b B c C d D e E f F g G h H i I j J k K l L m M n N o O p P q Q r R s S t T u U v V w W x X y Y z Z
|
|
LOWERMAP = A a B b C c D d E e F f G g H h I i J j K k L l M m N n O o P p Q q R r S s T t U u V v W w X x Y y Z z
|
|
|
|
UPPER_CASE = $(call ULMAP,$(UPPERMAP),$(1))
|
|
LOWER_CASE = $(call ULMAP,$(LOWERMAP),$(1))
|