That's interesting. Maybe there is a difference in the default flags between my compiler and what you and the build server are using. It looks like the default standard for my compiler is gnu90. I haven't done an exhaustive test on all the builds, but for starters here are a few that fail
nucleo-h743i:nsh nucleo-h743i:nxlines_oled stm32h747i-disco:nsh I just found that the nucleo-h743xi:pwm config did not fail, so I dug into that and found that compiler optimizations play a role in whether the build completes. With the "No Optimization" setting selected, the build fails. Turning on "Full Optimization" allows the build to complete. I also tested all of the common custom optimzation levels -O --> works -O2 --> works -O3 --> works -O0 --> fails -Os --> works The issue crops up in flat builds because of how the build pulls in files based on the config. An example is the easiest way to show the issue. Here is one of the offending functions from the compiler error nuttx/staging/libarch.a(stm32_allocateheap.o): In function `mpu_configure_region': nuttx/arch/arm/src/armv7-m/mpu.h:281: undefined reference to `mpu_allocregion' mpu_allocregion is declared at line 172 of mpu.h but used within the inline function mpu_configure_region at line 278 of the same file. The function mpu_allocregion is defined at line 211 of file arch/arm/src/armv7-m/up_mpu.c, but this file is not included in the build unless CONFIG_PROTECTED_BUILD is defined (line 96 of arc/arm/src/stm32h7/Make.defs). The file mpu.h, which is the source of the errors, is non-conditionally included in stm32_allocateheap.c, which is a required file for the build. There are really two issues here (potentially) 1. mpu.h should only be included when mpu support is needed, such as with a protected build. I tested this by conditionally including mpu.h only when CONFIG_PROTECTED_BUILD is defined and that gave me a clean build. The build should be able to complete regardless of whether optimization is used or not. I suspect that adding optimization helps me in this case because the compiler recognizes that the problematic functions are not used and simply removes them, thus getting me around the error. But if I were to switch over to a protected build, I'd wager that things might break again if inlining is the issue, which leads into number 2 below. 2. The way that compiler.h currently determines inline support is incompatible with the defaults on my system, which appears to be gnu90. Given that, what is the best way for a user to specify a particular build? And since we need inline functions for this code to compile, should we not specify the minimum standard necessary in the Make.defs? Thanks for the help. Sorry this got a little long winded. - John ----- Original Message ----- From: "Abdelatif Guettouche" <abdelatif.guettou...@gmail.com> To: "dev" <dev@nuttx.apache.org> Sent: Thursday, March 19, 2020 2:29:30 PM Subject: Re: Build errors with inline functions > > The functions the compiler > is complaining about are defined in up_mpu.c, which is only included for > protected builds. So it makes sense you wouldn't see the issue when > building in protected mode. The issue should be then seen when protected mode is enabled, there where the MPU is used. libarch shouldn't contain any MPU related symbol. I built flat modes as well. All builds complete error free. You can also see in the nightly build [1], all H7 are building error free. However, the same issue occurs when trying to build the existing > H7 boards and with many of the F7 boards as well. > What boards are causing the issue? 1. https://builds.apache.org/view/Incubator%20Projects/job/NuttX-Nightly-Build/68/console On Thu, Mar 19, 2020 at 2:46 PM John Rippetoe <jrippe...@roboticresearch.com> wrote: > I'm using the generic arm-none-eabi toolchain, version 4.84. OS is > Ubuntu 16.04. The contents of my board Make.defs is below. > > > ############################################################################ > # boards/arm/stm32h7/stm32h753xi-eval2/scripts/Make.defs > # > # Copyright (C) 2018 Gregory Nutt. All rights reserved. > # Author: Gregory Nutt <gn...@nuttx.org> > # > # 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. > # > > ############################################################################ > > include ${TOPDIR}/.config > include ${TOPDIR}/tools/Config.mk > include ${TOPDIR}/arch/arm/src/armv7-m/Toolchain.defs > > LDSCRIPT = flash.ld > > ifeq ($(WINTOOL),y) > # Windows-native toolchains > DIRLINK = $(TOPDIR)/tools/copydir.sh > DIRUNLINK = $(TOPDIR)/tools/unlink.sh > MKDEP = $(TOPDIR)/tools/mkwindeps.sh > ARCHINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}" > ARCHXXINCLUDES = -I. -isystem "${shell cygpath -w $(TOPDIR)/include}" > -isystem "${shell cygpath -w $(TOPDIR)/include/cxx}" > ARCHSCRIPT = -T "${shell cygpath -w > $(TOPDIR)/boards/$(CONFIG_ARCH)/$(CONFIG_ARCH_CHIP)/$(CONFIG_ARCH_BOARD)/scripts/$(LDSCRIPT)}" > else > # Linux/Cygwin-native toolchain > MKDEP = $(TOPDIR)/tools/mkdeps$(HOSTEXEEXT) > ARCHINCLUDES = -I. -isystem $(TOPDIR)/include > ARCHXXINCLUDES = -I. -isystem $(TOPDIR)/include -isystem > $(TOPDIR)/include/cxx > ARCHSCRIPT = > -T$(TOPDIR)/boards/$(CONFIG_ARCH)/$(CONFIG_ARCH_CHIP)/$(CONFIG_ARCH_BOARD)/scripts/$(LDSCRIPT) > endif > > CC = $(CROSSDEV)gcc > CXX = $(CROSSDEV)g++ > CPP = $(CROSSDEV)gcc -E > LD = $(CROSSDEV)ld > AR = $(ARCROSSDEV)ar rcs > NM = $(ARCROSSDEV)nm > OBJCOPY = $(CROSSDEV)objcopy > OBJDUMP = $(CROSSDEV)objdump > > ARCHCCVERSION = ${shell $(CC) -v 2>&1 | sed -n '/^gcc version/p' | sed -e > 's/^gcc version \([0-9\.]\)/\1/g' -e 's/[-\ ].*//g' -e '1q'} > ARCHCCMAJOR = ${shell echo $(ARCHCCVERSION) | cut -d'.' -f1} > > ifeq ($(CONFIG_DEBUG_SYMBOLS),y) > ARCHOPTIMIZATION = -g > endif > > ifneq ($(CONFIG_DEBUG_NOOPT),y) > ARCHOPTIMIZATION += $(MAXOPTIMIZATION) -fno-strict-aliasing > -fno-strength-reduce -fomit-frame-pointer > endif > > ARCHCFLAGS = -fno-builtin > ARCHCXXFLAGS = -fno-builtin -fno-exceptions -fcheck-new -fno-rtti > ARCHWARNINGS = -Wall -Wstrict-prototypes -Wshadow -Wundef > ARCHWARNINGSXX = -Wall -Wshadow -Wundef > ARCHDEFINES = > ARCHPICFLAGS = -fpic -msingle-pic-base -mpic-register=r10 > > CFLAGS = $(ARCHCFLAGS) $(ARCHWARNINGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) > $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRADEFINES) -pipe > CPICFLAGS = $(ARCHPICFLAGS) $(CFLAGS) > CXXFLAGS = $(ARCHCXXFLAGS) $(ARCHWARNINGSXX) $(ARCHOPTIMIZATION) > $(ARCHCPUFLAGS) $(ARCHXXINCLUDES) $(ARCHDEFINES) $(EXTRADEFINES) -pipe > CXXPICFLAGS = $(ARCHPICFLAGS) $(CXXFLAGS) > CPPFLAGS = $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRADEFINES) > AFLAGS = $(CFLAGS) -D__ASSEMBLY__ > > NXFLATLDFLAGS1 = -r -d -warn-common > NXFLATLDFLAGS2 = $(NXFLATLDFLAGS1) > -T$(TOPDIR)/binfmt/libnxflat/gnu-nxflat-pcrel.ld -no-check-sections > LDNXFLATFLAGS = -e main -s 2048 > > ASMEXT = .S > OBJEXT = .o > LIBEXT = .a > EXEEXT = > > ifneq ($(CROSSDEV),arm-nuttx-elf-) > LDFLAGS += -nostartfiles -nodefaultlibs > endif > ifeq ($(CONFIG_DEBUG_SYMBOLS),y) > LDFLAGS += -g > endif > > > HOSTCC = gcc > HOSTINCLUDES = -I. > HOSTCFLAGS = -Wall -Wstrict-prototypes -Wshadow -Wundef -g -pipe > HOSTLDFLAGS = > > John Rippetoe > Software Engineer > Robotic Research, LLC > (240) 631-0008 > > ----- Original Message ----- > From: "Nathan Hartman" <hartman.nat...@gmail.com> > To: dev@nuttx.apache.org > Sent: Thursday, March 19, 2020 10:39:39 AM > Subject: Re: Build errors with inline functions > > On Thu, Mar 19, 2020 at 9:17 AM John Rippetoe > <jrippe...@roboticresearch.com> wrote: > > I am working on a new board port for the STM32H7 that's not yet in the > > repo. However, the same issue occurs when trying to build the existing > > H7 boards and with many of the F7 boards as well. All of the affected > > configs are flat builds, including my own. The functions the compiler > > is complaining about are defined in up_mpu.c, which is only included for > > protected builds. So it makes sense you wouldn't see the issue when > > building in protected mode. > > > > To answer your other question: yes, I have done a clean build. I have > > also run a distclean and reconfigured, but the issue persists. The only > > way to get a build to complete is to comment out line 270 below from > > compiler.h > > > > /* GCC supports inlined functions for C++ and for C version C99 and > above */ > > > > 266 # if defined(__cplusplus) || (defined(__STDC_VERSION__) && > > __STDC_VERSION__ >= 199901L) > > 267 # define CONFIG_HAVE_INLINE 1 > > 268 # else > > 269 # undef CONFIG_HAVE_INLINE > > 270 # define inline > > 271 # endif > > Which toolchain are you using? > > Which version of that toolchain? > > What's in your board's Make.defs? > > Cheers, > Nathan > CONFIDENTIALITY NOTICE: This communication may contain private, > confidential and privileged material for the sole use of the intended > recipient. If you are not the intended recipient, please delete this e-mail > and any attachments permanently. > > CONFIDENTIALITY NOTICE: This communication may contain private, confidential and privileged material for the sole use of the intended recipient. If you are not the intended recipient, please delete this e-mail and any attachments permanently.