Index: /trunk/src/kmk/kbuild.c
===================================================================
--- /trunk/src/kmk/kbuild.c	(revision 1811)
+++ /trunk/src/kmk/kbuild.c	(revision 1812)
@@ -525,9 +525,10 @@
     if (memchr(pVar->value, '$', pVar->value_length))
     {
-        char *pszExpanded = allocated_variable_expand(pVar->value);
+        unsigned int value_len;
+        char *pszExpanded = allocated_variable_expand_2(pVar->value, pVar->value_length, &value_len);
         free(pVar->value);
         pVar->value = pszExpanded;
-        pVar->value_length = strlen(pVar->value);
-        pVar->value_alloc_len = pVar->value_length + 1;
+        pVar->value_length = value_len;
+        pVar->value_alloc_len = value_len + 1;
     }
     pVar->recursive = 0;
@@ -1044,10 +1045,10 @@
     pSdks->iGlobal = i;
     pSdks->cGlobal = 0;
-    sprintf(pszTmp, "$(SDKS) $(SDKS.%s) $(SDKS.%s) $(SDKS.%s) $(SDKS.%s.%s)",
-            pBldType->value,
-            pBldTrg->value,
-            pBldTrgArch->value,
-            pBldTrg->value, pBldTrgArch->value);
-    pszIterator = pSdks->apsz[0] = allocated_variable_expand(pszTmp);
+    cch = sprintf(pszTmp, "$(SDKS) $(SDKS.%s) $(SDKS.%s) $(SDKS.%s) $(SDKS.%s.%s)",
+                  pBldType->value,
+                  pBldTrg->value,
+                  pBldTrgArch->value,
+                  pBldTrg->value, pBldTrgArch->value);
+    pszIterator = pSdks->apsz[0] = allocated_variable_expand_2(pszTmp, cch, NULL);
     while ((pszCur = find_next_token(&pszIterator, &cchCur)) != 0)
         pSdks->cGlobal++;
@@ -1057,11 +1058,11 @@
     pSdks->iTarget = i;
     pSdks->cTarget = 0;
-    sprintf(pszTmp, "$(%s_SDKS) $(%s_SDKS.%s) $(%s_SDKS.%s) $(%s_SDKS.%s) $(%s_SDKS.%s.%s)",
-            pTarget->value,
-            pTarget->value, pBldType->value,
-            pTarget->value, pBldTrg->value,
-            pTarget->value, pBldTrgArch->value,
-            pTarget->value, pBldTrg->value, pBldTrgArch->value);
-    pszIterator = pSdks->apsz[1] = allocated_variable_expand(pszTmp);
+    cch = sprintf(pszTmp, "$(%s_SDKS) $(%s_SDKS.%s) $(%s_SDKS.%s) $(%s_SDKS.%s) $(%s_SDKS.%s.%s)",
+                  pTarget->value,
+                  pTarget->value, pBldType->value,
+                  pTarget->value, pBldTrg->value,
+                  pTarget->value, pBldTrgArch->value,
+                  pTarget->value, pBldTrg->value, pBldTrgArch->value);
+    pszIterator = pSdks->apsz[1] = allocated_variable_expand_2(pszTmp, cch, NULL);
     while ((pszCur = find_next_token(&pszIterator, &cchCur)) != 0)
         pSdks->cTarget++;
@@ -1071,11 +1072,11 @@
     pSdks->iSource = i;
     pSdks->cSource = 0;
-    sprintf(pszTmp, "$(%s_SDKS) $(%s_SDKS.%s) $(%s_SDKS.%s) $(%s_SDKS.%s) $(%s_SDKS.%s.%s)",
-            pSource->value,
-            pSource->value, pBldType->value,
-            pSource->value, pBldTrg->value,
-            pSource->value, pBldTrgArch->value,
-            pSource->value, pBldTrg->value, pBldTrgArch->value);
-    pszIterator = pSdks->apsz[2] = allocated_variable_expand(pszTmp);
+    cch = sprintf(pszTmp, "$(%s_SDKS) $(%s_SDKS.%s) $(%s_SDKS.%s) $(%s_SDKS.%s) $(%s_SDKS.%s.%s)",
+                  pSource->value,
+                  pSource->value, pBldType->value,
+                  pSource->value, pBldTrg->value,
+                  pSource->value, pBldTrgArch->value,
+                  pSource->value, pBldTrg->value, pBldTrgArch->value);
+    pszIterator = pSdks->apsz[2] = allocated_variable_expand_2(pszTmp, cch, NULL);
     while ((pszCur = find_next_token(&pszIterator, &cchCur)) != 0)
         pSdks->cSource++;
@@ -1092,5 +1093,5 @@
                   pTarget->value, pSource->value, pBldTrg->value, pBldTrgArch->value);
     assert(cch < cchTmp); (void)cch;
-    pszIterator = pSdks->apsz[3] = allocated_variable_expand(pszTmp);
+    pszIterator = pSdks->apsz[3] = allocated_variable_expand_2(pszTmp, cch, NULL);
     while ((pszCur = find_next_token(&pszIterator, &cchCur)) != 0)
         pSdks->cTargetSource++;
@@ -1468,6 +1469,6 @@
         if (!paVars[iVar].pVar)
             continue;
-        if (    paVars[iVar].pVar->flavor == f_simple
-            ||  !strchr(paVars[iVar].pVar->value, '$'))
+        if (    !paVars[iVar].pVar->recursive
+            ||  !memchr(paVars[iVar].pVar->value, '$', paVars[iVar].pVar->value_length))
         {
             paVars[iVar].pszExp = paVars[iVar].pVar->value;
@@ -1476,6 +1477,7 @@
         else
         {
-            paVars[iVar].pszExp = allocated_variable_expand(paVars[iVar].pVar->value);
-            paVars[iVar].cchExp = strlen(paVars[iVar].pszExp);
+            unsigned int cchExp;
+            paVars[iVar].pszExp = allocated_variable_expand_2(paVars[iVar].pVar->value, paVars[iVar].pVar->value_length, &cchExp);
+            paVars[iVar].cchExp = cchExp;
         }
         if (pDefPath)
@@ -1772,5 +1774,5 @@
     {
         do_variable_definition_2(NILF, "_DEPFILES_INCLUDED", pDep->value, pDep->value_length,
-                                 pDep->flavor == f_simple, 0, o_file, f_append, 0 /* !target_var */);
+                                 !pDep->recursive, 0, o_file, f_append, 0 /* !target_var */);
         eval_include_dep(pDep->value, NILF, iVer >= 2 ? incdep_queue : incdep_read_it);
     }
@@ -1803,5 +1805,5 @@
     pVar = kbuild_get_recursive_variable(pszSrcVar);
     do_variable_definition_2(NILF, pszDstVar, pVar->value, pVar->value_length,
-                             pVar->flavor == f_simple, 0, o_file, f_simple, 0 /* !target_var */);
+                             !pVar->recursive, 0, o_file, f_simple, 0 /* !target_var */);
 
     memcpy(pszSrc, "_OUTPUT", sizeof("_OUTPUT"));
@@ -1830,5 +1832,5 @@
     memcpy(psz, pSource->value, pSource->value_length + 1);
     do_variable_definition_2(NILF, pszDstVar, pszVal, pVar->value_length + 1 + pDeps->value_length + 1 + pSource->value_length,
-                             pVar->flavor == f_simple && pDeps->flavor == f_simple && pSource->flavor == f_simple,
+                             !pVar->recursive && !pDeps->recursive && !pSource->recursive,
                              pszVal, o_file, f_simple, 0 /* !target_var */);
 
@@ -1844,5 +1846,5 @@
     do_variable_definition_2(NILF, pszDstVar, pszVal,
                              pVar->value_length + 1 + pDirDep->value_length + 1 + pOrderDeps->value_length,
-                             pVar->flavor == f_simple && pDirDep->flavor == f_simple && pOrderDeps->flavor == f_simple,
+                             !pVar->recursive && !pDirDep->recursive && !pOrderDeps->recursive,
                              pszVal, o_file, f_simple, 0 /* !target_var */);
 
@@ -1860,5 +1862,5 @@
     do_variable_definition_2(NILF, "_OUT_FILES", pszVal,
                              pVar->value_length + 1 + pOutput->value_length + 1 + pOutputMaybe->value_length,
-                             pVar->flavor == f_simple && pOutput->flavor == f_simple && pOutputMaybe->flavor == f_simple,
+                             !pVar->recursive && !pOutput->recursive && !pOutputMaybe->recursive,
                              pszVal, o_file, f_simple, 0 /* !target_var */);
 
@@ -1868,5 +1870,5 @@
     memcpy(pszDstVar + pTarget->value_length, "_OBJS_", sizeof("_OBJS_"));
     do_variable_definition_2(NILF, pszDstVar, pObj->value, pObj->value_length,
-                             pObj->flavor == f_simple, 0, o_file, f_append, 0 /* !target_var */);
+                             !pObj->recursive, 0, o_file, f_append, 0 /* !target_var */);
 
     /*
@@ -1874,5 +1876,5 @@
     */
     pVar = kbuild_get_recursive_variable("def_target_source_rule");
-    pszVal = allocated_variable_expand(pVar->value);
+    pszVal = allocated_variable_expand_2(pVar->value, pVar->value_length, NULL);
 
     install_variable_buffer(&pszSavedVarBuf, &cchSavedVarBuf);
