123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533 |
- ############################################################################
- # tools/Config.mk
- #
- # 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:
- 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
- ifeq ($(CONFIG_WINDOWS_MSYS),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
- 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 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
- 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
- # 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 "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 - Add a list of files to an archive
- # Example: $(call ARCHIVE_ADD, 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_ADD
- @echo "AR (add): ${shell basename $(1)} $(2)"
- $(Q) $(AR) $1 $(2)
- endef
- # ARCHIVE - Same as above, but ensure the archive is
- # created from scratch
- define ARCHIVE
- @echo "AR (create): ${shell basename $(1)} $(2)"
- $(Q) $(RM) $1
- $(Q) $(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 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 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) 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
- # 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)
- $(Q) if exist $(OBJS) (del /f /q $(OBJS))
- $(Q) if exist $(BIN) (del /f /q $(BIN))
- endef
- else
- define CLEAN
- $(Q) rm -f *$(OBJEXT) *$(LIBEXT) *~ .*.swp $(OBJS) $(BIN)
- 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) APPDIR="$(APPDIR)"
- endef
- define SDIR_template
- $(1)_$(2):
- +$(Q) $(MAKE) -C $(1) $(2) APPDIR="$(APPDIR)"
- endef
- # ARCHxxx means the predefined setting(either toolchain, arch, or system specific)
- ARCHDEFINES += ${shell $(DEFINE) "$(CC)" __NuttX__}
- # 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}
|