From 3f33a5387ade823b087e24faeb9f4614ab6df461 Mon Sep 17 00:00:00 2001 From: John Parent Date: Wed, 21 May 2025 23:14:17 +0200 Subject: [PATCH] Makefiles: support shortened object filenames --- Help/release/dev/short-object-names.rst | 3 +++ Source/cmGlobalBorlandMakefileGenerator.cxx | 5 ++++ Source/cmGlobalBorlandMakefileGenerator.h | 2 ++ Source/cmGlobalUnixMakefileGenerator3.cxx | 5 ++++ Source/cmGlobalUnixMakefileGenerator3.h | 1 + Source/cmGlobalWatcomWMakeGenerator.cxx | 5 ++++ Source/cmGlobalWatcomWMakeGenerator.h | 2 ++ Source/cmLocalUnixMakefileGenerator3.cxx | 9 ++++++++ Source/cmLocalUnixMakefileGenerator3.h | 2 ++ Tests/RunCMake/Make/RunCMakeTest.cmake | 23 +++++++++++++++++++ Tests/RunCMake/Make/VerboseBuild.cmake | 2 ++ .../Make/VerboseBuildShort-build-stdout.txt | 1 + .../VerboseBuildShort-build-watcom-stdout.txt | 1 + .../VerboseBuildShort-nowork-gnu-stdout.txt | 1 + Tests/RunCMake/Make/VerboseBuildShort.cmake | 10 ++++++++ .../RunCMake/ObjectLibrary/RunCMakeTest.cmake | 2 +- .../PrecompileHeaders/RunCMakeTest.cmake | 2 +- Tests/RunCMake/UnityBuild/RunCMakeTest.cmake | 2 +- 18 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 Tests/RunCMake/Make/VerboseBuildShort-build-stdout.txt create mode 100644 Tests/RunCMake/Make/VerboseBuildShort-build-watcom-stdout.txt create mode 100644 Tests/RunCMake/Make/VerboseBuildShort-nowork-gnu-stdout.txt create mode 100644 Tests/RunCMake/Make/VerboseBuildShort.cmake diff --git a/Help/release/dev/short-object-names.rst b/Help/release/dev/short-object-names.rst index 1bed98b2fe..758bf27800 100644 --- a/Help/release/dev/short-object-names.rst +++ b/Help/release/dev/short-object-names.rst @@ -8,3 +8,6 @@ short-object-names is supported for the following generators: - :ref:`Ninja Generators` + - :ref:`Makefile Generators` + + Note that the strategy implementation may differ between generators. diff --git a/Source/cmGlobalBorlandMakefileGenerator.cxx b/Source/cmGlobalBorlandMakefileGenerator.cxx index 31e8df280a..cff01d7934 100644 --- a/Source/cmGlobalBorlandMakefileGenerator.cxx +++ b/Source/cmGlobalBorlandMakefileGenerator.cxx @@ -80,6 +80,11 @@ cmGlobalBorlandMakefileGenerator::GenerateBuildCommand( cmake::NO_BUILD_PARALLEL_LEVEL, verbose, buildOptions, makeOptions); } +std::string cmGlobalBorlandMakefileGenerator::GetShortBinaryOutputDir() const +{ + return "_o"; +} + void cmGlobalBorlandMakefileGenerator::PrintBuildCommandAdvice( std::ostream& os, int jobs) const { diff --git a/Source/cmGlobalBorlandMakefileGenerator.h b/Source/cmGlobalBorlandMakefileGenerator.h index 7fff979fb1..6857a2e04e 100644 --- a/Source/cmGlobalBorlandMakefileGenerator.h +++ b/Source/cmGlobalBorlandMakefileGenerator.h @@ -56,6 +56,8 @@ public: bool IsGNUMakeJobServerAware() const override { return false; } + std::string GetShortBinaryOutputDir() const override; + protected: std::vector GenerateBuildCommand( std::string const& makeProgram, std::string const& projectName, diff --git a/Source/cmGlobalUnixMakefileGenerator3.cxx b/Source/cmGlobalUnixMakefileGenerator3.cxx index 6ec64a4492..d2c2692e05 100644 --- a/Source/cmGlobalUnixMakefileGenerator3.cxx +++ b/Source/cmGlobalUnixMakefileGenerator3.cxx @@ -77,6 +77,11 @@ cmDocumentationEntry cmGlobalUnixMakefileGenerator3::GetDocumentation() "Generates standard UNIX makefiles." }; } +bool cmGlobalUnixMakefileGenerator3::SupportsShortObjectNames() const +{ + return true; +} + void cmGlobalUnixMakefileGenerator3::ComputeTargetObjectDirectory( cmGeneratorTarget* gt) const { diff --git a/Source/cmGlobalUnixMakefileGenerator3.h b/Source/cmGlobalUnixMakefileGenerator3.h index 75a4fddd15..2d46f88950 100644 --- a/Source/cmGlobalUnixMakefileGenerator3.h +++ b/Source/cmGlobalUnixMakefileGenerator3.h @@ -195,6 +195,7 @@ public: bool IsIPOSupported() const override { return true; } + bool SupportsShortObjectNames() const override; void ComputeTargetObjectDirectory(cmGeneratorTarget* gt) const override; std::string IncludeDirective; diff --git a/Source/cmGlobalWatcomWMakeGenerator.cxx b/Source/cmGlobalWatcomWMakeGenerator.cxx index 10367477c8..55d3a8d99c 100644 --- a/Source/cmGlobalWatcomWMakeGenerator.cxx +++ b/Source/cmGlobalWatcomWMakeGenerator.cxx @@ -75,6 +75,11 @@ cmGlobalWatcomWMakeGenerator::GenerateBuildCommand( cmake::NO_BUILD_PARALLEL_LEVEL, verbose, buildOptions, makeOptions); } +std::string cmGlobalWatcomWMakeGenerator::GetShortBinaryOutputDir() const +{ + return "_o"; +} + void cmGlobalWatcomWMakeGenerator::PrintBuildCommandAdvice(std::ostream& os, int jobs) const { diff --git a/Source/cmGlobalWatcomWMakeGenerator.h b/Source/cmGlobalWatcomWMakeGenerator.h index d0fb653682..6f00d556fc 100644 --- a/Source/cmGlobalWatcomWMakeGenerator.h +++ b/Source/cmGlobalWatcomWMakeGenerator.h @@ -55,6 +55,8 @@ public: bool IsGNUMakeJobServerAware() const override { return false; } + std::string GetShortBinaryOutputDir() const override; + protected: std::vector GenerateBuildCommand( std::string const& makeProgram, std::string const& projectName, diff --git a/Source/cmLocalUnixMakefileGenerator3.cxx b/Source/cmLocalUnixMakefileGenerator3.cxx index 84ef9dbcda..fc8fb4aeb6 100644 --- a/Source/cmLocalUnixMakefileGenerator3.cxx +++ b/Source/cmLocalUnixMakefileGenerator3.cxx @@ -201,6 +201,15 @@ void cmLocalUnixMakefileGenerator3::Generate() this->WriteDirectoryInformationFile(); } +std::string cmLocalUnixMakefileGenerator3::GetObjectOutputRoot() const +{ + if (this->UseShortObjectNames()) { + return cmStrCat(this->GetCurrentBinaryDirectory(), '/', + this->GetGlobalGenerator()->GetShortBinaryOutputDir()); + } + return cmStrCat(this->GetCurrentBinaryDirectory(), "/CMakeFiles"); +} + void cmLocalUnixMakefileGenerator3::ComputeHomeRelativeOutputPath() { // Compute the path to use when referencing the current output diff --git a/Source/cmLocalUnixMakefileGenerator3.h b/Source/cmLocalUnixMakefileGenerator3.h index 7a9b55aaa9..c4e7d2d5b0 100644 --- a/Source/cmLocalUnixMakefileGenerator3.h +++ b/Source/cmLocalUnixMakefileGenerator3.h @@ -43,6 +43,8 @@ public: */ void Generate() override; + std::string GetObjectOutputRoot() const override; + // this returns the relative path between the HomeOutputDirectory and this // local generators StartOutputDirectory std::string const& GetHomeRelativeOutputPath(); diff --git a/Tests/RunCMake/Make/RunCMakeTest.cmake b/Tests/RunCMake/Make/RunCMakeTest.cmake index 96733297f1..28301994b0 100644 --- a/Tests/RunCMake/Make/RunCMakeTest.cmake +++ b/Tests/RunCMake/Make/RunCMakeTest.cmake @@ -39,6 +39,29 @@ function(run_VerboseBuild) endfunction() run_VerboseBuild() +function(run_VerboseBuildShort) + run_cmake(VerboseBuildShort) + set(RunCMake_TEST_NO_CLEAN 1) + set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/VerboseBuildShort-build) + if(RunCMake_GENERATOR STREQUAL "Watcom WMake") + # wmake does not actually show the verbose output. + set(RunCMake-stdout-file VerboseBuildShort-build-watcom-stdout.txt) + endif() + run_cmake_command(VerboseBuildShort-build ${CMAKE_COMMAND} --build . -v --clean-first) + unset(RunCMake-stdout-file) + set(_backup_lang "$ENV{LANG}") + set(_backup_lc_Messages "$ENV{LC_MESSAGES}") + if(MAKE_IS_GNU) + set(RunCMake-stdout-file VerboseBuildShort-nowork-gnu-stdout.txt) + set(ENV{LANG} "C") + set(ENV{LC_MESSAGES} "C") + endif() + run_cmake_command(VerboseBuildShort-nowork ${CMAKE_COMMAND} --build . --verbose) + set(ENV{LANG} "${_backup_lang}") + set(ENV{LC_MESSAGES} "${_backup_lc_messages}") +endfunction() +run_VerboseBuildShort() + run_cmake(IncludeRegexSubdir) function(run_MakefileConflict) diff --git a/Tests/RunCMake/Make/VerboseBuild.cmake b/Tests/RunCMake/Make/VerboseBuild.cmake index 70a971d13f..ec76816f4a 100644 --- a/Tests/RunCMake/Make/VerboseBuild.cmake +++ b/Tests/RunCMake/Make/VerboseBuild.cmake @@ -1,3 +1,5 @@ +set(CMAKE_INTERMEDIATE_DIR_STRATEGY FULL CACHE STRING "" FORCE) + enable_language(C) # Make sure compile command is not hidden in a temp file. diff --git a/Tests/RunCMake/Make/VerboseBuildShort-build-stdout.txt b/Tests/RunCMake/Make/VerboseBuildShort-build-stdout.txt new file mode 100644 index 0000000000..447d812d83 --- /dev/null +++ b/Tests/RunCMake/Make/VerboseBuildShort-build-stdout.txt @@ -0,0 +1 @@ +DEFINE_FOR_VERBOSE_DETECTION.*.o[\\/]75d5d702[\\/]4efa03e1 diff --git a/Tests/RunCMake/Make/VerboseBuildShort-build-watcom-stdout.txt b/Tests/RunCMake/Make/VerboseBuildShort-build-watcom-stdout.txt new file mode 100644 index 0000000000..ce5c2a975e --- /dev/null +++ b/Tests/RunCMake/Make/VerboseBuildShort-build-watcom-stdout.txt @@ -0,0 +1 @@ +Building C object _o/75d5d702/4efa03e1.obj diff --git a/Tests/RunCMake/Make/VerboseBuildShort-nowork-gnu-stdout.txt b/Tests/RunCMake/Make/VerboseBuildShort-nowork-gnu-stdout.txt new file mode 100644 index 0000000000..3e65cd95fd --- /dev/null +++ b/Tests/RunCMake/Make/VerboseBuildShort-nowork-gnu-stdout.txt @@ -0,0 +1 @@ +.*Nothing to be done for.*hello.* diff --git a/Tests/RunCMake/Make/VerboseBuildShort.cmake b/Tests/RunCMake/Make/VerboseBuildShort.cmake new file mode 100644 index 0000000000..2983e7cdd0 --- /dev/null +++ b/Tests/RunCMake/Make/VerboseBuildShort.cmake @@ -0,0 +1,10 @@ +set(CMAKE_INTERMEDIATE_DIR_STRATEGY SHORT CACHE STRING "" FORCE) + +enable_language(C) + +# Make sure compile command is not hidden in a temp file. +string(REPLACE "${CMAKE_START_TEMP_FILE}" "" CMAKE_C_COMPILE_OBJECT "${CMAKE_C_COMPILE_OBJECT}") +string(REPLACE "${CMAKE_END_TEMP_FILE}" "" CMAKE_C_COMPILE_OBJECT "${CMAKE_C_COMPILE_OBJECT}") + +add_executable(hello hello.c) +target_compile_definitions(hello PRIVATE "DEFINE_FOR_VERBOSE_DETECTION") diff --git a/Tests/RunCMake/ObjectLibrary/RunCMakeTest.cmake b/Tests/RunCMake/ObjectLibrary/RunCMakeTest.cmake index 8e74f5c3e2..6169bc0e56 100644 --- a/Tests/RunCMake/ObjectLibrary/RunCMakeTest.cmake +++ b/Tests/RunCMake/ObjectLibrary/RunCMakeTest.cmake @@ -91,6 +91,6 @@ function(run_Dependencies suffix) endfunction() run_Dependencies("") -if (CMAKE_GENERATOR MATCHES "Ninja") +if (CMAKE_GENERATOR MATCHES "(Ninja|Makefiles)") run_Dependencies(Short) endif () diff --git a/Tests/RunCMake/PrecompileHeaders/RunCMakeTest.cmake b/Tests/RunCMake/PrecompileHeaders/RunCMakeTest.cmake index b837f4c0b1..aa106c438f 100644 --- a/Tests/RunCMake/PrecompileHeaders/RunCMakeTest.cmake +++ b/Tests/RunCMake/PrecompileHeaders/RunCMakeTest.cmake @@ -18,7 +18,7 @@ endfunction() run_cmake(DisabledPch) run_cmake(PchDebugGenex) run_test(PchInterface) -if (CMAKE_GENERATOR MATCHES "Ninja") +if (CMAKE_GENERATOR MATCHES "(Ninja|Makefiles)") run_test(PchInterfaceShort) endif () run_test(PchInterfaceUnity) diff --git a/Tests/RunCMake/UnityBuild/RunCMakeTest.cmake b/Tests/RunCMake/UnityBuild/RunCMakeTest.cmake index b9e6765776..709e369989 100644 --- a/Tests/RunCMake/UnityBuild/RunCMakeTest.cmake +++ b/Tests/RunCMake/UnityBuild/RunCMakeTest.cmake @@ -72,6 +72,6 @@ endfunction() run_test(unitybuild_runtest) run_test(unitybuild_object_library) -if (CMAKE_GENERATOR MATCHES "Ninja") +if (CMAKE_GENERATOR MATCHES "(Ninja|Makefiles)") run_build(unitybuild_cxx_short) endif ()