cmCPackIFWGenerator.cxx 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file Copyright.txt or https://cmake.org/licensing for details. */
  3. #include "cmCPackIFWGenerator.h"
  4. #include "cmCPackComponentGroup.h"
  5. #include "cmCPackGenerator.h"
  6. #include "cmCPackIFWCommon.h"
  7. #include "cmCPackIFWInstaller.h"
  8. #include "cmCPackIFWPackage.h"
  9. #include "cmCPackIFWRepository.h"
  10. #include "cmCPackLog.h" // IWYU pragma: keep
  11. #include "cmDuration.h"
  12. #include "cmGeneratedFileStream.h"
  13. #include "cmStringAlgorithms.h"
  14. #include "cmSystemTools.h"
  15. #include <sstream>
  16. #include <utility>
  17. cmCPackIFWGenerator::cmCPackIFWGenerator()
  18. {
  19. this->Generator = this;
  20. }
  21. cmCPackIFWGenerator::~cmCPackIFWGenerator() = default;
  22. int cmCPackIFWGenerator::PackageFiles()
  23. {
  24. cmCPackIFWLogger(OUTPUT, "- Configuration" << std::endl);
  25. // Installer configuragion
  26. this->Installer.GenerateInstallerFile();
  27. // Packages configuration
  28. this->Installer.GeneratePackageFiles();
  29. std::string ifwTLD = this->GetOption("CPACK_TOPLEVEL_DIRECTORY");
  30. std::string ifwTmpFile = ifwTLD;
  31. ifwTmpFile += "/IFWOutput.log";
  32. // Run repogen
  33. if (!this->Installer.RemoteRepositories.empty()) {
  34. std::string ifwCmd = this->RepoGen;
  35. if (this->IsVersionLess("2.0.0")) {
  36. ifwCmd += " -c " + this->toplevel + "/config/config.xml";
  37. }
  38. ifwCmd += " -p " + this->toplevel + "/packages";
  39. if (!this->PkgsDirsVector.empty()) {
  40. for (std::string const& it : this->PkgsDirsVector) {
  41. ifwCmd += " -p " + it;
  42. }
  43. }
  44. if (!this->RepoDirsVector.empty()) {
  45. if (!this->IsVersionLess("3.1")) {
  46. for (std::string const& rd : this->RepoDirsVector) {
  47. ifwCmd += " --repository " + rd;
  48. }
  49. } else {
  50. cmCPackIFWLogger(WARNING,
  51. "The \"CPACK_IFW_REPOSITORIES_DIRECTORIES\" "
  52. << "variable is set, but content will be skipped, "
  53. << "because this feature available only since "
  54. << "QtIFW 3.1. Please update your QtIFW instance."
  55. << std::endl);
  56. }
  57. }
  58. if (!this->OnlineOnly && !this->DownloadedPackages.empty()) {
  59. ifwCmd += " -i ";
  60. std::set<cmCPackIFWPackage*>::iterator it =
  61. this->DownloadedPackages.begin();
  62. ifwCmd += (*it)->Name;
  63. ++it;
  64. while (it != this->DownloadedPackages.end()) {
  65. ifwCmd += "," + (*it)->Name;
  66. ++it;
  67. }
  68. }
  69. ifwCmd += " " + this->toplevel + "/repository";
  70. cmCPackIFWLogger(VERBOSE, "Execute: " << ifwCmd << std::endl);
  71. std::string output;
  72. int retVal = 1;
  73. cmCPackIFWLogger(OUTPUT, "- Generate repository" << std::endl);
  74. bool res = cmSystemTools::RunSingleCommand(
  75. ifwCmd, &output, &output, &retVal, nullptr, this->GeneratorVerbose,
  76. cmDuration::zero());
  77. if (!res || retVal) {
  78. cmGeneratedFileStream ofs(ifwTmpFile);
  79. ofs << "# Run command: " << ifwCmd << std::endl
  80. << "# Output:" << std::endl
  81. << output << std::endl;
  82. cmCPackIFWLogger(ERROR,
  83. "Problem running IFW command: "
  84. << ifwCmd << std::endl
  85. << "Please check " << ifwTmpFile << " for errors"
  86. << std::endl);
  87. return 0;
  88. }
  89. if (!this->Repository.RepositoryUpdate.empty() &&
  90. !this->Repository.PatchUpdatesXml()) {
  91. cmCPackIFWLogger(WARNING,
  92. "Problem patch IFW \"Updates\" "
  93. << "file: "
  94. << this->toplevel + "/repository/Updates.xml"
  95. << std::endl);
  96. }
  97. cmCPackIFWLogger(OUTPUT,
  98. "- repository: " << this->toplevel
  99. << "/repository generated" << std::endl);
  100. }
  101. // Run binary creator
  102. {
  103. std::string ifwCmd = this->BinCreator;
  104. ifwCmd += " -c " + this->toplevel + "/config/config.xml";
  105. if (!this->Installer.Resources.empty()) {
  106. ifwCmd += " -r ";
  107. std::vector<std::string>::iterator it =
  108. this->Installer.Resources.begin();
  109. std::string path = this->toplevel + "/resources/";
  110. ifwCmd += path + *it;
  111. ++it;
  112. while (it != this->Installer.Resources.end()) {
  113. ifwCmd += "," + path + *it;
  114. ++it;
  115. }
  116. }
  117. ifwCmd += " -p " + this->toplevel + "/packages";
  118. if (!this->PkgsDirsVector.empty()) {
  119. for (std::string const& it : this->PkgsDirsVector) {
  120. ifwCmd += " -p " + it;
  121. }
  122. }
  123. if (!this->RepoDirsVector.empty()) {
  124. if (!this->IsVersionLess("3.1")) {
  125. for (std::string const& rd : this->RepoDirsVector) {
  126. ifwCmd += " --repository " + rd;
  127. }
  128. } else {
  129. cmCPackIFWLogger(WARNING,
  130. "The \"CPACK_IFW_REPOSITORIES_DIRECTORIES\" "
  131. << "variable is set, but content will be skipped, "
  132. << "because this feature available only since "
  133. << "QtIFW 3.1. Please update your QtIFW instance."
  134. << std::endl);
  135. }
  136. }
  137. if (this->OnlineOnly) {
  138. ifwCmd += " --online-only";
  139. } else if (!this->DownloadedPackages.empty() &&
  140. !this->Installer.RemoteRepositories.empty()) {
  141. ifwCmd += " -e ";
  142. std::set<cmCPackIFWPackage*>::iterator it =
  143. this->DownloadedPackages.begin();
  144. ifwCmd += (*it)->Name;
  145. ++it;
  146. while (it != this->DownloadedPackages.end()) {
  147. ifwCmd += "," + (*it)->Name;
  148. ++it;
  149. }
  150. } else if (!this->DependentPackages.empty()) {
  151. ifwCmd += " -i ";
  152. // Binary
  153. std::set<cmCPackIFWPackage*>::iterator bit =
  154. this->BinaryPackages.begin();
  155. while (bit != this->BinaryPackages.end()) {
  156. ifwCmd += (*bit)->Name + ",";
  157. ++bit;
  158. }
  159. // Depend
  160. DependenceMap::iterator it = this->DependentPackages.begin();
  161. ifwCmd += it->second.Name;
  162. ++it;
  163. while (it != this->DependentPackages.end()) {
  164. ifwCmd += "," + it->second.Name;
  165. ++it;
  166. }
  167. }
  168. // TODO: set correct name for multipackages
  169. if (!this->packageFileNames.empty()) {
  170. ifwCmd += " " + this->packageFileNames[0];
  171. } else {
  172. ifwCmd += " installer";
  173. ifwCmd += this->OutputExtension;
  174. }
  175. cmCPackIFWLogger(VERBOSE, "Execute: " << ifwCmd << std::endl);
  176. std::string output;
  177. int retVal = 1;
  178. cmCPackIFWLogger(OUTPUT, "- Generate package" << std::endl);
  179. bool res = cmSystemTools::RunSingleCommand(
  180. ifwCmd, &output, &output, &retVal, nullptr, this->GeneratorVerbose,
  181. cmDuration::zero());
  182. if (!res || retVal) {
  183. cmGeneratedFileStream ofs(ifwTmpFile);
  184. ofs << "# Run command: " << ifwCmd << std::endl
  185. << "# Output:" << std::endl
  186. << output << std::endl;
  187. cmCPackIFWLogger(ERROR,
  188. "Problem running IFW command: "
  189. << ifwCmd << std::endl
  190. << "Please check " << ifwTmpFile << " for errors"
  191. << std::endl);
  192. return 0;
  193. }
  194. }
  195. return 1;
  196. }
  197. const char* cmCPackIFWGenerator::GetPackagingInstallPrefix()
  198. {
  199. const char* defPrefix = this->cmCPackGenerator::GetPackagingInstallPrefix();
  200. std::string tmpPref = defPrefix ? defPrefix : "";
  201. if (this->Components.empty()) {
  202. tmpPref += "packages/" + this->GetRootPackageName() + "/data";
  203. }
  204. this->SetOption("CPACK_IFW_PACKAGING_INSTALL_PREFIX", tmpPref.c_str());
  205. return this->GetOption("CPACK_IFW_PACKAGING_INSTALL_PREFIX");
  206. }
  207. const char* cmCPackIFWGenerator::GetOutputExtension()
  208. {
  209. return this->OutputExtension.c_str();
  210. }
  211. int cmCPackIFWGenerator::InitializeInternal()
  212. {
  213. // Search Qt Installer Framework tools
  214. const std::string BinCreatorOpt = "CPACK_IFW_BINARYCREATOR_EXECUTABLE";
  215. const std::string RepoGenOpt = "CPACK_IFW_REPOGEN_EXECUTABLE";
  216. const std::string FrameworkVersionOpt = "CPACK_IFW_FRAMEWORK_VERSION";
  217. if (!this->IsSet(BinCreatorOpt) || !this->IsSet(RepoGenOpt) ||
  218. !this->IsSet(FrameworkVersionOpt)) {
  219. this->ReadListFile("CPackIFW.cmake");
  220. }
  221. // Look 'binarycreator' executable (needs)
  222. const char* BinCreatorStr = this->GetOption(BinCreatorOpt);
  223. if (!BinCreatorStr || cmSystemTools::IsNOTFOUND(BinCreatorStr)) {
  224. this->BinCreator.clear();
  225. } else {
  226. this->BinCreator = BinCreatorStr;
  227. }
  228. if (this->BinCreator.empty()) {
  229. cmCPackIFWLogger(ERROR,
  230. "Cannot find QtIFW compiler \"binarycreator\": "
  231. "likely it is not installed, or not in your PATH"
  232. << std::endl);
  233. return 0;
  234. }
  235. // Look 'repogen' executable (optional)
  236. const char* RepoGenStr = this->GetOption(RepoGenOpt);
  237. if (!RepoGenStr || cmSystemTools::IsNOTFOUND(RepoGenStr)) {
  238. this->RepoGen.clear();
  239. } else {
  240. this->RepoGen = RepoGenStr;
  241. }
  242. // Framework version
  243. if (const char* FrameworkVersionSrt = this->GetOption(FrameworkVersionOpt)) {
  244. this->FrameworkVersion = FrameworkVersionSrt;
  245. } else {
  246. this->FrameworkVersion = "1.9.9";
  247. }
  248. // Variables that Change Behavior
  249. // Resolve duplicate names
  250. this->ResolveDuplicateNames =
  251. this->IsOn("CPACK_IFW_RESOLVE_DUPLICATE_NAMES");
  252. // Additional packages dirs
  253. this->PkgsDirsVector.clear();
  254. if (const char* dirs = this->GetOption("CPACK_IFW_PACKAGES_DIRECTORIES")) {
  255. cmExpandList(dirs, this->PkgsDirsVector);
  256. }
  257. // Additional repositories dirs
  258. this->RepoDirsVector.clear();
  259. if (const char* dirs =
  260. this->GetOption("CPACK_IFW_REPOSITORIES_DIRECTORIES")) {
  261. cmExpandList(dirs, this->RepoDirsVector);
  262. }
  263. // Installer
  264. this->Installer.Generator = this;
  265. this->Installer.ConfigureFromOptions();
  266. // Repository
  267. this->Repository.Generator = this;
  268. this->Repository.Name = "Unspecified";
  269. if (const char* site = this->GetOption("CPACK_DOWNLOAD_SITE")) {
  270. this->Repository.Url = site;
  271. this->Installer.RemoteRepositories.push_back(&this->Repository);
  272. }
  273. // Repositories
  274. if (const char* RepoAllStr = this->GetOption("CPACK_IFW_REPOSITORIES_ALL")) {
  275. std::vector<std::string> RepoAllVector;
  276. cmExpandList(RepoAllStr, RepoAllVector);
  277. for (std::string const& r : RepoAllVector) {
  278. this->GetRepository(r);
  279. }
  280. }
  281. if (const char* ifwDownloadAll = this->GetOption("CPACK_IFW_DOWNLOAD_ALL")) {
  282. this->OnlineOnly = cmSystemTools::IsOn(ifwDownloadAll);
  283. } else if (const char* cpackDownloadAll =
  284. this->GetOption("CPACK_DOWNLOAD_ALL")) {
  285. this->OnlineOnly = cmSystemTools::IsOn(cpackDownloadAll);
  286. } else {
  287. this->OnlineOnly = false;
  288. }
  289. if (!this->Installer.RemoteRepositories.empty() && this->RepoGen.empty()) {
  290. cmCPackIFWLogger(ERROR,
  291. "Cannot find QtIFW repository generator \"repogen\": "
  292. "likely it is not installed, or not in your PATH"
  293. << std::endl);
  294. return 0;
  295. }
  296. // Executable suffix
  297. std::string exeSuffix(this->GetOption("CMAKE_EXECUTABLE_SUFFIX"));
  298. std::string sysName(this->GetOption("CMAKE_SYSTEM_NAME"));
  299. if (sysName == "Linux") {
  300. this->ExecutableSuffix = ".run";
  301. } else if (sysName == "Windows") {
  302. this->ExecutableSuffix = ".exe";
  303. } else if (sysName == "Darwin") {
  304. this->ExecutableSuffix = ".app";
  305. } else {
  306. this->ExecutableSuffix = exeSuffix;
  307. }
  308. // Output extension
  309. if (const char* optOutExt =
  310. this->GetOption("CPACK_IFW_PACKAGE_FILE_EXTENSION")) {
  311. this->OutputExtension = optOutExt;
  312. } else if (sysName == "Darwin") {
  313. this->OutputExtension = ".dmg";
  314. } else {
  315. this->OutputExtension = this->ExecutableSuffix;
  316. }
  317. if (this->OutputExtension.empty()) {
  318. this->OutputExtension = this->cmCPackGenerator::GetOutputExtension();
  319. }
  320. return this->Superclass::InitializeInternal();
  321. }
  322. std::string cmCPackIFWGenerator::GetComponentInstallDirNameSuffix(
  323. const std::string& componentName)
  324. {
  325. const std::string prefix = "packages/";
  326. const std::string suffix = "/data";
  327. if (this->componentPackageMethod == this->ONE_PACKAGE) {
  328. return std::string(prefix + this->GetRootPackageName() + suffix);
  329. }
  330. return prefix +
  331. this->GetComponentPackageName(&this->Components[componentName]) + suffix;
  332. }
  333. cmCPackComponent* cmCPackIFWGenerator::GetComponent(
  334. const std::string& projectName, const std::string& componentName)
  335. {
  336. ComponentsMap::iterator cit = this->Components.find(componentName);
  337. if (cit != this->Components.end()) {
  338. return &(cit->second);
  339. }
  340. cmCPackComponent* component =
  341. this->cmCPackGenerator::GetComponent(projectName, componentName);
  342. if (!component) {
  343. return component;
  344. }
  345. std::string name = this->GetComponentPackageName(component);
  346. PackagesMap::iterator pit = this->Packages.find(name);
  347. if (pit != this->Packages.end()) {
  348. return component;
  349. }
  350. cmCPackIFWPackage* package = &this->Packages[name];
  351. package->Name = name;
  352. package->Generator = this;
  353. if (package->ConfigureFromComponent(component)) {
  354. package->Installer = &this->Installer;
  355. this->Installer.Packages.insert(
  356. std::pair<std::string, cmCPackIFWPackage*>(name, package));
  357. this->ComponentPackages.insert(
  358. std::pair<cmCPackComponent*, cmCPackIFWPackage*>(component, package));
  359. if (component->IsDownloaded) {
  360. this->DownloadedPackages.insert(package);
  361. } else {
  362. this->BinaryPackages.insert(package);
  363. }
  364. } else {
  365. this->Packages.erase(name);
  366. cmCPackIFWLogger(ERROR,
  367. "Cannot configure package \""
  368. << name << "\" for component \"" << component->Name
  369. << "\"" << std::endl);
  370. }
  371. return component;
  372. }
  373. cmCPackComponentGroup* cmCPackIFWGenerator::GetComponentGroup(
  374. const std::string& projectName, const std::string& groupName)
  375. {
  376. cmCPackComponentGroup* group =
  377. this->cmCPackGenerator::GetComponentGroup(projectName, groupName);
  378. if (!group) {
  379. return group;
  380. }
  381. std::string name = this->GetGroupPackageName(group);
  382. PackagesMap::iterator pit = this->Packages.find(name);
  383. if (pit != this->Packages.end()) {
  384. return group;
  385. }
  386. cmCPackIFWPackage* package = &this->Packages[name];
  387. package->Name = name;
  388. package->Generator = this;
  389. if (package->ConfigureFromGroup(group)) {
  390. package->Installer = &this->Installer;
  391. this->Installer.Packages.insert(
  392. std::pair<std::string, cmCPackIFWPackage*>(name, package));
  393. this->GroupPackages.insert(
  394. std::pair<cmCPackComponentGroup*, cmCPackIFWPackage*>(group, package));
  395. this->BinaryPackages.insert(package);
  396. } else {
  397. this->Packages.erase(name);
  398. cmCPackIFWLogger(ERROR,
  399. "Cannot configure package \""
  400. << name << "\" for component group \"" << group->Name
  401. << "\"" << std::endl);
  402. }
  403. return group;
  404. }
  405. enum cmCPackGenerator::CPackSetDestdirSupport
  406. cmCPackIFWGenerator::SupportsSetDestdir() const
  407. {
  408. return cmCPackGenerator::SETDESTDIR_SHOULD_NOT_BE_USED;
  409. }
  410. bool cmCPackIFWGenerator::SupportsAbsoluteDestination() const
  411. {
  412. return false;
  413. }
  414. bool cmCPackIFWGenerator::SupportsComponentInstallation() const
  415. {
  416. return true;
  417. }
  418. bool cmCPackIFWGenerator::IsOnePackage() const
  419. {
  420. return this->componentPackageMethod == cmCPackGenerator::ONE_PACKAGE;
  421. }
  422. std::string cmCPackIFWGenerator::GetRootPackageName()
  423. {
  424. // Default value
  425. std::string name = "root";
  426. if (const char* optIFW_PACKAGE_GROUP =
  427. this->GetOption("CPACK_IFW_PACKAGE_GROUP")) {
  428. // Configure from root group
  429. cmCPackIFWPackage package;
  430. package.Generator = this;
  431. package.ConfigureFromGroup(optIFW_PACKAGE_GROUP);
  432. name = package.Name;
  433. } else if (const char* optIFW_PACKAGE_NAME =
  434. this->GetOption("CPACK_IFW_PACKAGE_NAME")) {
  435. // Configure from root package name
  436. name = optIFW_PACKAGE_NAME;
  437. } else if (const char* optPACKAGE_NAME =
  438. this->GetOption("CPACK_PACKAGE_NAME")) {
  439. // Configure from package name
  440. name = optPACKAGE_NAME;
  441. }
  442. return name;
  443. }
  444. std::string cmCPackIFWGenerator::GetGroupPackageName(
  445. cmCPackComponentGroup* group) const
  446. {
  447. std::string name;
  448. if (!group) {
  449. return name;
  450. }
  451. if (cmCPackIFWPackage* package = this->GetGroupPackage(group)) {
  452. return package->Name;
  453. }
  454. const char* option =
  455. this->GetOption("CPACK_IFW_COMPONENT_GROUP_" +
  456. cmsys::SystemTools::UpperCase(group->Name) + "_NAME");
  457. name = option ? option : group->Name;
  458. if (group->ParentGroup) {
  459. cmCPackIFWPackage* package = this->GetGroupPackage(group->ParentGroup);
  460. bool dot = !this->ResolveDuplicateNames;
  461. if (dot && name.substr(0, package->Name.size()) == package->Name) {
  462. dot = false;
  463. }
  464. if (dot) {
  465. name = package->Name + "." + name;
  466. }
  467. }
  468. return name;
  469. }
  470. std::string cmCPackIFWGenerator::GetComponentPackageName(
  471. cmCPackComponent* component) const
  472. {
  473. std::string name;
  474. if (!component) {
  475. return name;
  476. }
  477. if (cmCPackIFWPackage* package = this->GetComponentPackage(component)) {
  478. return package->Name;
  479. }
  480. std::string prefix = "CPACK_IFW_COMPONENT_" +
  481. cmsys::SystemTools::UpperCase(component->Name) + "_";
  482. const char* option = this->GetOption(prefix + "NAME");
  483. name = option ? option : component->Name;
  484. if (component->Group) {
  485. cmCPackIFWPackage* package = this->GetGroupPackage(component->Group);
  486. if ((this->componentPackageMethod ==
  487. cmCPackGenerator::ONE_PACKAGE_PER_GROUP) ||
  488. this->IsOn(prefix + "COMMON")) {
  489. return package->Name;
  490. }
  491. bool dot = !this->ResolveDuplicateNames;
  492. if (dot && name.substr(0, package->Name.size()) == package->Name) {
  493. dot = false;
  494. }
  495. if (dot) {
  496. name = package->Name + "." + name;
  497. }
  498. }
  499. return name;
  500. }
  501. cmCPackIFWPackage* cmCPackIFWGenerator::GetGroupPackage(
  502. cmCPackComponentGroup* group) const
  503. {
  504. std::map<cmCPackComponentGroup*, cmCPackIFWPackage*>::const_iterator pit =
  505. this->GroupPackages.find(group);
  506. return pit != this->GroupPackages.end() ? pit->second : nullptr;
  507. }
  508. cmCPackIFWPackage* cmCPackIFWGenerator::GetComponentPackage(
  509. cmCPackComponent* component) const
  510. {
  511. std::map<cmCPackComponent*, cmCPackIFWPackage*>::const_iterator pit =
  512. this->ComponentPackages.find(component);
  513. return pit != this->ComponentPackages.end() ? pit->second : nullptr;
  514. }
  515. cmCPackIFWRepository* cmCPackIFWGenerator::GetRepository(
  516. const std::string& repositoryName)
  517. {
  518. RepositoriesMap::iterator rit = this->Repositories.find(repositoryName);
  519. if (rit != this->Repositories.end()) {
  520. return &(rit->second);
  521. }
  522. cmCPackIFWRepository* repository = &this->Repositories[repositoryName];
  523. repository->Name = repositoryName;
  524. repository->Generator = this;
  525. if (repository->ConfigureFromOptions()) {
  526. if (repository->Update == cmCPackIFWRepository::None) {
  527. this->Installer.RemoteRepositories.push_back(repository);
  528. } else {
  529. this->Repository.RepositoryUpdate.push_back(repository);
  530. }
  531. } else {
  532. this->Repositories.erase(repositoryName);
  533. repository = nullptr;
  534. cmCPackIFWLogger(WARNING,
  535. "Invalid repository \""
  536. << repositoryName << "\""
  537. << " configuration. Repository will be skipped."
  538. << std::endl);
  539. }
  540. return repository;
  541. }