Mein Projekt verwendet SCons, um den Buildprozess zu verwalten. Ich möchte mehrere Compiler unterstützen, also entschied ich mich, AddOption
zu verwenden, so dass der Benutzer angeben kann, welcher Compiler in der Befehlszeile verwendet werden soll (wobei der Standardwert der aktuelle Compiler ist).So ermitteln Sie, welcher Compiler angefordert wurde
AddOption('--compiler', dest = 'compiler', type = 'string', action = 'store', default = DefaultEnvironment()['CXX'], help = 'Name of the compiler to use.')
Ich möchte eingebauten Compiler-Einstellungen für verschiedene Compiler (einschließlich solcher Dinge wie maximale Warnstufen für diesen speziellen Compiler) haben können. Dies ist, was mein erster Versuch einer Lösung sieht derzeit wie:
if is_compiler('g++'):
from build_scripts.gcc.std import cxx_std
from build_scripts.gcc.warnings import warnings, warnings_debug, warnings_optimized
from build_scripts.gcc.optimizations import optimizations, preprocessor_optimizations, linker_optimizations
elif is_compiler('clang++'):
from build_scripts.clang.std import cxx_std
from build_scripts.clang.warnings import warnings, warnings_debug, warnings_optimized
from build_scripts.clang.optimizations import optimizations, preprocessor_optimizations, linker_optimizations
Aber ich bin nicht sicher, was wie die is_compiler()
Funktion aussehen zu lassen. Mein erster Gedanke war, den Compiler-Namen (wie "clang ++") direkt mit dem zu vergleichen, was der Benutzer übergibt. Dies ist jedoch sofort fehlgeschlagen, als ich versuchte, scons --compiler=~/data/llvm-3.1-obj/Release+Asserts/bin/clang++
zu verwenden.
Also dachte ich, ich ein wenig schlauer bekommen würde und diese Funktion am Ende des Compilers Zeichenfolge
cxx = GetOption('compiler')
def is_compiler (compiler):
return cxx[-len(compiler):] == compiler
Das sieht nur verwenden, so dass es Verzeichnisse ignoriert. Unglücklicherweise endet 'clang ++' in 'g ++', daher wurde mein Compiler als g ++ anstelle von clang ++ angesehen.
Mein nächster Gedanke war, eine Rückwärtssuche durchzuführen und nach dem ersten Vorkommen eines Pfadtrennzeichens ('\' oder '/') zu suchen, aber dann erkannte ich, dass dies nicht für Leute mit mehreren Compilerversionen funktioniert . Jemand, der mit 'g ++ - 4.7' kompiliert, wird nicht als g ++ registriert.
Gibt es also eine einfache Möglichkeit zu bestimmen, welcher Compiler angefordert wurde?
Momentan werden nur g ++ und clang ++ (und nur ihre zuletzt veröffentlichten Versionen) aufgrund ihrer C++ 11 Unterstützung unterstützt, daher wäre eine Lösung, die nur für diese beiden funktioniert, gut genug für jetzt. Mein oberstes Ziel ist es jedoch, mindestens g ++, clang ++, icc und msvC++ zu unterstützen (sobald sie die erforderlichen C++ 11-Funktionen unterstützen), sodass allgemeinere Lösungen bevorzugt werden.
Ich würde die beiden Ausgaben hier trennen. Problem # 1) * welcher * Compiler angefordert wird und # 2) * wobei * der angeforderte Compiler gefunden wird (dafür können Sie die meisten Zeit sinnvolle Standardwerte verwenden und sie nur angeben lassen, wenn sie den Standardcall nicht wollen/gcc/was auch immer). Die zwei Dinge haben nicht viel gemeinsam, schließlich kann ich leicht einen Softlink zum Klängen erstellen, der 'msvc' genannt wird, wenn ich wollte (tatsächlich nie ausprobiert, aber warum nicht?) – Voo
Ich stimme dem Vorschlag zu, den @Voo dir gegeben hat . Bearbeiten Sie dies, um auf eine Frage einzugrenzen, und erstellen Sie anschließend eine neue Frage. Sie haben zwei gute Fragen, weshalb ich den von Ihnen erstellten (bis jetzt) upvoted habe. – octopusgrabbus
@Voo Wenn du das als Antwort aufschreibst, werde ich es akzeptieren, denn das war die Schlüsseleinsicht, mit der ich das Problem gelöst habe. –