Changeset 3425 for trunk/src/kmk
- Timestamp:
- Aug 21, 2020, 2:45:06 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kmk/kbuild.c
r3415 r3425 1519 1519 } 1520 1520 1521 /** Per variable struct used by kbuild_collect_source_prop and helpers. */ 1522 struct kbuild_collect_variable 1523 { 1524 struct variable *pVar; 1525 unsigned int cchExp; 1526 char *pszExp; 1527 }; 1528 1529 /** 1530 * Helper for kbuild_collect_source_prop. 1531 * 1532 * Frees up any memory we've allocated for the variable values. 1533 */ 1534 static struct variable * 1535 kbuild_collect_source_prop_create_var(size_t cchTotal, int cVars, struct kbuild_collect_variable *paVars, int iDirection, 1536 const char *pszVarName, size_t cchVarName, enum variable_origin enmVarOrigin) 1537 { 1538 char *pszResult; 1539 struct variable *pVar; 1540 if (!cVars || !cchTotal) 1541 { 1542 pszResult = xmalloc(1); 1543 *pszResult = '\0'; 1544 } 1545 else 1546 { 1547 int iVar; 1548 char *psz = pszResult = xmalloc(cchTotal + 1); 1549 if (iDirection == 1) 1550 { 1551 for (iVar = 0; iVar < cVars; iVar++) 1552 { 1553 my_memcpy(psz, paVars[iVar].pszExp, paVars[iVar].cchExp); 1554 psz += paVars[iVar].cchExp; 1555 *psz++ = ' '; 1556 if (paVars[iVar].pszExp != paVars[iVar].pVar->value) 1557 free(paVars[iVar].pszExp); 1558 } 1559 } 1560 else 1561 { 1562 iVar = cVars; 1563 while (iVar-- > 0) 1564 { 1565 my_memcpy(psz, paVars[iVar].pszExp, paVars[iVar].cchExp); 1566 psz += paVars[iVar].cchExp; 1567 *psz++ = ' '; 1568 if (paVars[iVar].pszExp != paVars[iVar].pVar->value) 1569 free(paVars[iVar].pszExp); 1570 } 1571 1572 } 1573 assert(psz != pszResult); 1574 assert(cchTotal == (size_t)(psz - pszResult)); 1575 psz[-1] = '\0'; 1576 cchTotal--; 1577 1578 } 1579 if (enmVarOrigin == o_local) 1580 pVar = define_variable_vl(pszVarName, cchVarName, pszResult, cchTotal, 1581 0 /* take pszResult */ , enmVarOrigin, 0 /* !recursive */); 1582 else 1583 pVar = define_variable_vl_global(pszVarName, cchVarName, pszResult, cchTotal, 1584 0 /* take pszResult */ , enmVarOrigin, 0 /* !recursive */, NILF); 1585 return pVar; 1586 } 1521 1587 1522 1588 /* this kind of stuff: … … 1658 1724 int cVars, iVar; 1659 1725 size_t cchTotal, cchBuf; 1660 char *pszResult, *pszBuf, *psz, *psz2, *psz3; 1661 struct 1662 { 1663 struct variable *pVar; 1664 unsigned int cchExp; 1665 char *pszExp; 1666 } *paVars; 1726 char *pszBuf, *psz, *psz2, *psz3; 1727 struct kbuild_collect_variable *paVars; 1667 1728 1668 1729 assert(iDirection == 1 || iDirection == -1); … … 1680 1741 + pBldTrgArch->value_length + 1 1681 1742 + pBldTrgCpu->value_length + 1 1682 + pBldType->value_length + 1; 1743 + pBldType->value_length + 1 1744 + sizeof("_2_"); 1683 1745 pszBuf = xmalloc(cchBuf); 1684 1746 … … 1689 1751 */ 1690 1752 cVars = 12 * (pSdks->c + 5); 1691 paVars = alloca(cVars * sizeof(paVars[0]));1753 paVars = (struct kbuild_collect_variable *)alloca(cVars * sizeof(paVars[0])); 1692 1754 1693 1755 iVar = 0; … … 1773 1835 } while (0) 1774 1836 1775 /* the tool (lowest priority). */ 1837 /* 1838 * The first bunch part may be cached on the target already, check that first: 1839 */ 1776 1840 psz = pszBuf; 1777 ADD_CSTR("TOOL_"); 1778 ADD_VAR(pTool); 1841 ADD_VAR(pTarget); 1842 ADD_CSTR("_2_"); 1843 ADD_VAR(pType); 1844 ADD_STR(pszProp, cchProp); 1779 1845 ADD_CH('_'); 1780 DO_DOUBLE_PSZ2_VARIATION(); 1781 1782 1783 /* the global sdks. */ 1784 iSdkEnd = iDirection == 1 ? pSdks->iGlobal + pSdks->cGlobal : pSdks->iGlobal - 1; 1785 for (iSdk = iDirection == 1 ? pSdks->iGlobal : pSdks->iGlobal + pSdks->cGlobal - 1; 1786 iSdk != iSdkEnd; 1787 iSdk += iDirection) 1788 { 1789 struct variable *pSdk = &pSdks->pa[iSdk]; 1846 ADD_VAR(pBldType); 1847 *psz = '\0'; 1848 pVar = kbuild_lookup_variable_n(pszBuf, psz - pszBuf); 1849 if (pVar) 1850 assert(iVar == 0); 1851 else 1852 { 1853 /* the tool (lowest priority). */ 1790 1854 psz = pszBuf; 1791 ADD_CSTR(" SDK_");1792 ADD_VAR(p Sdk);1855 ADD_CSTR("TOOL_"); 1856 ADD_VAR(pTool); 1793 1857 ADD_CH('_'); 1794 1858 DO_DOUBLE_PSZ2_VARIATION(); 1795 } 1796 1797 /* the globals. */ 1798 psz = pszBuf; 1799 DO_DOUBLE_PSZ2_VARIATION(); 1800 1801 /* the target sdks. */ 1802 /** @todo these can be cached in a type specific _2_ variable */ 1803 iSdkEnd = iDirection == 1 ? pSdks->iTarget + pSdks->cTarget : pSdks->iTarget - 1; 1804 for (iSdk = iDirection == 1 ? pSdks->iTarget : pSdks->iTarget + pSdks->cTarget - 1; 1805 iSdk != iSdkEnd; 1806 iSdk += iDirection) 1807 { 1808 struct variable *pSdk = &pSdks->pa[iSdk]; 1859 1860 /* the global sdks. */ 1861 iSdkEnd = iDirection == 1 ? pSdks->iGlobal + pSdks->cGlobal : pSdks->iGlobal - 1; 1862 for (iSdk = iDirection == 1 ? pSdks->iGlobal : pSdks->iGlobal + pSdks->cGlobal - 1; 1863 iSdk != iSdkEnd; 1864 iSdk += iDirection) 1865 { 1866 struct variable *pSdk = &pSdks->pa[iSdk]; 1867 psz = pszBuf; 1868 ADD_CSTR("SDK_"); 1869 ADD_VAR(pSdk); 1870 ADD_CH('_'); 1871 DO_DOUBLE_PSZ2_VARIATION(); 1872 } 1873 1874 /* the globals. */ 1809 1875 psz = pszBuf; 1810 ADD_CSTR("SDK_"); 1811 ADD_VAR(pSdk); 1876 DO_DOUBLE_PSZ2_VARIATION(); 1877 1878 /* the target sdks. */ 1879 iSdkEnd = iDirection == 1 ? pSdks->iTarget + pSdks->cTarget : pSdks->iTarget - 1; 1880 for (iSdk = iDirection == 1 ? pSdks->iTarget : pSdks->iTarget + pSdks->cTarget - 1; 1881 iSdk != iSdkEnd; 1882 iSdk += iDirection) 1883 { 1884 struct variable *pSdk = &pSdks->pa[iSdk]; 1885 psz = pszBuf; 1886 ADD_CSTR("SDK_"); 1887 ADD_VAR(pSdk); 1888 ADD_CH('_'); 1889 DO_DOUBLE_PSZ2_VARIATION(); 1890 } 1891 1892 /* the target. */ 1893 psz = pszBuf; 1894 ADD_VAR(pTarget); 1812 1895 ADD_CH('_'); 1813 1896 DO_DOUBLE_PSZ2_VARIATION(); 1814 } 1815 1816 1817 /* the target. */ 1818 /** @todo these can be cached in a type specific _2_ variable */ 1819 psz = pszBuf; 1820 ADD_VAR(pTarget); 1821 ADD_CH('_'); 1822 DO_DOUBLE_PSZ2_VARIATION(); 1897 1898 /* 1899 * Cache the result thus far (frees up anything we might've allocated above). 1900 */ 1901 psz = pszBuf; 1902 ADD_VAR(pTarget); 1903 ADD_CSTR("_2_"); 1904 ADD_VAR(pType); 1905 ADD_STR(pszProp, cchProp); 1906 ADD_CH('_'); 1907 ADD_VAR(pBldType); 1908 *psz = '\0'; 1909 assert(iVar <= cVars); 1910 pVar = kbuild_collect_source_prop_create_var(cchTotal, iVar, paVars, iDirection, pszBuf, psz - pszBuf, o_file); 1911 assert(pVar); 1912 } 1913 1914 /* Now we use the cached target variable. */ 1915 paVars[0].pVar = pVar; 1916 paVars[0].pszExp = pVar->value; 1917 paVars[0].cchExp = pVar->value_length; 1918 cchTotal = paVars[0].cchExp + 1; 1919 iVar = 1; 1823 1920 1824 1921 /* the source sdks. */ … … 1866 1963 free(pszBuf); 1867 1964 1965 /* 1966 * Construct the result value (frees up anything we might've allocated above). 1967 */ 1868 1968 assert(iVar <= cVars); 1869 cVars = iVar; 1870 1871 /* 1872 * Construct the result value. 1873 */ 1874 if (!cVars || !cchTotal) 1875 pVar = define_variable_vl(pszVarName, cchVarName, "", 0, 1876 1 /* duplicate value */ , o_local, 0 /* !recursive */); 1877 else 1878 { 1879 psz = pszResult = xmalloc(cchTotal + 1); 1880 if (iDirection == 1) 1881 { 1882 for (iVar = 0; iVar < cVars; iVar++) 1883 { 1884 my_memcpy(psz, paVars[iVar].pszExp, paVars[iVar].cchExp); 1885 psz += paVars[iVar].cchExp; 1886 *psz++ = ' '; 1887 if (paVars[iVar].pszExp != paVars[iVar].pVar->value) 1888 free(paVars[iVar].pszExp); 1889 } 1890 } 1891 else 1892 { 1893 iVar = cVars; 1894 while (iVar-- > 0) 1895 { 1896 my_memcpy(psz, paVars[iVar].pszExp, paVars[iVar].cchExp); 1897 psz += paVars[iVar].cchExp; 1898 *psz++ = ' '; 1899 if (paVars[iVar].pszExp != paVars[iVar].pVar->value) 1900 free(paVars[iVar].pszExp); 1901 } 1902 1903 } 1904 assert(psz != pszResult); 1905 assert(cchTotal == (size_t)(psz - pszResult)); 1906 psz[-1] = '\0'; 1907 cchTotal--; 1908 1909 pVar = define_variable_vl(pszVarName, cchVarName, pszResult, cchTotal, 1910 0 /* take pszResult */ , o_local, 0 /* !recursive */); 1911 } 1912 1913 return pVar; 1969 return kbuild_collect_source_prop_create_var(cchTotal, iVar, paVars, iDirection, pszVarName, cchVarName, o_local); 1914 1970 1915 1971 #undef ADD_VAR
Note:
See TracChangeset
for help on using the changeset viewer.