123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505 |
- ############################################################################
- # tools/Config.mk
- # Global build rules and macros.
- #
- # Copyright (C) 2011, 2013-2014, 2018-2019, 2020 Gregory Nutt. All rights
- # reserved.
- # Author: Richard Cochran
- # Gregory Nutt <gnutt@nuttx.org>
- #
- # This file (along with $(TOPDIR)/.config) must be included by every
- # configuration-specific Make.defs file.
- #
- # Redistribution and use in source and binary forms, with or without
- # modification, are permitted provided that the following conditions
- # are met:
- #
- # 1. Redistributions of source code must retain the above copyright
- # notice, this list of conditions and the following disclaimer.
- # 2. Redistributions in binary form must reproduce the above copyright
- # notice, this list of conditions and the following disclaimer in
- # the documentation and/or other materials provided with the
- # distribution.
- # 3. Neither the name NuttX nor the names of its contributors may be
- # used to endorse or promote products derived from this software
- # without specific prior written permission.
- #
- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- # OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- # POSSIBILITY OF SUCH DAMAGE.
- #
- ############################################################################
- # Disable all built-in rules
- .SUFFIXES:
- ifeq ($(CONFIG_WINDOWS_NATIVE),y)
- export SHELL=cmd
- endif
- # Control build verbosity
- #
- # 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
- # 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)
- # 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
- HOSTOS = ${shell uname -o 2>/dev/null || uname -s 2>/dev/null || echo "Other"}
- ifeq ($(HOSTOS),MinGW)
- # 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 ($(HOSTOS),Cygwin)
- 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 ($(HOSTOS),Cygwin)
- EXEEXT ?= .exe
- endif
- ifeq ($(CONFIG_HOST_WINDOWS),y)
- HOSTEXEEXT ?= .exe
- 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 ?= ${shell $(DEFINE) "$(CC)" __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
- # 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
- else
- BOARD_DIR ?= $(TOPDIR)$(DELIM)boards$(DELIM)$(CONFIG_ARCH)$(DELIM)$(CONFIG_ARCH_CHIP)$(DELIM)$(CONFIG_ARCH_BOARD)
- endif
- BOARD_COMMON_DIR ?= $(wildcard $(BOARD_DIR)$(DELIM)..$(DELIM)common)
- 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
- # 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 "CPP: $1->$2"
- $(Q) $(CPP) $(CPPFLAGS) $($(strip $1)_CPPFLAGS) $1 -o $2
- endef
- # COMPILE - Default macro to compile one C file
- # Example: $(call COMPILE, in-file, out-file)
- #
- # 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 "CC: $1"
- $(Q) $(CC) -c $(CFLAGS) $($(strip $1)_CFLAGS) $1 -o $2
- endef
- # COMPILEXX - Default macro to compile one C++ file
- # Example: $(call COMPILEXX, in-file, out-file)
- #
- # 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 "CXX: $1"
- $(Q) $(CXX) -c $(CXXFLAGS) $($(strip $1)_CXXFLAGS) $1 -o $2
- 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 "AS: $1"
- $(Q) $(CC) -c $(AFLAGS) $1 $($(strip $1)_AFLAGS) -o $2
- endef
- # INSTALL_LIB - Install a library $1 into target $2
- # Example: $(call INSTALL_LIB, libabc.a, $(TOPDIR)/staging/)
- define INSTALL_LIB
- @echo "IN: $1 -> $2"
- $(Q) install -m 0644 $1 $2
- 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
- # 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 thos 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 DELFILE
- $(Q) if exist $1 (del /f /q $1)
- 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)
- 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
- $(Q) type $(2) > $1
- endef
- else
- define CATFILE
- $(Q) cat $(2) > $1
- 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
- # CLEAN - Default clean target
- 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)
- endef
- else
- define CLEAN
- $(Q) rm -f *$(OBJEXT) *$(LIBEXT) *~ .*.swp
- 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 $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) TOPDIR="$(TOPDIR)" APPDIR="$(APPDIR)"
- endef
- define SDIR_template
- $(1)_$(2):
- +$(Q) $(MAKE) -C $(1) $(2) TOPDIR="$(TOPDIR)" APPDIR="$(APPDIR)"
- endef
- # The default C/C++ search path
- ARCHINCLUDES += ${shell $(INCDIR) -s "$(CC)" $(TOPDIR)$(DELIM)include}
- ifeq ($(CONFIG_LIBCXX),y)
- ARCHXXINCLUDES += ${shell $(INCDIR) -s "$(CC)" $(TOPDIR)$(DELIM)include$(DELIM)libcxx}
- else ifeq ($(CONFIG_UCLIBCXX),y)
- ARCHXXINCLUDES += ${shell $(INCDIR) -s "$(CC)" $(TOPDIR)$(DELIM)include$(DELIM)uClibc++}
- else
- ARCHXXINCLUDES += ${shell $(INCDIR) -s "$(CC)" $(TOPDIR)$(DELIM)include$(DELIM)cxx}
- endif
- ARCHXXINCLUDES += ${shell $(INCDIR) -s "$(CC)" $(TOPDIR)$(DELIM)include}
|