2013-02-28 9 views
5

Sto provando a costruire sia una libreria statica che una libreria condivisa usando le stesse fonti con SCons.scons costruisce sia la libreria statica che quella condivisa

Tutto funziona correttamente se creo solo uno o l'altro, ma non appena provo a creare entrambi, viene creata solo la libreria statica.

mio SConscript assomiglia:

cppflags = SP3_env['CPPFLAGS'] 
cppflags += ' -fPIC ' 
SP3_env['CPPFLAGS'] = cppflags 

soLibFile = SP3_env.SharedLibrary(
    target = "sp3", 
    source = sources) 
installedSoFile = SP3_env.Install(SP3_env['SP3_lib_dir'], soLibFile) 

libFile = SP3_env.Library(
    target = "sp3", 
    source = sources) 
installedLibFile = SP3_env.Install(SP3_env['SP3_lib_dir'], libFile) 

Ho anche provato SharedObject (fonti) prima della SharedLibrary (che passano nel ritorno da SharedObject, piuttosto che le fonti), ma non è diverso. Lo stesso se costruisco il .a prima del .so.

Come posso aggirare questo?

risposta

6

Quando la directory di installazione non è o sotto la directory corrente , SCons non funziona come previsto, come commentato nella SCons Install method docs:

Si noti, tuttavia, che l'installazione di un file è ancora considerato un tipo del file "build". Questo è importante quando si ricorda che il comportamento predefinito di SCons è quello di creare file nella directory corrente o al di sotto di essa. Se, come nell'esempio sopra, si stanno installando file in una directory al di fuori della struttura di directory del file di livello superiore di SConstruct, è necessario specificare tale directory (o una directory superiore, ad esempio /) per l'installazione di c'è:

Cioè, è necessario richiamare SCons con la directory di installazione come un bersaglio (SP3_env['SP3_lib_dir'] nel tuo caso) in modo che l'installazione da eseguire. Per semplificare, utilizzare env.Alias() come faccio di seguito.

Quando invochi SCons, dovresti almeno vedere che entrambe le librerie statiche e condivise sono incorporate nella directory del progetto locale. Immagino, tuttavia, che SCons non li installi. Ecco un esempio che ho fatto su Ubuntu che funziona:

env = Environment() 

sourceFiles = 'ExampleClass.cc' 

sharedLib = env.SharedLibrary(target='example', source=sourceFiles) 
staticLib = env.StaticLibrary(target='example', source=sourceFiles) 

# Notice that installDir is outside of the local project dir 
installDir = '/home/notroot/projects/sandbox' 

sharedInstall = env.Install(installDir, sharedLib) 
staticInstall = env.Install(installDir, staticLib) 

env.Alias('install', installDir) 

Se eseguo scons senza obiettivi, ottengo il seguente:

# scons 
scons: Reading SConscript files ... 
scons: done reading SConscript files. 
scons: Building targets ... 
g++ -o ExampleClass.o -c ExampleClass.cc 
g++ -o ExampleClass.os -c -fPIC ExampleClass.cc 
ar rc libexample.a ExampleClass.o 
ranlib libexample.a 
g++ -o libexample.so -shared ExampleClass.os 
scons: done building targets. 

allora posso installare, eseguendo scons con l'obiettivo di installazione, come segue:

# scons install 
scons: Reading SConscript files ... 
scons: done reading SConscript files. 
scons: Building targets ... 
Install file: "libexample.a" as "/home/notroot/projects/sandbox/libexample.a" 
Install file: "libexample.so" as "/home/notroot/projects/sandbox/libexample.so" 
scons: done building targets. 

Oppure, si può solo fare tutto con un solo comando, prima tutto pulito

# scons -c install 

Poi, fare tutto con un solo comando:

# scons install 
scons: Reading SConscript files ... 
scons: done reading SConscript files. 
scons: Building targets ... 
g++ -o ExampleClass.o -c ExampleClass.cc 
g++ -o ExampleClass.os -c -fPIC ExampleClass.cc 
ar rc libexample.a ExampleClass.o 
ranlib libexample.a 
g++ -o libexample.so -shared ExampleClass.os 
Install file: "libexample.a" as "/home/notroot/projects/sandbox/libexample.a" 
Install file: "libexample.so" as "/home/notroot/projects/sandbox/libexample.so" 
scons: done building targets.