mirror of
https://github.com/Kitware/CMake.git
synced 2025-10-14 02:08:27 +08:00
cmScanDepFormat: Drop unused "outputs", "inputs", and "depends" fields
These fields are specified by our `P1689r3` paper, but are not actually needed. The dependencies of the scanning results themselves can be captured via normal depfile logic. Avoid saving this possibly-large information in the scanning results. It is not needed by later steps.
This commit is contained in:
@@ -39,7 +39,10 @@ to the file specified by the ``<DEP_FILE>`` placeholder, and write module
|
||||
dependencies to the file specified by the ``<DYNDEP_FILE>`` placeholder.
|
||||
|
||||
The module dependencies should be written in the format described
|
||||
by the `P1689r3`_ paper.
|
||||
by the `P1689r3`_ paper, with the following updates:
|
||||
|
||||
* Omit the ``outputs``, ``inputs``, and ``depends`` fields from
|
||||
each entry in the ``rules`` array. They are unused.
|
||||
|
||||
Compiler writers may try out their scanning functionality using
|
||||
the `cxx-modules-sandbox`_ test project, modified to set variables
|
||||
|
@@ -2247,14 +2247,22 @@ Compilation of source files within a target is split into the following steps:
|
||||
(because the latter consumes the module).
|
||||
*/
|
||||
|
||||
static std::unique_ptr<cmSourceInfo> cmcmd_cmake_ninja_depends_fortran(
|
||||
namespace {
|
||||
|
||||
struct cmSourceInfo
|
||||
{
|
||||
cmScanDepInfo ScanDep;
|
||||
std::vector<std::string> Includes;
|
||||
};
|
||||
|
||||
std::unique_ptr<cmSourceInfo> cmcmd_cmake_ninja_depends_fortran(
|
||||
std::string const& arg_tdi, std::string const& arg_pp);
|
||||
}
|
||||
|
||||
int cmcmd_cmake_ninja_depends(std::vector<std::string>::const_iterator argBeg,
|
||||
std::vector<std::string>::const_iterator argEnd)
|
||||
{
|
||||
std::string arg_tdi;
|
||||
std::string arg_src;
|
||||
std::string arg_pp;
|
||||
std::string arg_dep;
|
||||
std::string arg_obj;
|
||||
@@ -2263,8 +2271,6 @@ int cmcmd_cmake_ninja_depends(std::vector<std::string>::const_iterator argBeg,
|
||||
for (std::string const& arg : cmMakeRange(argBeg, argEnd)) {
|
||||
if (cmHasLiteralPrefix(arg, "--tdi=")) {
|
||||
arg_tdi = arg.substr(6);
|
||||
} else if (cmHasLiteralPrefix(arg, "--src=")) {
|
||||
arg_src = arg.substr(6);
|
||||
} else if (cmHasLiteralPrefix(arg, "--pp=")) {
|
||||
arg_pp = arg.substr(5);
|
||||
} else if (cmHasLiteralPrefix(arg, "--dep=")) {
|
||||
@@ -2305,9 +2311,6 @@ int cmcmd_cmake_ninja_depends(std::vector<std::string>::const_iterator argBeg,
|
||||
cmSystemTools::Error("-E cmake_ninja_depends requires value for --lang=");
|
||||
return 1;
|
||||
}
|
||||
if (arg_src.empty()) {
|
||||
arg_src = cmStrCat("<", arg_obj, " input file>");
|
||||
}
|
||||
|
||||
std::unique_ptr<cmSourceInfo> info;
|
||||
if (arg_lang == "Fortran") {
|
||||
@@ -2324,7 +2327,7 @@ int cmcmd_cmake_ninja_depends(std::vector<std::string>::const_iterator argBeg,
|
||||
return 1;
|
||||
}
|
||||
|
||||
info->PrimaryOutput = arg_obj;
|
||||
info->ScanDep.PrimaryOutput = arg_obj;
|
||||
|
||||
{
|
||||
cmGeneratedFileStream depfile(arg_dep);
|
||||
@@ -2335,7 +2338,7 @@ int cmcmd_cmake_ninja_depends(std::vector<std::string>::const_iterator argBeg,
|
||||
depfile << "\n";
|
||||
}
|
||||
|
||||
if (!cmScanDepFormat_P1689_Write(arg_ddi, arg_src, *info)) {
|
||||
if (!cmScanDepFormat_P1689_Write(arg_ddi, info->ScanDep)) {
|
||||
cmSystemTools::Error(
|
||||
cmStrCat("-E cmake_ninja_depends failed to write ", arg_ddi));
|
||||
return 1;
|
||||
@@ -2343,6 +2346,8 @@ int cmcmd_cmake_ninja_depends(std::vector<std::string>::const_iterator argBeg,
|
||||
return 0;
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
std::unique_ptr<cmSourceInfo> cmcmd_cmake_ninja_depends_fortran(
|
||||
std::string const& arg_tdi, std::string const& arg_pp)
|
||||
{
|
||||
@@ -2397,7 +2402,7 @@ std::unique_ptr<cmSourceInfo> cmcmd_cmake_ninja_depends_fortran(
|
||||
cmSourceReqInfo src_info;
|
||||
src_info.LogicalName = provide;
|
||||
src_info.CompiledModulePath = provide;
|
||||
info->Provides.emplace_back(src_info);
|
||||
info->ScanDep.Provides.emplace_back(src_info);
|
||||
}
|
||||
for (std::string const& require : finfo.Requires) {
|
||||
// Require modules not provided in the same source.
|
||||
@@ -2407,13 +2412,14 @@ std::unique_ptr<cmSourceInfo> cmcmd_cmake_ninja_depends_fortran(
|
||||
cmSourceReqInfo src_info;
|
||||
src_info.LogicalName = require;
|
||||
src_info.CompiledModulePath = require;
|
||||
info->Requires.emplace_back(src_info);
|
||||
info->ScanDep.Requires.emplace_back(src_info);
|
||||
}
|
||||
for (std::string const& include : finfo.Includes) {
|
||||
info->Includes.push_back(include);
|
||||
}
|
||||
return info;
|
||||
}
|
||||
}
|
||||
|
||||
bool cmGlobalNinjaGenerator::WriteDyndepFile(
|
||||
std::string const& dir_top_src, std::string const& dir_top_bld,
|
||||
@@ -2436,9 +2442,9 @@ bool cmGlobalNinjaGenerator::WriteDyndepFile(
|
||||
this->LocalGenerators.push_back(std::move(lgd));
|
||||
}
|
||||
|
||||
std::vector<cmSourceInfo> objects;
|
||||
std::vector<cmScanDepInfo> objects;
|
||||
for (std::string const& arg_ddi : arg_ddis) {
|
||||
cmSourceInfo info;
|
||||
cmScanDepInfo info;
|
||||
if (!cmScanDepFormat_P1689_Parse(arg_ddi, &info)) {
|
||||
cmSystemTools::Error(
|
||||
cmStrCat("-E cmake_ninja_dyndep failed to parse ddi file ", arg_ddi));
|
||||
@@ -2474,7 +2480,7 @@ bool cmGlobalNinjaGenerator::WriteDyndepFile(
|
||||
// We do this after loading the modules provided by linked targets
|
||||
// in case we have one of the same name that must be preferred.
|
||||
Json::Value tm = Json::objectValue;
|
||||
for (cmSourceInfo const& object : objects) {
|
||||
for (cmScanDepInfo const& object : objects) {
|
||||
for (auto const& p : object.Provides) {
|
||||
std::string const mod = cmStrCat(
|
||||
module_dir, cmSystemTools::GetFilenameName(p.CompiledModulePath));
|
||||
@@ -2489,7 +2495,7 @@ bool cmGlobalNinjaGenerator::WriteDyndepFile(
|
||||
{
|
||||
cmNinjaBuild build("dyndep");
|
||||
build.Outputs.emplace_back("");
|
||||
for (cmSourceInfo const& object : objects) {
|
||||
for (cmScanDepInfo const& object : objects) {
|
||||
build.Outputs[0] = this->ConvertToNinjaPath(object.PrimaryOutput);
|
||||
build.ImplicitOuts.clear();
|
||||
for (auto const& p : object.Provides) {
|
||||
|
@@ -528,7 +528,7 @@ std::string GetScanCommand(const std::string& cmakeCmd, const std::string& tdi,
|
||||
const std::string& ddiFile)
|
||||
{
|
||||
return cmStrCat(cmakeCmd, " -E cmake_ninja_depends --tdi=", tdi,
|
||||
" --lang=", lang, " --src=$in", " --pp=", ppFile,
|
||||
" --lang=", lang, " --pp=", ppFile,
|
||||
" --dep=$DEP_FILE --obj=$OBJ_FILE --ddi=", ddiFile);
|
||||
}
|
||||
|
||||
|
@@ -74,7 +74,8 @@ static Json::Value EncodeFilename(std::string const& path)
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
bool cmScanDepFormat_P1689_Parse(std::string const& arg_pp, cmSourceInfo* info)
|
||||
bool cmScanDepFormat_P1689_Parse(std::string const& arg_pp,
|
||||
cmScanDepInfo* info)
|
||||
{
|
||||
Json::Value ppio;
|
||||
Json::Value const& ppi = ppio;
|
||||
@@ -116,15 +117,6 @@ bool cmScanDepFormat_P1689_Parse(std::string const& arg_pp, cmSourceInfo* info)
|
||||
return false;
|
||||
}
|
||||
|
||||
Json::Value const& depends = rule["depends"];
|
||||
if (depends.isArray()) {
|
||||
std::string depend_filename;
|
||||
for (auto const& depend : depends) {
|
||||
PARSE_FILENAME(depend, depend_filename);
|
||||
info->Includes.push_back(depend_filename);
|
||||
}
|
||||
}
|
||||
|
||||
if (rule.isMember("future-compile")) {
|
||||
Json::Value const& future_compile = rule["future-compile"];
|
||||
|
||||
@@ -194,8 +186,7 @@ bool cmScanDepFormat_P1689_Parse(std::string const& arg_pp, cmSourceInfo* info)
|
||||
}
|
||||
|
||||
bool cmScanDepFormat_P1689_Write(std::string const& path,
|
||||
std::string const& input,
|
||||
cmSourceInfo const& info)
|
||||
cmScanDepInfo const& info)
|
||||
{
|
||||
Json::Value ddi(Json::objectValue);
|
||||
ddi["version"] = 0;
|
||||
@@ -204,16 +195,6 @@ bool cmScanDepFormat_P1689_Write(std::string const& path,
|
||||
Json::Value& rules = ddi["rules"] = Json::arrayValue;
|
||||
|
||||
Json::Value rule(Json::objectValue);
|
||||
Json::Value& inputs = rule["inputs"] = Json::arrayValue;
|
||||
inputs.append(EncodeFilename(input));
|
||||
|
||||
Json::Value& rule_outputs = rule["outputs"] = Json::arrayValue;
|
||||
rule_outputs.append(EncodeFilename(path));
|
||||
|
||||
Json::Value& depends = rule["depends"] = Json::arrayValue;
|
||||
for (auto const& include : info.Includes) {
|
||||
depends.append(EncodeFilename(include));
|
||||
}
|
||||
|
||||
Json::Value& future_compile = rule["future-compile"] = Json::objectValue;
|
||||
|
||||
|
@@ -11,20 +11,16 @@ struct cmSourceReqInfo
|
||||
std::string CompiledModulePath;
|
||||
};
|
||||
|
||||
struct cmSourceInfo
|
||||
struct cmScanDepInfo
|
||||
{
|
||||
std::string PrimaryOutput;
|
||||
|
||||
// Set of provided and required modules.
|
||||
std::vector<cmSourceReqInfo> Provides;
|
||||
std::vector<cmSourceReqInfo> Requires;
|
||||
|
||||
// Set of files included in the translation unit.
|
||||
std::vector<std::string> Includes;
|
||||
};
|
||||
|
||||
bool cmScanDepFormat_P1689_Parse(std::string const& arg_pp,
|
||||
cmSourceInfo* info);
|
||||
cmScanDepInfo* info);
|
||||
bool cmScanDepFormat_P1689_Write(std::string const& path,
|
||||
std::string const& input,
|
||||
cmSourceInfo const& info);
|
||||
cmScanDepInfo const& info);
|
||||
|
Reference in New Issue
Block a user