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