2010-11-30 17 views
2

Ich habe eine bestehende C-Bibliothek, die mit Scons gebaut wurde (die Bibliothek hat ihre eigenen SConscript). Dieser Code enthält jetzt zwei Variationen, die von #ifdef s gesteuert werden. Wie sage ich Scons, um zwei Varianten dieser Bibliothek zu erstellen, die Seite von Seite leben können (so können Anwendungen gegen die entsprechende Variation verknüpfen)?Erstellen von Bibliotheksvarianten mit Scons

Konzeptionell, es ist so etwas wie dieses:

driver_sources = [ ... ] 
env.Library('drivers', driver_sources) 

env.Library('drivers_withflag', driver_sources, 
      CPPDEFINES += ['FLAG']) 

SCons (verständlicherweise) nicht wie die gleiche Quellenliste mit für verschiedene Ausgänge mit unterschiedlichen Umgebungen, da die Zwischenobjektnamen Konflikt.

Ich bin nicht sicher, ob dieses Problem nähern, indem irgendwie einen neuen Builder für drivers_withflag Objekte stammen, oder ob ich meine Bibliothek SConscript zweimal mit einigen Parametern die #defines angeben umfasse (und ich konnte jede Variante setzen in einem eigenen Build-Verzeichnis). Irgendein Rat?

Antwort

1

Hier ist ein Link zu einem gewissen relevanten Dokumentation: http://www.scons.org/doc/1.1.0/HTML/scons-user/x1392.html

Ich denke, es ist so etwas wie dies

driver_sources = [ ... ] 

env.Library('libdrivers', driver_sources) 

env_flag = env.Clone() 

env_flag.Append(CPPDEFINES = ['FLAG']) 

flag_objects = [os.path.splitext(src)[0] + '_flag' + 
    env['OBJSUFFIX'] for src in driver_sources] 

d_wf = [env_flag.Object(tgt, src) for tgt,src in 
    zip(flag_objects, driver_sources)] 

env_flag.Library(d_wf) 

Dies würde in Ihrer aktuellen SConscript Datei direkt gehen gehen würde, aber Sie auch einen Blick darauf werfen können auf diese Frage: here

Sie könnten die Schritte verwenden, die dort in der Datei beschrieben werden, die die SConscript-Datei Ihrer Bibliothek aufruft, um zwei Umgebungen einzurichten, dann rufen Sie das SConscript zweimal mit jedem an e.

Hoffe, dass hilft.

+0

Danke für die Antwort Tom. Leider funktioniert es nicht für mich. 'driver_sources' ist eine Liste von Dateien, also beschwert sich scons mit Ihrer Lösung," mehr als eine Quelle für den Builder für einzelne Quelle angegeben. " Der Versuch, die Bibliothek direkt aus den Quellen zu erstellen, führt zu dem Problem, das ich in der Frage erläutert habe, wo die Umgebungen bei der Erzeugung der gleichen Dateinamen von Zwischenobjektkonflikten stehen. –

+0

Ah ich sehe, ja ich habe nur ein einfaches Beispiel mit einer Testdatei ausgearbeitet. Vielleicht gibt es eine Alternative zu Object? Oder vielleicht eine Art For-Schleife, um eine Liste von Objekten zu erstellen, dann können Sie vielleicht die Bibliothek aus dieser Liste von Objekten erstellen. – Tom

+1

In der Tat kann ich ein Listenverständnis verwenden, um eine Liste von Objekten zu erstellen: 'd_wf = [env_flag.Object (src + '.flag', src) für src in driver_sources]'. Ich vergesse manchmal noch, dass ich in scons die volle Power von Python zur Verfügung habe. :) Wenn Sie Ihre Antwort bearbeiten, akzeptiere ich sie. –