Investigate build times of CMake
I have seen people bringing up the build times of CMake as a pain point and I have also noticed that during my contributions, however for me it's an infrequent occurence, so I don't mind all that much.
I think source based distributions are affected for one here.
I have compiled CMake via the bootstrap script on an Ubuntu VM with 2 cores, CMake being at commit ad2e7f3c with the following command:
CPP=clang-cpp-12 \
LD=ld.lld-12 \
CC=clang-12 \
CXX=clang++-12 \
CFLAGS="-ftime-trace -isystem /usr/include/c++/10 -isystem /usr/include/x86_64-linux-gnu/c++/10" \
CXXFLAGS="-ftime-trace -isystem /usr/include/c++/10 -isystem /usr/include/x86_64-linux-gnu/c++/10 -stdlib=libstdc++" \
LDFLAGS="-L/usr/lib/gcc/x86_64-linux-gnu/10" \
time sh -ec '.../cmake/bootstrap --system-libs --bootstrap-system-libuv --bootstrap-system-jsoncpp --bootstrap-system-librhash --generator=Ninja --parallel=2 -- -DBUILD_TESTING=0 && ninja'
time
output:
1473.50user 70.72system 13:19.68elapsed 193%CPU (0avgtext+0avgdata 357652maxresident)k
273376inputs+745440outputs (7633major+14968114minor)pagefaults 0swaps
Analysis of the traces:
ClangBuildAnalyzer output
Analyzing build trace from '.../out'...
**** Time summary:
Compilation (1330 times):
Parsing (frontend): 1425.5 s
Codegen & opts (backend): 675.2 s
**** Files that took longest to parse (compiler frontend):
9339 ms: .../Source/CMakeFiles/CMakeLib.dir/cmGeneratorTarget.cxx.o
7424 ms: .../Source/CMakeFiles/CMakeLib.dir/cmake.cxx.o
7164 ms: .../Source/CMakeFiles/CMakeLib.dir/cmGlobalNinjaGenerator.cxx.o
6971 ms: .../Source/CMakeFiles/CMakeLib.dir/cmGlobalGenerator.cxx.o
6872 ms: .../Source/CMakeFiles/CMakeLib.dir/cmQtAutoGenInitializer.cxx.o
6680 ms: .../Source/CMakeFiles/CTestLib.dir/CTest/cmCTestTestHandler.cxx.o
6380 ms: .../Source/CMakeFiles/CMakeLib.dir/cmLocalGenerator.cxx.o
6324 ms: .../Source/CMakeFiles/CMakeLib.dir/cmMakefileTargetGenerator.cxx.o
6290 ms: .../Source/CMakeFiles/CMakeLib.dir/cmGeneratorExpressionNode.cxx.o
6157 ms: .../Source/CMakeFiles/CMakeLib.dir/cmFileCommand.cxx.o
**** Files that took longest to codegen (compiler backend):
32903 ms: .../Source/CMakeFiles/CMakeLib.dir/cmGeneratorTarget.cxx.o
15247 ms: .../Source/CMakeFiles/CMakeLib.dir/cmLocalGenerator.cxx.o
14481 ms: .../Source/CMakeFiles/CMakeLib.dir/cmMakefile.cxx.o
13265 ms: .../Source/CMakeFiles/CMakeLib.dir/cmake.cxx.o
12786 ms: .../Source/CMakeFiles/CMakeLib.dir/cmGlobalNinjaGenerator.cxx.o
12148 ms: .../Source/CMakeFiles/CTestLib.dir/CTest/cmCTestTestHandler.cxx.o
11985 ms: .../Source/CMakeFiles/CMakeLib.dir/cmGlobalGenerator.cxx.o
11581 ms: .../Source/CMakeFiles/CTestLib.dir/cmCTest.cxx.o
11339 ms: .../Source/CMakeFiles/CMakeLib.dir/cmTarget.cxx.o
11086 ms: .../Source/CMakeFiles/CTestLib.dir/CTest/cmCTestCoverageHandler.cxx.o
**** Templates that took longest to instantiate:
8396 ms: std::_Rb_tree<std::basic_string<char>, std::pair<const std::basic_st... (682 times, avg 12 ms)
6939 ms: std::unique_ptr<cmTargetInternals> (360 times, avg 19 ms)
6884 ms: std::set<std::basic_string<char>>::insert (211 times, avg 32 ms)
6827 ms: std::unique_ptr<cmCustomCommand> (341 times, avg 20 ms)
6679 ms: std::make_shared<cmListFileFunction::Implementation, std::basic_stri... (414 times, avg 16 ms)
6524 ms: std::_Rb_tree<std::basic_string<char>, std::pair<const std::basic_st... (341 times, avg 19 ms)
6521 ms: std::unique_ptr<cmMakefile::DeferCommands> (338 times, avg 19 ms)
6331 ms: std::unordered_map<int, int> (353 times, avg 17 ms)
5611 ms: std::allocate_shared<cmListFileFunction::Implementation, std::alloca... (414 times, avg 13 ms)
5601 ms: std::__uniq_ptr_data<cmTargetInternals, std::default_delete<cmTarget... (360 times, avg 15 ms)
5539 ms: std::__uniq_ptr_impl<cmTargetInternals, std::default_delete<cmTarget... (360 times, avg 15 ms)
5537 ms: std::__uniq_ptr_data<cmCustomCommand, std::default_delete<cmCustomCo... (341 times, avg 16 ms)
5487 ms: std::__uniq_ptr_impl<cmCustomCommand, std::default_delete<cmCustomCo... (341 times, avg 16 ms)
5422 ms: std::shared_ptr<cmListFileFunction::Implementation>::shared_ptr<std:... (414 times, avg 13 ms)
5254 ms: std::__shared_ptr<cmListFileFunction::Implementation, __gnu_cxx::_S_... (414 times, avg 12 ms)
5254 ms: std::__uniq_ptr_data<cmMakefile::DeferCommands, std::default_delete<... (338 times, avg 15 ms)
5187 ms: std::basic_string<char16_t>::_M_construct<const char16_t *> (1300 times, avg 3 ms)
5178 ms: std::basic_string<char32_t>::_M_construct<const char32_t *> (1300 times, avg 3 ms)
5178 ms: std::__uniq_ptr_impl<cmMakefile::DeferCommands, std::default_delete<... (338 times, avg 15 ms)
5007 ms: std::unordered_map<std::basic_string<char>, std::vector<cmSourceFile... (338 times, avg 14 ms)
4930 ms: std::_Hashtable<int, std::pair<const int, int>, std::allocator<std::... (353 times, avg 13 ms)
4898 ms: std::__shared_count<__gnu_cxx::_S_atomic>::__shared_count<cmListFile... (414 times, avg 11 ms)
4736 ms: std::unordered_map<std::basic_string<char>, cmTarget> (338 times, avg 14 ms)
4702 ms: __gnu_cxx::__to_xstring<std::basic_string<wchar_t>, wchar_t> (650 times, avg 7 ms)
4638 ms: std::basic_string<wchar_t>::_M_construct<wchar_t *> (1300 times, avg 3 ms)
4637 ms: std::unique_ptr<cmSourceGroupInternals> (205 times, avg 22 ms)
4537 ms: std::unique_ptr<cmCustomCommand>::~unique_ptr (338 times, avg 13 ms)
4533 ms: std::_Rb_tree<std::basic_string<char>, std::basic_string<char>, std:... (176 times, avg 25 ms)
4516 ms: std::unordered_map<std::basic_string<char>, cmTarget *> (357 times, avg 12 ms)
4463 ms: std::_Hashtable<std::basic_string<char>, std::pair<const std::basic_... (338 times, avg 13 ms)
**** Template sets that took longest to instantiate:
71362 ms: std::unique_ptr<$> (3545 times, avg 20 ms)
69927 ms: std::__and_<$> (44084 times, avg 1 ms)
57320 ms: std::__uniq_ptr_data<$> (3545 times, avg 16 ms)
56637 ms: std::__uniq_ptr_impl<$> (3545 times, avg 15 ms)
50846 ms: std::_Hashtable<$> (4722 times, avg 10 ms)
48097 ms: std::unordered_map<$> (3430 times, avg 14 ms)
43853 ms: std::vector<$> (13551 times, avg 3 ms)
40290 ms: std::map<$> (6183 times, avg 6 ms)
31260 ms: std::optional<$> (2275 times, avg 13 ms)
28617 ms: std::tuple<$> (3779 times, avg 7 ms)
27139 ms: std::__or_<$> (20659 times, avg 1 ms)
25785 ms: std::_Rb_tree<$> (7729 times, avg 3 ms)
23284 ms: std::_Vector_base<$> (13340 times, avg 1 ms)
22182 ms: std::pair<$> (6727 times, avg 3 ms)
20258 ms: std::__detail::_Hashtable_alloc<$> (4129 times, avg 4 ms)
17808 ms: std::is_convertible<$> (13898 times, avg 1 ms)
17115 ms: std::allocator<$> (14786 times, avg 1 ms)
12374 ms: std::is_move_constructible<$> (6027 times, avg 2 ms)
12314 ms: std::_Optional_base<$> (2275 times, avg 5 ms)
12174 ms: std::basic_string<$> (2600 times, avg 4 ms)
11933 ms: std::__detail::_Hash_node<$> (3490 times, avg 3 ms)
11797 ms: std::__detail::_Hash_node_value_base<$> (3466 times, avg 3 ms)
11497 ms: __gnu_cxx::__aligned_buffer<$> (3459 times, avg 3 ms)
11230 ms: std::_TupleConstraints<$>::__is_implicitly_constructible<$> (6863 times, avg 1 ms)
10898 ms: std::basic_string<$>::_M_construct<$> (3877 times, avg 2 ms)
10218 ms: std::basic_string<$>::basic_string (4022 times, avg 2 ms)
10053 ms: std::basic_string<$>::_M_construct_aux<$> (3759 times, avg 2 ms)
10022 ms: std::chrono::duration<$> (6040 times, avg 1 ms)
9742 ms: std::set<$>::insert (317 times, avg 30 ms)
8944 ms: std::vector<$>::~vector (2570 times, avg 3 ms)
**** Functions that took longest to compile:
2593 ms: cmCTestCoverageHandler::HandleGCovCoverage(cmCTestCoverageHandlerCon... (.../Source/CTest/cmCTestCoverageHandler.cxx)
2551 ms: (anonymous namespace)::HandleTargetsMode(std::vector<std::__cxx11::b... (.../Source/cmInstallCommand.cxx)
2304 ms: cmMakefileTargetGenerator::WriteObjectRuleFiles(cmSourceFile const&) (.../Source/cmMakefileTargetGenerator.cxx)
2153 ms: cmNinjaNormalTargetGenerator::WriteLinkStatement(std::__cxx11::basic... (.../Source/cmNinjaNormalTargetGenerator.cxx)
1907 ms: cmTarget::cmTarget(std::__cxx11::basic_string<char, std::char_traits... (.../Source/cmTarget.cxx)
1657 ms: (anonymous namespace)::Target::Dump() (.../Source/cmFileAPICodemodel.cxx)
1641 ms: cmCTestCoverageHandler::HandleLCovCoverage(cmCTestCoverageHandlerCon... (.../Source/CTest/cmCTestCoverageHandler.cxx)
1627 ms: main (.../Source/CPack/cpack.cxx)
1423 ms: cmake::SetArgs(std::vector<std::__cxx11::basic_string<char, std::cha... (.../Source/cmake.cxx)
1410 ms: cmcmd::ExecuteCMakeCommand(std::vector<std::__cxx11::basic_string<ch... (.../Source/cmcmd.cxx)
1384 ms: cmCPackNSISGenerator::PackageFiles() (.../Source/CPack/cmCPackNSISGenerator.cxx)
1352 ms: cmCoreTryCompile::TryCompileCode(std::vector<std::__cxx11::basic_str... (.../Source/cmCoreTryCompile.cxx)
1271 ms: cmNinjaTargetGenerator::WriteObjectBuildStatement(cmSourceFile const... (.../Source/cmNinjaTargetGenerator.cxx)
1262 ms: cmFindPackageCommand::InitialPass(std::vector<std::__cxx11::basic_st... (.../Source/cmFindPackageCommand.cxx)
1228 ms: (anonymous namespace)::HandleTransformCommand(std::vector<std::__cxx... (.../Source/cmListCommand.cxx)
1186 ms: cmCTestCoverageHandler::ProcessHandler() (.../Source/CTest/cmCTestCoverageHandler.cxx)
1134 ms: cmFindPackageCommand::SearchPrefix(std::__cxx11::basic_string<char, ... (.../Source/cmFindPackageCommand.cxx)
1102 ms: cmMakefileLibraryTargetGenerator::WriteLibraryRules(std::__cxx11::ba... (.../Source/cmMakefileLibraryTargetGenerator.cxx)
1056 ms: cmNinjaTargetGenerator::WriteCompileRule(std::__cxx11::basic_string<... (.../Source/cmNinjaTargetGenerator.cxx)
1029 ms: (anonymous namespace)::cmQtAutoMocUicT::InitFromInfo(cmQtAutoGenerat... (.../Source/cmQtAutoMocUic.cxx)
990 ms: cmCTestSubmitHandler::SubmitUsingHTTP(std::__cxx11::basic_string<cha... (.../Source/CTest/cmCTestSubmitHandler.cxx)
982 ms: cmQtAutoGenInitializer::InitAutogenTarget() (.../Source/cmQtAutoGenInitializer.cxx)
978 ms: cmCMakeLanguageCommand(std::vector<cmListFileArgument, std::allocato... (.../Source/cmCMakeLanguageCommand.cxx)
907 ms: (anonymous namespace)::HandleDownloadCommand(std::vector<std::__cxx1... (.../Source/cmFileCommand.cxx)
893 ms: cmCTestMemCheckHandler::InitializeMemoryChecking() (.../Source/CTest/cmCTestMemCheckHandler.cxx)
847 ms: cmQtAutoGenInitializer::InitScanFiles() (.../Source/cmQtAutoGenInitializer.cxx)
845 ms: cmCPackGenerator::InstallCMakeProject(bool, std::__cxx11::basic_stri... (.../Source/CPack/cmCPackGenerator.cxx)
831 ms: cmCTestSubmitHandler::HandleCDashUploadFile(std::__cxx11::basic_stri... (.../Source/CTest/cmCTestSubmitHandler.cxx)
806 ms: cmCPackGenerator::DoPackage() (.../Source/CPack/cmCPackGenerator.cxx)
804 ms: cmGlobalGenerator::EnableLanguage(std::vector<std::__cxx11::basic_st... (.../Source/cmGlobalGenerator.cxx)
**** Function sets that took longest to compile / optimize:
5057 ms: void std::vector<$>::_M_range_insert<$>(__gnu_cxx::__normal_iterator... (78 times, avg 64 ms)
4243 ms: std::_Rb_tree<$>::_M_get_insert_hint_unique_pos(std::_Rb_tree_const_... (179 times, avg 23 ms)
4238 ms: void std::vector<$>::_M_realloc_insert<$>(__gnu_cxx::__normal_iterat... (137 times, avg 30 ms)
4053 ms: std::_Rb_tree<$>::_M_get_insert_unique_pos(std::__cxx11::basic_strin... (247 times, avg 16 ms)
3110 ms: std::_Rb_tree<$>::_M_erase(std::_Rb_tree_node<$>*) (469 times, avg 6 ms)
3091 ms: std::_Rb_tree_iterator<$> std::_Rb_tree<$>::_M_emplace_hint_unique<$... (201 times, avg 15 ms)
2563 ms: (anonymous namespace)::HandleTargetsMode(std::vector<$> const&, cmEx... (2 times, avg 1281 ms)
2537 ms: void std::vector<$>::_M_realloc_insert<$>(__gnu_cxx::__normal_iterat... (88 times, avg 28 ms)
2169 ms: cmNinjaNormalTargetGenerator::WriteLinkStatement(std::__cxx11::basic... (2 times, avg 1084 ms)
1950 ms: std::_Function_handler<$>::_M_manager(std::_Any_data&, std::_Any_dat... (424 times, avg 4 ms)
1934 ms: std::vector<$>::~vector() (733 times, avg 2 ms)
1925 ms: std::__cxx11::basic_string<$>* std::__uninitialized_copy<$>::__unini... (113 times, avg 17 ms)
1911 ms: cmTarget::cmTarget(std::__cxx11::basic_string<$> const&, cmStateEnum... (2 times, avg 955 ms)
1548 ms: __gnu_cxx::__normal_iterator<$> std::__find_if<$>(__gnu_cxx::__norma... (83 times, avg 18 ms)
1435 ms: cmcmd::ExecuteCMakeCommand(std::vector<$> const&, std::unique_ptr<$>) (2 times, avg 717 ms)
1429 ms: cmake::SetArgs(std::vector<$> const&) (2 times, avg 714 ms)
1373 ms: cmCoreTryCompile::TryCompileCode(std::vector<$> const&, bool) (2 times, avg 686 ms)
1305 ms: void std::_Rb_tree<$>::_M_construct_node<$>(std::_Rb_tree_node<$>*, ... (192 times, avg 6 ms)
1277 ms: cmNinjaTargetGenerator::WriteObjectBuildStatement(cmSourceFile const... (2 times, avg 638 ms)
1269 ms: cmFindPackageCommand::InitialPass(std::vector<$> const&) (2 times, avg 634 ms)
1238 ms: (anonymous namespace)::HandleTransformCommand(std::vector<$> const&,... (2 times, avg 619 ms)
1135 ms: cmFindPackageCommand::SearchPrefix(std::__cxx11::basic_string<$> con... (2 times, avg 567 ms)
1133 ms: void std::__merge_sort_with_buffer<$>(std::reverse_iterator<$>, std:... (2 times, avg 566 ms)
1114 ms: cmMakefileLibraryTargetGenerator::WriteLibraryRules(std::__cxx11::ba... (2 times, avg 557 ms)
1102 ms: void cmComputeLinkDepends::AddLinkEntries<$>(int, std::vector<$> con... (4 times, avg 275 ms)
1082 ms: cmNinjaTargetGenerator::WriteCompileRule(std::__cxx11::basic_string<... (2 times, avg 541 ms)
1055 ms: std::_Hashtable<$>::_M_insert_unique_node(std::__cxx11::basic_string... (53 times, avg 19 ms)
1047 ms: std::vector<std::__cxx11::basic_string<char, std::char_traits<char>,... (39 times, avg 26 ms)
1009 ms: void std::__insertion_sort<$>(__gnu_cxx::__normal_iterator<$>, __gnu... (28 times, avg 36 ms)
996 ms: cmCTestSubmitHandler::SubmitUsingHTTP(std::__cxx11::basic_string<$> ... (2 times, avg 498 ms)
*** Expensive headers:
199497 ms: .../Source/cmMakefile.h (included 338 times, avg 590 ms), included via:
cmMakefile.cxx.o (2095 ms)
cmSetCommand.cxx.o (1769 ms)
cmSetDirectoryPropertiesCommand.cxx.o (1729 ms)
cmGetTestPropertyCommand.cxx.o (1653 ms)
cmAddDependenciesCommand.cxx.o (1643 ms)
cmIncludeGuardCommand.cxx.o (1629 ms)
...
195757 ms: /usr/include/c++/10/string (included 650 times, avg 301 ms), included via:
cmParseCoberturaCoverage.cxx.o cmParseCoberturaCoverage.h (658 ms)
cmSetPropertyCommand.cxx.o cmSetPropertyCommand.h (624 ms)
cmSetTargetPropertiesCommand.cxx.o cmSetTargetPropertiesCommand.h (611 ms)
cmSubdirDependsCommand.cxx.o cmSubdirDependsCommand.h (610 ms)
cmFileLockPool.cxx.o cmFileLockPool.h (598 ms)
cmCTestBuildCommand.cxx.o cmCTestBuildCommand.h (594 ms)
...
94589 ms: .../Source/cmListFileCache.h (included 413 times, avg 229 ms), included via:
cmListFileCache.cxx.o (1234 ms)
cmComputeComponentGraph.cxx.o cmComputeComponentGraph.h cmGraphAdjacencyList.h (1094 ms)
cmMessenger.cxx.o cmMessenger.h (876 ms)
cmGeneratorExpressionDAGChecker.cxx.o cmGeneratorExpressionDAGChecker.h (852 ms)
cmTest.cxx.o cmTest.h (819 ms)
cmFunctionBlocker.cxx.o cmFunctionBlocker.h (805 ms)
...
93187 ms: .../Source/cmSystemTools.h (included 503 times, avg 185 ms), included via:
cmSystemTools.cxx.o (1145 ms)
cmHexFileConverter.cxx.o (898 ms)
cmWorkingDirectory.cxx.o (811 ms)
cmFileLockUnix.cxx (760 ms)
bindexplib.cxx.o (615 ms)
cmLoadCommandCommand.cxx.o cmListFileCache.h (588 ms)
...
88748 ms: /usr/include/c++/10/functional (included 548 times, avg 161 ms), included via:
cmDependsCompiler.cxx.o cmDependsCompiler.h (735 ms)
cmDefinitions.cxx.o cmDefinitions.h (690 ms)
cmCMakePresetsGraphReadJSONTestPresets.cxx.o (653 ms)
cmCustomCommandGenerator.cxx.o cmCustomCommandGenerator.h (634 ms)
cmCMakePresetsGraphReadJSONBuildPresets.cxx.o (628 ms)
cmCMakePresetsGraphReadJSONConfigurePresets.cxx.o (622 ms)
...
86814 ms: .../Source/cmGlobalGenerator.h (included 149 times, avg 582 ms), included via:
cmGlobalGenerator.cxx.o (2357 ms)
cmSourceFileLocation.cxx.o (1677 ms)
cmTargetPropCommandBase.cxx.o (1664 ms)
cmBuildCommand.cxx.o (1642 ms)
cmInstallTargetsCommand.cxx.o (1598 ms)
cmGetDirectoryPropertyCommand.cxx.o (1589 ms)
...
80512 ms: .../Source/cmake.h (included 119 times, avg 676 ms), included via:
cmake.cxx.o (2722 ms)
cmWhileCommand.cxx.o (1419 ms)
cmVariableWatchCommand.cxx.o (1238 ms)
cmFileSet.cxx.o (1216 ms)
cmGeneratorExpressionDAGChecker.cxx.o (1209 ms)
cmIfCommand.cxx.o (1205 ms)
...
66818 ms: /usr/include/c++/10/memory (included 560 times, avg 119 ms), included via:
cmBinUtilsWindowsPELinker.cxx.o cmBinUtilsWindowsPELinker.h (560 ms)
cmCommandArgumentParserHelper.cxx.o cmCommandArgumentParserHelper.h (504 ms)
cmSourceFile.cxx.o cmSourceFile.h (497 ms)
cmCTestSubmitCommand.cxx.o cmCTestSubmitCommand.h (495 ms)
cmQtAutoGen.cxx.o cmQtAutoGen.h (468 ms)
cmFileTimes.cxx.o cmFileTimes.h (463 ms)
...
65322 ms: .../Source/cmAlgorithms.h (included 376 times, avg 173 ms), included via:
cmTarget.cxx.o cmTarget.h (749 ms)
cmNinjaLinkLineComputer.cxx.o cmNinjaLinkLineComputer.h cmLinkLineComputer.h cmStateDirectory.h (743 ms)
cmMSVC60LinkLineComputer.cxx.o cmMSVC60LinkLineComputer.h cmLinkLineComputer.h cmStateDirectory.h (687 ms)
cmLinkLineComputer.cxx.o cmLinkLineComputer.h cmStateDirectory.h (662 ms)
cmOSXBundleGenerator.cxx.o cmGeneratorTarget.h (655 ms)
cmGlobalWatcomWMakeGenerator.cxx.o cmGlobalWatcomWMakeGenerator.h cmGlobalUnixMakefileGenerator3.h cmGeneratorTarget.h (634 ms)
...
65092 ms: /usr/include/c++/10/istream (included 522 times, avg 124 ms), included via:
cmCTestBuildAndTestHandler.cxx.o cmCTestBuildAndTestHandler.h sstream (723 ms)
cmStringAlgorithms.cxx.o cmStringAlgorithms.h sstream (642 ms)
cmQtAutoGenerator.cxx.o cmQtAutoGenerator.h (590 ms)
cmCPackNuGetGenerator.cxx.o cmCPackNuGetGenerator.h cmCPackGenerator.h sstream (540 ms)
cmCPackGenerator.cxx.o cmCPackGenerator.h sstream (499 ms)
cmCTest.cxx.o cmCTest.h sstream (402 ms)
...
done in 0.8s.
It's worth noting that CMake is bootstrapped with PCH support, so that might be a low hanging fruit to look into.