题
我有一个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
作为根,没有被安装到/usr/local/lib/python2.6/site-packages。
为什么不scons的建设安装目标没有沙箱选项?
解决方案
所以周围有很多挖后,事实证明,要做到这一点的最好办法如下:
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
不隶属于 StackOverflow