| 1619 | } |
| 1620 | |
| 1621 | CompileData Target::MergeCompileData(CompileData const& fd) |
| 1622 | { |
| 1623 | CompileData cd; |
| 1624 | cd.Language = fd.Language; |
| 1625 | if (cd.Language.empty()) { |
| 1626 | return cd; |
| 1627 | } |
| 1628 | CompileData const& td = this->CompileDataMap.at(cd.Language); |
| 1629 | |
| 1630 | // All compile groups share the sysroot of the target. |
| 1631 | cd.Sysroot = td.Sysroot; |
| 1632 | |
| 1633 | // All compile groups share the precompile headers of the target. |
| 1634 | cd.PrecompileHeaders = td.PrecompileHeaders; |
| 1635 | |
| 1636 | // All compile groups share the language standard of the target. |
| 1637 | cd.LanguageStandard = td.LanguageStandard; |
| 1638 | |
| 1639 | // Use target-wide flags followed by source-specific flags. |
| 1640 | cd.Flags.reserve(td.Flags.size() + fd.Flags.size()); |
| 1641 | cd.Flags.insert(cd.Flags.end(), td.Flags.begin(), td.Flags.end()); |
| 1642 | cd.Flags.insert(cd.Flags.end(), fd.Flags.begin(), fd.Flags.end()); |
| 1643 | |
| 1644 | // Use source-specific includes followed by target-wide includes. |
| 1645 | cd.Includes.reserve(fd.Includes.size() + td.Includes.size()); |
| 1646 | cd.Includes.insert(cd.Includes.end(), fd.Includes.begin(), |
| 1647 | fd.Includes.end()); |
| 1648 | cd.Includes.insert(cd.Includes.end(), td.Includes.begin(), |
| 1649 | td.Includes.end()); |
| 1650 | |
| 1651 | // Use source-specific frameworks followed by target-wide frameworks. |
| 1652 | cd.Frameworks.reserve(fd.Frameworks.size() + td.Frameworks.size()); |
| 1653 | cd.Frameworks.insert(cd.Frameworks.end(), fd.Frameworks.begin(), |
| 1654 | fd.Frameworks.end()); |
| 1655 | cd.Frameworks.insert(cd.Frameworks.end(), td.Frameworks.begin(), |
| 1656 | td.Frameworks.end()); |
| 1657 | |
| 1658 | // Use target-wide defines followed by source-specific defines. |
| 1659 | cd.Defines.reserve(td.Defines.size() + fd.Defines.size()); |
| 1660 | cd.Defines.insert(cd.Defines.end(), td.Defines.begin(), td.Defines.end()); |
| 1661 | cd.Defines.insert(cd.Defines.end(), fd.Defines.begin(), fd.Defines.end()); |
| 1662 | |
| 1663 | // De-duplicate defines. |
| 1664 | std::stable_sort(cd.Defines.begin(), cd.Defines.end(), |
| 1665 | JBT<std::string>::ValueLess); |
| 1666 | auto end = std::unique(cd.Defines.begin(), cd.Defines.end(), |
| 1667 | JBT<std::string>::ValueEq); |
| 1668 | cd.Defines.erase(end, cd.Defines.end()); |
| 1669 | |
| 1670 | return cd; |
| 1671 | } |
| 1672 | |
| 1673 | Json::ArrayIndex Target::AddSourceCompileGroup(cmSourceFile* sf, |
| 1674 | Json::ArrayIndex si) |