GHS: Fix handling of duplicate source filenames (#16046)

Green Hills MULTI project files must specify explicitly distinct object
file names for source files with the same name.
This commit is contained in:
Geoff Viola 2016-04-24 13:47:48 -06:00 committed by Brad King
parent 657a446175
commit 1703a6d2c4
7 changed files with 84 additions and 0 deletions

View File

@ -481,9 +481,46 @@ void cmGhsMultiTargetGenerator::WriteCustomCommandsHelper(
}
}
std::map<const cmSourceFile *, std::string>
cmGhsMultiTargetGenerator::GetObjectNames(
const std::vector<cmSourceFile *> &objectSources)
{
bool found_duplicate = false;
std::set<std::string> filenames;
for(std::vector<cmSourceFile *>::const_iterator
sf = objectSources.begin(); sf != objectSources.end(); ++sf)
{
const std::string filename =
cmSystemTools::GetFilenameName((*sf)->GetFullPath());
const std::string lower_filename = cmSystemTools::LowerCase(filename);
if (filenames.end() != filenames.find(lower_filename))
{
found_duplicate = true;
}
filenames.insert(lower_filename);
}
std::map<const cmSourceFile *, std::string> objectNames;
if (found_duplicate)
{
for(std::vector<cmSourceFile *>::const_iterator
sf = objectSources.begin(); sf != objectSources.end(); ++sf)
{
std::string full_filename = (*sf)->GetFullPath();
cmsys::SystemTools::ReplaceString(full_filename, ":/", "_");
cmsys::SystemTools::ReplaceString(full_filename, "/", "_");
objectNames[*sf] = full_filename;
}
}
return objectNames;
}
void cmGhsMultiTargetGenerator::WriteSources(
std::vector<cmSourceFile *> const &objectSources)
{
std::map<const cmSourceFile *, std::string> objectNames =
cmGhsMultiTargetGenerator::GetObjectNames(objectSources);
for (std::vector<cmSourceFile *>::const_iterator si = objectSources.begin();
si != objectSources.end(); ++si)
{
@ -515,6 +552,11 @@ void cmGhsMultiTargetGenerator::WriteSources(
"bsp" != (*si)->GetExtension())
{
this->WriteObjectLangOverride(this->FolderBuildStreams[sgPath], (*si));
if (objectNames.end() != objectNames.find(*si))
{
*this->FolderBuildStreams[sgPath] << " -o \"" <<
objectNames.find(*si)->second << ".o\"" << std::endl;
}
this->WriteObjectDir(this->FolderBuildStreams[sgPath],
this->AbsBuildFilePath + sgPath);

View File

@ -88,6 +88,8 @@ private:
WriteCustomCommandsHelper(std::vector<cmCustomCommand> const &commandsSet,
cmTarget::CustomCommandType commandType);
void WriteSources(std::vector<cmSourceFile *> const &objectSources);
static std::map<const cmSourceFile *, std::string>
GetObjectNames(const std::vector<cmSourceFile *> &objectSources);
static void WriteObjectLangOverride(cmGeneratedFileStream *fileStream,
cmSourceFile *sourceFile);
static void WriteObjectDir(cmGeneratedFileStream *fileStream,

View File

@ -2103,6 +2103,17 @@ ${CMake_BINARY_DIR}/bin/cmake -DDIR=dev -P ${CMake_SOURCE_DIR}/Utilities/Release
endmacro ()
add_test_GhsMulti("arm_integrity_simarm" "arm_integrity.tgt" "simarm")
add_test_GhsMulti("arm64_integrity_simarm" "arm64_integrity.tgt" "simarm")
add_test(NAME GhsMulti.duplicate_source_filenames
COMMAND ${CMAKE_CTEST_COMMAND}
--build-and-test
"${CMake_SOURCE_DIR}/Tests/GhsMultiDuplicateSourceFilenames"
"${CMake_BINARY_DIR}/Tests/GhsMultiDuplicateSourceFilenames"
--build-generator "Green Hills MULTI"
--build-project ReturnNum
--build-config $<CONFIGURATION>
--build-options -DGHS_PRIMARY_TARGET="arm_integrity.tgt"
-DGHS_BSP_NAME="simarm"
)
endif ()
if(tegra AND NOT "${CMake_SOURCE_DIR};${CMake_BINARY_DIR}" MATCHES " ")

View File

@ -0,0 +1,10 @@
cmake_minimum_required(VERSION 3.5)
project(demo C)
add_library(libdemo test.c subfolder/test.c)
add_executable(demo main.c)
target_link_libraries(demo libdemo)
if(GHSMULTI)
target_compile_options(demo PUBLIC "-non_shared")
endif()

View File

@ -0,0 +1,9 @@
int test_a(void);
int test_b(void);
int main(int argc, char *argv[])
{
test_a();
test_b();
return 0;
}

View File

@ -0,0 +1,5 @@
int test_b()
{
return 2;
}

View File

@ -0,0 +1,5 @@
int test_a()
{
return 1;
}