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:
- Innerhalb meines Programms, ich
#include
Dateien geben den Pfad relativ zum Verzeichnissrc
. Zum Beispiel könntemore.c
foo.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. - 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 Verzeichnissrc
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 nurcd
insrc
und dann von dort aus alle Dateien in der Hierarchie erstellen. - Ich könnte dies lösen, indem Sie
SConscript
in das Verzeichnissrc
verschieben und es von dort aus starten, vielleicht mit einemMakefile
auf der obersten Ebene. Aber das scheint ziemlich hacky, und ich möchte auch SCons verwenden, um (Nicht-Code-) Assets in anderen Verzeichnissen alssrc
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?
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 –