From 266dadf8683c9c0081368604c4ccae12e8ffc9f7 Mon Sep 17 00:00:00 2001 From: Fred Baksik Date: Tue, 19 Mar 2019 20:56:30 -0400 Subject: GHS: Print status message regarding GHS_OS_DIR -- Rename platform script so it runs before initial try_compile() in project() command. -- Fix incorrect variable name GHS_OS_DIR_OPTION -- Remove unnecessary ".*" from REGEX expression for GHS_CANDIDATE_OS_DIRS -- Forward GHS_OS_DIR_OPTION to try_compile() and preserve trailing whitespace of the variable. --- Help/generator/Green Hills MULTI.rst | 3 +- Modules/Platform/GHS-MULTI-Determine.cmake | 56 +++++++++++++++++++++ Modules/Platform/GHS-MULTI-Initialize.cmake | 55 --------------------- Source/cmCoreTryCompile.cxx | 5 +- Source/cmGlobalGhsMultiGenerator.cxx | 75 +++++++++++++++++++---------- Source/cmGlobalGhsMultiGenerator.h | 1 + 6 files changed, 111 insertions(+), 84 deletions(-) create mode 100644 Modules/Platform/GHS-MULTI-Determine.cmake delete mode 100644 Modules/Platform/GHS-MULTI-Initialize.cmake diff --git a/Help/generator/Green Hills MULTI.rst b/Help/generator/Green Hills MULTI.rst index 09c5b15..138e214 100644 --- a/Help/generator/Green Hills MULTI.rst +++ b/Help/generator/Green Hills MULTI.rst @@ -40,11 +40,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`` diff --git a/Modules/Platform/GHS-MULTI-Determine.cmake b/Modules/Platform/GHS-MULTI-Determine.cmake new file mode 100644 index 0000000..349d906 --- /dev/null +++ b/Modules/Platform/GHS-MULTI-Determine.cmake @@ -0,0 +1,56 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#Setup Green Hills MULTI specific compilation information + +if(CMAKE_HOST_UNIX) + set(GHS_OS_ROOT "/usr/ghs" CACHE PATH "GHS platform OS search root directory") +else() + set(GHS_OS_ROOT "C:/ghs" CACHE PATH "GHS platform OS search root directory") +endif() +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_OPTION) + +#set GHS_OS_DIR if not set by user +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) + 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]") + else() #fall-back for standalone + unset(GHS_CANDIDATE_OS_DIRS) + set(GHS_OS_DIR "IGNORE") + endif() + + 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() + +set(GHS_BSP_NAME "IGNORE" CACHE STRING "BSP name") + +set(GHS_CUSTOMIZATION "" CACHE FILEPATH "optional GHS customization") +mark_as_advanced(GHS_CUSTOMIZATION) +set(GHS_GPJ_MACROS "" CACHE STRING "optional GHS macros generated in the .gpjs for legacy reasons") +mark_as_advanced(GHS_GPJ_MACROS) diff --git a/Modules/Platform/GHS-MULTI-Initialize.cmake b/Modules/Platform/GHS-MULTI-Initialize.cmake deleted file mode 100644 index db65d14..0000000 --- a/Modules/Platform/GHS-MULTI-Initialize.cmake +++ /dev/null @@ -1,55 +0,0 @@ -# Distributed under the OSI-approved BSD 3-Clause License. See accompanying -# file Copyright.txt or https://cmake.org/licensing for details. - -#Setup Green Hills MULTI specific compilation information - -if(CMAKE_HOST_UNIX) - set(GHS_OS_ROOT "/usr/ghs" CACHE PATH "GHS platform OS search root directory") -else() - set(GHS_OS_ROOT "C:/ghs" CACHE PATH "GHS platform OS search root directory") -endif() -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 if not set by user -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 ) - 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].*") - else() #fall-back for standalone - unset(GHS_CANDIDATE_OS_DIRS) - set(GHS_OS_DIR "IGNORE") - endif () - - 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() - - set(GHS_OS_DIR "${GHS_OS_DIR}" CACHE PATH "GHS platform OS directory" FORCE) - endif () -endif () - -set(GHS_BSP_NAME "IGNORE" CACHE STRING "BSP name") - -set(GHS_CUSTOMIZATION "" CACHE FILEPATH "optional GHS customization") -mark_as_advanced(GHS_CUSTOMIZATION) -set(GHS_GPJ_MACROS "" CACHE STRING "optional GHS macros generated in the .gpjs for legacy reasons") -mark_as_advanced(GHS_GPJ_MACROS) diff --git a/Source/cmCoreTryCompile.cxx b/Source/cmCoreTryCompile.cxx index 69d4374..62fba74 100644 --- a/Source/cmCoreTryCompile.cxx +++ b/Source/cmCoreTryCompile.cxx @@ -60,7 +60,8 @@ static std::string const kCMAKE_WARN_DEPRECATED = "CMAKE_WARN_DEPRECATED"; /* GHS Multi platform variables */ static std::set 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, @@ -881,7 +882,7 @@ int cmCoreTryCompile::TryCompileCode(std::vector 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)); } } diff --git a/Source/cmGlobalGhsMultiGenerator.cxx b/Source/cmGlobalGhsMultiGenerator.cxx index e6a1d78..4379b34 100644 --- a/Source/cmGlobalGhsMultiGenerator.cxx +++ b/Source/cmGlobalGhsMultiGenerator.cxx @@ -132,17 +132,30 @@ bool cmGlobalGhsMultiGenerator::SetGeneratorPlatform(std::string const& p, cmStateEnums::INTERNAL); } - 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); } - - /* store the platform name for later use */ - mf->AddCacheDefinition("GHS_TARGET_PLATFORM", tgtPlatform, - "Name of GHS target platform.", - cmStateEnums::INTERNAL); + this->OsDir = osdir; return true; } @@ -153,6 +166,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); } @@ -261,22 +289,17 @@ void cmGlobalGhsMultiGenerator::WriteTopLevelProject( // 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); diff --git a/Source/cmGlobalGhsMultiGenerator.h b/Source/cmGlobalGhsMultiGenerator.h index f8df6ef..3dcf077 100644 --- a/Source/cmGlobalGhsMultiGenerator.h +++ b/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; }; -- cgit v0.12