Explorar el Código

Merge topic 'ghs_os_dir'

a1e6b414b9 GHS: Update GHS_BSP_NAME processing
266dadf868 GHS: Print status message regarding GHS_OS_DIR

Acked-by: Kitware Robot <[email protected]>
Merge-request: !3123
Brad King hace 6 años
padre
commit
c756fbce9b

+ 2 - 1
Help/generator/Green Hills MULTI.rst

@@ -41,11 +41,12 @@ Cache variables that are used for toolset and target system customization:
   | Root path for RTOS searches.
   | Defaults to ``C:/ghs`` in Windows or ``/usr/ghs`` in Linux.
 
-* ``GHS_OS_DIR``
+* ``GHS_OS_DIR`` and ``GHS_OS_DIR_OPTION``
 
   | Sets ``-os_dir`` entry in project file.
   | Defaults to latest platform OS installation at ``GHS_OS_ROOT``.  Set this value if
     a specific RTOS is to be used.
+  | ``GHS_OS_DIR_OPTION`` default value is ``-os_dir``.
 
 * ``GHS_BSP_NAME``
 

+ 12 - 11
Modules/Platform/GHS-MULTI-Initialize.cmake → Modules/Platform/GHS-MULTI-Determine.cmake

@@ -13,39 +13,40 @@ mark_as_advanced(GHS_OS_ROOT)
 set(GHS_OS_DIR "NOTFOUND" CACHE PATH "GHS platform OS directory")
 mark_as_advanced(GHS_OS_DIR)
 
-set(GHS_OS_DIR_OPTION "-os_dir " CACHE STRING "GHS compiler os option")
-mark_as_advanced(GHS_OS_DIR)
+set(GHS_OS_DIR_OPTION "-os_dir " CACHE STRING "GHS compiler OS option")
+mark_as_advanced(GHS_OS_DIR_OPTION)
 
 #set GHS_OS_DIR if not set by user
-if ( NOT GHS_OS_DIR )
-  if (EXISTS ${GHS_OS_ROOT})
+if(NOT GHS_OS_DIR)
+  if(EXISTS ${GHS_OS_ROOT})
 
     #get all directories in root directory
     FILE(GLOB GHS_CANDIDATE_OS_DIRS
       LIST_DIRECTORIES true RELATIVE ${GHS_OS_ROOT} ${GHS_OS_ROOT}/*)
     FILE(GLOB GHS_CANDIDATE_OS_FILES
       LIST_DIRECTORIES false RELATIVE ${GHS_OS_ROOT} ${GHS_OS_ROOT}/*)
-    if ( GHS_CANDIDATE_OS_FILES )
+    if(GHS_CANDIDATE_OS_FILES)
       list(REMOVE_ITEM GHS_CANDIDATE_OS_DIRS ${GHS_CANDIDATE_OS_FILES})
     endif ()
 
     #filter based on platform name
-    if (GHS_TARGET_PLATFORM MATCHES "integrity")
-      list(FILTER GHS_CANDIDATE_OS_DIRS INCLUDE REGEX "int[0-9][0-9][0-9][0-9a-z].*")
+    if(GHS_TARGET_PLATFORM MATCHES "integrity")
+      list(FILTER GHS_CANDIDATE_OS_DIRS INCLUDE REGEX "int[0-9][0-9][0-9][0-9a-z]")
     else() #fall-back for standalone
       unset(GHS_CANDIDATE_OS_DIRS)
       set(GHS_OS_DIR "IGNORE")
-    endif ()
+    endif()
 
-    if (GHS_CANDIDATE_OS_DIRS)
+    if(GHS_CANDIDATE_OS_DIRS)
       list(SORT GHS_CANDIDATE_OS_DIRS)
       list(GET GHS_CANDIDATE_OS_DIRS -1 GHS_OS_DIR)
       string(CONCAT GHS_OS_DIR ${GHS_OS_ROOT} "/" ${GHS_OS_DIR})
     endif()
 
+    #update cache with new value
     set(GHS_OS_DIR "${GHS_OS_DIR}" CACHE PATH "GHS platform OS directory" FORCE)
-  endif ()
-endif ()
+  endif()
+endif()
 
 set(GHS_BSP_NAME "IGNORE" CACHE STRING "BSP name")
 

+ 3 - 2
Source/cmCoreTryCompile.cxx

@@ -60,7 +60,8 @@ static std::string const kCMAKE_WARN_DEPRECATED = "CMAKE_WARN_DEPRECATED";
 /* GHS Multi platform variables */
 static std::set<std::string> ghs_platform_vars{
   "GHS_TARGET_PLATFORM", "GHS_PRIMARY_TARGET", "GHS_TOOLSET_ROOT",
-  "GHS_OS_ROOT",         "GHS_OS_DIR",         "GHS_BSP_NAME"
+  "GHS_OS_ROOT",         "GHS_OS_DIR",         "GHS_BSP_NAME",
+  "GHS_OS_DIR_OPTION"
 };
 
 static void writeProperty(FILE* fout, std::string const& targetName,
@@ -896,7 +897,7 @@ int cmCoreTryCompile::TryCompileCode(std::vector<std::string> const& argv,
     // Forward the GHS variables to the inner project cache.
     for (std::string const& var : ghs_platform_vars) {
       if (const char* val = this->Makefile->GetDefinition(var)) {
-        std::string flag = "-D" + var + "=" + val;
+        std::string flag = "-D" + var + "=" + "'" + val + "'";
         cmakeFlags.push_back(std::move(flag));
       }
     }

+ 72 - 52
Source/cmGlobalGhsMultiGenerator.cxx

@@ -119,10 +119,11 @@ bool cmGlobalGhsMultiGenerator::SetGeneratorToolset(std::string const& ts,
 bool cmGlobalGhsMultiGenerator::SetGeneratorPlatform(std::string const& p,
                                                      cmMakefile* mf)
 {
+  std::string arch;
   if (p.empty()) {
     cmSystemTools::Message(
       "Green Hills MULTI: -A <arch> not specified; defaulting to \"arm\"");
-    std::string arch = "arm";
+    arch = "arm";
 
     /* store the platform name for later use
      * -- already done if -A<arch> was specified
@@ -130,19 +131,51 @@ bool cmGlobalGhsMultiGenerator::SetGeneratorPlatform(std::string const& p,
     mf->AddCacheDefinition("CMAKE_GENERATOR_PLATFORM", arch.c_str(),
                            "Name of generator platform.",
                            cmStateEnums::INTERNAL);
+  } else {
+    arch = p;
   }
 
-  const char* tgtPlatform = mf->GetDefinition("GHS_TARGET_PLATFORM");
-  if (tgtPlatform == nullptr) {
-    cmSystemTools::Message("Green Hills MULTI: GHS_TARGET_PLATFORM not "
-                           "specified; defaulting to \"integrity\"");
-    tgtPlatform = "integrity";
+  /* check if OS location has been updated by platform scripts */
+  std::string platform = mf->GetSafeDefinition("GHS_TARGET_PLATFORM");
+  std::string osdir = mf->GetSafeDefinition("GHS_OS_DIR");
+  if (cmSystemTools::IsOff(osdir.c_str()) &&
+      platform.find("integrity") != std::string::npos) {
+    if (!this->CMakeInstance->GetIsInTryCompile()) {
+      /* required OS location is not found */
+      std::string m =
+        "Green Hills MULTI: GHS_OS_DIR not specified; No OS found in \"";
+      m += mf->GetSafeDefinition("GHS_OS_ROOT");
+      m += "\"";
+      cmSystemTools::Message(m);
+    }
+    osdir = "GHS_OS_DIR-NOT-SPECIFIED";
+  } else if (!this->CMakeInstance->GetIsInTryCompile() &&
+             cmSystemTools::IsOff(this->OsDir) &&
+             !cmSystemTools::IsOff(osdir)) {
+    /* OS location was updated by auto-selection */
+    std::string m = "Green Hills MULTI: GHS_OS_DIR not specified; found \"";
+    m += osdir;
+    m += "\"";
+    cmSystemTools::Message(m);
   }
+  this->OsDir = osdir;
 
-  /* store the platform name for later use */
-  mf->AddCacheDefinition("GHS_TARGET_PLATFORM", tgtPlatform,
-                         "Name of GHS target platform.",
-                         cmStateEnums::INTERNAL);
+  // Determine GHS_BSP_NAME
+  std::string bspName = mf->GetSafeDefinition("GHS_BSP_NAME");
+
+  if (cmSystemTools::IsOff(bspName.c_str()) &&
+      platform.find("integrity") != std::string::npos) {
+    bspName = "sim" + arch;
+    /* write back the calculate name for next time */
+    mf->AddCacheDefinition("GHS_BSP_NAME", bspName.c_str(),
+                           "Name of GHS target platform.",
+                           cmStateEnums::STRING, true);
+    std::string m =
+      "Green Hills MULTI: GHS_BSP_NAME not specified; defaulting to \"";
+    m += bspName;
+    m += "\"";
+    cmSystemTools::Message(m);
+  }
 
   return true;
 }
@@ -153,6 +186,21 @@ void cmGlobalGhsMultiGenerator::EnableLanguage(
   mf->AddDefinition("CMAKE_SYSTEM_NAME", "GHS-MULTI");
 
   mf->AddDefinition("GHSMULTI", "1"); // identifier for user CMake files
+
+  const char* tgtPlatform = mf->GetDefinition("GHS_TARGET_PLATFORM");
+  if (!tgtPlatform) {
+    cmSystemTools::Message("Green Hills MULTI: GHS_TARGET_PLATFORM not "
+                           "specified; defaulting to \"integrity\"");
+    tgtPlatform = "integrity";
+  }
+
+  /* store the platform name for later use */
+  mf->AddCacheDefinition("GHS_TARGET_PLATFORM", tgtPlatform,
+                         "Name of GHS target platform.", cmStateEnums::STRING);
+
+  /* store original OS location */
+  this->OsDir = mf->GetSafeDefinition("GHS_OS_DIR");
+
   this->cmGlobalGenerator::EnableLanguage(l, mf, optional);
 }
 
@@ -230,53 +278,25 @@ void cmGlobalGhsMultiGenerator::WriteTopLevelProject(
   fout << "# Top Level Project File" << std::endl;
 
   // Specify BSP option if supplied by user
-  // -- not all platforms require this entry in the project file
-  //    integrity platforms require this field; use default if needed
-  std::string platform;
-  if (const char* p =
-        this->GetCMakeInstance()->GetCacheDefinition("GHS_TARGET_PLATFORM")) {
-    platform = p;
-  }
-
-  std::string bspName;
-  if (char const* bspCache =
-        this->GetCMakeInstance()->GetCacheDefinition("GHS_BSP_NAME")) {
-    bspName = bspCache;
-    this->GetCMakeInstance()->MarkCliAsUsed("GHS_BSP_NAME");
-  } else {
-    bspName = "IGNORE";
-  }
-
-  if (platform.find("integrity") != std::string::npos &&
-      cmSystemTools::IsOff(bspName.c_str())) {
-    const char* a =
-      this->GetCMakeInstance()->GetCacheDefinition("CMAKE_GENERATOR_PLATFORM");
-    bspName = "sim";
-    bspName += (a ? a : "");
-  }
-
-  if (!cmSystemTools::IsOff(bspName.c_str())) {
+  const char* bspName =
+    this->GetCMakeInstance()->GetCacheDefinition("GHS_BSP_NAME");
+  if (!cmSystemTools::IsOff(bspName)) {
     fout << "    -bsp " << bspName << std::endl;
   }
 
   // Specify OS DIR if supplied by user
   // -- not all platforms require this entry in the project file
-  std::string osDir;
-  std::string osDirOption;
-  if (char const* osDirCache =
-        this->GetCMakeInstance()->GetCacheDefinition("GHS_OS_DIR")) {
-    osDir = osDirCache;
-  }
-
-  if (char const* osDirOptionCache =
-        this->GetCMakeInstance()->GetCacheDefinition("GHS_OS_DIR_OPTION")) {
-    osDirOption = osDirOptionCache;
-  }
-
-  if (!cmSystemTools::IsOff(osDir.c_str()) ||
-      platform.find("integrity") != std::string::npos) {
-    std::replace(osDir.begin(), osDir.end(), '\\', '/');
-    fout << "    " << osDirOption << "\"" << osDir << "\"" << std::endl;
+  if (!cmSystemTools::IsOff(this->OsDir.c_str())) {
+    const char* osDirOption =
+      this->GetCMakeInstance()->GetCacheDefinition("GHS_OS_DIR_OPTION");
+    std::replace(this->OsDir.begin(), this->OsDir.end(), '\\', '/');
+    fout << "    ";
+    if (cmSystemTools::IsOff(osDirOption)) {
+      fout << "";
+    } else {
+      fout << osDirOption;
+    }
+    fout << "\"" << this->OsDir << "\"" << std::endl;
   }
 
   WriteSubProjects(fout, root, generators);

+ 1 - 0
Source/cmGlobalGhsMultiGenerator.h

@@ -120,6 +120,7 @@ private:
 
   std::string trimQuotes(std::string const& str);
 
+  std::string OsDir;
   static const char* DEFAULT_BUILD_PROGRAM;
   static const char* DEFAULT_TOOLSET_ROOT;
 };