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:
parent
657a446175
commit
1703a6d2c4
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 " ")
|
||||
|
|
|
@ -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()
|
|
@ -0,0 +1,9 @@
|
|||
int test_a(void);
|
||||
int test_b(void);
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
test_a();
|
||||
test_b();
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
|
||||
int test_b()
|
||||
{
|
||||
return 2;
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
|
||||
int test_a()
|
||||
{
|
||||
return 1;
|
||||
}
|
Loading…
Reference in New Issue