Wie Konfiguriere ich portable parallel baut in CMake?
Ist es irgendwie möglich in der Lage sein, eine parallele Version, egal welches build-tool verwendet wird?
Unter Unix können wir hinzufügen make -jN
wobei N die Anzahl der threads, und unter Windows habe ich Hinzugefügt, um die CXX_FLAG "/MP"
die dann in Visual Studio verwendet, um parallel bauen...(?) Wie kann ich meine version so, dass CMAKE_MAKE_PROGRAM
ist nicht immer erweitert, wenn ich CMake?
Was ist eine Allgemeine Lösung?
Ich kam mit dieser:
# Add some multithreaded build support
MARK_AS_ADVANCED(MULTITHREADED_BUILD)
set(MULTITHREADED_BUILD 12 CACHE STRING "How many threads are used to build the project")
if(MULTITHREADED_BUILD)
if(${CMAKE_GENERATOR} MATCHES "Unix Makefiles")
message(STATUS ${CMAKE_BUILD_TOOL})
set(CMAKE_MAKE_PROGRAM "${CMAKE_MAKE_PROGRAM} -j${MULTITHREADED_BUILD}")
message(STATUS "Added arguments to CMAKE_BUILD_TOOL: ${CMAKE_MAKE_PROGRAM}")
elseif(MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
message(STATUS "Added parallel build arguments to CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}")
endif()
endif()
- Nicht sicher, es kann getan werden, glaube nicht, dass seine eine gute Idee auf jeden Fall. CMake beschreibt, wie das Projekt aufgebaut ist und wie seine Sache macht ist eine andere Ebene von CMake.
- Exetnding Ihr Ansatz nur hinzufügen
-DMULTITHREADED_BUILD=12
auf der Kommandozeile von cmake erstellt. und entfernen Sie dieSET(MULTITHREADED_BUILD ...)
- In meinem Fall mit Eclipse CDT führt zu Fehler: "/usr/bin/make -j8" alle können Nicht starten Sie das Programm "/usr/bin/make -j8": Unbekannten Grund Fehler: Programm "/usr/bin/make -j8" not found in PATH
- Mein CMake - / Eclipse-CDT-Fehler aufgrund CMAKE_MAKE_PROGRAM bug: cmake.org/Bug/view.php?id=15497
- Als dieser Beitrag ist ein bisschen alt, Nutzer von CMake >= 3.12.0 sollte die Antwort von @usr1234567
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit CMake 3.12 ist dies möglich. Aus den release notes:
Wie bereits erwähnt durch die dkg, können Sie auch eine Umgebungsvariable
CMAKE_BUILD_PARALLEL_LEVEL
.Links zu CMake-Dokumentation:
CMAKE_BUILD_PARALLEL_LEVEL
Wenn Sie CMake v2.8.8 oder höher, können Sie Ninja als alternative GNU
make
:oder
Wie Sie sehen können, keine Notwendigkeit zu verwenden
CMAKE_MAKE_PROGRAM
, der Aufbau ist parallel standardmäßig, eine Optimierung der Anzahl der Arbeitsplätze abhängig von der verfügbaren CPU-Kerne.Ninja basiert auf einem low-level-JSON-Konfiguration, um die Geschwindigkeit der startup-phase. Daher seine JSON-Konfiguration zu schreiben ist nicht einfach von der hand, und ich immer erzeugen es mit Hilfe eines high-level-tool/IDE:
Als C++ build erfordert oft viel Speicher Ihr computer muss so viel Arbeitsspeicher wie die Anzahl der CPU-Kerne.
Können Sie nicht tun, diese cross-Plattform. Die jN ist die option einen parameter zu machen, und nicht Teil der erzeugten Makefile. Allerdings hätte man die CMake generieren ein Bash-Skript, das ausgeführt wird machen für das Projekt mit -jN (wobei das script sieht bis die Anzahl der Kerne haben).
msbuild your_project.sln /maxcpucount:N
cmake --build . -- /maxcpucount:8
wie CMake alle Parameter übergeben werden, nach dem "leeren"--
dem build-tool.cmake --build . --target install --config release -- /m
und es scheint zu funktionieren auf allen Kernen. Dank diese Diskussion. Ich empfehle auch, nicht geben Sie die genaue Zahl, in diesem Fall MSBuild als build-müssen durchgeführt werden, auf alle verfügbaren Kerne, aber nicht mehr als vorhanden.Ich habe nieder zu schreiben eine
parallelmake.sh
Skript fürUnix Makefiles
-basierte Generatoren. Dies geschieht hier: https://github.com/gabyx/ApproxMVBBUnd die relevanten Teile in der CMake-Datei:
https://github.com/gabyx/ApproxMVBB/blob/master/CMakeLists.txt#L89