make/common/NativeCompilation.gmk
branchihse-cflags-rewrite-branch
changeset 56214 0544ba555e67
parent 56168 cb0b10e44247
parent 49070 d7859531621b
child 56217 e550367df595
equal deleted inserted replaced
56213:85ee4e5a2f92 56214:0544ba555e67
    28 # desired whenever sort is used below!
    28 # desired whenever sort is used below!
    29 
    29 
    30 ifndef _NATIVE_COMPILATION_GMK
    30 ifndef _NATIVE_COMPILATION_GMK
    31 _NATIVE_COMPILATION_GMK := 1
    31 _NATIVE_COMPILATION_GMK := 1
    32 
    32 
    33 ifeq (,$(_MAKEBASE_GMK))
    33 ifeq ($(_MAKEBASE_GMK), )
    34   $(error You must include MakeBase.gmk prior to including NativeCompilation.gmk)
    34   $(error You must include MakeBase.gmk prior to including NativeCompilation.gmk)
    35 endif
    35 endif
    36 
    36 
    37 ################################################################################
    37 ################################################################################
    38 # Create exported symbols file for static libraries
    38 # Create exported symbols file for static libraries
   229     ifeq ($$(filter $$(notdir $2), $$($1_PRECOMPILED_HEADER_EXCLUDE)), )
   229     ifeq ($$(filter $$(notdir $2), $$($1_PRECOMPILED_HEADER_EXCLUDE)), )
   230       $1_$2_USE_PCH_FLAGS := $$($1_USE_PCH_FLAGS)
   230       $1_$2_USE_PCH_FLAGS := $$($1_USE_PCH_FLAGS)
   231     endif
   231     endif
   232   endif
   232   endif
   233 
   233 
   234   ifneq (,$$(filter %.c,$2))
   234   ifneq ($$(filter %.c, $2), )
   235     # Compile as a C file
   235     # Compile as a C file
   236     $1_$2_FLAGS=$(CFLAGS_CCACHE) $$($1_$2_USE_PCH_FLAGS) $4 \
   236     $1_$2_FLAGS := $(CFLAGS_CCACHE) $$($1_$2_USE_PCH_FLAGS) $4 \
   237         $$($1_$(notdir $2)_OPT_CFLAGS) \
   237         $$($1_$(notdir $2)_OPT_CFLAGS) \
   238         $$($1_$(notdir $2)_CFLAGS) $$($1_$2_THIS_FILE) -c
   238         $$($1_$(notdir $2)_CFLAGS) $$($1_$2_THIS_FILE) -c
   239     $1_$2_COMP=$5
   239     $1_$2_COMP := $5
   240     $1_$2_DEP_FLAG:=$(C_FLAG_DEPS)
   240     $1_$2_DEP_FLAG := $(C_FLAG_DEPS)
   241   else ifneq (,$$(filter %.m,$2))
   241   else ifneq ($$(filter %.m, $2), )
   242     # Compile as an Objective-C file
   242     # Compile as an Objective-C file
   243     $1_$2_FLAGS=-x objective-c $(CFLAGS_CCACHE) $$($1_$2_USE_PCH_FLAGS) $4 \
   243     $1_$2_FLAGS := -x objective-c $(CFLAGS_CCACHE) $$($1_$2_USE_PCH_FLAGS) $4 \
   244         $$($1_$(notdir $2)_OPT_CFLAGS) \
   244         $$($1_$(notdir $2)_OPT_CFLAGS) \
   245         $$($1_$(notdir $2)_CFLAGS) $$($1_$2_THIS_FILE) -c
   245         $$($1_$(notdir $2)_CFLAGS) $$($1_$2_THIS_FILE) -c
   246     $1_$2_COMP=$5
   246     $1_$2_COMP := $5
   247     $1_$2_DEP_FLAG:=$(C_FLAG_DEPS)
   247     $1_$2_DEP_FLAG := $(C_FLAG_DEPS)
   248   else ifneq (,$$(filter %.s %.S,$2))
   248   else ifneq ($$(filter %.s %.S, $2), )
   249     # Compile as assembler file
   249     # Compile as assembler file
   250     $1_$2_FLAGS=$8
   250     $1_$2_FLAGS := $8
   251     $1_$2_COMP=$(AS)
   251     $1_$2_COMP := $(AS)
   252     $1_$2_DEP_FLAG:=
   252     $1_$2_DEP_FLAG :=
   253   else ifneq (,$$(filter %.cpp,$2)$$(filter %.cc,$2)$$(filter %.mm,$2))
   253   else ifneq ($$(filter %.cpp, $2)$$(filter %.cc, $2)$$(filter %.mm, $2), )
   254     # Compile as a C++ or Objective-C++ file
   254     # Compile as a C++ or Objective-C++ file
   255     $1_$2_FLAGS=$(CFLAGS_CCACHE) $$($1_$2_USE_PCH_FLAGS) $6 \
   255     $1_$2_FLAGS := $(CFLAGS_CCACHE) $$($1_$2_USE_PCH_FLAGS) $6 \
   256         $$($1_$(notdir $2)_OPT_CXXFLAGS) \
   256         $$($1_$(notdir $2)_OPT_CXXFLAGS) \
   257         $$($1_$(notdir $2)_CXXFLAGS) $$($1_$2_THIS_FILE) -c
   257         $$($1_$(notdir $2)_CXXFLAGS) $$($1_$2_THIS_FILE) -c
   258     $1_$2_COMP=$7
   258     $1_$2_COMP := $7
   259     $1_$2_DEP_FLAG:=$(CXX_FLAG_DEPS)
   259     $1_$2_DEP_FLAG := $(CXX_FLAG_DEPS)
   260   else
   260   else
   261     $$(error Internal error in NativeCompilation.gmk: no compiler for file $2)
   261     $$(error Internal error in NativeCompilation.gmk: no compiler for file $2)
   262   endif
   262   endif
   263   # Generate the .o (.obj) file name and place it in the bin dir.
   263   # Generate the .o (.obj) file name and place it in the bin dir.
   264   $1_$2_OBJ := $3/$$(call replace_with_obj_extension, $$(notdir $2))
   264   $1_$2_OBJ := $3/$$(call replace_with_obj_extension, $$(notdir $2))
   265   # Only continue if this object file hasn't been processed already. This lets the first found
   265   # Only continue if this object file hasn't been processed already. This lets the first found
   266   # source file override any other with the same name.
   266   # source file override any other with the same name.
   267   ifeq (,$$(findstring $$($1_$2_OBJ),$$($1_OBJS_SO_FAR)))
   267   ifeq ($$(findstring $$($1_$2_OBJ), $$($1_OBJS_SO_FAR)), )
   268     $1_OBJS_SO_FAR+=$$($1_$2_OBJ)
   268     $1_OBJS_SO_FAR += $$($1_$2_OBJ)
   269     ifeq (,$$(filter %.s %.S,$2))
   269     ifeq ($$(filter %.s %.S, $2), )
   270       # And this is the dependency file for this obj file.
   270       # And this is the dependency file for this obj file.
   271       $1_$2_DEP:=$$(patsubst %$(OBJ_SUFFIX),%.d,$$($1_$2_OBJ))
   271       $1_$2_DEP := $$(patsubst %$(OBJ_SUFFIX),%.d,$$($1_$2_OBJ))
   272       # The dependency target file lists all dependencies as empty targets
   272       # The dependency target file lists all dependencies as empty targets
   273       # to avoid make error "No rule to make target" for removed files
   273       # to avoid make error "No rule to make target" for removed files
   274       $1_$2_DEP_TARGETS:=$$(patsubst %$(OBJ_SUFFIX),%.d.targets,$$($1_$2_OBJ))
   274       $1_$2_DEP_TARGETS := $$(patsubst %$(OBJ_SUFFIX),%.d.targets,$$($1_$2_OBJ))
   275 
   275 
   276       # Include previously generated dependency information. (if it exists)
   276       # Include previously generated dependency information. (if it exists)
   277       -include $$($1_$2_DEP)
   277       -include $$($1_$2_DEP)
   278       -include $$($1_$2_DEP_TARGETS)
   278       -include $$($1_$2_DEP_TARGETS)
   279 
   279 
   280       ifeq ($(TOOLCHAIN_TYPE), microsoft)
   280       ifeq ($(TOOLCHAIN_TYPE), microsoft)
   281         # To avoid name clashes between pdbs for objects and libs/execs, put
   281         # To avoid name clashes between pdbs for objects and libs/execs, put
   282         # object pdbs in a separate subdir.
   282         # object pdbs in a separate subdir.
   283         $1_$2_DEBUG_OUT_FLAGS:=-Fd$$(strip $$(patsubst $$($1_OBJECT_DIR)/%, \
   283         $1_$2_DEBUG_OUT_FLAGS := -Fd$$(strip $$(patsubst $$($1_OBJECT_DIR)/%, \
   284             $$($1_OBJECT_DIR)/pdb/%, $$(patsubst %$(OBJ_SUFFIX),%.pdb,$$($1_$2_OBJ))))
   284             $$($1_OBJECT_DIR)/pdb/%, $$(patsubst %$(OBJ_SUFFIX),%.pdb,$$($1_$2_OBJ))))
   285       endif
   285       endif
   286     endif
   286     endif
   287 
   287 
   288     ifneq ($$(strip $$($1_$(notdir $2)_CFLAGS) $$($1_$(notdir $2)_CXXFLAGS) \
   288     ifneq ($$(strip $$($1_$(notdir $2)_CFLAGS) $$($1_$(notdir $2)_CXXFLAGS) \
   291           $$($1_$(notdir $2)_OPT_CFLAGS) $$($1_$(notdir $2)_OPT_CXXFLAGS)
   291           $$($1_$(notdir $2)_OPT_CFLAGS) $$($1_$(notdir $2)_OPT_CXXFLAGS)
   292       $1_$2_VARDEPS_FILE := $$(call DependOnVariable, $1_$2_VARDEPS, $$($1_$2_OBJ).vardeps)
   292       $1_$2_VARDEPS_FILE := $$(call DependOnVariable, $1_$2_VARDEPS, $$($1_$2_OBJ).vardeps)
   293     endif
   293     endif
   294 
   294 
   295     $$($1_$2_OBJ) : $2 $$($1_COMPILE_VARDEPS_FILE) $$($1_$2_VARDEPS_FILE) | $$($1_BUILD_INFO)
   295     $$($1_$2_OBJ) : $2 $$($1_COMPILE_VARDEPS_FILE) $$($1_$2_VARDEPS_FILE) | $$($1_BUILD_INFO)
   296 	$$(call LogInfo, Compiling $$(notdir $2) (for $$(notdir $$($1_TARGET))))
   296 	$$(call LogInfo, Compiling $$(notdir $2) (for $$($1_BASENAME)))
   297 	$$(call MakeDir, $$(@D) $$(@D)/pdb)
   297 	$$(call MakeDir, $$(@D) $$(@D)/pdb)
   298         ifneq ($(TOOLCHAIN_TYPE), microsoft)
   298         ifneq ($(TOOLCHAIN_TYPE), microsoft)
   299           ifeq ($(TOOLCHAIN_TYPE)$$(filter %.s,$2), solstudio)
   299           ifeq ($(TOOLCHAIN_TYPE)$$(filter %.s, $2), solstudio)
   300             # The Solaris studio compiler doesn't output the full path to the object file in the
   300             # The Solaris studio compiler doesn't output the full path to the object file in the
   301             # generated deps files. Fixing it with sed. If compiling assembly, don't try this.
   301             # generated deps files. Fixing it with sed. If compiling assembly, don't try this.
   302 	    $$(call ExecuteWithLog, $$@, \
   302 	    $$(call ExecuteWithLog, $$@, \
   303 	        $$($1_$2_COMP) $$($1_$2_FLAGS) $$($1_$2_DEP_FLAG) $$($1_$2_DEP).tmp $(CC_OUT_OPTION)$$($1_$2_OBJ) $2)
   303 	        $$($1_$2_COMP) $$($1_$2_FLAGS) $$($1_$2_DEP_FLAG) $$($1_$2_DEP).tmp $(CC_OUT_OPTION)$$($1_$2_OBJ) $2)
   304 	    $(SED) 's|^$$(@F):|$$@:|' $$($1_$2_DEP).tmp > $$($1_$2_DEP)
   304 	    $(SED) 's|^$$(@F):|$$@:|' $$($1_$2_DEP).tmp > $$($1_$2_DEP)
   306 	    $$(call ExecuteWithLog, $$@, \
   306 	    $$(call ExecuteWithLog, $$@, \
   307 	        $$($1_$2_COMP) $$($1_$2_FLAGS) $$($1_$2_DEP_FLAG) $$($1_$2_DEP) $(CC_OUT_OPTION)$$($1_$2_OBJ) $2)
   307 	        $$($1_$2_COMP) $$($1_$2_FLAGS) $$($1_$2_DEP_FLAG) $$($1_$2_DEP) $(CC_OUT_OPTION)$$($1_$2_OBJ) $2)
   308           endif
   308           endif
   309           # Create a dependency target file from the dependency file.
   309           # Create a dependency target file from the dependency file.
   310           # Solution suggested by http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/
   310           # Solution suggested by http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/
   311           ifneq ($$($1_$2_DEP),)
   311           ifneq ($$($1_$2_DEP), )
   312 	    $(SED) $(DEPENDENCY_TARGET_SED_PATTERN) $$($1_$2_DEP) > $$($1_$2_DEP_TARGETS)
   312 	    $(SED) $(DEPENDENCY_TARGET_SED_PATTERN) $$($1_$2_DEP) > $$($1_$2_DEP_TARGETS)
   313           endif
   313           endif
   314         else
   314         else
   315           # The Visual Studio compiler lacks a feature for generating make dependencies, but by
   315           # The Visual Studio compiler lacks a feature for generating make dependencies, but by
   316           # setting -showIncludes, all included files are printed. These are filtered out and
   316           # setting -showIncludes, all included files are printed. These are filtered out and
   336 #
   336 #
   337 # Parameter 1 is the name of the rule. This name is used as variable prefix,
   337 # Parameter 1 is the name of the rule. This name is used as variable prefix,
   338 # and the targets generated are listed in a variable by that name.
   338 # and the targets generated are listed in a variable by that name.
   339 #
   339 #
   340 # Remaining parameters are named arguments. These include:
   340 # Remaining parameters are named arguments. These include:
       
   341 #   NAME The base name for the resulting binary, excluding decorations (like *.exe)
       
   342 #   TYPE Type of binary (EXECUTABLE, LIBRARY or STATIC_LIBRARY). Default is LIBRARY.
       
   343 #   SUFFIX Override the default suffix for the output file
   341 #   TOOLCHAIN Name of toolchain setup to use. Defaults to TOOLCHAIN_DEFAULT.
   344 #   TOOLCHAIN Name of toolchain setup to use. Defaults to TOOLCHAIN_DEFAULT.
   342 #   SRC one or more directory roots to scan for C/C++ files.
   345 #   SRC one or more directory roots to scan for C/C++ files.
   343 #   CFLAGS the compiler flags to be used, used both for C and C++.
   346 #   CFLAGS the compiler flags to be used, used both for C and C++.
   344 #   CXXFLAGS the compiler flags to be used for c++, if set overrides CFLAGS.
   347 #   CXXFLAGS the compiler flags to be used for c++, if set overrides CFLAGS.
   345 #   LDFLAGS the linker flags to be used, used both for C and C++.
   348 #   LDFLAGS the linker flags to be used, used both for C and C++.
   346 #   LIBS the libraries to link to
   349 #   LIBS the libraries to link to
   347 #   ARFLAGS the archiver flags to be used
   350 #   ARFLAGS the archiver flags to be used
   348 #   OBJECT_DIR the directory where we store the object files
   351 #   OBJECT_DIR the directory where we store the object files
   349 #   OUTPUT_DIR the directory where the resulting binary is put
   352 #   OUTPUT_DIR the directory where the resulting binary is put
   350 #   LIBRARY the resulting library file
       
   351 #   PROGRAM the resulting exec file
       
   352 #   INCLUDES only pick source from these directories
   353 #   INCLUDES only pick source from these directories
   353 #   EXCLUDES do not pick source from these directories
   354 #   EXCLUDES do not pick source from these directories
   354 #   INCLUDE_FILES only compile exactly these files!
   355 #   INCLUDE_FILES only compile exactly these files!
   355 #   EXCLUDE_FILES with these names
   356 #   EXCLUDE_FILES with these names
   356 #   EXCLUDE_PATTERN exclude files matching any of these substrings
   357 #   EXCLUDE_PATTERN exclude files matching any of these substrings
   383 #   PRECOMPILED_HEADER Header file to use as precompiled header
   384 #   PRECOMPILED_HEADER Header file to use as precompiled header
   384 #   PRECOMPILED_HEADER_EXCLUDE List of source files that should not use PCH
   385 #   PRECOMPILED_HEADER_EXCLUDE List of source files that should not use PCH
   385 SetupNativeCompilation = $(NamedParamsMacroTemplate)
   386 SetupNativeCompilation = $(NamedParamsMacroTemplate)
   386 define SetupNativeCompilationBody
   387 define SetupNativeCompilationBody
   387 
   388 
       
   389   # If type is unspecified, default to LIBRARY
       
   390   ifeq ($$($1_TYPE), )
       
   391     $1_TYPE := LIBRARY
       
   392   endif
       
   393 
   388   # If we're doing a static build and producing a library
   394   # If we're doing a static build and producing a library
   389   # force it to be a static library and remove the -l libraries
   395   # force it to be a static library and remove the -l libraries
   390   ifeq ($(STATIC_BUILD), true)
   396   ifeq ($(STATIC_BUILD), true)
   391     ifneq ($$($1_LIBRARY),)
   397     ifeq ($$($1_TYPE), LIBRARY)
   392       $1_STATIC_LIBRARY := $$($1_LIBRARY)
   398       $1_TYPE := STATIC_LIBRARY
   393       $1_LIBRARY :=
   399     endif
   394     endif
   400   endif
   395   endif
   401 
   396 
   402   ifeq ($$($1_TYPE), EXECUTABLE)
   397   ifneq (,$$($1_BIN))
   403     $1_PREFIX :=
   398     $$(error BIN has been replaced with OBJECT_DIR)
       
   399   endif
       
   400 
       
   401   ifneq (,$$($1_LIB))
       
   402     $$(error LIB has been replaced with LIBRARY)
       
   403   endif
       
   404 
       
   405   ifneq (,$$($1_EXE))
       
   406     $$(error EXE has been replaced with PROGRAM)
       
   407   endif
       
   408 
       
   409   ifneq (,$$($1_LIBRARY))
       
   410     ifeq (,$$($1_OUTPUT_DIR))
       
   411       $$(error LIBRARY requires OUTPUT_DIR)
       
   412     endif
       
   413 
       
   414     ifneq ($$($1_LIBRARY),$(basename $$($1_LIBRARY)))
       
   415       $$(error directory of LIBRARY should be specified using OUTPUT_DIR)
       
   416     endif
       
   417 
       
   418     ifneq (,$(findstring $(SHARED_LIBRARY_SUFFIX),$$($1_LIBRARY)))
       
   419       $$(error LIBRARY should be specified without SHARED_LIBRARY_SUFFIX: $(SHARED_LIBRARY_SUFFIX))
       
   420     endif
       
   421 
       
   422     ifneq (,$(findstring $(LIBRARY_PREFIX),$$($1_LIBRARY)))
       
   423       $$(error LIBRARY should be specified without LIBRARY_PREFIX: $(LIBRARY_PREFIX))
       
   424     endif
       
   425 
       
   426     ifeq ($$($1_SUFFIX), )
       
   427       $1_SUFFIX := $(SHARED_LIBRARY_SUFFIX)
       
   428     endif
       
   429 
       
   430     $1_BASENAME:=$(LIBRARY_PREFIX)$$($1_LIBRARY)$$($1_SUFFIX)
       
   431     $1_TARGET:=$$($1_OUTPUT_DIR)/$$($1_BASENAME)
       
   432     $1_NOSUFFIX:=$(LIBRARY_PREFIX)$$($1_LIBRARY)
       
   433   endif
       
   434 
       
   435   ifneq (,$$($1_STATIC_LIBRARY))
       
   436     ifeq (,$$($1_OUTPUT_DIR))
       
   437       $$(error STATIC_LIBRARY requires OUTPUT_DIR)
       
   438     endif
       
   439 
       
   440     ifneq ($$($1_STATIC_LIBRARY),$(basename $$($1_STATIC_LIBRARY)))
       
   441       $$(error directory of STATIC_LIBRARY should be specified using OUTPUT_DIR)
       
   442     endif
       
   443 
       
   444     ifneq (,$(findstring $(STATIC_LIBRARY_SUFFIX),$$($1_STATIC_LIBRARY)))
       
   445       $$(error STATIC_LIBRARY should be specified without STATIC_LIBRARY_SUFFIX: $(STATIC_LIBRARY_SUFFIX))
       
   446     endif
       
   447 
       
   448     ifneq (,$(findstring $(LIBRARY_PREFIX),$$($1_STATIC_LIBRARY)))
       
   449       $$(error STATIC_LIBRARY should be specified without LIBRARY_PREFIX: $(LIBRARY_PREFIX))
       
   450     endif
       
   451 
       
   452     ifeq ($$($1_SUFFIX), )
       
   453       $1_SUFFIX := $(STATIC_LIBRARY_SUFFIX)
       
   454     endif
       
   455 
       
   456     $1_BASENAME:=$(LIBRARY_PREFIX)$$($1_STATIC_LIBRARY)$$($1_SUFFIX)
       
   457     $1_TARGET:=$$($1_OUTPUT_DIR)/$$($1_BASENAME)
       
   458     $1_NOSUFFIX:=$(LIBRARY_PREFIX)$$($1_STATIC_LIBRARY)
       
   459   endif
       
   460 
       
   461   ifneq (,$$($1_PROGRAM))
       
   462     ifeq (,$$($1_OUTPUT_DIR))
       
   463       $$(error PROGRAM requires OUTPUT_DIR)
       
   464     endif
       
   465 
       
   466     ifneq ($$($1_PROGRAM),$(basename $$($1_PROGRAM)))
       
   467       $$(error directory of PROGRAM should be specified using OUTPUT_DIR)
       
   468     endif
       
   469 
       
   470     ifneq (,$(findstring $(EXE_SUFFIX),$$($1_PROGRAM)))
       
   471       $$(error PROGRAM should be specified without EXE_SUFFIX: $(EXE_SUFFIX))
       
   472     endif
       
   473 
       
   474     ifeq ($$($1_SUFFIX), )
   404     ifeq ($$($1_SUFFIX), )
   475       $1_SUFFIX := $(EXE_SUFFIX)
   405       $1_SUFFIX := $(EXE_SUFFIX)
   476     endif
   406     endif
   477 
   407   else
   478     $1_BASENAME:=$$($1_PROGRAM)$$($1_SUFFIX)
   408     $1_PREFIX := $(LIBRARY_PREFIX)
   479     $1_TARGET:=$$($1_OUTPUT_DIR)/$$($1_BASENAME)
   409     ifeq ($$($1_TYPE), LIBRARY)
   480     $1_NOSUFFIX:=$$($1_PROGRAM)
   410       ifeq ($$($1_SUFFIX), )
   481   endif
   411         $1_SUFFIX := $(SHARED_LIBRARY_SUFFIX)
       
   412       endif
       
   413     else ifeq ($$($1_TYPE), STATIC_LIBRARY)
       
   414       ifeq ($$($1_SUFFIX), )
       
   415         $1_SUFFIX := $(STATIC_LIBRARY_SUFFIX)
       
   416       endif
       
   417     endif
       
   418   endif
       
   419 
       
   420   ifneq ($$($1_NAME), $(basename $$($1_NAME)))
       
   421     $$(error NAME must not contain any directory path in $1)
       
   422   endif
       
   423   ifneq ($(findstring $$($1_SUFFIX), $$($1_NAME)), )
       
   424     $$(error NAME should be specified without suffix: $$($1_SUFFIX) in $1)
       
   425   endif
       
   426   ifneq ($(findstring $$($1_PREFIX), $$($1_NAME)), )
       
   427     $$(error NAME should be specified without prefix: $$($1_PREFIX) in $1)
       
   428   endif
       
   429   ifeq ($$($1_OUTPUT_DIR), )
       
   430     $$(error OUTPUT_DIR is missing in $1)
       
   431   endif
       
   432   ifneq ($$($1_MANIFEST), )
       
   433     ifeq ($$($1_MANIFEST_VERSION), )
       
   434       $$(error If MANIFEST is provided, then MANIFEST_VERSION is required in $1)
       
   435     endif
       
   436   endif
       
   437 
       
   438   $1_BASENAME := $$($1_PREFIX)$$($1_NAME)$$($1_SUFFIX)
       
   439   $1_TARGET := $$($1_OUTPUT_DIR)/$$($1_BASENAME)
       
   440   $1_NOSUFFIX := $$($1_PREFIX)$$($1_NAME)
   482   $1_SAFE_NAME := $$(strip $$(subst /,_, $1))
   441   $1_SAFE_NAME := $$(strip $$(subst /,_, $1))
   483 
       
   484   ifeq (,$$($1_TARGET))
       
   485     $$(error Neither PROGRAM, LIBRARY nor STATIC_LIBRARY has been specified for SetupNativeCompilation)
       
   486   endif
       
   487 
   442 
   488   # Setup the toolchain to be used
   443   # Setup the toolchain to be used
   489   $$(call SetIfEmpty, $1_TOOLCHAIN, TOOLCHAIN_DEFAULT)
   444   $$(call SetIfEmpty, $1_TOOLCHAIN, TOOLCHAIN_DEFAULT)
   490   $$(call SetIfEmpty, $1_CC, $$($$($1_TOOLCHAIN)_CC))
   445   $$(call SetIfEmpty, $1_CC, $$($$($1_TOOLCHAIN)_CC))
   491   $$(call SetIfEmpty, $1_CXX, $$($$($1_TOOLCHAIN)_CXX))
   446   $$(call SetIfEmpty, $1_CXX, $$($$($1_TOOLCHAIN)_CXX))
   497   $$(call SetIfEmpty, $1_OBJCOPY, $$($$($1_TOOLCHAIN)_OBJCOPY))
   452   $$(call SetIfEmpty, $1_OBJCOPY, $$($$($1_TOOLCHAIN)_OBJCOPY))
   498   $$(call SetIfEmpty, $1_STRIP, $$($$($1_TOOLCHAIN)_STRIP))
   453   $$(call SetIfEmpty, $1_STRIP, $$($$($1_TOOLCHAIN)_STRIP))
   499   $$(call SetIfEmpty, $1_SYSROOT_CFLAGS, $$($$($1_TOOLCHAIN)_SYSROOT_CFLAGS))
   454   $$(call SetIfEmpty, $1_SYSROOT_CFLAGS, $$($$($1_TOOLCHAIN)_SYSROOT_CFLAGS))
   500   $$(call SetIfEmpty, $1_SYSROOT_LDFLAGS, $$($$($1_TOOLCHAIN)_SYSROOT_LDFLAGS))
   455   $$(call SetIfEmpty, $1_SYSROOT_LDFLAGS, $$($$($1_TOOLCHAIN)_SYSROOT_LDFLAGS))
   501 
   456 
   502   ifneq ($$($1_MANIFEST), )
       
   503     ifeq ($$($1_MANIFEST_VERSION), )
       
   504       $$(error If MANIFEST is provided, then MANIFEST_VERSION is required in $1)
       
   505     endif
       
   506   endif
       
   507 
       
   508   # Make sure the dirs exist.
   457   # Make sure the dirs exist.
   509   $$(call MakeDir,$$($1_OBJECT_DIR) $$($1_OUTPUT_DIR))
   458   $$(call MakeDir, $$($1_OBJECT_DIR) $$($1_OUTPUT_DIR))
   510   $$(foreach d,$$($1_SRC), $$(if $$(wildcard $$d),, \
   459   $$(foreach d, $$($1_SRC), $$(if $$(wildcard $$d), , \
   511       $$(error SRC specified to SetupNativeCompilation $1 contains missing directory $$d)))
   460       $$(error SRC specified to SetupNativeCompilation $1 contains missing directory $$d)))
   512 
   461 
   513   # Find all files in the source trees. Preserve order.
   462   # Find all files in the source trees. Preserve order.
   514   $1_SRCS := $$(foreach s, $$($1_SRC), $$(call CacheFind,$$(s)))
   463   $1_SRCS := $$(foreach s, $$($1_SRC), $$(call CacheFind, $$(s)))
   515   $1_SRCS := $$(filter $$(NATIVE_SOURCE_EXTENSIONS), $$($1_SRCS))
   464   $1_SRCS := $$(filter $$(NATIVE_SOURCE_EXTENSIONS), $$($1_SRCS))
   516   # Extract the C/C++ files.
   465   # Extract the C/C++ files.
   517   ifneq ($$($1_EXCLUDE_PATTERNS), )
   466   ifneq ($$($1_EXCLUDE_PATTERNS), )
   518     # We must not match the exclude pattern against the src root(s).
   467     # We must not match the exclude pattern against the src root(s).
   519     $1_SRCS_WITHOUT_ROOTS := $$($1_SRCS)
   468     $1_SRCS_WITHOUT_ROOTS := $$($1_SRCS)
   520     $$(foreach i,$$($1_SRC),$$(eval $1_SRCS_WITHOUT_ROOTS := $$(patsubst \
   469     $$(foreach i, $$($1_SRC), $$(eval $1_SRCS_WITHOUT_ROOTS := $$(patsubst \
   521         $$i/%,%, $$($1_SRCS_WITHOUT_ROOTS))))
   470         $$i/%,%, $$($1_SRCS_WITHOUT_ROOTS))))
   522     $1_ALL_EXCLUDE_FILES :=  $$(call containing, $$($1_EXCLUDE_PATTERNS), \
   471     $1_ALL_EXCLUDE_FILES :=  $$(call containing, $$($1_EXCLUDE_PATTERNS), \
   523         $$($1_SRCS_WITHOUT_ROOTS))
   472         $$($1_SRCS_WITHOUT_ROOTS))
   524   endif
   473   endif
   525   ifneq ($$($1_EXCLUDE_FILES),)
   474   ifneq ($$($1_EXCLUDE_FILES), )
   526     $1_ALL_EXCLUDE_FILES += $$($1_EXCLUDE_FILES)
   475     $1_ALL_EXCLUDE_FILES += $$($1_EXCLUDE_FILES)
   527   endif
   476   endif
   528   ifneq ($$($1_ALL_EXCLUDE_FILES),)
   477   ifneq ($$($1_ALL_EXCLUDE_FILES), )
   529     $1_EXCLUDE_FILES_PAT := $$($1_ALL_EXCLUDE_FILES) \
   478     $1_EXCLUDE_FILES_PAT := $$($1_ALL_EXCLUDE_FILES) \
   530         $$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$($1_ALL_EXCLUDE_FILES)))
   479         $$(foreach i, $$($1_SRC), $$(addprefix $$i/, $$($1_ALL_EXCLUDE_FILES)))
   531     $1_EXCLUDE_FILES_PAT := $$(addprefix %,$$($1_EXCLUDE_FILES_PAT))
   480     $1_EXCLUDE_FILES_PAT := $$(addprefix %, $$($1_EXCLUDE_FILES_PAT))
   532     $1_SRCS := $$(filter-out $$($1_EXCLUDE_FILES_PAT),$$($1_SRCS))
   481     $1_SRCS := $$(filter-out $$($1_EXCLUDE_FILES_PAT), $$($1_SRCS))
   533   endif
   482   endif
   534   ifneq ($$($1_INCLUDE_FILES), )
   483   ifneq ($$($1_INCLUDE_FILES), )
   535     $1_INCLUDE_FILES_PAT := $$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$($1_INCLUDE_FILES)))
   484     $1_INCLUDE_FILES_PAT := $$(foreach i, $$($1_SRC), $$(addprefix $$i/, $$($1_INCLUDE_FILES)))
   536     $1_SRCS := $$(filter $$($1_INCLUDE_FILES_PAT),$$($1_SRCS))
   485     $1_SRCS := $$(filter $$($1_INCLUDE_FILES_PAT), $$($1_SRCS))
   537   endif
   486   endif
   538   # There can be only a single bin dir root, no need to foreach over the roots.
   487   # There can be only a single bin dir root, no need to foreach over the roots.
   539   $1_BINS := $$(wildcard $$($1_OBJECT_DIR)/*$(OBJ_SUFFIX))
   488   $1_BINS := $$(wildcard $$($1_OBJECT_DIR)/*$(OBJ_SUFFIX))
   540   # Now we have a list of all c/c++ files to compile: $$($1_SRCS)
   489   # Now we have a list of all c/c++ files to compile: $$($1_SRCS)
   541   # and we have a list of all existing object files: $$($1_BINS)
   490   # and we have a list of all existing object files: $$($1_BINS)
   542 
   491 
   543   # Prepend the source/bin path to the filter expressions. Then do the filtering.
   492   # Prepend the source/bin path to the filter expressions. Then do the filtering.
   544   ifneq ($$($1_INCLUDES),)
   493   ifneq ($$($1_INCLUDES), )
   545     $1_SRC_INCLUDES := $$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$(addsuffix /%,$$($1_INCLUDES))))
   494     $1_SRC_INCLUDES := $$(foreach i, $$($1_SRC), $$(addprefix $$i/, $$(addsuffix /%, $$($1_INCLUDES))))
   546     $1_SRCS := $$(filter $$($1_SRC_INCLUDES),$$($1_SRCS))
   495     $1_SRCS := $$(filter $$($1_SRC_INCLUDES), $$($1_SRCS))
   547   endif
   496   endif
   548   ifneq ($$($1_EXCLUDES),)
   497   ifneq ($$($1_EXCLUDES), )
   549     $1_SRC_EXCLUDES := $$(addsuffix /%,$$($1_EXCLUDES))
   498     $1_SRC_EXCLUDES := $$(addsuffix /%, $$($1_EXCLUDES))
   550     $1_SRC_EXCLUDES += $$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$(addsuffix /%,$$($1_EXCLUDES))))
   499     $1_SRC_EXCLUDES += $$(foreach i, $$($1_SRC), $$(addprefix $$i/, $$(addsuffix /%, $$($1_EXCLUDES))))
   551     $1_SRCS := $$(filter-out $$($1_SRC_EXCLUDES),$$($1_SRCS))
   500     $1_SRCS := $$(filter-out $$($1_SRC_EXCLUDES), $$($1_SRCS))
   552   endif
   501   endif
   553 
   502 
   554   $1_SRCS += $$($1_EXTRA_FILES)
   503   $1_SRCS += $$($1_EXTRA_FILES)
   555 
   504 
   556   ifeq (,$$($1_SRCS))
   505   ifeq ($$($1_SRCS), )
   557     $$(error No sources found for $1 when looking inside the dirs $$($1_SRC))
   506     $$(error No sources found for $1 when looking inside the dirs $$($1_SRC))
   558   endif
   507   endif
   559 
   508 
   560   # Calculate the expected output from compiling the sources
   509   # Calculate the expected output from compiling the sources
   561   $1_EXPECTED_OBJS_FILENAMES := $$(call replace_with_obj_extension, $$(notdir $$($1_SRCS)))
   510   $1_EXPECTED_OBJS_FILENAMES := $$(call replace_with_obj_extension, $$(notdir $$($1_SRCS)))
   562   $1_EXPECTED_OBJS := $$(addprefix $$($1_OBJECT_DIR)/,$$($1_EXPECTED_OBJS_FILENAMES))
   511   $1_EXPECTED_OBJS := $$(addprefix $$($1_OBJECT_DIR)/, $$($1_EXPECTED_OBJS_FILENAMES))
   563   # Are there too many object files on disk? Perhaps because some source file was removed?
   512   # Are there too many object files on disk? Perhaps because some source file was removed?
   564   $1_SUPERFLOUS_OBJS:=$$(sort $$(filter-out $$($1_EXPECTED_OBJS),$$($1_BINS)))
   513   $1_SUPERFLOUS_OBJS := $$(sort $$(filter-out $$($1_EXPECTED_OBJS), $$($1_BINS)))
   565   # Clean out the superfluous object files.
   514   # Clean out the superfluous object files.
   566   ifneq ($$($1_SUPERFLUOUS_OBJS),)
   515   ifneq ($$($1_SUPERFLUOUS_OBJS), )
   567     $$(shell $(RM) -f $$($1_SUPERFLUOUS_OBJS))
   516     $$(shell $(RM) -f $$($1_SUPERFLUOUS_OBJS))
   568   endif
   517   endif
   569   # Sort to remove dupliates and provide a reproducable order on the input files to the linker.
   518   # Sort to remove dupliates and provide a reproducable order on the input files to the linker.
   570   $1_ALL_OBJS := $$(sort $$($1_EXPECTED_OBJS) $$($1_EXTRA_OBJECT_FILES))
   519   $1_ALL_OBJS := $$(sort $$($1_EXPECTED_OBJS) $$($1_EXTRA_OBJECT_FILES))
   571 
   520 
   572   # Pickup extra OPENJDK_TARGET_OS_TYPE, OPENJDK_TARGET_OS, and/or OPENJDK_TARGET_OS plus
   521   # Pickup extra OPENJDK_TARGET_OS_TYPE, OPENJDK_TARGET_OS, and/or OPENJDK_TARGET_OS plus
   573   # OPENJDK_TARGET_CPU pair dependent variables for CFLAGS.
   522   # OPENJDK_TARGET_CPU pair dependent variables for CFLAGS.
   574   $1_EXTRA_CFLAGS:=$$($1_CFLAGS_$(OPENJDK_TARGET_OS_TYPE)) $$($1_CFLAGS_$(OPENJDK_TARGET_OS)) \
   523   $1_EXTRA_CFLAGS := $$($1_CFLAGS_$(OPENJDK_TARGET_OS_TYPE)) $$($1_CFLAGS_$(OPENJDK_TARGET_OS)) \
   575       $$($1_CFLAGS_$(OPENJDK_TARGET_OS)_$(OPENJDK_TARGET_CPU))
   524       $$($1_CFLAGS_$(OPENJDK_TARGET_OS)_$(OPENJDK_TARGET_CPU))
   576   ifneq ($(DEBUG_LEVEL),release)
   525   ifneq ($(DEBUG_LEVEL), release)
   577     # Pickup extra debug dependent variables for CFLAGS
   526     # Pickup extra debug dependent variables for CFLAGS
   578     $1_EXTRA_CFLAGS+=$$($1_CFLAGS_debug)
   527     $1_EXTRA_CFLAGS += $$($1_CFLAGS_debug)
   579     $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS_TYPE)_debug)
   528     $1_EXTRA_CFLAGS += $$($1_CFLAGS_$(OPENJDK_TARGET_OS_TYPE)_debug)
   580     $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS)_debug)
   529     $1_EXTRA_CFLAGS += $$($1_CFLAGS_$(OPENJDK_TARGET_OS)_debug)
   581     $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS)_$(OPENJDK_TARGET_CPU)_debug)
   530     $1_EXTRA_CFLAGS += $$($1_CFLAGS_$(OPENJDK_TARGET_OS)_$(OPENJDK_TARGET_CPU)_debug)
   582   else
   531   else
   583     $1_EXTRA_CFLAGS+=$$($1_CFLAGS_release)
   532     $1_EXTRA_CFLAGS += $$($1_CFLAGS_release)
   584     $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS_TYPE)_release)
   533     $1_EXTRA_CFLAGS += $$($1_CFLAGS_$(OPENJDK_TARGET_OS_TYPE)_release)
   585     $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS)_release)
   534     $1_EXTRA_CFLAGS += $$($1_CFLAGS_$(OPENJDK_TARGET_OS)_release)
   586     $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS)_$(OPENJDK_TARGET_CPU)_release)
   535     $1_EXTRA_CFLAGS += $$($1_CFLAGS_$(OPENJDK_TARGET_OS)_$(OPENJDK_TARGET_CPU)_release)
   587   endif
   536   endif
   588 
   537 
   589   # Pickup extra OPENJDK_TARGET_OS_TYPE and/or OPENJDK_TARGET_OS dependent variables for CXXFLAGS.
   538   # Pickup extra OPENJDK_TARGET_OS_TYPE and/or OPENJDK_TARGET_OS dependent variables for CXXFLAGS.
   590   $1_EXTRA_CXXFLAGS:=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS_TYPE)) $$($1_CXXFLAGS_$(OPENJDK_TARGET_OS))
   539   $1_EXTRA_CXXFLAGS := $$($1_CXXFLAGS_$(OPENJDK_TARGET_OS_TYPE)) $$($1_CXXFLAGS_$(OPENJDK_TARGET_OS))
   591   ifneq ($(DEBUG_LEVEL),release)
   540   ifneq ($(DEBUG_LEVEL), release)
   592     # Pickup extra debug dependent variables for CXXFLAGS
   541     # Pickup extra debug dependent variables for CXXFLAGS
   593     $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_debug)
   542     $1_EXTRA_CXXFLAGS += $$($1_CXXFLAGS_debug)
   594     $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS_TYPE)_debug)
   543     $1_EXTRA_CXXFLAGS += $$($1_CXXFLAGS_$(OPENJDK_TARGET_OS_TYPE)_debug)
   595     $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS)_debug)
   544     $1_EXTRA_CXXFLAGS += $$($1_CXXFLAGS_$(OPENJDK_TARGET_OS)_debug)
   596   else
   545   else
   597     $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_release)
   546     $1_EXTRA_CXXFLAGS += $$($1_CXXFLAGS_release)
   598     $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS_TYPE)_release)
   547     $1_EXTRA_CXXFLAGS += $$($1_CXXFLAGS_$(OPENJDK_TARGET_OS_TYPE)_release)
   599     $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS)_release)
   548     $1_EXTRA_CXXFLAGS += $$($1_CXXFLAGS_$(OPENJDK_TARGET_OS)_release)
   600   endif
   549   endif
   601 
   550 
   602   # If no C++ flags are explicitly set, default to using the C flags.
   551   # If no C++ flags are explicitly set, default to using the C flags.
   603   # After that, we can set additional C++ flags that should not interfere
   552   # After that, we can set additional C++ flags that should not interfere
   604   # with the mechanism for copying the C flags by default.
   553   # with the mechanism for copying the C flags by default.
   605   ifeq ($$($1_CXXFLAGS),)
   554   ifeq ($$($1_CXXFLAGS), )
   606     $1_CXXFLAGS:=$$($1_CFLAGS)
   555     $1_CXXFLAGS := $$($1_CFLAGS)
   607   endif
   556   endif
   608   ifeq ($$(strip $$($1_EXTRA_CXXFLAGS)),)
   557   ifeq ($$(strip $$($1_EXTRA_CXXFLAGS)), )
   609     $1_EXTRA_CXXFLAGS:=$$($1_EXTRA_CFLAGS)
   558     $1_EXTRA_CXXFLAGS := $$($1_EXTRA_CFLAGS)
   610   endif
   559   endif
   611 
   560 
   612   ifeq ($(COMPILE_WITH_DEBUG_SYMBOLS), true)
   561   ifeq ($(COMPILE_WITH_DEBUG_SYMBOLS), true)
   613     $$(call SetIfEmpty, $1_CFLAGS_DEBUG_SYMBOLS, $(CFLAGS_DEBUG_SYMBOLS))
   562     $$(call SetIfEmpty, $1_CFLAGS_DEBUG_SYMBOLS, $(CFLAGS_DEBUG_SYMBOLS))
   614     $$(call SetIfEmpty, $1_CXXFLAGS_DEBUG_SYMBOLS, $(CXXFLAGS_DEBUG_SYMBOLS))
   563     $$(call SetIfEmpty, $1_CXXFLAGS_DEBUG_SYMBOLS, $(CXXFLAGS_DEBUG_SYMBOLS))
   615     $1_EXTRA_CFLAGS += $$($1_CFLAGS_DEBUG_SYMBOLS)
   564     $1_EXTRA_CFLAGS += $$($1_CFLAGS_DEBUG_SYMBOLS)
   616     $1_EXTRA_CXXFLAGS += $$($1_CXXFLAGS_DEBUG_SYMBOLS)
   565     $1_EXTRA_CXXFLAGS += $$($1_CXXFLAGS_DEBUG_SYMBOLS)
   617   endif
   566   endif
   618 
   567 
   619   ifneq (,$$($1_REORDER))
   568   ifneq ($$($1_REORDER), )
   620     $1_EXTRA_CFLAGS += $$(C_FLAG_REORDER)
   569     $1_EXTRA_CFLAGS += $$(C_FLAG_REORDER)
   621     $1_EXTRA_CXXFLAGS += $$(C_FLAG_REORDER)
   570     $1_EXTRA_CXXFLAGS += $$(C_FLAG_REORDER)
   622   endif
   571   endif
   623 
   572 
   624   # Pass the library name for static JNI library naming
   573   # Pass the library name for static JNI library naming
   625   ifneq ($$($1_STATIC_LIBRARY),)
   574   ifeq ($$($1_TYPE), STATIC_LIBRARY)
   626     $1_EXTRA_CFLAGS += -DLIBRARY_NAME=$$($1_STATIC_LIBRARY)
   575     $1_EXTRA_CFLAGS += -DLIBRARY_NAME=$$($1_NAME)
   627     $1_EXTRA_CXXFLAGS += -DLIBRARY_NAME=$$($1_STATIC_LIBRARY)
   576     $1_EXTRA_CXXFLAGS += -DLIBRARY_NAME=$$($1_NAME)
   628   endif
   577   endif
   629 
   578 
   630   # Pick up disabled warnings, if possible on this platform.
   579   # Pick up disabled warnings, if possible on this platform.
   631   ifneq ($(DISABLE_WARNING_PREFIX),)
   580   ifneq ($(DISABLE_WARNING_PREFIX), )
   632     $1_EXTRA_CFLAGS += $$(addprefix $(DISABLE_WARNING_PREFIX), \
   581     $1_EXTRA_CFLAGS += $$(addprefix $(DISABLE_WARNING_PREFIX), \
   633         $$($1_DISABLED_WARNINGS_$(TOOLCHAIN_TYPE)) \
   582         $$($1_DISABLED_WARNINGS_$(TOOLCHAIN_TYPE)) \
   634         $$($1_DISABLED_WARNINGS_C_$(TOOLCHAIN_TYPE)))
   583         $$($1_DISABLED_WARNINGS_C_$(TOOLCHAIN_TYPE)))
   635     $1_EXTRA_CXXFLAGS += $$(addprefix $(DISABLE_WARNING_PREFIX), \
   584     $1_EXTRA_CXXFLAGS += $$(addprefix $(DISABLE_WARNING_PREFIX), \
   636         $$($1_DISABLED_WARNINGS_$(TOOLCHAIN_TYPE)) \
   585         $$($1_DISABLED_WARNINGS_$(TOOLCHAIN_TYPE)) \
   637         $$($1_DISABLED_WARNINGS_CXX_$(TOOLCHAIN_TYPE)))
   586         $$($1_DISABLED_WARNINGS_CXX_$(TOOLCHAIN_TYPE)))
   638   endif
   587   endif
   639 
   588 
   640   # Check if warnings should be considered errors.
   589   # Check if warnings should be considered errors.
   641   # Pick first binary and toolchain specific, then binary specific, then general setting.
   590   # Pick first binary and toolchain specific, then binary specific, then general setting.
   642   ifeq ($$($1_WARNINGS_AS_ERRORS_$(TOOLCHAIN_TYPE)),)
   591   ifeq ($$($1_WARNINGS_AS_ERRORS_$(TOOLCHAIN_TYPE)), )
   643     ifeq ($$($1_WARNINGS_AS_ERRORS),)
   592     ifeq ($$($1_WARNINGS_AS_ERRORS), )
   644       $1_WARNINGS_AS_ERRORS_$(TOOLCHAIN_TYPE) := $$(WARNINGS_AS_ERRORS)
   593       $1_WARNINGS_AS_ERRORS_$(TOOLCHAIN_TYPE) := $$(WARNINGS_AS_ERRORS)
   645     else
   594     else
   646       $1_WARNINGS_AS_ERRORS_$(TOOLCHAIN_TYPE) := $$($1_WARNINGS_AS_ERRORS)
   595       $1_WARNINGS_AS_ERRORS_$(TOOLCHAIN_TYPE) := $$($1_WARNINGS_AS_ERRORS)
   647     endif
   596     endif
   648   endif
   597   endif
   738       endif
   687       endif
   739     endif
   688     endif
   740   endif
   689   endif
   741 
   690 
   742   # Now call add_native_source for each source file we are going to compile.
   691   # Now call add_native_source for each source file we are going to compile.
   743   $$(foreach p,$$($1_SRCS), \
   692   $$(foreach p, $$($1_SRCS), \
   744       $$(eval $$(call add_native_source,$1,$$p,$$($1_OBJECT_DIR), \
   693       $$(eval $$(call add_native_source,$1,$$p,$$($1_OBJECT_DIR), \
   745           $$($1_CFLAGS) $$($1_EXTRA_CFLAGS) $$($1_SYSROOT_CFLAGS), \
   694           $$($1_CFLAGS) $$($1_EXTRA_CFLAGS) $$($1_SYSROOT_CFLAGS), \
   746           $$($1_CC), \
   695           $$($1_CC), \
   747           $$($1_CXXFLAGS) $$($1_EXTRA_CXXFLAGS) $$($1_SYSROOT_CFLAGS), \
   696           $$($1_CXXFLAGS) $$($1_EXTRA_CXXFLAGS) $$($1_SYSROOT_CFLAGS), \
   748           $$($1_CXX), $$($1_ASFLAGS))))
   697           $$($1_CXX), $$($1_ASFLAGS))))
   749 
   698 
   750   # Setup rule for printing progress info when compiling source files.
   699   # Setup rule for printing progress info when compiling source files.
   751   # This is a rough heuristic and may not always print accurate information.
   700   # This is a rough heuristic and may not always print accurate information.
   752   $$($1_BUILD_INFO): $$($1_SRCS) $$($1_COMPILE_VARDEPS_FILE)
   701   $$($1_BUILD_INFO): $$($1_SRCS) $$($1_COMPILE_VARDEPS_FILE)
   753         ifeq ($$(wildcard $$($1_TARGET)),)
   702         ifeq ($$(wildcard $$($1_TARGET)), )
   754 	  $(ECHO) 'Creating $$(subst $$(OUTPUTDIR)/,,$$($1_TARGET)) from $$(words \
   703 	  $(ECHO) 'Creating $$(subst $$(OUTPUTDIR)/,,$$($1_TARGET)) from $$(words \
   755 	      $$(filter-out %.vardeps, $$?)) file(s)'
   704 	      $$(filter-out %.vardeps, $$?)) file(s)'
   756         else
   705         else
   757 	  $(ECHO) $$(strip 'Updating $$(subst $$(OUTPUTDIR)/,,$$($1_TARGET))' \
   706 	  $(ECHO) $$(strip 'Updating $$(subst $$(OUTPUTDIR)/,,$$($1_TARGET))' \
   758 	      $$(if $$(filter-out %.vardeps, $$?), \
   707 	      $$(if $$(filter-out %.vardeps, $$?), \
   761         endif
   710         endif
   762 	$(TOUCH) $$@
   711 	$(TOUCH) $$@
   763 
   712 
   764   # On windows we need to create a resource file
   713   # On windows we need to create a resource file
   765   ifeq ($(OPENJDK_TARGET_OS), windows)
   714   ifeq ($(OPENJDK_TARGET_OS), windows)
   766     ifneq (,$$($1_VERSIONINFO_RESOURCE))
   715     ifneq ($$($1_VERSIONINFO_RESOURCE), )
   767       $1_RES:=$$($1_OBJECT_DIR)/$$($1_BASENAME).res
   716       $1_RES := $$($1_OBJECT_DIR)/$$($1_BASENAME).res
   768       $1_RES_DEP:=$$($1_RES).d
   717       $1_RES_DEP := $$($1_RES).d
   769       $1_RES_DEP_TARGETS:=$$($1_RES).d.targets
   718       $1_RES_DEP_TARGETS := $$($1_RES).d.targets
   770       -include $$($1_RES_DEP)
   719       -include $$($1_RES_DEP)
   771       -include $$($1_RES_DEP_TARGETS)
   720       -include $$($1_RES_DEP_TARGETS)
   772 
   721 
   773       $1_RES_VARDEPS := $$($1_RC) $$($1_RC_FLAGS)
   722       $1_RES_VARDEPS := $$($1_RC) $$($1_RC_FLAGS)
   774       $1_RES_VARDEPS_FILE := $$(call DependOnVariable, $1_RES_VARDEPS, \
   723       $1_RES_VARDEPS_FILE := $$(call DependOnVariable, $1_RES_VARDEPS, \
   775           $$($1_RES).vardeps)
   724           $$($1_RES).vardeps)
   776 
   725 
   777       $$($1_RES): $$($1_VERSIONINFO_RESOURCE) $$($1_RES_VARDEPS_FILE)
   726       $$($1_RES): $$($1_VERSIONINFO_RESOURCE) $$($1_RES_VARDEPS_FILE)
   778 		$$(call LogInfo, Compiling resource $$(notdir $$($1_VERSIONINFO_RESOURCE)) (for $$(notdir $$($1_TARGET))))
   727 		$$(call LogInfo, Compiling resource $$(notdir $$($1_VERSIONINFO_RESOURCE)) (for $$($1_BASENAME)))
   779 		$$(call MakeDir, $$(@D) $$($1_OBJECT_DIR))
   728 		$$(call MakeDir, $$(@D) $$($1_OBJECT_DIR))
   780 		$$(call ExecuteWithLog, $$@, \
   729 		$$(call ExecuteWithLog, $$@, \
   781 		    $$($1_RC) $$($1_RC_FLAGS) $$($1_SYSROOT_CFLAGS) $(CC_OUT_OPTION)$$@ \
   730 		    $$($1_RC) $$($1_RC_FLAGS) $$($1_SYSROOT_CFLAGS) $(CC_OUT_OPTION)$$@ \
   782 		    $$($1_VERSIONINFO_RESOURCE))
   731 		    $$($1_VERSIONINFO_RESOURCE))
   783                 # Windows RC compiler does not support -showIncludes, so we mis-use CL
   732                 # Windows RC compiler does not support -showIncludes, so we mis-use CL
   796 		$(SED) $(WINDOWS_SHOWINCLUDE_SED_PATTERN) $$($1_RES_DEP).obj.log >> $$($1_RES_DEP) ; \
   745 		$(SED) $(WINDOWS_SHOWINCLUDE_SED_PATTERN) $$($1_RES_DEP).obj.log >> $$($1_RES_DEP) ; \
   797 		$(SED) $(DEPENDENCY_TARGET_SED_PATTERN) $$($1_RES_DEP) > $$($1_RES_DEP_TARGETS)
   746 		$(SED) $(DEPENDENCY_TARGET_SED_PATTERN) $$($1_RES_DEP) > $$($1_RES_DEP_TARGETS)
   798     endif
   747     endif
   799   endif
   748   endif
   800 
   749 
   801   ifneq ($(DISABLE_MAPFILES),true)
   750   ifneq ($(DISABLE_MAPFILES), true)
   802     $1_REAL_MAPFILE := $$($1_MAPFILE)
   751     $1_REAL_MAPFILE := $$($1_MAPFILE)
   803     ifneq ($(OPENJDK_TARGET_OS),windows)
   752     ifneq ($(OPENJDK_TARGET_OS), windows)
   804       ifneq (,$$($1_REORDER))
   753       ifneq ($$($1_REORDER), )
   805         $1_REAL_MAPFILE := $$($1_OBJECT_DIR)/mapfile
   754         $1_REAL_MAPFILE := $$($1_OBJECT_DIR)/mapfile
   806 
   755 
   807         $$($1_REAL_MAPFILE) : $$($1_MAPFILE) $$($1_REORDER)
   756         $$($1_REAL_MAPFILE) : $$($1_MAPFILE) $$($1_REORDER)
   808 		$$(call MakeDir, $$(@D))
   757 		$$(call MakeDir, $$(@D))
   809 		$$(CP) $$($1_MAPFILE) $$@.tmp
   758 		$$(CP) $$($1_MAPFILE) $$@.tmp
   813     endif
   762     endif
   814   endif
   763   endif
   815 
   764 
   816   # Pickup extra OPENJDK_TARGET_OS_TYPE and/or OPENJDK_TARGET_OS dependent variables
   765   # Pickup extra OPENJDK_TARGET_OS_TYPE and/or OPENJDK_TARGET_OS dependent variables
   817   # for LDFLAGS and LIBS
   766   # for LDFLAGS and LIBS
   818   $1_EXTRA_LDFLAGS:=$$($1_LDFLAGS_$(OPENJDK_TARGET_OS_TYPE)) $$($1_LDFLAGS_$(OPENJDK_TARGET_OS))
   767   $1_EXTRA_LDFLAGS := $$($1_LDFLAGS_$(OPENJDK_TARGET_OS_TYPE)) $$($1_LDFLAGS_$(OPENJDK_TARGET_OS))
   819   $1_EXTRA_LIBS:=$$($1_LIBS_$(OPENJDK_TARGET_OS_TYPE)) $$($1_LIBS_$(OPENJDK_TARGET_OS))
   768   $1_EXTRA_LIBS := $$($1_LIBS_$(OPENJDK_TARGET_OS_TYPE)) $$($1_LIBS_$(OPENJDK_TARGET_OS))
   820   ifneq (,$$($1_REAL_MAPFILE))
   769   ifneq ($$($1_REAL_MAPFILE), )
   821     $1_EXTRA_LDFLAGS += $(call SET_SHARED_LIBRARY_MAPFILE,$$($1_REAL_MAPFILE))
   770     $1_EXTRA_LDFLAGS += $(call SET_SHARED_LIBRARY_MAPFILE,$$($1_REAL_MAPFILE))
   822   endif
   771   endif
   823 
   772 
   824   # Need to make sure TARGET is first on list
   773   # Need to make sure TARGET is first on list
   825   $1 := $$($1_TARGET)
   774   $1 := $$($1_TARGET)
   833   endif
   782   endif
   834 
   783 
   835   ifeq ($$($1_COPY_DEBUG_SYMBOLS), true)
   784   ifeq ($$($1_COPY_DEBUG_SYMBOLS), true)
   836     ifneq ($$($1_DEBUG_SYMBOLS), false)
   785     ifneq ($$($1_DEBUG_SYMBOLS), false)
   837       # Only copy debug symbols for dynamic libraries and programs.
   786       # Only copy debug symbols for dynamic libraries and programs.
   838       ifeq ($$($1_STATIC_LIBRARY), )
   787       ifneq ($$($1_TYPE), STATIC_LIBRARY)
   839         # Generate debuginfo files.
   788         # Generate debuginfo files.
   840         ifeq ($(OPENJDK_TARGET_OS), windows)
   789         ifeq ($(OPENJDK_TARGET_OS), windows)
   841           $1_EXTRA_LDFLAGS += -debug "-pdb:$$($1_OUTPUT_DIR)/$$($1_NOSUFFIX).pdb" \
   790           $1_EXTRA_LDFLAGS += -debug "-pdb:$$($1_OUTPUT_DIR)/$$($1_NOSUFFIX).pdb" \
   842               "-map:$$($1_OUTPUT_DIR)/$$($1_NOSUFFIX).map"
   791               "-map:$$($1_OUTPUT_DIR)/$$($1_NOSUFFIX).map"
   843           $1_DEBUGINFO_FILES := $$($1_OUTPUT_DIR)/$$($1_NOSUFFIX).pdb \
   792           $1_DEBUGINFO_FILES := $$($1_OUTPUT_DIR)/$$($1_NOSUFFIX).pdb \
   897       $1_STRIPFLAGS ?= $(STRIPFLAGS)
   846       $1_STRIPFLAGS ?= $(STRIPFLAGS)
   898       $1_STRIP_CMD := $$($1_STRIP) $$($1_STRIPFLAGS) $$($1_TARGET)
   847       $1_STRIP_CMD := $$($1_STRIP) $$($1_STRIPFLAGS) $$($1_TARGET)
   899     endif
   848     endif
   900   endif
   849   endif
   901 
   850 
   902   ifneq (,$$($1_LIBRARY))
   851   ifeq ($$($1_TYPE), LIBRARY)
   903     # Generating a dynamic library.
   852     # Generating a dynamic library.
   904     $1_EXTRA_LDFLAGS += $$(call SET_SHARED_LIBRARY_NAME,$$($1_BASENAME))
   853     $1_EXTRA_LDFLAGS += $$(call SET_SHARED_LIBRARY_NAME,$$($1_BASENAME))
   905     ifeq ($(OPENJDK_TARGET_OS), windows)
   854     ifeq ($(OPENJDK_TARGET_OS), windows)
   906       $1_EXTRA_LDFLAGS += "-implib:$$($1_OBJECT_DIR)/$$($1_LIBRARY).lib"
   855       $1_EXTRA_LDFLAGS += "-implib:$$($1_OBJECT_DIR)/$$($1_NAME).lib"
   907       # Create a rule for the import lib so that other rules may depend on it
   856       # Create a rule for the import lib so that other rules may depend on it
   908       $$($1_OBJECT_DIR)/$$($1_LIBRARY).lib: $$($1_TARGET)
   857       $$($1_OBJECT_DIR)/$$($1_NAME).lib: $$($1_TARGET)
   909     endif
   858     endif
   910 
   859 
   911     # Create loadmap on AIX. Helps in diagnosing some problems.
   860     # Create loadmap on AIX. Helps in diagnosing some problems.
   912     ifneq ($(COMPILER_BINDCMD_FILE_FLAG),)
   861     ifneq ($(COMPILER_BINDCMD_FILE_FLAG), )
   913       $1_EXTRA_LDFLAGS += $(COMPILER_BINDCMD_FILE_FLAG)$$($1_OBJECT_DIR)/$$($1_NOSUFFIX).loadmap
   862       $1_EXTRA_LDFLAGS += $(COMPILER_BINDCMD_FILE_FLAG)$$($1_OBJECT_DIR)/$$($1_NOSUFFIX).loadmap
   914     endif
   863     endif
   915 
   864 
   916     $1_VARDEPS := $$($1_LD) $$($1_SYSROOT_LDFLAGS) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) \
   865     $1_VARDEPS := $$($1_LD) $$($1_SYSROOT_LDFLAGS) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) \
   917         $$($1_LIBS) $$($1_EXTRA_LIBS) $$($1_CREATE_DEBUGINFO_CMDS) \
   866         $$($1_LIBS) $$($1_EXTRA_LIBS) $$($1_CREATE_DEBUGINFO_CMDS) \
   922     $1_LD_OBJ_ARG := $$($1_ALL_OBJS)
   871     $1_LD_OBJ_ARG := $$($1_ALL_OBJS)
   923 
   872 
   924     # If there are many object files, use an @-file...
   873     # If there are many object files, use an @-file...
   925     ifneq ($$(word 17, $$($1_ALL_OBJS)), )
   874     ifneq ($$(word 17, $$($1_ALL_OBJS)), )
   926       $1_OBJ_FILE_LIST := $$($1_OBJECT_DIR)/_$1_objectfilenames.txt
   875       $1_OBJ_FILE_LIST := $$($1_OBJECT_DIR)/_$1_objectfilenames.txt
   927       ifneq ($(COMPILER_COMMAND_FILE_FLAG),)
   876       ifneq ($(COMPILER_COMMAND_FILE_FLAG), )
   928         $1_LD_OBJ_ARG := $(COMPILER_COMMAND_FILE_FLAG)$$($1_OBJ_FILE_LIST)
   877         $1_LD_OBJ_ARG := $(COMPILER_COMMAND_FILE_FLAG)$$($1_OBJ_FILE_LIST)
   929       else
   878       else
   930         # ...except for toolchains which don't support them.
   879         # ...except for toolchains which don't support them.
   931         $1_LD_OBJ_ARG := `cat $$($1_OBJ_FILE_LIST)`
   880         $1_LD_OBJ_ARG := `cat $$($1_OBJ_FILE_LIST)`
   932       endif
   881       endif
   984 		  $$($1_STRIP_CMD)
   933 		  $$($1_STRIP_CMD)
   985                 endif
   934                 endif
   986 
   935 
   987   endif
   936   endif
   988 
   937 
   989   ifneq (,$$($1_STATIC_LIBRARY))
   938   ifeq ($$($1_TYPE), STATIC_LIBRARY)
   990     $1_VARDEPS := $$($1_AR) $$($1_ARFLAGS) $$($1_LIBS) \
   939     $1_VARDEPS := $$($1_AR) $$($1_ARFLAGS) $$($1_LIBS) \
   991         $$($1_EXTRA_LIBS)
   940         $$($1_EXTRA_LIBS)
   992     $1_VARDEPS_FILE := $$(call DependOnVariable, $1_VARDEPS, \
   941     $1_VARDEPS_FILE := $$(call DependOnVariable, $1_VARDEPS, \
   993         $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).vardeps)
   942         $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).vardeps)
   994 
   943 
   998         STATIC_MAPFILE_DEP := $$($1_MAPFILE)
   947         STATIC_MAPFILE_DEP := $$($1_MAPFILE)
   999       endif
   948       endif
  1000     endif
   949     endif
  1001 
   950 
  1002     $$($1_TARGET): $$($1_ALL_OBJS) $$($1_RES) $$($1_VARDEPS_FILE) $$(STATIC_MAPFILE_DEP)
   951     $$($1_TARGET): $$($1_ALL_OBJS) $$($1_RES) $$($1_VARDEPS_FILE) $$(STATIC_MAPFILE_DEP)
  1003 	$$(call LogInfo, Archiving $$($1_STATIC_LIBRARY))
   952 	$$(call LogInfo, Building static library $$($1_BASENAME))
  1004 	$$(call ExecuteWithLog, $$($1_OBJECT_DIR)/$$($1_SAFE_NAME)_link, \
   953 	$$(call ExecuteWithLog, $$($1_OBJECT_DIR)/$$($1_SAFE_NAME)_link, \
  1005 	    $$($1_AR) $$($1_ARFLAGS) $(AR_OUT_OPTION)$$($1_TARGET) $$($1_ALL_OBJS) \
   954 	    $$($1_AR) $$($1_ARFLAGS) $(AR_OUT_OPTION)$$($1_TARGET) $$($1_ALL_OBJS) \
  1006 	        $$($1_RES))
   955 	        $$($1_RES))
  1007         ifeq ($(STATIC_BUILD), true)
   956         ifeq ($(STATIC_BUILD), true)
  1008           ifeq ($$($1_USE_MAPFILE_FOR_SYMBOLS), true)
   957           ifeq ($$($1_USE_MAPFILE_FOR_SYMBOLS), true)
  1011 	    $(GetSymbols)
   960 	    $(GetSymbols)
  1012           endif
   961           endif
  1013         endif
   962         endif
  1014   endif
   963   endif
  1015 
   964 
  1016   ifneq (,$$($1_PROGRAM))
   965   ifeq ($$($1_TYPE), EXECUTABLE)
  1017     # A executable binary has been specified, setup the target for it.
   966     # A executable binary has been specified, setup the target for it.
  1018     $1_VARDEPS := $$($1_LD) $$($1_SYSROOT_LDFLAGS) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) \
   967     $1_VARDEPS := $$($1_LD) $$($1_SYSROOT_LDFLAGS) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) \
  1019         $$($1_LIBS) $$($1_EXTRA_LIBS) $$($1_MT) \
   968         $$($1_LIBS) $$($1_EXTRA_LIBS) $$($1_MT) \
  1020         $$($1_CODESIGN) $$($1_CREATE_DEBUGINFO_CMDS) $$($1_MANIFEST_VERSION) \
   969         $$($1_CODESIGN) $$($1_CREATE_DEBUGINFO_CMDS) $$($1_MANIFEST_VERSION) \
  1021         $$($1_STRIP_CMD)
   970         $$($1_STRIP_CMD)
  1036 		        $(EXE_OUT_OPTION)$$($1_TARGET) \
   985 		        $(EXE_OUT_OPTION)$$($1_TARGET) \
  1037 		        $$($1_ALL_OBJS) $$($1_RES) \
   986 		        $$($1_ALL_OBJS) $$($1_RES) \
  1038 		        $$($1_LIBS) $$($1_EXTRA_LIBS))
   987 		        $$($1_LIBS) $$($1_EXTRA_LIBS))
  1039                 ifeq ($(OPENJDK_TARGET_OS), windows)
   988                 ifeq ($(OPENJDK_TARGET_OS), windows)
  1040                   ifneq ($$($1_MANIFEST), )
   989                   ifneq ($$($1_MANIFEST), )
  1041 		    $$($1_MT) -nologo -manifest $$($1_MANIFEST) -identity:"$$($1_PROGRAM).exe, version=$$($1_MANIFEST_VERSION)" -outputresource:$$@;#1
   990 		    $$($1_MT) -nologo -manifest $$($1_MANIFEST) -identity:"$$($1_NAME).exe, version=$$($1_MANIFEST_VERSION)" -outputresource:$$@;#1
  1042                   endif
   991                   endif
  1043                 endif
   992                 endif
  1044                 # This only works if the openjdk_codesign identity is present on the system. Let
   993                 # This only works if the openjdk_codesign identity is present on the system. Let
  1045                 # silently fail otherwise.
   994                 # silently fail otherwise.
  1046                 ifneq (,$(CODESIGN))
   995                 ifneq ($(CODESIGN), )
  1047                   ifneq (,$$($1_CODESIGN))
   996                   ifneq ($$($1_CODESIGN), )
  1048 		    $(CODESIGN) -s openjdk_codesign $$@
   997 		    $(CODESIGN) -s openjdk_codesign $$@
  1049                   endif
   998                   endif
  1050                 endif
   999                 endif
  1051 		$$($1_CREATE_DEBUGINFO_CMDS)
  1000 		$$($1_CREATE_DEBUGINFO_CMDS)
  1052 		$$($1_STRIP_CMD)
  1001 		$$($1_STRIP_CMD)