Home | History | Annotate | Line # | Download | only in dist
      1 # -*- makefile -*-
      2 # Copyright (c) 1999-2007 Hewlett-Packard Development Company, L.P.
      3 #	Contributed by David Mosberger <davidm (a] hpl.hp.com>
      4 #	Contributed by Stephane Eranian <eranian (a] hpl.hp.com>
      5 #
      6 #    All rights reserved.
      7 #
      8 #    Redistribution and use in source and binary forms, with or without
      9 #    modification, are permitted provided that the following conditions
     10 #    are met:
     11 #
     12 #    * Redistributions of source code must retain the above copyright
     13 #      notice, this list of conditions and the following disclaimer.
     14 #    * Redistributions in binary form must reproduce the above
     15 #      copyright notice, this list of conditions and the following
     16 #      disclaimer in the documentation and/or other materials
     17 #      provided with the distribution.
     18 #    * Neither the name of Hewlett-Packard Co. nor the names of its
     19 #      contributors may be used to endorse or promote products derived
     20 #      from this software without specific prior written permission.
     21 #
     22 #    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
     23 #    CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
     24 #    INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     25 #    MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     26 #    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
     27 #    BE LIABLE FOR ANYDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
     28 #    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     29 #    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     30 #    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     31 #    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
     32 #    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
     33 #    THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     34 #    SUCH DAMAGE.
     35 #
     36 
     37 TOPDIR := $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi)
     38 
     39 #
     40 # Variables below overridable from command-line:
     41 #   make VARNAME=value ...
     42 #
     43 
     44 #
     45 # Where to install the package. GNU-EFI will create and access
     46 # lib and include under the root
     47 #
     48 INSTALLROOT  := /
     49 PREFIX       := /usr/local
     50 LIBDIR 	     := $(PREFIX)/lib
     51 INSTALL	     := install
     52 
     53 # Compilation tools
     54 HOSTCC       := $(prefix)gcc
     55 CC           := $(prefix)$(CROSS_COMPILE)gcc
     56 AS           := $(prefix)$(CROSS_COMPILE)as
     57 LD           := $(prefix)$(CROSS_COMPILE)ld
     58 AR           := $(prefix)$(CROSS_COMPILE)ar
     59 RANLIB       := $(prefix)$(CROSS_COMPILE)ranlib
     60 OBJCOPY      := $(prefix)$(CROSS_COMPILE)objcopy
     61 
     62 
     63 # Host/target identification
     64 OS           := $(shell uname -s)
     65 HOSTARCH     ?= $(shell $(HOSTCC) -dumpmachine | cut -f1 -d- | sed -e s,i[3456789]86,ia32, -e 's,armv[67].*,arm,' )
     66 ARCH         ?= $(shell $(HOSTCC) -dumpmachine | cut -f1 -d- | sed -e s,i[3456789]86,ia32, -e 's,armv[67].*,arm,' )
     67 
     68 # Get ARCH from the compiler if cross compiling 
     69 ifneq ($(CROSS_COMPILE),)
     70   override ARCH := $(shell $(CC) -dumpmachine | cut -f1 -d-| sed -e s,i[3456789]86,ia32, -e 's,armv[67].*,arm,' )
     71 endif
     72 
     73 # FreeBSD (and possibly others) reports amd64 instead of x86_64
     74 ifeq ($(ARCH),amd64)
     75   override ARCH := x86_64
     76 endif
     77 
     78 #
     79 # Where to build the package
     80 #
     81 OBJDIR       := $(TOPDIR)/$(ARCH)
     82 
     83 #
     84 # Variables below derived from variables above
     85 #
     86 
     87 # Arch-specific compilation flags
     88 CPPFLAGS += -DCONFIG_$(ARCH)
     89 
     90 CFLAGS += -Wno-error=pragmas
     91 
     92 ifeq ($(ARCH),ia64)
     93   CFLAGS += -mfixed-range=f32-f127
     94 endif
     95 
     96 ifeq ($(ARCH),ia32)
     97   CFLAGS += -mno-mmx -mno-sse
     98   ifeq ($(HOSTARCH),x86_64)
     99     ARCH3264 = -m32
    100   endif
    101 endif
    102 
    103 ifeq ($(ARCH),x86_64)
    104   GCCVERSION   := $(shell $(CC) -dumpversion | cut -f1 -d.)
    105   GCCMINOR     := $(shell $(CC) -dumpversion | cut -f2 -d.)
    106   USING_CLANG  := $(shell $(CC) -v 2>&1 | grep -q 'clang version' && echo clang)
    107 
    108   # Rely on GCC MS ABI support?
    109   GCCNEWENOUGH := $(shell ( [ $(GCCVERSION) -gt "4" ]           \
    110                             || ( [ $(GCCVERSION) -eq "4" ]      \
    111                                  && [ $(GCCMINOR) -ge "7" ] ) ) \
    112                           && echo 1)
    113   ifeq ($(GCCNEWENOUGH),1)
    114     CPPFLAGS += -DGNU_EFI_USE_MS_ABI -maccumulate-outgoing-args --std=c11
    115   else ifeq ($(USING_CLANG),clang)
    116     CPPFLAGS += -DGNU_EFI_USE_MS_ABI --std=c11
    117   endif
    118 
    119   CFLAGS += -mno-red-zone
    120   ifeq ($(HOSTARCH),ia32)
    121     ARCH3264 = -m64
    122   endif
    123 endif
    124 
    125 ifneq (,$(filter $(ARCH),ia32 x86_64))
    126   # Disable AVX, if the compiler supports that.
    127   CC_CAN_DISABLE_AVX=$(shell $(CC) -Werror -c -o /dev/null -xc -mno-avx - </dev/null >/dev/null 2>&1 && echo 1)
    128   ifeq ($(CC_CAN_DISABLE_AVX), 1)
    129     CFLAGS += -mno-avx
    130   endif
    131 endif
    132 
    133 ifeq ($(ARCH),mips64el)
    134   CFLAGS += -march=mips64r2
    135   ARCH3264 = -mabi=64
    136 endif
    137 
    138 #
    139 # Set HAVE_EFI_OBJCOPY if objcopy understands --target efi-[app|bsdrv|rtdrv],
    140 # otherwise we need to compose the PE/COFF header using the assembler
    141 #
    142 ifneq ($(ARCH),aarch64)
    143 ifneq ($(ARCH),arm)
    144 ifneq ($(ARCH),mips64el)
    145 ifneq ($(ARCH),riscv64)
    146 export HAVE_EFI_OBJCOPY=y
    147 endif
    148 endif
    149 endif
    150 endif
    151 
    152 ifneq ($(ARCH),arm)
    153 export LIBGCC=$(shell $(CC) $(ARCH3264) -print-libgcc-file-name)
    154 endif
    155 
    156 ifeq ($(ARCH),arm)
    157 CFLAGS += -marm
    158 endif
    159 
    160 # Generic compilation flags
    161 INCDIR  += -I$(SRCDIR) -I$(TOPDIR)/inc -I$(TOPDIR)/inc/$(ARCH) \
    162            -I$(TOPDIR)/inc/protocol
    163 
    164 # Only enable -fpic for non MinGW compilers (unneeded on MinGW)
    165 GCCMACHINE := $(shell $(CC) -dumpmachine)
    166 ifneq (mingw32,$(findstring mingw32, $(GCCMACHINE)))
    167   CFLAGS += -fpic
    168 endif
    169 
    170 ifeq (FreeBSD, $(findstring FreeBSD, $(OS)))
    171 CFLAGS  += $(ARCH3264) -g -O2 -Wall -Wextra -Werror \
    172            -fshort-wchar -fno-strict-aliasing \
    173            -ffreestanding -fno-stack-protector
    174 else
    175 CFLAGS  += $(ARCH3264) -g -O2 -Wall -Wextra -Werror \
    176            -fshort-wchar -fno-strict-aliasing \
    177 	   -ffreestanding -fno-stack-protector -fno-stack-check \
    178            -fno-stack-check \
    179            $(if $(findstring gcc,$(CC)),-fno-merge-all-constants,)
    180 endif
    181 
    182 ARFLAGS := rDv
    183 ASFLAGS += $(ARCH3264)
    184 LDFLAGS	+= -nostdlib --warn-common --no-undefined --fatal-warnings \
    185 	   --build-id=sha1
    186