1*7c3d14c8STreehugger RobotSubDirs := lib 2*7c3d14c8STreehugger Robot 3*7c3d14c8STreehugger Robot# Set default rule before anything else. 4*7c3d14c8STreehugger Robotall: help 5*7c3d14c8STreehugger Robot 6*7c3d14c8STreehugger Robotinclude make/config.mk 7*7c3d14c8STreehugger Robotinclude make/util.mk 8*7c3d14c8STreehugger Robot# If SRCROOT is defined, assume we are doing an Apple style build. We should be 9*7c3d14c8STreehugger Robot# able to use RC_XBS for this but that is unused during "make installsrc". 10*7c3d14c8STreehugger Robotifdef SRCROOT 11*7c3d14c8STreehugger Robot include make/AppleBI.mk 12*7c3d14c8STreehugger Robotendif 13*7c3d14c8STreehugger Robot 14*7c3d14c8STreehugger Robot# Make sure we don't build with a missing ProjObjRoot. 15*7c3d14c8STreehugger Robotifeq ($(ProjObjRoot),) 16*7c3d14c8STreehugger Robot$(error Refusing to build with empty ProjObjRoot variable) 17*7c3d14c8STreehugger Robotendif 18*7c3d14c8STreehugger Robot 19*7c3d14c8STreehugger Robot############## 20*7c3d14c8STreehugger Robot 21*7c3d14c8STreehugger Robot### 22*7c3d14c8STreehugger Robot# Rules 23*7c3d14c8STreehugger Robot 24*7c3d14c8STreehugger Robot### 25*7c3d14c8STreehugger Robot# Top level targets 26*7c3d14c8STreehugger Robot 27*7c3d14c8STreehugger Robot# FIXME: Document the available subtargets. 28*7c3d14c8STreehugger Robothelp: 29*7c3d14c8STreehugger Robot @echo "usage: make [{VARIABLE=VALUE}*] target" 30*7c3d14c8STreehugger Robot @echo 31*7c3d14c8STreehugger Robot @echo "User variables:" 32*7c3d14c8STreehugger Robot @echo " VERBOSE=1: Use to show all commands [default=0]" 33*7c3d14c8STreehugger Robot @echo 34*7c3d14c8STreehugger Robot @echo "Available targets:" 35*7c3d14c8STreehugger Robot @echo " <platform name>: build the libraries for 'platform'" 36*7c3d14c8STreehugger Robot @echo " clean: clean all configurations" 37*7c3d14c8STreehugger Robot @echo " test: run unit tests" 38*7c3d14c8STreehugger Robot @echo 39*7c3d14c8STreehugger Robot @echo " info-platforms: list available platforms" 40*7c3d14c8STreehugger Robot @echo " help-devel: print additional help for developers" 41*7c3d14c8STreehugger Robot @echo 42*7c3d14c8STreehugger Robot 43*7c3d14c8STreehugger Robothelp-devel: help 44*7c3d14c8STreehugger Robot @echo "Development targets:" 45*7c3d14c8STreehugger Robot @echo " <platform name>-<config name>:" 46*7c3d14c8STreehugger Robot @echo " build the libraries for a single platform config" 47*7c3d14c8STreehugger Robot @echo " <platform name>-<config name>-<arch name>:" 48*7c3d14c8STreehugger Robot @echo " build the libraries for a single config and arch" 49*7c3d14c8STreehugger Robot @echo " info-functions: list available compiler-rt functions" 50*7c3d14c8STreehugger Robot @echo " help-hidden: print help for Makefile debugging" 51*7c3d14c8STreehugger Robot @echo 52*7c3d14c8STreehugger Robot 53*7c3d14c8STreehugger Robothelp-hidden: help-devel 54*7c3d14c8STreehugger Robot @echo "Debugging variables:" 55*7c3d14c8STreehugger Robot @echo " DEBUGMAKE=1: enable some Makefile logging [default=]" 56*7c3d14c8STreehugger Robot @echo " =2: enable more Makefile logging" 57*7c3d14c8STreehugger Robot @echo 58*7c3d14c8STreehugger Robot @echo "Debugging targets:" 59*7c3d14c8STreehugger Robot @echo " make-print-FOO: print information on the variable 'FOO'" 60*7c3d14c8STreehugger Robot @echo 61*7c3d14c8STreehugger Robot 62*7c3d14c8STreehugger Robotinfo-functions: 63*7c3d14c8STreehugger Robot @echo "compiler-rt Available Functions" 64*7c3d14c8STreehugger Robot @echo 65*7c3d14c8STreehugger Robot @echo "All Functions: $(AvailableFunctions)" 66*7c3d14c8STreehugger Robot @$(foreach fn,$(AvailableFunctions),\ 67*7c3d14c8STreehugger Robot printf " %-20s - available in (%s)\n" $(fn)\ 68*7c3d14c8STreehugger Robot "$(foreach key,$(AvailableIn.$(fn)),$($(key).Dir))";) 69*7c3d14c8STreehugger Robot 70*7c3d14c8STreehugger Robotinfo-platforms: 71*7c3d14c8STreehugger Robot @echo "compiler-rt Available Platforms" 72*7c3d14c8STreehugger Robot @echo 73*7c3d14c8STreehugger Robot @echo "Platforms:" 74*7c3d14c8STreehugger Robot @$(foreach key,$(PlatformKeys),\ 75*7c3d14c8STreehugger Robot printf " %s - from '%s'\n" $($(key).Name) $($(key).Path);\ 76*7c3d14c8STreehugger Robot printf " %s\n" "$($(key).Description)";\ 77*7c3d14c8STreehugger Robot printf " Configurations: %s\n\n" "$($(key).Configs)";) 78*7c3d14c8STreehugger Robot 79*7c3d14c8STreehugger Robot# Provide default clean target which is extended by other templates. 80*7c3d14c8STreehugger Robot.PHONY: clean 81*7c3d14c8STreehugger Robotclean:: 82*7c3d14c8STreehugger Robot 83*7c3d14c8STreehugger Robot# Test 84*7c3d14c8STreehugger Robot.PHONY: test 85*7c3d14c8STreehugger Robottest: 86*7c3d14c8STreehugger Robot cd test/Unit && ./test 87*7c3d14c8STreehugger Robot 88*7c3d14c8STreehugger Robot### 89*7c3d14c8STreehugger Robot# Directory handling magic. 90*7c3d14c8STreehugger Robot 91*7c3d14c8STreehugger Robot# Create directories as needed, and timestamp their creation. 92*7c3d14c8STreehugger Robot%/.dir: 93*7c3d14c8STreehugger Robot $(Summary) " MKDIR: $*" 94*7c3d14c8STreehugger Robot $(Verb) $(MKDIR) $* > /dev/null 95*7c3d14c8STreehugger Robot $(Verb) echo 'Created.' > $@ 96*7c3d14c8STreehugger Robot 97*7c3d14c8STreehugger Robot# Remove directories 98*7c3d14c8STreehugger Robot%/.remove: 99*7c3d14c8STreehugger Robot $(Verb) $(RM) -r $* 100*7c3d14c8STreehugger Robot 101*7c3d14c8STreehugger Robot### 102*7c3d14c8STreehugger Robot# Include child makefile fragments 103*7c3d14c8STreehugger Robot 104*7c3d14c8STreehugger RobotDir := . 105*7c3d14c8STreehugger Robotinclude make/subdir.mk 106*7c3d14c8STreehugger Robotinclude make/lib_info.mk 107*7c3d14c8STreehugger Robotinclude make/lib_util.mk 108*7c3d14c8STreehugger Robotinclude make/lib_platforms.mk 109*7c3d14c8STreehugger Robot 110*7c3d14c8STreehugger Robot### 111*7c3d14c8STreehugger Robot# Define Platform Rules 112*7c3d14c8STreehugger Robot 113*7c3d14c8STreehugger Robotdefine PerPlatform_template 114*7c3d14c8STreehugger Robot$(call Set,Tmp.Key,$(1)) 115*7c3d14c8STreehugger Robot$(call Set,Tmp.Name,$($(Tmp.Key).Name)) 116*7c3d14c8STreehugger Robot$(call Set,Tmp.Configs,$($(Tmp.Key).Configs)) 117*7c3d14c8STreehugger Robot$(call Set,Tmp.ObjPath,$(ProjObjRoot)/$(Tmp.Name)) 118*7c3d14c8STreehugger Robot 119*7c3d14c8STreehugger Robot# Top-Level Platform Target 120*7c3d14c8STreehugger Robot$(Tmp.Name):: $(Tmp.Configs:%=$(Tmp.Name)-%) 121*7c3d14c8STreehugger Robot.PHONY: $(Tmp.Name) 122*7c3d14c8STreehugger Robot 123*7c3d14c8STreehugger Robotclean:: 124*7c3d14c8STreehugger Robot $(Verb) rm -rf $(Tmp.ObjPath) 125*7c3d14c8STreehugger Robot 126*7c3d14c8STreehugger Robot# Per-Config Libraries 127*7c3d14c8STreehugger Robot$(foreach config,$(Tmp.Configs),\ 128*7c3d14c8STreehugger Robot $(call PerPlatformConfig_template,$(config))) 129*7c3d14c8STreehugger Robotendef 130*7c3d14c8STreehugger Robot 131*7c3d14c8STreehugger Robotdefine PerPlatformConfig_template 132*7c3d14c8STreehugger Robot$(call Set,Tmp.Config,$(1)) 133*7c3d14c8STreehugger Robot$(call Set,Tmp.ObjPath,$(ProjObjRoot)/$(Tmp.Name)/$(Tmp.Config)) 134*7c3d14c8STreehugger Robot$(call Set,Tmp.SHARED_LIBRARY,$(strip \ 135*7c3d14c8STreehugger Robot $(call GetCNAVar,SHARED_LIBRARY,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch)))) 136*7c3d14c8STreehugger Robot$(call Set,Tmp.SHARED_LIBRARY_SUFFIX,$(strip \ 137*7c3d14c8STreehugger Robot $(call GetCNAVar,SHARED_LIBRARY_SUFFIX,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch)))) 138*7c3d14c8STreehugger Robot 139*7c3d14c8STreehugger Robot# Compute the library suffix. 140*7c3d14c8STreehugger Robot$(if $(call streq,1,$(Tmp.SHARED_LIBRARY)), 141*7c3d14c8STreehugger Robot $(call Set,Tmp.LibrarySuffix,$(Tmp.SHARED_LIBRARY_SUFFIX)), 142*7c3d14c8STreehugger Robot $(call Set,Tmp.LibrarySuffix,a)) 143*7c3d14c8STreehugger Robot 144*7c3d14c8STreehugger Robot# Compute the archs to build, depending on whether this is a universal build or 145*7c3d14c8STreehugger Robot# not. 146*7c3d14c8STreehugger Robot$(call Set,Tmp.ArchsToBuild,\ 147*7c3d14c8STreehugger Robot $(if $(call IsDefined,$(Tmp.Key).UniversalArchs),\ 148*7c3d14c8STreehugger Robot $(strip \ 149*7c3d14c8STreehugger Robot $(or $($(Tmp.Key).UniversalArchs.$(Tmp.Config)),\ 150*7c3d14c8STreehugger Robot $($(Tmp.Key).UniversalArchs))),\ 151*7c3d14c8STreehugger Robot $(call VarOrDefault,$(Tmp.Key).Arch.$(Tmp.Config),$($(Tmp.Key).Arch)))) 152*7c3d14c8STreehugger Robot 153*7c3d14c8STreehugger Robot# Copy or lipo to create the per-config library. 154*7c3d14c8STreehugger Robot$(call Set,Tmp.Inputs,$(Tmp.ArchsToBuild:%=$(Tmp.ObjPath)/%/libcompiler_rt.$(Tmp.LibrarySuffix))) 155*7c3d14c8STreehugger Robot$(Tmp.ObjPath)/libcompiler_rt.$(Tmp.LibrarySuffix): $(Tmp.Inputs) $(Tmp.ObjPath)/.dir 156*7c3d14c8STreehugger Robot $(Summary) " FINAL-ARCHIVE: $(Tmp.Name)/$(Tmp.Config): $$@" 157*7c3d14c8STreehugger Robot -$(Verb) $(RM) $$@ 158*7c3d14c8STreehugger Robot $(if $(call streq,1,$(words $(Tmp.ArchsToBuild))), \ 159*7c3d14c8STreehugger Robot $(Verb) $(CP) $(Tmp.Inputs) $$@, \ 160*7c3d14c8STreehugger Robot $(Verb) $(LIPO) -create -output $$@ $(Tmp.Inputs)) 161*7c3d14c8STreehugger Robot.PRECIOUS: $(Tmp.ObjPath)/.dir 162*7c3d14c8STreehugger Robot 163*7c3d14c8STreehugger Robot# Per-Config Targets 164*7c3d14c8STreehugger Robot$(Tmp.Name)-$(Tmp.Config):: $(Tmp.ObjPath)/libcompiler_rt.$(Tmp.LibrarySuffix) 165*7c3d14c8STreehugger Robot.PHONY: $(Tmp.Name)-$(Tmp.Config) 166*7c3d14c8STreehugger Robot 167*7c3d14c8STreehugger Robot# Per-Config-Arch Libraries 168*7c3d14c8STreehugger Robot$(foreach arch,$(Tmp.ArchsToBuild),\ 169*7c3d14c8STreehugger Robot $(call PerPlatformConfigArch_template,$(arch))) 170*7c3d14c8STreehugger Robotendef 171*7c3d14c8STreehugger Robot 172*7c3d14c8STreehugger Robotdefine PerPlatformConfigArch_template 173*7c3d14c8STreehugger Robot$(call Set,Tmp.Arch,$(1)) 174*7c3d14c8STreehugger Robot$(call Set,Tmp.ObjPath,$(ProjObjRoot)/$(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch)) 175*7c3d14c8STreehugger Robot$(call Set,Tmp.Functions,$(strip \ 176*7c3d14c8STreehugger Robot $(AlwaysRequiredModules) \ 177*7c3d14c8STreehugger Robot $(call GetCNAVar,FUNCTIONS,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch)))) 178*7c3d14c8STreehugger Robot$(call Set,Tmp.Optimized,$(strip \ 179*7c3d14c8STreehugger Robot $(call GetCNAVar,OPTIMIZED,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch)))) 180*7c3d14c8STreehugger Robot$(call Set,Tmp.AR,$(strip \ 181*7c3d14c8STreehugger Robot $(call GetCNAVar,AR,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch)))) 182*7c3d14c8STreehugger Robot$(call Set,Tmp.ARFLAGS,$(strip \ 183*7c3d14c8STreehugger Robot $(call GetCNAVar,ARFLAGS,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch)))) 184*7c3d14c8STreehugger Robot$(call Set,Tmp.CC,$(strip \ 185*7c3d14c8STreehugger Robot $(call GetCNAVar,CC,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch)))) 186*7c3d14c8STreehugger Robot$(call Set,Tmp.LDFLAGS,$(strip \ 187*7c3d14c8STreehugger Robot $(call GetCNAVar,LDFLAGS,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch)))) 188*7c3d14c8STreehugger Robot$(call Set,Tmp.RANLIB,$(strip \ 189*7c3d14c8STreehugger Robot $(call GetCNAVar,RANLIB,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch)))) 190*7c3d14c8STreehugger Robot$(call Set,Tmp.RANLIBFLAGS,$(strip \ 191*7c3d14c8STreehugger Robot $(call GetCNAVar,RANLIBFLAGS,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch)))) 192*7c3d14c8STreehugger Robot$(call Set,Tmp.SHARED_LIBRARY,$(strip \ 193*7c3d14c8STreehugger Robot $(call GetCNAVar,SHARED_LIBRARY,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch)))) 194*7c3d14c8STreehugger Robot 195*7c3d14c8STreehugger Robot# Compute the library suffix. 196*7c3d14c8STreehugger Robot$(if $(call streq,1,$(Tmp.SHARED_LIBRARY)), 197*7c3d14c8STreehugger Robot $(call Set,Tmp.LibrarySuffix,$(Tmp.SHARED_LIBRARY_SUFFIX)), 198*7c3d14c8STreehugger Robot $(call Set,Tmp.LibrarySuffix,a)) 199*7c3d14c8STreehugger Robot 200*7c3d14c8STreehugger Robot# Compute the object inputs for this library. 201*7c3d14c8STreehugger Robot$(call Set,Tmp.Inputs,\ 202*7c3d14c8STreehugger Robot $(foreach fn,$(sort $(Tmp.Functions)),\ 203*7c3d14c8STreehugger Robot $(call Set,Tmp.FnDir,\ 204*7c3d14c8STreehugger Robot $(call SelectFunctionDir,$(Tmp.Config),$(Tmp.Arch),$(fn),$(Tmp.Optimized)))\ 205*7c3d14c8STreehugger Robot $(Tmp.ObjPath)/$(Tmp.FnDir)/$(fn).o)) 206*7c3d14c8STreehugger Robot$(Tmp.ObjPath)/libcompiler_rt.a: $(Tmp.Inputs) $(Tmp.ObjPath)/.dir 207*7c3d14c8STreehugger Robot $(Summary) " ARCHIVE: $(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch): $$@" 208*7c3d14c8STreehugger Robot -$(Verb) $(RM) $$@ 209*7c3d14c8STreehugger Robot $(Verb) $(Tmp.AR) $(Tmp.ARFLAGS) $$@ $(Tmp.Inputs) 210*7c3d14c8STreehugger Robot $(Verb) $(Tmp.RANLIB) $(Tmp.RANLIBFLAGS) $$@ 211*7c3d14c8STreehugger Robot$(Tmp.ObjPath)/libcompiler_rt.dylib: $(Tmp.Inputs) $(Tmp.ObjPath)/.dir 212*7c3d14c8STreehugger Robot $(Summary) " DYLIB: $(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch): $$@" 213*7c3d14c8STreehugger Robot $(Verb) $(Tmp.CC) -arch $(Tmp.Arch) -dynamiclib -o $$@ \ 214*7c3d14c8STreehugger Robot $(Tmp.Inputs) $(Tmp.LDFLAGS) 215*7c3d14c8STreehugger Robot$(Tmp.ObjPath)/libcompiler_rt.so: $(Tmp.Inputs) $(Tmp.ObjPath)/.dir 216*7c3d14c8STreehugger Robot $(Summary) " SO: $(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch): $$@" 217*7c3d14c8STreehugger Robot $(Verb) $(Tmp.CC) -shared -o $$@ \ 218*7c3d14c8STreehugger Robot $(Tmp.Inputs) $(Tmp.LDFLAGS) 219*7c3d14c8STreehugger Robot.PRECIOUS: $(Tmp.ObjPath)/.dir 220*7c3d14c8STreehugger Robot 221*7c3d14c8STreehugger Robot# Per-Config-Arch Targets 222*7c3d14c8STreehugger Robot$(Tmp.Name)-$(Tmp.Config)-$(Tmp.Arch):: $(Tmp.ObjPath)/libcompiler_rt.$(Tmp.LibrarySuffix) 223*7c3d14c8STreehugger Robot.PHONY: $(Tmp.Name)-$(Tmp.Config)-$(Tmp.Arch) 224*7c3d14c8STreehugger Robot 225*7c3d14c8STreehugger Robot# Per-Config-Arch-SubDir Objects 226*7c3d14c8STreehugger Robot$(foreach key,$(SubDirKeys),\ 227*7c3d14c8STreehugger Robot $(call PerPlatformConfigArchSubDir_template,$(key))) 228*7c3d14c8STreehugger Robotendef 229*7c3d14c8STreehugger Robot 230*7c3d14c8STreehugger Robotdefine PerPlatformConfigArchSubDir_template 231*7c3d14c8STreehugger Robot$(call Set,Tmp.SubDirKey,$(1)) 232*7c3d14c8STreehugger Robot$(call Set,Tmp.SubDir,$($(Tmp.SubDirKey).Dir)) 233*7c3d14c8STreehugger Robot$(call Set,Tmp.SrcPath,$(ProjSrcRoot)/$(Tmp.SubDir)) 234*7c3d14c8STreehugger Robot$(call Set,Tmp.ObjPath,$(ProjObjRoot)/$(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch)/$(Tmp.SubDirKey)) 235*7c3d14c8STreehugger Robot$(call Set,Tmp.Dependencies,$($(Tmp.SubDirKey).Dependencies)) 236*7c3d14c8STreehugger Robot$(call Set,Tmp.CC,$(strip \ 237*7c3d14c8STreehugger Robot $(call GetCNAVar,CC,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch)))) 238*7c3d14c8STreehugger Robot$(call Set,Tmp.KERNEL_USE,$(strip \ 239*7c3d14c8STreehugger Robot $(call GetCNAVar,KERNEL_USE,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch)))) 240*7c3d14c8STreehugger Robot$(call Set,Tmp.VISIBILITY_HIDDEN,$(strip \ 241*7c3d14c8STreehugger Robot $(call GetCNAVar,VISIBILITY_HIDDEN,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch)))) 242*7c3d14c8STreehugger Robot$(call Set,Tmp.CFLAGS,$(strip \ 243*7c3d14c8STreehugger Robot $(if $(call IsDefined,$(Tmp.Key).UniversalArchs),-arch $(Tmp.Arch),)\ 244*7c3d14c8STreehugger Robot $(if $(call streq,$(Tmp.VISIBILITY_HIDDEN),1),\ 245*7c3d14c8STreehugger Robot -fvisibility=hidden -DVISIBILITY_HIDDEN,)\ 246*7c3d14c8STreehugger Robot $(if $(call streq,$(Tmp.KERNEL_USE),1),\ 247*7c3d14c8STreehugger Robot -mkernel -DKERNEL_USE,)\ 248*7c3d14c8STreehugger Robot $(call GetCNAVar,CFLAGS,$(Tmp.Key),$(Tmp.Config),$(Tmp.Arch)))) 249*7c3d14c8STreehugger Robot 250*7c3d14c8STreehugger Robot$(Tmp.ObjPath)/%.o: $(Tmp.SrcPath)/%.s $(Tmp.Dependencies) $(Tmp.ObjPath)/.dir 251*7c3d14c8STreehugger Robot $(Summary) " ASSEMBLE: $(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch): $$<" 252*7c3d14c8STreehugger Robot $(Verb) $(Tmp.CC) $(COMMON_ASMFLAGS) $(Tmp.CFLAGS) -c -o $$@ $$< 253*7c3d14c8STreehugger Robot$(Tmp.ObjPath)/%.o: $(Tmp.SrcPath)/%.S $(Tmp.Dependencies) $(Tmp.ObjPath)/.dir 254*7c3d14c8STreehugger Robot $(Summary) " ASSEMBLE: $(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch): $$<" 255*7c3d14c8STreehugger Robot $(Verb) $(Tmp.CC) $(COMMON_ASMFLAGS) $(Tmp.CFLAGS) -c -o $$@ $$< 256*7c3d14c8STreehugger Robot$(Tmp.ObjPath)/%.o: $(Tmp.SrcPath)/%.c $(Tmp.Dependencies) $(Tmp.ObjPath)/.dir 257*7c3d14c8STreehugger Robot $(Summary) " COMPILE: $(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch): $$<" 258*7c3d14c8STreehugger Robot $(Verb) $(Tmp.CC) $(COMMON_CFLAGS) $(Tmp.CFLAGS) -c -o $$@ $$< 259*7c3d14c8STreehugger Robot$(Tmp.ObjPath)/%.o: $(Tmp.SrcPath)/%.cc $(Tmp.Dependencies) $(Tmp.ObjPath)/.dir 260*7c3d14c8STreehugger Robot $(Summary) " COMPILE: $(Tmp.Name)/$(Tmp.Config)/$(Tmp.Arch): $$<" 261*7c3d14c8STreehugger Robot $(Verb) $(Tmp.CC) $(COMMON_CXXFLAGS) $(Tmp.CFLAGS) -c -o $$@ $$< 262*7c3d14c8STreehugger Robot.PRECIOUS: $(Tmp.ObjPath)/.dir 263*7c3d14c8STreehugger Robot 264*7c3d14c8STreehugger Robotendef 265*7c3d14c8STreehugger Robot 266*7c3d14c8STreehugger Robot# Run templates. 267*7c3d14c8STreehugger Robot$(foreach key,$(PlatformKeys),\ 268*7c3d14c8STreehugger Robot $(eval $(call PerPlatform_template,$(key)))) 269*7c3d14c8STreehugger Robot 270*7c3d14c8STreehugger Robot### 271*7c3d14c8STreehugger Robot 272*7c3d14c8STreehugger Robotifneq ($(DEBUGMAKE),) 273*7c3d14c8STreehugger Robot $(info MAKE: Done processing Makefile) 274*7c3d14c8STreehugger Robot $(info ) 275*7c3d14c8STreehugger Robotendif 276