4

我有一个我正在构建的 python 模块的 SConstruct 文件:

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

作为 root,没有任何东西安装到 /usr/local/lib/python2.6/site-packages。

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

4

1 回答 1

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 安装 --clean
于 2009-07-22T17:43:03.137 回答