| # 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)) |