diff --git a/Modules/CMakeFindCodeBlocks.cmake b/Modules/CMakeFindCodeBlocks.cmake index f8d8d5908..bf85ea037 100644 --- a/Modules/CMakeFindCodeBlocks.cmake +++ b/Modules/CMakeFindCodeBlocks.cmake @@ -23,3 +23,18 @@ endif() # Determine builtin macros and include dirs: include(${CMAKE_CURRENT_LIST_DIR}/CMakeExtraGeneratorDetermineCompilerMacrosAndIncludeDirs.cmake) + +# Try to find out how many CPUs we have and set the -j argument for make accordingly +set(_CMAKE_CODEBLOCKS_INITIAL_MAKE_ARGS "") + +include(ProcessorCount) +processorcount(_CMAKE_CODEBLOCKS_PROCESSOR_COUNT) + +# Only set -j if we are under UNIX and if the make-tool used actually has "make" in the name +# (we may also get here in the future e.g. for ninja) +if("${_CMAKE_CODEBLOCKS_PROCESSOR_COUNT}" GREATER 1 AND CMAKE_HOST_UNIX AND "${CMAKE_MAKE_PROGRAM}" MATCHES make) + set(_CMAKE_CODEBLOCKS_INITIAL_MAKE_ARGS "-j${_CMAKE_CODEBLOCKS_PROCESSOR_COUNT}") +endif() + +# This variable is used by the CodeBlocks generator and appended to the make invocation commands. +set(CMAKE_CODEBLOCKS_MAKE_ARGUMENTS "${_CMAKE_CODEBLOCKS_INITIAL_MAKE_ARGS}" CACHE STRING "Additional command line arguments when CodeBlocks invokes make. Enter e.g. -j to get parallel builds") diff --git a/Source/cmExtraCodeBlocksGenerator.cxx b/Source/cmExtraCodeBlocksGenerator.cxx index 9348ef2b3..19f99baf2 100644 --- a/Source/cmExtraCodeBlocksGenerator.cxx +++ b/Source/cmExtraCodeBlocksGenerator.cxx @@ -300,6 +300,8 @@ void cmExtraCodeBlocksGenerator // figure out the compiler std::string compiler = this->GetCBCompilerId(mf); std::string make = mf->GetRequiredDefinition("CMAKE_MAKE_PROGRAM"); + const std::string makeArgs = mf->GetSafeDefinition( + "CMAKE_CODEBLOCKS_MAKE_ARGUMENTS"); fout<<"\n" "\n" @@ -311,7 +313,8 @@ void cmExtraCodeBlocksGenerator " "<\n"; - this->AppendTarget(fout, "all", 0, make.c_str(), lgs[0], compiler.c_str()); + this->AppendTarget(fout, "all", 0, make.c_str(), lgs[0], compiler.c_str(), + makeArgs); // add all executable and library targets and some of the GLOBAL // and UTILITY targets @@ -333,7 +336,8 @@ void cmExtraCodeBlocksGenerator (*lg)->GetBinaryDirectory())==0) { this->AppendTarget(fout, targetName, 0, - make.c_str(), *lg, compiler.c_str()); + make.c_str(), *lg, compiler.c_str(), + makeArgs); } } break; @@ -350,7 +354,7 @@ void cmExtraCodeBlocksGenerator } this->AppendTarget(fout, targetName, 0, - make.c_str(), *lg, compiler.c_str()); + make.c_str(), *lg, compiler.c_str(),makeArgs); break; case cmState::EXECUTABLE: case cmState::STATIC_LIBRARY: @@ -360,11 +364,11 @@ void cmExtraCodeBlocksGenerator { cmGeneratorTarget* gt = *ti; this->AppendTarget(fout, targetName, gt, - make.c_str(), *lg, compiler.c_str()); + make.c_str(), *lg, compiler.c_str(), makeArgs); std::string fastTarget = targetName; fastTarget += "/fast"; this->AppendTarget(fout, fastTarget, gt, - make.c_str(), *lg, compiler.c_str()); + make.c_str(), *lg, compiler.c_str(), makeArgs); } break; default: @@ -555,7 +559,8 @@ void cmExtraCodeBlocksGenerator::AppendTarget(cmGeneratedFileStream& fout, cmGeneratorTarget* target, const char* make, const cmLocalGenerator* lg, - const char* compiler) + const char* compiler, + const std::string& makeFlags) { cmMakefile const* makefile = lg->GetMakefile(); std::string makefileName = lg->GetCurrentBinaryDirectory(); @@ -663,16 +668,18 @@ void cmExtraCodeBlocksGenerator::AppendTarget(cmGeneratedFileStream& fout, fout<<" \n" " BuildMakeCommand(make, makefileName.c_str(), targetName) + << this->BuildMakeCommand(make, makefileName.c_str(), targetName, + makeFlags) << "\" />\n" " BuildMakeCommand(make, makefileName.c_str(),""$file"") + << this->BuildMakeCommand(make, makefileName.c_str(),""$file"", + makeFlags) << "\" />\n" " BuildMakeCommand(make, makefileName.c_str(), "clean") + << this->BuildMakeCommand(make, makefileName.c_str(), "clean", makeFlags) << "\" />\n" " BuildMakeCommand(make, makefileName.c_str(), "clean") + << this->BuildMakeCommand(make, makefileName.c_str(), "clean", makeFlags) << "\" />\n" " \n" " \n"; @@ -753,9 +760,15 @@ int cmExtraCodeBlocksGenerator::GetCBTargetType(cmGeneratorTarget* target) // make std::string cmExtraCodeBlocksGenerator::BuildMakeCommand( const std::string& make, const char* makefile, - const std::string& target) + const std::string& target, const std::string& makeFlags) { std::string command = make; + if (makeFlags.size() > 0) + { + command += " "; + command += makeFlags; + } + std::string generator = this->GlobalGenerator->GetName(); if (generator == "NMake Makefiles") { diff --git a/Source/cmExtraCodeBlocksGenerator.h b/Source/cmExtraCodeBlocksGenerator.h index 0c3846d35..4abfa7e93 100644 --- a/Source/cmExtraCodeBlocksGenerator.h +++ b/Source/cmExtraCodeBlocksGenerator.h @@ -54,13 +54,16 @@ private: std::string GetCBCompilerId(const cmMakefile* mf); int GetCBTargetType(cmGeneratorTarget* target); std::string BuildMakeCommand(const std::string& make, const char* makefile, - const std::string& target); + const std::string& target, + const std::string& makeFlags); void AppendTarget(cmGeneratedFileStream& fout, const std::string& targetName, cmGeneratorTarget* target, const char* make, const cmLocalGenerator* lg, - const char* compiler); + const char* compiler, + const std::string& makeFlags + ); };