2

我使用 CMake 构建了一个包含多个独立项目的源代码树来构建每个单独的项目。

重要提示:我没有全局 CMakeLists.txt 文件来执行整个构建,我使用通用脚本(windows (.cmd) 和 unix (.sh))循环所有子项目。我想保持项目的独立性,同时又能够自动构建它们。

另一方面,在 Cdash 中,我希望将所有这些独立项目视为Cdash 子项目,作为更大的独特人工Cdash 项目的一部分。

为了使用 Cdash,我遵循了以下描述的方法: http ://www.cmake.org/Wiki/CMake/Testing_With_CTest

我将此方法命名为 A

即,我这样做:

enable_testing()
include(CTest)

然后,我自己做一些测试。

之后,我尝试按照以下页面指示将我的个人项目视为子项目: http ://www.kitware.com/media/html/CdashSubprojects.html

我将此方法命名为 B

问题是提交给 CDash 的 xml 缺少SubProjectxmlLabels元素(xml 滥用者的标签)Sites,尽管我的 CMakeLists.txt(实际上是我的 CTestConfig.cmake)文件具有以下全局属性设置(我试图把它在两个文件中):

set_property(GLOBAL PROPERTY SubProject ${CMAKE_PROJECT_NAME})
set_property(GLOBAL PROPERTY Label ${CMAKE_PROJECT_NAME})

其中 CMAKE_PROJECT_NAME - 当然 - 定义明确。

  • 你知道提交的 xml 文件的元素下缺少wjySubProject和元素吗?LabelsSites
  • 方法A和B可以混用吗?

另外,我检查了CTest源,这些全局属性是由这个函数添加的(我从2.8.10获取,无法下载我正在使用的2.8.11的源,所以我希望没有改变它,否则对不起) :

//----------------------------------------------------------------------
void cmCTest::AddSiteProperties(std::ostream& ostr)
{
  cmCTestScriptHandler* ch =
    static_cast<cmCTestScriptHandler*>(this->GetHandler("script"));
  cmake* cm =  ch->GetCMake();
  // if no CMake then this is the old style script and props like
  // this will not work anyway.
  if(!cm)
  {
    return;
  }
  // This code should go when cdash is changed to use labels only
  const char* subproject = cm->GetProperty("SubProject", cmProperty::GLOBAL);
  if(subproject)
  {
    ostr << "<Subproject name=\"" << subproject << "\">\n";
    const char* labels =
      ch->GetCMake()->GetProperty("SubProjectLabels", cmProperty::GLOBAL);
    if(labels)
    {
      ostr << "  <Labels>\n";
      std::string l = labels;
      std::vector<std::string> args;
      cmSystemTools::ExpandListArgument(l, args);
      for(std::vector<std::string>::iterator i = args.begin();
          i != args.end(); ++i)
      {
        ostr << "    <Label>" << i->c_str() << "</Label>\n";
      }
      ostr << "  </Labels>\n";
    }
    ostr << "</Subproject>\n";
  }

  // This code should stay when cdash only does label based sub-projects
  const char* label = cm->GetProperty("Label", cmProperty::GLOBAL);
  if(label)
  {
    ostr << "<Labels>\n";
    ostr << "  <Label>" << label << "</Label>\n";
    ostr << "</Labels>\n";
  }
}
  • ch->GetCMake()在我的情况下会以某种方式返回 NULL 吗?

在此先感谢您的帮助。问候。


P.-S.:请不要问我为什么要这样做或那样(除非你有相关的观点要提出),因为-一-没有帮助,-二-如果我这样做,那是因为我有一个很好的理由,这个地方不适合暴露它。我来这里是为了寻求你的帮助,最好是从知道他/她在说什么的人那里寻求帮助,或者明确的最终结果“不,不可能那样做,因为这个”(因为是强制性的 - 请不要强制答案)。

4

0 回答 0