2013-05-04 7 views
5

Ich habe eine App mit der folgenden (ich hätte recht häufig gedacht) Verzeichnishierarchie:Gebäude in Bezug auf src/Verzeichnis mit SCons

/src 
    subdir1/ # Subdirs with more source files. 
     more.c 
     SConscript 
    foo.c  # Source files. 
    foo.h 
    SConscript 
/other  # Other top-level directories with no source code. 
/stuff  # However, there are other assets I may want to build. 
README  # Other top-level files. 
SConstruct 

Das Problem ist, dass, wenn ich laufe scons aus dem Top-Level-Verzeichnis , ruft gcc aus diesem Verzeichnis ohne cd ing in src, wie folgt aus:

gcc -o src/foo.o src/foo.c 

Dies ist aus mehreren Gründen problematisch:

  1. Innerhalb meines Programms, ich #include Dateien geben den Pfad relativ zum Verzeichnis src. Zum Beispiel könnte more.cfoo.h mit #include "foo.h" enthalten. Dies schlägt fehl, weil GCC vom übergeordneten Verzeichnis ausgeführt wird. Ich möchte meine Includes nicht in #include "src/foo.h" ändern.
  2. Ich verwende das spezielle Makro __FILE__ für Dinge wie Protokollierung. Wenn es aus dem Top-Level-Verzeichnis erstellt wird, setzt GCC "src/" an den Anfang aller Dateinamen, da dies der Pfad war, den es kompilieren sollte. Das mag wählerisch erscheinen, aber das möchte ich nicht, weil ich meinen Quellenbaum als relativ zum Verzeichnis src betrachte.

(bearbeiten. Ich sollte hinzufügen, dass offensichtlich 1 # kann durch Zugabe von -Isrc als Flag zu GCC festgelegt werden, aber dies scheint mehr Hacks um die Hauptausgabe)

Wie kann ich SCons cd in das Verzeichnis src vor dem Aufruf gcc?

  • Ich will nicht von dem src Verzeichnis, um loszuwerden, und alles nach oben bewegen, denn es gibt viele andere (Nicht-Code-Dateien) auf der obersten Ebene.
  • Ich möchte nicht SCONs cd in jedes Unterverzeichnis. Es sollte nur cd in src und dann von dort aus alle Dateien in der Hierarchie erstellen.
  • Ich könnte dies lösen, indem Sie SConscript in das Verzeichnis src verschieben und es von dort aus starten, vielleicht mit einem Makefile auf der obersten Ebene. Aber das scheint ziemlich hacky, und ich möchte auch SCons verwenden, um (Nicht-Code-) Assets in anderen Verzeichnissen als src zu erstellen.

Ich habe gelesen, dass Sie eine benutzerdefinierte Builder machen können und es ändern Verzeichnisse. Ich möchte jedoch nicht ein ganz neues Builder für C/C++ schreiben. Gibt es eine Möglichkeit, das Verhalten eines vorhandenen Builders zu ändern, ohne einen von Grund auf neu zu schreiben? Auch in einem Forum sagte jemand, dass das Ändern von Verzeichnissen innerhalb einer Builder parallele Builds unterbrechen würde, da es das Verzeichnis ändern würde, aus dem andere Aufgaben aufgebaut sind. Ist das wahr?

+0

Dies scheint wie, was ich auch für mein Problem wollen: https://stackoverflow.com/questions/45519577/scons-link-program-without-build-directory-in-link-path –

Antwort

3

Dieses Verhalten ist nur, wie SCons funktioniert, und es ist nicht möglich zu vermeiden/ändern. Ich habe nach einigen unterstützenden Unterlagen zu seinen Gunsten gesucht und habe keine gefunden. Es ist etwas, an das ich mich gewöhnt habe.

Wie Sie erwähnen, sind die Include-Pfade einfach zu beheben. Der schwierigere Teil ist das __FILE__ Makro. Ich habe das nie bemerkt, bis du es erwähnt hast.Unglücklicherweise denke ich, dass der einzige Weg dahin ist, den Pfad im Logger zu entfernen, was eine ziemlich hässliche Lösung ist.

+0

Vielen Dank für die Bestätigung mein Verdacht. Nun, ich habe meinen Logger aktualisiert, so dass er den gesamten Pfad ausblendet und nur den Dateinamen anzeigt (das ist wahrscheinlich sowieso besser, da die Logs viel sauberer aussehen und Sie den Pfad normalerweise erraten können). Ich schätze, ich kann jetzt damit leben :) – mgiuca