SCons Bibliotheken und sub-Bibliotheken

Habe ich eine hierarchische build-system basiert auf SCons. Ich habe einen root SConstruct, dass Anrufe in ein SConscript baut, dass eine shared library und dann in einem anderen SConscript baut eine ausführbare Datei, hängt von der gemeinsam genutzten Bibliothek.

So, hier ist meine Frage: mein Verständnis von shared libraries unter linux ist, dass, wenn Sie wollen, um die endgültige ld link auf die ausführbare Datei wird über das shared lib, die shared lib enthalten sein, die auf die ausführbare Datei ld Befehlszeile als Quelle zu verweisen (es sei denn, es ist in einem standard-Speicherort, in dem Fall die -l option funktioniert).

Hier ist So etwas wie das, was meine SCons-Dateien Aussehen:

=== rootdir/SConstruct

env=DefaultEnvironment()
shared_lib = SConscript('foolib/SConscript')
env.Append( LIBS=[shared_lib] )
executable = SConscript('barexec/SConscript')

=== rootdir/foolib/SConscript

env=DefaultEnvironment()
env.Append(CPPPATH=Glob('inc'))
penv = env.Clone()
penv.Append(CPPPATH=Glob('internal/inc'))
lib = penv.SharedLibrary( 'foo', source=['foo.c', 'morefoo.c']
Return("lib")

=== rootdir/barexec/SConscript

env=DefaultEnvironment()
exe = env.Program( 'bar', source=['main.c', 'bar.c', 'rod.c'] )
Return("exe")

Also der Haken hier ist diese Linie:

env.Append( LIBS=[shared_lib] )

Wäre dies eine großartige Möglichkeit, um generierte Bibliotheken auf der Befehlszeile für alle anderen Bibliotheken, die Sie benötigen, AUßER, dass da SCons ist dabei ein zwei-pass-Lauf durch die SConscripts (ersten zu generieren, die es Abhängigkeitsbaum, dann um die Arbeit zu tun), rootdir/foolib/libfoo.so Winde bis auf der Befehl-Linie für ALLE Produkte, SOGAR libfoo.so selbst:

gcc -g -Wall -Werror -o libfoo.so foo.o morefoo.o libfoo.so

Also, wie ist dieser am besten mit SCons? Jetzt habe ich Zuflucht zu diesem hack:

=== rootdir/SConstruct

env=DefaultEnvironment()
shared_lib = SConscript('foolib/SConscript')
env['shared_lib'] = shared_lib
executable = SConscript('barexec/SConscript')

...

=== rootdir/barexec/SConscript

env=DefaultEnvironment()
exe = env.Program( 'bar', source=['main.c', 'bar.c', 'rod.c'] + env['shared_lib'] )
Return("exe")

Gibt es eine mehr SCons-y Weg, dies zu tun?

Schreibe einen Kommentar