Changeset 729 for trunk


Ignore:
Timestamp:
Dec 17, 2006, 3:12:07 AM (19 years ago)
Author:
bird
Message:

The target _PATH property should be working now.

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/kBuild/footer.kmk

    r726 r729  
    123123# Basic macros
    124124#
    125 
    126 ## Figure out the tool for a source
    127 # @param    target       source file
    128 # @param    source       normalized main target
    129 # @param    type         tooltype
    130 # @param    bld_trg      build target.
    131 # @param    bld_trg_arch build target architecture.
    132 # @remark       Obsoleted by kBuild helpers in kmk. Only required for gmake compatbility.
    133 _SOURCE_TOOL = $(strip $(firstword \
    134         $($(target)_$(source)_$(type)TOOL.$(bld_trg).$(bld_trg_arch)) \
    135         $($(target)_$(source)_$(type)TOOL.$(bld_trg)) \
    136         $($(target)_$(source)_$(type)TOOL) \
    137         $($(target)_$(source)_TOOL.$(bld_trg).$(bld_trg_arch)) \
    138         $($(target)_$(source)_TOOL.$(bld_trg)) \
    139         $($(target)_$(source)_TOOL) \
    140         $($(source)_$(type)TOOL.$(bld_trg).$(bld_trg_arch)) \
    141         $($(source)_$(type)TOOL.$(bld_trg)) \
    142         $($(source)_$(type)TOOL) \
    143         $($(source)_TOOL.$(bld_trg).$(bld_trg_arch)) \
    144         $($(source)_TOOL.$(bld_trg)) \
    145         $($(source)_TOOL) \
    146         $($(target)_$(type)TOOL.$(bld_trg).$(bld_trg_arch)) \
    147         $($(target)_$(type)TOOL.$(bld_trg)) \
    148         $($(target)_$(type)TOOL) \
    149         $($(target)_TOOL.$(bld_trg).$(bld_trg_arch)) \
    150         $($(target)_TOOL.$(bld_trg)) \
    151         $($(target)_TOOL) \
    152         $($(type)TOOL.$(bld_trg).$(bld_trg_arch)) \
    153         $($(type)TOOL.$(bld_trg)) \
    154         $($(type)TOOL) \
    155         $(TOOL.$(bld_trg).$(bld_trg_arch)) \
    156         $(TOOL.$(bld_trg)) \
    157         $(TOOL) ))
    158125
    159126## Figure out the tool for a target.
     
    193160,$(if $(subst :$(call no-root-slash,$(call no-drive,$(_fix_path))):,,:$(_fix_path):),$(_fix_path),$(abspath $2/$(_fix_path))))
    194161endif
    195 
    196 ## Figure out where to put object files.
    197 # @param    $1      source file
    198 # @param    $2      normalized main target
    199 # @remark There are two major hacks here:
    200 #           1. Source files in the output directory are translated into a gen/ subdir.
    201 #               2. Catch anyone specifying $(PATH_SUB_CURRENT)/sourcefile.c.
    202 # @remark       obsoleted by kBuild helpers in kmk. Only required for gmake compatbility.
    203 _OBJECT_BASE = $(PATH_TARGET)/$(2)/$(call no-root-slash,$(call no-drive,$(basename \
    204         $(patsubst $(PATH_ROOT)/%,%,$(patsubst $(PATH_SUB_CURRENT)/%,%,$(patsubst $(PATH_TARGET)/$(2)/%,gen/%,$(1)))))))
    205162
    206163## Figure out where to put object files.
     
    930887$(out): $(comp-vars _TARGET_$(target)_DIGEST_PREV,_TARGET_$(target)_DIGEST,FORCE) | $(call DIRDEP,$(inst))
    931888        $$(QUIET)$$(RM) -f $$@
    932         $$(call MSG_L1,$$(if $$(_TARGET_$(target)_DIGEST),$$(if $$(wildcard $(out).lst),Re-fetching,Fetching),Removing) $(target)...)
     889        $$(call MSG_L1,$$(if $$(wildcard $(out).lst),$$(if $$(_TARGET_$(target)_DIGEST),Re-fetching,Removing),Fetching) $(target)...)
    933890        $$(QUIET)$$(if $$(wildcard $(out).lst      ),$$(MAKE) -f $(MAKEFILE) --no-print-directory $(out)_unfetched)
    934891        $$(QUIET)$$(if  $$(_TARGET_$(target)_DIGEST),$$(MAKE) -f $(MAKEFILE) --no-print-directory $(out).lst,$$(RMDIR) -p --ignore-fail-on-non-empty --ignore-fail-on-not-exist $$(dir $$@))
     
    11271084# @param    bld_trg_arch  Build target arch.
    11281085# @param    bld_trg_cpu   Build target cpu.
    1129 def_target_source_c_cpp_asm_rc_new = $(kb-src-one x)
     1086def_target_source_c_cpp_asm_rc_new = $(kb-src-one )
    11301087ifneq ($(filter kb-src-one,$(KMK_FEATURES)),)
    11311088 def_target_source_c_cpp_asm_rc_var = def_target_source_c_cpp_asm_rc_new
     
    11391096# @param    much-more...
    11401097define def_target_sources
    1141 
    1142 # Apply any default path on the sources first.
    1143 ifneq ($(defpath),)
    1144  ifdef $(target)_SOURCES
    1145   $(target)_SOURCES := $(call abspathex,$($(target)_SOURCES),$(defpath))
    1146  endif
    1147  ifdef $(target)_SOURCES.$(bld_trg)
    1148   $(target)_SOURCES.$(bld_trg) := $(call abspathex,$($(target)_SOURCES.$(bld_trg)),$(defpath))
    1149  endif
    1150  ifdef $(target)_SOURCES.$(bld_trg).$(bld_trg_arch)
    1151   $(target)_SOURCES.$(bld_trg).$(bld_trg_arch) := $(call abspathex,$($(target)_SOURCES.$(bld_trg).$(bld_trg_arch)),$(defpath))
    1152  endif
    1153  ifdef $(target)_SOURCES.$(bld_trg_arch)
    1154   $(target)_SOURCES.$(bld_trg_arch) := $(call abspathex,$($(target)_SOURCES.$(bld_trg_arch)),$(defpath))
    1155  endif
    1156  ifdef $(target)_SOURCES.$(bld_trg_cpu)
    1157   $(target)_SOURCES.$(bld_trg_cpu) := $(call abspathex,$($(target)_SOURCES.$(bld_trg_cpu)),$(defpath))
    1158  endif
    1159  ifdef $(target)_SOURCES.$(bld_type)
    1160   $(target)_SOURCES.$(bld_type) := $(call abspathex,$($(target)_SOURCES.$(bld_type)),$(defpath))
    1161  endif
    1162 endif
    1163 
    11641098#$ (warning def_target_sources)
    11651099# C sources
     
    11941128# @param        $(definst)  The default _INST value.
    11951129# @param        $(typevar)  The name of the variable with all the root targets of its type.
    1196 # @obsolete Only library uses this now.
     1130# @remark  Only library uses this now.
    11971131define def_target_install_pluss
    11981132ifndef $(target)_NOINST
  • trunk/kBuild/gnumake-footer.kmk

    r723 r729  
    2424#
    2525#
     26
     27## Figure out the tool for a source
     28# @param    target       source file
     29# @param    source       normalized main target
     30# @param    type         tooltype
     31# @param    bld_trg      build target.
     32# @param    bld_trg_arch build target architecture.
     33# @remark       Obsoleted by kBuild helpers in kmk. Only required for gmake compatbility.
     34_SOURCE_TOOL = $(strip $(firstword \
     35        $($(target)_$(source)_$(type)TOOL.$(bld_trg).$(bld_trg_arch)) \
     36        $($(target)_$(source)_$(type)TOOL.$(bld_trg)) \
     37        $($(target)_$(source)_$(type)TOOL) \
     38        $($(target)_$(source)_TOOL.$(bld_trg).$(bld_trg_arch)) \
     39        $($(target)_$(source)_TOOL.$(bld_trg)) \
     40        $($(target)_$(source)_TOOL) \
     41        $($(source)_$(type)TOOL.$(bld_trg).$(bld_trg_arch)) \
     42        $($(source)_$(type)TOOL.$(bld_trg)) \
     43        $($(source)_$(type)TOOL) \
     44        $($(source)_TOOL.$(bld_trg).$(bld_trg_arch)) \
     45        $($(source)_TOOL.$(bld_trg)) \
     46        $($(source)_TOOL) \
     47        $($(target)_$(type)TOOL.$(bld_trg).$(bld_trg_arch)) \
     48        $($(target)_$(type)TOOL.$(bld_trg)) \
     49        $($(target)_$(type)TOOL) \
     50        $($(target)_TOOL.$(bld_trg).$(bld_trg_arch)) \
     51        $($(target)_TOOL.$(bld_trg)) \
     52        $($(target)_TOOL) \
     53        $($(type)TOOL.$(bld_trg).$(bld_trg_arch)) \
     54        $($(type)TOOL.$(bld_trg)) \
     55        $($(type)TOOL) \
     56        $(TOOL.$(bld_trg).$(bld_trg_arch)) \
     57        $(TOOL.$(bld_trg)) \
     58        $(TOOL) ))
     59
     60## Figure out where to put object files.
     61# @param    $1      source file
     62# @param    $2      normalized main target
     63# @remark There are two major hacks here:
     64#           1. Source files in the output directory are translated into a gen/ subdir.
     65#               2. Catch anyone specifying $(PATH_SUB_CURRENT)/sourcefile.c.
     66# @remark       obsoleted by kBuild helpers in kmk. Only required for gmake compatbility.
     67_OBJECT_BASE = $(PATH_TARGET)/$(2)/$(call no-root-slash,$(call no-drive,$(basename \
     68        $(patsubst $(PATH_ROOT)/%,%,$(patsubst $(PATH_SUB_CURRENT)/%,%,$(patsubst $(PATH_TARGET)/$(2)/%,gen/%,$(1)))))))
    2669
    2770
  • trunk/kBuild/subfooter.kmk

    r725 r729  
    5757#
    5858MAKEFILE_CURRENT := $(call stack-pop,_SUB_MAKEFILE_STACK)
    59 PATH_SUB_CURRENT := $(abspath $(patsubst %/,%,$(dir $(MAKEFILE_CURRENT))))
     59PATH_SUB_CURRENT := $(abspath $(dir $(MAKEFILE_CURRENT)))
    6060
    6161#
     
    6666endif
    6767
     68
  • trunk/kBuild/subheader.kmk

    r725 r729  
    2525#
    2626
    27 ifndef _SUB_MAKEFILE_STACK
     27ifndef _SUB_MAKEFILE_NOT_FIRST
     28
    2829 #
    2930 # The first time we just take the makefile context set by header.kmk.
    3031 #
     32 _SUB_MAKEFILE_NOT_FIRST := 1
    3133 include $(PATH_KBUILD)/header.kmk
    32 
     34 
    3335else
    3436
     
    6365 # Switch context.
    6466 #
     67
     68 # push the current old makefile onto the stack.
     69 $(call stack-push,_SUB_MAKEFILE_STACK,$(MAKEFILE_CURRENT))
     70
     71 # the current makefile is the 2nd from the end of the MAKEFILE_LIST (we're the last one).
    6572 __tmp := $(MAKEFILE_LIST)
    6673 $(call stack-popv,__tmp)
    6774 MAKEFILE_CURRENT := $(call stack-top,__tmp)
    68  PATH_SUB_CURRENT := $(abspath $(patsubst %/,%,$(dir $(MAKEFILE_CURRENT))))
     75 PATH_SUB_CURRENT := $(abspath $(dir $(MAKEFILE_CURRENT)))
    6976endif
    7077
    71 $(call stack-push,_SUB_MAKEFILE_STACK,$(MAKEFILE_CURRENT))
    72 
  • trunk/src/gmake/function.c

    r725 r729  
    19331933/* Return the absolute name of file NAME which does not contain any `.',
    19341934   `..' components nor any repeated path separators ('/').   */
    1935 
    1936 static char *
     1935#ifdef KMK
     1936char *
     1937#else
     1938static char *
     1939#endif
    19371940abspath (const char *name, char *apath)
    19381941{
     
    24542457  { STRING_SIZE_TUPLE("kb-obj-base"),   1,  1,  0,  func_kbuild_object_base},
    24552458  { STRING_SIZE_TUPLE("kb-obj-suff"),   1,  1,  0,  func_kbuild_object_suffix},
    2456   { STRING_SIZE_TUPLE("kb-src-prop"),   3,  3,  0,  func_kbuild_source_prop},
    2457   { STRING_SIZE_TUPLE("kb-src-one"),    1,  1,  0,  func_kbuild_source_one},
     2459  { STRING_SIZE_TUPLE("kb-src-prop"),   4,  4,  0,  func_kbuild_source_prop},
     2460  { STRING_SIZE_TUPLE("kb-src-one"),    0,  1,  0,  func_kbuild_source_one},
    24582461#endif
    24592462};
  • trunk/src/gmake/kbuild.c

    r725 r729  
    4343#endif
    4444
     45/* function.c */
     46char * abspath(const char *name, char *apath);
     47
     48/**
     49 * Applies the specified default path to any relative paths in *ppsz.
     50 *
     51 * @param   pDefPath        The default path.
     52 * @param   ppsz            Pointer to the string pointer. If we expand anything, *ppsz
     53 *                          will be replaced and the caller is responsible for calling free() on it.
     54 * @param   pcch            IN: *pcch contains the current string length.
     55 *                          OUT: *pcch contains the new string length.
     56 * @param   pcchAlloc       *pcchAlloc contains the length allocated for the string. Can be NULL.
     57 * @param   fCanFree        Whether *ppsz should be freed when we replace it.
     58 */
     59static void
     60kbuild_apply_defpath(struct variable *pDefPath, char **ppsz, int *pcch, int *pcchAlloc, int fCanFree)
     61{
     62    char *pszIterator;
     63    const char *pszInCur;
     64    unsigned int cchInCur;
     65    unsigned int cRelativePaths;
     66
     67    /*
     68     * The first pass, count the relative paths.
     69     */
     70    cRelativePaths = 0;
     71    pszIterator = *ppsz;
     72    while ((pszInCur = find_next_token(&pszIterator, &cchInCur)))
     73    {
     74        /* is relative? */
     75#ifdef HAVE_DOS_PATHS
     76        if (pszInCur[0] != '/' && pszInCur[0] != '\\' && (cchInCur < 2 || pszInCur[1] != ':'))
     77#else
     78        if (pszInCur[0] != '/')
     79#endif
     80            cRelativePaths++;
     81    }
     82
     83    /*
     84     * The second pass construct the new string.
     85     */
     86    if (cRelativePaths)
     87    {
     88        const size_t cchOut = *pcch + cRelativePaths * (pDefPath->value_length + 1) + 1;
     89        char *pszOut = xmalloc(cchOut);
     90        char *pszOutCur = pszOut;
     91        const char *pszInNextCopy = *ppsz;
     92
     93        cRelativePaths = 0;
     94        pszIterator = *ppsz;
     95        while ((pszInCur = find_next_token(&pszIterator, &cchInCur)))
     96        {
     97            /* is relative? */
     98#ifdef HAVE_DOS_PATHS
     99            if (pszInCur[0] != '/' && pszInCur[0] != '\\' && (cchInCur < 2 || pszInCur[1] != ':'))
     100#else
     101            if (pszInCur[0] != '/')
     102#endif
     103            {
     104                PATH_VAR(szAbsPathIn);
     105                PATH_VAR(szAbsPathOut);
     106
     107                if (pDefPath->value_length + cchInCur + 1 >= GET_PATH_MAX)
     108                    continue;
     109
     110                /* Create the abspath input. */
     111                memcpy(szAbsPathIn, pDefPath->value, pDefPath->value_length);
     112                szAbsPathIn[pDefPath->value_length] = '/';
     113                memcpy(&szAbsPathIn[pDefPath->value_length + 1], pszInCur, cchInCur);
     114                szAbsPathIn[pDefPath->value_length + 1 + cchInCur] = '\0';
     115
     116                if (abspath(szAbsPathIn, szAbsPathOut) != NULL)
     117                {
     118                    const size_t cchAbsPathOut = strlen(szAbsPathOut);
     119                    assert(cchAbsPathOut <= pDefPath->value_length + 1 + cchInCur);
     120
     121                    /* copy leading input */
     122                    if (pszInCur != pszInNextCopy)
     123                    {
     124                        const size_t cchCopy = pszInCur - pszInNextCopy;
     125                        memcpy(pszOutCur, pszInNextCopy, cchCopy);
     126                        pszOutCur += cchCopy;
     127                    }
     128                    pszInNextCopy = pszInCur + cchInCur;
     129
     130                    /* copy out the abspath. */
     131                    memcpy(pszOutCur, szAbsPathOut, cchAbsPathOut);
     132                    pszOutCur += cchAbsPathOut;
     133                }
     134            }
     135        }
     136        /* the final copy (includes the nil). */
     137        cchInCur = *ppsz + *pcch - pszInNextCopy;
     138        memcpy(pszOutCur, pszInNextCopy, cchInCur);
     139        pszOutCur += cchInCur;
     140        *pszOutCur = '\0';
     141        assert((size_t)(pszOutCur - pszOut) < cchOut);
     142
     143        /* set return values */
     144        if (fCanFree)
     145            free(*ppsz);
     146        *ppsz = pszOut;
     147        *pcch = pszOutCur - pszOut;
     148        if (pcchAlloc)
     149            *pcchAlloc = cchOut;
     150    }
     151}
     152
    45153
    46154/**
     
    157265}
    158266
     267/**
     268 * Looks up a variable and applies default a path to all relative paths.
     269 * The value_length field is valid upon successful return.
     270 *
     271 * @returns Pointer to the variable. NULL if not found.
     272 * @param   pDefPath    The default path.
     273 * @param   pszName     The variable name.
     274 */
     275static struct variable *
     276kbuild_lookup_variable_defpath(struct variable *pDefPath, const char *pszName)
     277{
     278    struct variable *pVar = kbuild_lookup_variable(pszName);
     279    if (pVar && pDefPath)
     280        kbuild_apply_defpath(pDefPath, &pVar->value, &pVar->value_length, &pVar->value_alloc_len, 1);
     281    return pVar;
     282}
     283
    159284/** Same as kbuild_lookup_variable except that a '%s' in the name string
    160285 * will be substituted with the values of the variables in the va list.  */
    161286static struct variable *
    162 kbuild_lookup_variable_fmt_va(const char *pszNameFmt, va_list va)
     287kbuild_lookup_variable_fmt_va(struct variable *pDefPath, const char *pszNameFmt, va_list va)
    163288{
    164289    va_list va2;
     
    206331    va_end(va2);
    207332
     333    if (pDefPath)
     334        return kbuild_lookup_variable_defpath(pDefPath, pszName);
    208335    return kbuild_lookup_variable(pszName);
    209336}
     
    212339 * will be substituted with the values of the variables in the ellipsis.  */
    213340static struct variable *
    214 kbuild_lookup_variable_fmt(const char *pszNameFmt, ...)
     341kbuild_lookup_variable_fmt(struct variable *pDefPath, const char *pszNameFmt, ...)
    215342{
    216343    struct variable *pVar;
    217344    va_list va;
    218345    va_start(va, pszNameFmt);
    219     pVar = kbuild_lookup_variable_fmt_va(pszNameFmt, va);
     346    pVar = kbuild_lookup_variable_fmt_va(pDefPath, pszNameFmt, va);
    220347    va_end(va);
    221348    return pVar;
     
    240367    PropF2.value_length = strlen(pszPropF2);
    241368
    242     if (    (pVar = kbuild_lookup_variable_fmt("%_%_%%.%.%",pTarget, pSource, pType, &PropF2, pBldTrg, pBldTrgArch))
    243         ||  (pVar = kbuild_lookup_variable_fmt("%_%_%%.%",  pTarget, pSource, pType, &PropF2, pBldTrg))
    244         ||  (pVar = kbuild_lookup_variable_fmt("%_%_%%",    pTarget, pSource, pType, &PropF2))
    245         ||  (pVar = kbuild_lookup_variable_fmt("%_%_%.%.%", pTarget, pSource, &PropF2, pBldTrg, pBldTrgArch))
    246         ||  (pVar = kbuild_lookup_variable_fmt("%_%_%.%",   pTarget, pSource, &PropF2, pBldTrg))
    247         ||  (pVar = kbuild_lookup_variable_fmt("%_%_%",     pTarget, pSource, &PropF2))
    248         ||  (pVar = kbuild_lookup_variable_fmt("%_%%.%.%",  pSource, pType, &PropF2, pBldTrg, pBldTrgArch))
    249         ||  (pVar = kbuild_lookup_variable_fmt("%_%%.%",    pSource, pType, &PropF2, pBldTrg))
    250         ||  (pVar = kbuild_lookup_variable_fmt("%_%%",      pSource, pType, &PropF2))
    251         ||  (pVar = kbuild_lookup_variable_fmt("%_%.%.%",   pSource, &PropF2, pBldTrg, pBldTrgArch))
    252         ||  (pVar = kbuild_lookup_variable_fmt("%_%.%",     pSource, &PropF2, pBldTrg))
    253         ||  (pVar = kbuild_lookup_variable_fmt("%_%",       pSource, &PropF2))
    254         ||  (pVar = kbuild_lookup_variable_fmt("%_%%.%.%",  pTarget, pType, &PropF2, pBldTrg, pBldTrgArch))
    255         ||  (pVar = kbuild_lookup_variable_fmt("%_%%.%",    pTarget, pType, &PropF2, pBldTrg))
    256         ||  (pVar = kbuild_lookup_variable_fmt("%_%%",      pTarget, pType, &PropF2))
    257         ||  (pVar = kbuild_lookup_variable_fmt("%_%.%.%",   pTarget, &PropF2, pBldTrg, pBldTrgArch))
    258         ||  (pVar = kbuild_lookup_variable_fmt("%_%.%",     pTarget, &PropF2, pBldTrg))
    259         ||  (pVar = kbuild_lookup_variable_fmt("%_%",       pTarget, &PropF2))
    260 
    261         ||  (pTool && (pVar = kbuild_lookup_variable_fmt("TOOL_%_%%.%.%",   pTool, pType, &PropF2, pBldTrg, pBldTrgArch)))
    262         ||  (pTool && (pVar = kbuild_lookup_variable_fmt("TOOL_%_%%.%",     pTool, pType, &PropF2, pBldTrg)))
    263         ||  (pTool && (pVar = kbuild_lookup_variable_fmt("TOOL_%_%%",       pTool, pType, &PropF2)))
    264         ||  (pTool && (pVar = kbuild_lookup_variable_fmt("TOOL_%_%.%.%",    pTool, &PropF2, pBldTrg, pBldTrgArch)))
    265         ||  (pTool && (pVar = kbuild_lookup_variable_fmt("TOOL_%_%.%",      pTool, &PropF2, pBldTrg)))
    266         ||  (pTool && (pVar = kbuild_lookup_variable_fmt("TOOL_%_%",        pTool, &PropF2)))
    267 
    268         ||  (pVar = kbuild_lookup_variable_fmt("%%.%.%",    pType, &PropF1, pBldTrg, pBldTrgArch))
    269         ||  (pVar = kbuild_lookup_variable_fmt("%%.%",      pType, &PropF1, pBldTrg))
    270         ||  (pVar = kbuild_lookup_variable_fmt("%%",        pType, &PropF1))
    271         ||  (pVar = kbuild_lookup_variable_fmt("%.%.%",     &PropF1, pBldTrg, pBldTrgArch))
    272         ||  (pVar = kbuild_lookup_variable_fmt("%.%",       &PropF1, pBldTrg))
     369    if (    (pVar = kbuild_lookup_variable_fmt(NULL, "%_%_%%.%.%",pTarget, pSource, pType, &PropF2, pBldTrg, pBldTrgArch))
     370        ||  (pVar = kbuild_lookup_variable_fmt(NULL, "%_%_%%.%",  pTarget, pSource, pType, &PropF2, pBldTrg))
     371        ||  (pVar = kbuild_lookup_variable_fmt(NULL, "%_%_%%",    pTarget, pSource, pType, &PropF2))
     372        ||  (pVar = kbuild_lookup_variable_fmt(NULL, "%_%_%.%.%", pTarget, pSource, &PropF2, pBldTrg, pBldTrgArch))
     373        ||  (pVar = kbuild_lookup_variable_fmt(NULL, "%_%_%.%",   pTarget, pSource, &PropF2, pBldTrg))
     374        ||  (pVar = kbuild_lookup_variable_fmt(NULL, "%_%_%",     pTarget, pSource, &PropF2))
     375        ||  (pVar = kbuild_lookup_variable_fmt(NULL, "%_%%.%.%",  pSource, pType, &PropF2, pBldTrg, pBldTrgArch))
     376        ||  (pVar = kbuild_lookup_variable_fmt(NULL, "%_%%.%",    pSource, pType, &PropF2, pBldTrg))
     377        ||  (pVar = kbuild_lookup_variable_fmt(NULL, "%_%%",      pSource, pType, &PropF2))
     378        ||  (pVar = kbuild_lookup_variable_fmt(NULL, "%_%.%.%",   pSource, &PropF2, pBldTrg, pBldTrgArch))
     379        ||  (pVar = kbuild_lookup_variable_fmt(NULL, "%_%.%",     pSource, &PropF2, pBldTrg))
     380        ||  (pVar = kbuild_lookup_variable_fmt(NULL, "%_%",       pSource, &PropF2))
     381        ||  (pVar = kbuild_lookup_variable_fmt(NULL, "%_%%.%.%",  pTarget, pType, &PropF2, pBldTrg, pBldTrgArch))
     382        ||  (pVar = kbuild_lookup_variable_fmt(NULL, "%_%%.%",    pTarget, pType, &PropF2, pBldTrg))
     383        ||  (pVar = kbuild_lookup_variable_fmt(NULL, "%_%%",      pTarget, pType, &PropF2))
     384        ||  (pVar = kbuild_lookup_variable_fmt(NULL, "%_%.%.%",   pTarget, &PropF2, pBldTrg, pBldTrgArch))
     385        ||  (pVar = kbuild_lookup_variable_fmt(NULL, "%_%.%",     pTarget, &PropF2, pBldTrg))
     386        ||  (pVar = kbuild_lookup_variable_fmt(NULL, "%_%",       pTarget, &PropF2))
     387
     388        ||  (pTool && (pVar = kbuild_lookup_variable_fmt(NULL, "TOOL_%_%%.%.%",   pTool, pType, &PropF2, pBldTrg, pBldTrgArch)))
     389        ||  (pTool && (pVar = kbuild_lookup_variable_fmt(NULL, "TOOL_%_%%.%",     pTool, pType, &PropF2, pBldTrg)))
     390        ||  (pTool && (pVar = kbuild_lookup_variable_fmt(NULL, "TOOL_%_%%",       pTool, pType, &PropF2)))
     391        ||  (pTool && (pVar = kbuild_lookup_variable_fmt(NULL, "TOOL_%_%.%.%",    pTool, &PropF2, pBldTrg, pBldTrgArch)))
     392        ||  (pTool && (pVar = kbuild_lookup_variable_fmt(NULL, "TOOL_%_%.%",      pTool, &PropF2, pBldTrg)))
     393        ||  (pTool && (pVar = kbuild_lookup_variable_fmt(NULL, "TOOL_%_%",        pTool, &PropF2)))
     394
     395        ||  (pVar = kbuild_lookup_variable_fmt(NULL, "%%.%.%",    pType, &PropF1, pBldTrg, pBldTrgArch))
     396        ||  (pVar = kbuild_lookup_variable_fmt(NULL, "%%.%",      pType, &PropF1, pBldTrg))
     397        ||  (pVar = kbuild_lookup_variable_fmt(NULL, "%%",        pType, &PropF1))
     398        ||  (pVar = kbuild_lookup_variable_fmt(NULL, "%.%.%",     &PropF1, pBldTrg, pBldTrgArch))
     399        ||  (pVar = kbuild_lookup_variable_fmt(NULL, "%.%",       &PropF1, pBldTrg))
    273400        ||  (pVar = kbuild_lookup_variable(pszPropF1))
    274401       )
     
    651778
    652779/* releases resources allocated in the kbuild_get_sdks. */
     780static void
    653781kbuild_put_sdks(struct kbuild_sdks *pSdks)
    654782{
     
    799927    {
    800928        struct variable    *pVar;
    801         size_t              cchExp;
     929        int                 cchExp;
    802930        char               *pszExp;
    803931    } *paVars;
     
    817945    iVar = 0;
    818946    /* the tool (lowest priority) */
    819     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("TOOL_%_%",      pTool, &Prop);
    820     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("TOOL_%_%.%",    pTool, &Prop, pBldType);
    821     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("TOOL_%_%.%",    pTool, &Prop, pBldTrg);
    822     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("TOOL_%_%.%",    pTool, &Prop, pBldTrgArch);
    823     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("TOOL_%_%.%.%",  pTool, &Prop, pBldTrg, pBldTrgArch);
    824     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("TOOL_%_%.%",    pTool, &Prop, pBldTrgCpu);
    825 
    826     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("TOOL_%_%%",     pTool, pType, &Prop);
    827     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("TOOL_%_%%.%",   pTool, pType, &Prop, pBldType);
    828     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("TOOL_%_%%.%",   pTool, pType, &Prop, pBldTrg);
    829     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("TOOL_%_%%.%",   pTool, pType, &Prop, pBldTrgArch);
    830     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("TOOL_%_%%.%.%", pTool, pType, &Prop, pBldTrg, pBldTrgArch);
    831     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("TOOL_%_%%.%",   pTool, pType, &Prop, pBldTrgCpu);
     947    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "TOOL_%_%",      pTool, &Prop);
     948    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "TOOL_%_%.%",    pTool, &Prop, pBldType);
     949    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "TOOL_%_%.%",    pTool, &Prop, pBldTrg);
     950    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "TOOL_%_%.%",    pTool, &Prop, pBldTrgArch);
     951    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "TOOL_%_%.%.%",  pTool, &Prop, pBldTrg, pBldTrgArch);
     952    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "TOOL_%_%.%",    pTool, &Prop, pBldTrgCpu);
     953
     954    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "TOOL_%_%%",     pTool, pType, &Prop);
     955    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "TOOL_%_%%.%",   pTool, pType, &Prop, pBldType);
     956    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "TOOL_%_%%.%",   pTool, pType, &Prop, pBldTrg);
     957    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "TOOL_%_%%.%",   pTool, pType, &Prop, pBldTrgArch);
     958    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "TOOL_%_%%.%.%", pTool, pType, &Prop, pBldTrg, pBldTrgArch);
     959    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "TOOL_%_%%.%",   pTool, pType, &Prop, pBldTrgCpu);
    832960
    833961    /* the global sdks */
     
    838966    {
    839967        struct variable *pSdk = &pSdks->pa[iSdk];
    840         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%",      pSdk, &Prop);
    841         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%.%",    pSdk, &Prop, pBldType);
    842         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%.%",    pSdk, &Prop, pBldTrg);
    843         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%.%",    pSdk, &Prop, pBldTrgArch);
    844         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%.%.%",  pSdk, &Prop, pBldTrg, pBldTrgArch);
    845         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%.%",    pSdk, &Prop, pBldTrgCpu);
    846 
    847         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%%",     pSdk, pType, &Prop);
    848         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%%.%",   pSdk, pType, &Prop, pBldType);
    849         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%%.%",   pSdk, pType, &Prop, pBldTrg);
    850         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%%.%",   pSdk, pType, &Prop, pBldTrgArch);
    851         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%%.%.%", pSdk, pType, &Prop, pBldTrg, pBldTrgArch);
    852         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%%.%",   pSdk, pType, &Prop, pBldTrgCpu);
     968        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%",      pSdk, &Prop);
     969        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%.%",    pSdk, &Prop, pBldType);
     970        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%.%",    pSdk, &Prop, pBldTrg);
     971        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%.%",    pSdk, &Prop, pBldTrgArch);
     972        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%.%.%",  pSdk, &Prop, pBldTrg, pBldTrgArch);
     973        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%.%",    pSdk, &Prop, pBldTrgCpu);
     974
     975        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%%",     pSdk, pType, &Prop);
     976        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%%.%",   pSdk, pType, &Prop, pBldType);
     977        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%%.%",   pSdk, pType, &Prop, pBldTrg);
     978        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%%.%",   pSdk, pType, &Prop, pBldTrgArch);
     979        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%%.%.%", pSdk, pType, &Prop, pBldTrg, pBldTrgArch);
     980        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%%.%",   pSdk, pType, &Prop, pBldTrgCpu);
    853981    }
    854982
    855983    /* the globals */
    856     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%",      &Prop);
    857     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%.%",    &Prop, pBldType);
    858     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%.%",    &Prop, pBldTrg);
    859     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%.%",    &Prop, pBldTrgArch);
    860     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%.%.%",  &Prop, pBldTrg, pBldTrgArch);
    861     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%.%",    &Prop, pBldTrgCpu);
    862 
    863     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%%",     pType, &Prop);
    864     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%%.%",   pType, &Prop, pBldType);
    865     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%%.%",   pType, &Prop, pBldTrg);
    866     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%%.%",   pType, &Prop, pBldTrgArch);
    867     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%%.%.%", pType, &Prop, pBldTrg, pBldTrgArch);
    868     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%%.%",   pType, &Prop, pBldTrgCpu);
     984    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "%",      &Prop);
     985    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "%.%",    &Prop, pBldType);
     986    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "%.%",    &Prop, pBldTrg);
     987    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "%.%",    &Prop, pBldTrgArch);
     988    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "%.%.%",  &Prop, pBldTrg, pBldTrgArch);
     989    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "%.%",    &Prop, pBldTrgCpu);
     990
     991    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "%%",     pType, &Prop);
     992    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "%%.%",   pType, &Prop, pBldType);
     993    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "%%.%",   pType, &Prop, pBldTrg);
     994    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "%%.%",   pType, &Prop, pBldTrgArch);
     995    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "%%.%.%", pType, &Prop, pBldTrg, pBldTrgArch);
     996    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "%%.%",   pType, &Prop, pBldTrgCpu);
    869997
    870998    /* the target sdks */
     
    8751003    {
    8761004        struct variable *pSdk = &pSdks->pa[iSdk];
    877         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%",      pSdk, &Prop);
    878         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%.%",    pSdk, &Prop, pBldType);
    879         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%.%",    pSdk, &Prop, pBldTrg);
    880         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%.%",    pSdk, &Prop, pBldTrgArch);
    881         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%.%.%",  pSdk, &Prop, pBldTrg, pBldTrgArch);
    882         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%.%",    pSdk, &Prop, pBldTrgCpu);
    883 
    884         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%%",     pSdk, pType, &Prop);
    885         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%%.%",   pSdk, pType, &Prop, pBldType);
    886         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%%.%",   pSdk, pType, &Prop, pBldTrg);
    887         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%%.%",   pSdk, pType, &Prop, pBldTrgArch);
    888         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%%.%.%", pSdk, pType, &Prop, pBldTrg, pBldTrgArch);
    889         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%%.%",   pSdk, pType, &Prop, pBldTrgCpu);
     1005        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%",      pSdk, &Prop);
     1006        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%.%",    pSdk, &Prop, pBldType);
     1007        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%.%",    pSdk, &Prop, pBldTrg);
     1008        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%.%",    pSdk, &Prop, pBldTrgArch);
     1009        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%.%.%",  pSdk, &Prop, pBldTrg, pBldTrgArch);
     1010        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%.%",    pSdk, &Prop, pBldTrgCpu);
     1011
     1012        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%%",     pSdk, pType, &Prop);
     1013        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%%.%",   pSdk, pType, &Prop, pBldType);
     1014        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%%.%",   pSdk, pType, &Prop, pBldTrg);
     1015        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%%.%",   pSdk, pType, &Prop, pBldTrgArch);
     1016        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%%.%.%", pSdk, pType, &Prop, pBldTrg, pBldTrgArch);
     1017        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%%.%",   pSdk, pType, &Prop, pBldTrgCpu);
    8901018    }
    8911019
    8921020    /* the target */
    893     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%",      pTarget, &Prop);
    894     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%.%",    pTarget, &Prop, pBldType);
    895     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%.%",    pTarget, &Prop, pBldTrg);
    896     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%.%",    pTarget, &Prop, pBldTrgArch);
    897     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%.%.%",  pTarget, &Prop, pBldTrg, pBldTrgArch);
    898     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%.%",    pTarget, &Prop, pBldTrgCpu);
    899 
    900     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%%",     pTarget, pType, &Prop);
    901     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%%.%",   pTarget, pType, &Prop, pBldType);
    902     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%%.%",   pTarget, pType, &Prop, pBldTrg);
    903     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%%.%",   pTarget, pType, &Prop, pBldTrgArch);
    904     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%%.%.%", pTarget, pType, &Prop, pBldTrg, pBldTrgArch);
    905     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%%.%",   pTarget, pType, &Prop, pBldTrgCpu);
     1021    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%",      pTarget, &Prop);
     1022    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%.%",    pTarget, &Prop, pBldType);
     1023    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%.%",    pTarget, &Prop, pBldTrg);
     1024    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%.%",    pTarget, &Prop, pBldTrgArch);
     1025    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%.%.%",  pTarget, &Prop, pBldTrg, pBldTrgArch);
     1026    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%.%",    pTarget, &Prop, pBldTrgCpu);
     1027
     1028    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%%",     pTarget, pType, &Prop);
     1029    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%%.%",   pTarget, pType, &Prop, pBldType);
     1030    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%%.%",   pTarget, pType, &Prop, pBldTrg);
     1031    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%%.%",   pTarget, pType, &Prop, pBldTrgArch);
     1032    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%%.%.%", pTarget, pType, &Prop, pBldTrg, pBldTrgArch);
     1033    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%%.%",   pTarget, pType, &Prop, pBldTrgCpu);
    9061034
    9071035    /* the source sdks */
     
    9121040    {
    9131041        struct variable *pSdk = &pSdks->pa[iSdk];
    914         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%",      pSdk, &Prop);
    915         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%.%",    pSdk, &Prop, pBldType);
    916         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%.%",    pSdk, &Prop, pBldTrg);
    917         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%.%",    pSdk, &Prop, pBldTrgArch);
    918         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%.%.%",  pSdk, &Prop, pBldTrg, pBldTrgArch);
    919         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%.%",    pSdk, &Prop, pBldTrgCpu);
    920 
    921         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%%",     pSdk, pType, &Prop);
    922         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%%.%",   pSdk, pType, &Prop, pBldType);
    923         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%%.%",   pSdk, pType, &Prop, pBldTrg);
    924         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%%.%",   pSdk, pType, &Prop, pBldTrgArch);
    925         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%%.%.%", pSdk, pType, &Prop, pBldTrg, pBldTrgArch);
    926         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%%.%",   pSdk, pType, &Prop, pBldTrgCpu);
     1042        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%",      pSdk, &Prop);
     1043        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%.%",    pSdk, &Prop, pBldType);
     1044        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%.%",    pSdk, &Prop, pBldTrg);
     1045        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%.%",    pSdk, &Prop, pBldTrgArch);
     1046        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%.%.%",  pSdk, &Prop, pBldTrg, pBldTrgArch);
     1047        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%.%",    pSdk, &Prop, pBldTrgCpu);
     1048
     1049        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%%",     pSdk, pType, &Prop);
     1050        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%%.%",   pSdk, pType, &Prop, pBldType);
     1051        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%%.%",   pSdk, pType, &Prop, pBldTrg);
     1052        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%%.%",   pSdk, pType, &Prop, pBldTrgArch);
     1053        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%%.%.%", pSdk, pType, &Prop, pBldTrg, pBldTrgArch);
     1054        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%%.%",   pSdk, pType, &Prop, pBldTrgCpu);
    9271055    }
    9281056
    9291057    /* the source */
    930     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%",      pSource, &Prop);
    931     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%.%",    pSource, &Prop, pBldType);
    932     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%.%",    pSource, &Prop, pBldTrg);
    933     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%.%",    pSource, &Prop, pBldTrgArch);
    934     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%.%.%",  pSource, &Prop, pBldTrg, pBldTrgArch);
    935     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%.%",    pSource, &Prop, pBldTrgCpu);
    936 
    937     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%%",     pSource, pType, &Prop);
    938     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%%.%",   pSource, pType, &Prop, pBldType);
    939     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%%.%",   pSource, pType, &Prop, pBldTrg);
    940     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%%.%",   pSource, pType, &Prop, pBldTrgArch);
    941     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%%.%.%", pSource, pType, &Prop, pBldTrg, pBldTrgArch);
    942     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%%.%",   pSource, pType, &Prop, pBldTrgCpu);
     1058    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%",      pSource, &Prop);
     1059    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%.%",    pSource, &Prop, pBldType);
     1060    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%.%",    pSource, &Prop, pBldTrg);
     1061    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%.%",    pSource, &Prop, pBldTrgArch);
     1062    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%.%.%",  pSource, &Prop, pBldTrg, pBldTrgArch);
     1063    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%.%",    pSource, &Prop, pBldTrgCpu);
     1064
     1065    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%%",     pSource, pType, &Prop);
     1066    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%%.%",   pSource, pType, &Prop, pBldType);
     1067    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%%.%",   pSource, pType, &Prop, pBldTrg);
     1068    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%%.%",   pSource, pType, &Prop, pBldTrgArch);
     1069    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%%.%.%", pSource, pType, &Prop, pBldTrg, pBldTrgArch);
     1070    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%%.%",   pSource, pType, &Prop, pBldTrgCpu);
    9431071
    9441072
     
    9501078    {
    9511079        struct variable *pSdk = &pSdks->pa[iSdk];
    952         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%",      pSdk, &Prop);
    953         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%.%",    pSdk, &Prop, pBldType);
    954         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%.%",    pSdk, &Prop, pBldTrg);
    955         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%.%",    pSdk, &Prop, pBldTrgArch);
    956         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%.%.%",  pSdk, &Prop, pBldTrg, pBldTrgArch);
    957         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%.%",    pSdk, &Prop, pBldTrgCpu);
    958 
    959         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%%",     pSdk, pType, &Prop);
    960         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%%.%",   pSdk, pType, &Prop, pBldType);
    961         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%%.%",   pSdk, pType, &Prop, pBldTrg);
    962         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%%.%",   pSdk, pType, &Prop, pBldTrgArch);
    963         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%%.%.%", pSdk, pType, &Prop, pBldTrg, pBldTrgArch);
    964         paVars[iVar++].pVar = kbuild_lookup_variable_fmt("SDK_%_%%.%",   pSdk, pType, &Prop, pBldTrgCpu);
     1080        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%",      pSdk, &Prop);
     1081        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%.%",    pSdk, &Prop, pBldType);
     1082        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%.%",    pSdk, &Prop, pBldTrg);
     1083        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%.%",    pSdk, &Prop, pBldTrgArch);
     1084        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%.%.%",  pSdk, &Prop, pBldTrg, pBldTrgArch);
     1085        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%.%",    pSdk, &Prop, pBldTrgCpu);
     1086
     1087        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%%",     pSdk, pType, &Prop);
     1088        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%%.%",   pSdk, pType, &Prop, pBldType);
     1089        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%%.%",   pSdk, pType, &Prop, pBldTrg);
     1090        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%%.%",   pSdk, pType, &Prop, pBldTrgArch);
     1091        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%%.%.%", pSdk, pType, &Prop, pBldTrg, pBldTrgArch);
     1092        paVars[iVar++].pVar = kbuild_lookup_variable_fmt(NULL, "SDK_%_%%.%",   pSdk, pType, &Prop, pBldTrgCpu);
    9651093    }
    9661094
    9671095    /* the target + source */
    968     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%_%",      pTarget, pSource, &Prop);
    969     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%_%.%",    pTarget, pSource, &Prop, pBldType);
    970     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%_%.%",    pTarget, pSource, &Prop, pBldTrg);
    971     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%_%.%",    pTarget, pSource, &Prop, pBldTrgArch);
    972     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%_%.%.%",  pTarget, pSource, &Prop, pBldTrg, pBldTrgArch);
    973     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%_%.%",    pTarget, pSource, &Prop, pBldTrgCpu);
    974 
    975     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%_%%",     pTarget, pSource, pType, &Prop);
    976     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%_%%.%",   pTarget, pSource, pType, &Prop, pBldType);
    977     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%_%%.%",   pTarget, pSource, pType, &Prop, pBldTrg);
    978     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%_%%.%",   pTarget, pSource, pType, &Prop, pBldTrgArch);
    979     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%_%%.%.%", pTarget, pSource, pType, &Prop, pBldTrg, pBldTrgArch);
    980     paVars[iVar++].pVar = kbuild_lookup_variable_fmt("%_%_%%.%",   pTarget, pSource, pType, &Prop, pBldTrgCpu);
     1096    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%_%",      pTarget, pSource, &Prop);
     1097    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%_%.%",    pTarget, pSource, &Prop, pBldType);
     1098    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%_%.%",    pTarget, pSource, &Prop, pBldTrg);
     1099    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%_%.%",    pTarget, pSource, &Prop, pBldTrgArch);
     1100    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%_%.%.%",  pTarget, pSource, &Prop, pBldTrg, pBldTrgArch);
     1101    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%_%.%",    pTarget, pSource, &Prop, pBldTrgCpu);
     1102
     1103    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%_%%",     pTarget, pSource, pType, &Prop);
     1104    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%_%%.%",   pTarget, pSource, pType, &Prop, pBldType);
     1105    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%_%%.%",   pTarget, pSource, pType, &Prop, pBldTrg);
     1106    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%_%%.%",   pTarget, pSource, pType, &Prop, pBldTrgArch);
     1107    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%_%%.%.%", pTarget, pSource, pType, &Prop, pBldTrg, pBldTrgArch);
     1108    paVars[iVar++].pVar = kbuild_lookup_variable_fmt(pDefPath, "%_%_%%.%",   pTarget, pSource, pType, &Prop, pBldTrgCpu);
    9811109
    9821110    assert(cVars == iVar);
     
    10041132        }
    10051133        if (pDefPath)
    1006         {
    1007             /** @todo */
    1008         }
     1134            kbuild_apply_defpath(pDefPath, &paVars[iVar].pszExp, &paVars[iVar].cchExp, NULL,
     1135                                 paVars[iVar].pszExp != paVars[iVar].pVar->value);
    10091136        cchTotal += paVars[iVar].cchExp + 1;
    10101137    }
     
    10411168    struct variable *pTarget = kbuild_get_variable("target");
    10421169    struct variable *pSource = kbuild_get_variable("source");
     1170    struct variable *pDefPath = NULL;
    10431171    struct variable *pType = kbuild_get_variable("type");
    10441172    struct variable *pTool = kbuild_get_variable("tool");
     
    10561184    else
    10571185        fatal(NILF, _("incorrect direction argument `%s'!"), argv[2]);
     1186    if (argv[3])
     1187        pDefPath = kbuild_get_variable("defpath");
    10581188
    10591189    kbuild_get_sdks(&Sdks, pTarget, pSource, pBldType, pBldTrg, pBldTrgArch);
     
    10611191    pVar = kbuild_collect_source_prop(pTarget, pSource, pTool, &Sdks, pType,
    10621192                                      pBldType, pBldTrg, pBldTrgArch, pBldTrgCpu,
    1063                                       NULL,
     1193                                      pDefPath,
    10641194                                      argv[0], argv[1], iDirection);
    10651195    if (pVar)
     
    12121342    size_t cch;
    12131343    struct kbuild_sdks Sdks;
     1344
     1345    /*
     1346     * Gather properties.
     1347     */
    12141348    kbuild_get_sdks(&Sdks, pTarget, pSource, pBldType, pBldTrg, pBldTrgArch);
    12151349
     
    12181352    pDefs  = kbuild_collect_source_prop(pTarget, pSource, pTool, &Sdks, pType, pBldType, pBldTrg, pBldTrgArch, pBldTrgCpu, NULL,
    12191353                                        "DEFS", "defs", 1/* left-to-right */);
    1220     pIncs  = kbuild_collect_source_prop(pTarget, pSource, pTool, &Sdks, pType, pBldType, pBldTrg, pBldTrgArch, pBldTrgCpu, NULL,
     1354    pIncs  = kbuild_collect_source_prop(pTarget, pSource, pTool, &Sdks, pType, pBldType, pBldTrg, pBldTrgArch, pBldTrgCpu, pDefPath,
    12211355                                        "INCS", "incs", -1/* right-to-left */);
    1222     pFlags = kbuild_collect_source_prop(pTarget, pSource, pTool, &Sdks, pType, pBldType, pBldTrg, pBldTrgArch, pBldTrgCpu, pDefPath,
     1356    pFlags = kbuild_collect_source_prop(pTarget, pSource, pTool, &Sdks, pType, pBldType, pBldTrg, pBldTrgArch, pBldTrgCpu, NULL,
    12231357                                        "FLAGS", "flags", 1/* left-to-right */);
    12241358    pDeps  = kbuild_collect_source_prop(pTarget, pSource, pTool, &Sdks, pType, pBldType, pBldTrg, pBldTrgArch, pBldTrgCpu, pDefPath,
    12251359                                        "DEPS", "deps", 1/* left-to-right */);
     1360
     1361    /*
     1362     * If we've got a default path, we must expand the source now.
     1363     * If we do this too early, "<source>_property = stuff" won't work becuase
     1364     * our 'source' value isn't what the user expects.
     1365     */
     1366    if (pDefPath)
     1367        kbuild_apply_defpath(pDefPath, &pSource->value, &pSource->value_length, &pSource->value_alloc_len, 1 /* can free */);
    12261368
    12271369    /*
Note: See TracChangeset for help on using the changeset viewer.