blob: 97dfd467d9e5fae24dc7bbcd1eb3704124bd6943 [file] [log] [blame]
# Copyright 2015 Andrew Gottemoller.
#
# This software is a copyrighted work licensed under the terms of the
# Weld license. Please consult the file "WELD_LICENSE" for
# details.
# This makefile defines the set of rules for a header list
# This makefile is included for each component definition so clear out
# any variables used by this makefile
c_toolchain_path :=
def_source_path :=
def_obj_output_path :=
source_file :=
source_name :=
def_source_file :=
obj_alias :=
obj_goal_list :=
obj_goal_file_list :=
compile_goal :=
compile_goal_path :=
full_compile_goal_path :=
c_toolchain_path := $(weld_path)/toolchain/gcc
def_source_path := $(def_path)/$(def_source_subdir)
def_obj_output_path := $(obj_output_path)/$(name)
# Add the weld project's lib and header paths to the specified lib
# and include path lists
lib_path_list := $(lib_output_path) $(global_lib_path_list) $(lib_path_list)
include_path_list := $(header_output_path) $(global_include_path_list) $(include_path_list)
# Add the global definition list to the component definition's list
definition_list := $(global_definition_list) $(definition_list)
# Specify a default set of compiler flags in addition to those
# flags specified by the component definition
compiler_flag_list := -g \
-fstrict-aliasing \
-funsigned-char \
-Wall \
-Winline \
-Wmissing-field-initializers \
-Wsign-compare \
-Wstrict-aliasing=1 \
-pedantic \
$(global_compiler_flag_list) \
$(compiler_flag_list)
# Add the global link flags to the component definition's list
link_flag_list := $(global_link_flag_list) $(link_flag_list)
# Include settings for the specified language, platform, mode, and
# architecture
include $(c_toolchain_path)/lang/$(lang).mk
include $(c_toolchain_path)/platform/$(platform).mk
include $(c_toolchain_path)/mode/$(mode).mk
include $(c_toolchain_path)/arch/$(arch).mk
define source_file_rule
$(call debug_info,source specified: $(1))
source_file := $(1)
source_name := $$(notdir $(1))
def_source_file := $$(def_source_path)/$$(source_file)
obj_alias := $$(name)/$$(basename $$(source_name)).o
obj_goal_list := $$(obj_alias) $$(obj_goal_list)
# Define an alias for the object file so the user can do
# "make name/foo.o" on the command line
vpath $$(obj_alias) $$(obj_output_path)
# Try to include the object's dependency file generated by
# a previous compile
-include $$(obj_output_path)/$$(obj_alias).d
# Set the target specific variables and dependencies for this
# object
$$(obj_alias) : def_source_file := $$(def_source_file)
$$(obj_alias) : obj_alias := $$(obj_alias)
$$(obj_alias) : $$(def_deps)
$$(obj_alias) : $$(def_source_file)
endef
# Expand the source file rule for each source specified
$(foreach file,$(source_list),$(eval $(call source_file_rule,$(file))))
obj_goal_file_list := $(addprefix $(obj_output_path)/,$(obj_goal_list))
source_lib_file_list := $(addsuffix .a,$(addprefix lib,$(source_lib_list)))
full_compile_goal_path := $(dir $(compile_goal_path)/$(compile_goal))
# Add the necessary output directories to the list of directories to create
directory_list := $(def_obj_output_path) $(full_compile_goal_path) $(directory_list)
# Create aliases for the compile goal and library names
vpath %.a $(lib_path_list)
vpath $(compile_goal) $(compile_goal_path)
# Add the component's compile goal as a dependency to this component's
# compile target
$(name)_def_compile : $(compile_goal)
# The actual recipe for an object file
$(obj_goal_list) : compile_command := $(compile_command)
$(obj_goal_list) : obj_output_path := $(obj_output_path)
$(obj_goal_list) : include_path_list := $(include_path_list)
$(obj_goal_list) : definition_list := $(definition_list)
$(obj_goal_list) : compiler_flag_list := $(compiler_flag_list)
$(obj_goal_list) : | headers
$(obj_goal_list) : | $(def_obj_output_path)
$(obj_goal_list) :
$(call print_progress,$(obj_alias))
$(strip \
$(compile_command) -o $(call path_to_native,$(obj_output_path)/$(obj_alias)) \
-MD -MP -MF $(call path_to_native,$(obj_output_path)/$(obj_alias).d) -MQ $(obj_alias) \
$(compiler_flag_list) \
$(addprefix -I,$(call path_to_native,$(include_path_list))) \
$(addprefix -D,$(definition_list)) \
-c $(call path_to_native,$(def_source_file)))
# The actual recipe for linking a library or binary
$(compile_goal) : compile_command := $(compile_command)
$(compile_goal) : link_flag_list := $(link_flag_list)
$(compile_goal) : compile_goal := $(compile_goal)
$(compile_goal) : compile_goal_path := $(compile_goal_path)
$(compile_goal) : obj_goal_file_list := $(obj_goal_file_list)
$(compile_goal) : lib_path_list := $(lib_path_list)
$(compile_goal) : lib_list := $(lib_list)
$(compile_goal) : static_lib_list := $(static_lib_list)
$(compile_goal) : source_lib_list := $(source_lib_list)
$(compile_goal) : $(obj_goal_list)
$(compile_goal) : $(source_lib_file_list)
$(compile_goal) : | $(full_compile_goal_path)
$(compile_goal) :
$(call print_progress,$(compile_goal))
ifeq ($(type), lib)
$(call remove_files,$(call path_to_native,$(compile_goal_path)/$(compile_goal)))
$(strip \
ar rcs \
$(link_flag_list) \
$(call path_to_native,$(compile_goal_path)/$(compile_goal)) \
$(call path_to_native,$(obj_goal_file_list)))
else
$(strip \
$(compile_command) -o $(call path_to_native,$(compile_goal_path)/$(compile_goal)) \
$(link_flag_list) \
$(addprefix -L,$(call path_to_native,$(lib_path_list))) \
$(call path_to_native,$(obj_goal_file_list)) \
-Wl,--start-group \
$(addprefix -l,$(lib_list) $(source_lib_list)) \
$(addsuffix .a,$(addprefix -l:lib,$(static_lib_list))) \
-Wl,--end-group)
endif
.PHONY : clean_$(name)_def_compile
clean_$(name)_def_compile : def_obj_output_path := $(def_obj_output_path)
clean_$(name)_def_compile : compile_goal := $(compile_goal)
clean_$(name)_def_compile : compile_goal_path := $(compile_goal_path)
clean_$(name)_def_compile :
$(call print_progress,$@)
$(call remove_files,$(def_obj_output_path)/*.o)
$(call remove_files,$(def_obj_output_path)/*.o.*)
$(call remove_files,$(compile_goal_path)/$(compile_goal))