2009-07-22 18 views
4

我有一个Python模块的SConstruct文件的工作,我的建筑:安装使用SCons()只与--install的沙箱

import distutils.sysconfig 

env = Environment(CPPPATH=['include', distutils.sysconfig.get_python_inc()], 
        CPPFLAGS='-ggdb', SWIGFLAGS=['-python'], 
        SWIGPATH=['include']) 

env.ParseConfig('net-snmp-config --libs --cflags') 
env.Append(LIBS = 'pthread') 

backend_interface = 'src/backend_interface.c' 
backend_thread = 'src/backend_thread.c' 
python_wrapper = 'src/backend_thread.i' 


lib = env.SharedLibrary(target = "_rpdu_backend", 
         source = [ backend_interface, 
         backend_thread, python_wrapper ], 
         SHLIBPREFIX='') 

env.Install(distutils.sysconfig.get_python_lib(), 
      [ lib, 'src/rpdu_backend.py']) 

运行:

$ scons --install-sandbox=./sandbox

导致图书馆关联的.py模块安装在./sandbox/usr/local/lib/python2.6/site-packages中。如果我只需运行:

# scons

为根,没有安装到/usr/local/lib/python2.6/site-packages。

为什么scons建立安装目标没有沙箱选项?

回答

4

所以周围有很多挖后,事实证明,要做到这一点的最好办法是:

import distutils.sysconfig 

env = Environment(CPPPATH=['include', distutils.sysconfig.get_python_inc()], 
        CPPFLAGS='-ggdb', SWIGFLAGS=['-python'], 
        SWIGPATH=['include']) 

env.ParseConfig('net-snmp-config --libs --cflags') 
env.Append(LIBS = 'pthread') 

backend_interface = 'src/backend_interface.c' 
backend_thread = 'src/backend_thread.c' 
python_wrapper = 'src/backend_thread.i' 


lib = env.SharedLibrary(target = "_rpdu_backend", 
         source = [ backend_interface, 
         backend_thread, python_wrapper ], 
         SHLIBPREFIX='') 
inst = env.Install(distutils.sysconfig.get_python_lib(), 
        [ lib, 'src/rpdu_backend.py']) 

env.Alias("install", inst) 
env.Depends(inst, lib) 
Ignore('.', inst) 

这就建立了一个假目标,其中,调用时,迫使外其一贯的“使用SCons只在当前目录下建立“的方法。它还确保在安装之前完成构建,并提供便捷的卸载使用:

# scons install --clean