# 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 rule to expand for each component
# definition file found


define def_file_rule

    # Clear out all possible variables a component definition file
    # may define
    def_file            :=
    def_path            :=
    def_deps            :=
    def_include_subdir  :=
    def_source_subdir   :=
    def_resource_subdir :=
    name                :=
    type                :=
    lang                :=
    header_list         :=
    resource_list       :=
    source_list         :=
    definition_list     :=
    source_lib_list     :=
    lib_list            :=
    static_lib_list     :=
    lib_path_list       :=
    include_path_list   :=
    compiler_flag_list  :=
    link_flag_list      :=


    $$(call debug_info,including def: $(1))

    def_file := $(1)
    def_path := $$(call def_file_to_root_path,$$(def_file))
    def_deps := $$(def_file) $$(config_file) $$(def_deps)


    ifeq ($$(def_include_subdir),)
        def_include_subdir := $$(include_subdir)
    endif

    ifeq ($$(def_source_subdir),)
        def_source_subdir := $$(source_subdir)
    endif

    ifeq ($$(def_resource_subdir),)
        def_resource_subdir := $$(resource_subdir)
    endif


    # Include the found component definition file
    include $$(def_file)

    # Custom component definition files might not bother with a name so skip the below stuff if
    # that's the case'
    ifneq ($$(name),)
        ifneq ($$(filter $$(name), $$(build_target_list)),)
            $$(call def_error,duplicate component name used here: $$($$(name).def_file))
        endif

        $$(name).def_file := $$(def_file)

        # Include the config file again after including the definition file.
        # This way a config file could specify component-specific settings
        -include $$(config_file)


        #  If a header list was specified, include header rules
        ifneq ($$(header_list),)
            include $$(weld_path)/headers.mk
        endif

        # If a resource list was specified, include resourcerules
        ifneq ($$(resource_list),)
            include $$(weld_path)/resources.mk
        endif

        # If the type is set to bin or lib include the compilation rules for the
        # specified language
        ifneq ($$(filter bin lib,$$(type)),)
            include $$(weld_path)/lang/$$(lang).mk
        endif

        # Add the found component to the standard set of build targets
        build_target_list         := $$(name) $$(build_target_list)
        headers_target_list       := $$(name)_headers $$(headers_target_list)
        clean_target_list         := clean_$$(name) $$(clean_target_list)
        clean_headers_target_list := clean_$$(name)_headers


        # Declare default targets for this component.  Various component rules
        # may add build steps as dependencies to these targets
        .PHONY : $$(name)_headers
        $$(name)_headers : $$(name)_def_headers
        $$(name)_headers :

        .PHONY : $$(name)_def_headers
        $$(name)_def_headers :

        .PHONY : clean_$$(name)_headers
        clean_$$(name)_headers : clean_$$(name)_def_headers
        clean_$$(name)_headers :

        .PHONY : clean_$$(name)_def_headers
        clean_$$(name)_def_headers :

        .PHONY : $$(name)_compile
        $$(name)_compile : $$(name)_def_compile
        $$(name)_compile :

        .PHONY : $$(name)_def_compile
        $$(name)_def_compile :

        .PHONY : clean_$$(name)_compile
        clean_$$(name)_compile : clean_$$(name)_def_compile
        clean_$$(name)_compile :

        .PHONY : clean_$$(name)_def_compile
        clean_$$(name)_def_compile :

        .PHONY : $$(name)_resources
        $$(name)_resources : $$(name)_def_resources
        $$(name)_resources :

        .PHONY : $$(name)_def_resources
        $$(name)_def_resources :

        .PHONY : clean_$$(name)_resources
        clean_$$(name)_resources : clean_$$(name)_def_resources
        clean_$$(name)_resources :

        .PHONY : clean_$$(name)_def_resources
        clean_$$(name)_def_resources :

        # Define the "make <name>" target for the component.  This target
        # should build the entire component
        .PHONY : $$(name)
        $$(name) : $$(name)_headers
        $$(name) : $$(name)_compile
        $$(name) : $$(name)_resources
        $$(name) :

        .PHONY : clean_$$(name)
        clean_$$(name) : clean_$$(name)_headers
        clean_$$(name) : clean_$$(name)_compile
        clean_$$(name) : clean_$$(name)_resources
        clean_$$(name) :
    endif

endef
