Autotools,Cmake和Scons之间有什么区别?
多年来我一直在使用make和makefiles,虽然这个概念很合理,但实现还是有所不足.
有没有人找到任何好的替代方案,使不会使问题过于复杂?
如何控制车轮中包含哪些文件?它似乎MANIFEST.in没有被使用python setup.py bdist_wheel.
更新:
从源tarball到wheel安装之间的区别我错了.源代码分发包括指定的文件MANIFEST.in,但安装的软件包只有python文件.需要步骤来识别应安装的其他文件,无论安装是通过源分发,egg还是wheel.也就是说,其他包文件需要package_data,而命令行脚本或系统配置文件需要包外的文件的data_files.
我有一个项目,我一直python setup.py sdist用来构建我的包,MANIFEST.in控制包含和排除的文件,以及pyroma和check-manifest来确认我的设置.
我最近将它转换为双Python 2/3代码,并添加了一个setup.cfg
[bdist_wheel]
universal = 1
Run Code Online (Sandbox Code Playgroud)
我可以用python setup.py bdist_wheel它来制造一个轮子,它看起来像是一个万向轮.但是,它不包括指定的所有文件MANIFEST.in.
我挖得更深,现在更了解包装和轮子.这是我学到的东西:
我将两个包文件上传到PyPi上的multigtfs项目:
multigtfs-0.4.2.tar.gz- 源tar球,包括所有文件MANIFEST.in.multigtfs-0.4.2-py2.py3-none-any.whl - 有问题的二进制分布.我创建了两个新的虚拟环境,都使用Python 2.7.5,并安装了每个包(pip install multigtfs-0.4.2.tar.gz).这两种环境几乎完全相同.它们有不同的.pyc文件,即"已编译"的Python文件.有记录磁盘上不同路径的日志文件.源tar球multigtfs-0.4.2-py27.egg-info的安装包括一个文件夹,详细说明安装,并且wheel安装有一个multigtfs-0.4.2.dist-info文件夹,其中包含该进程的详细信息.但是,从使用multigtfs项目的代码的角度来看,两种安装方法之间没有区别.
显然,我的测试使用的.zip文件都没有,因此测试套件将失败:
$ django-admin startproject demo
$ cd demo
$ pip …Run Code Online (Sandbox Code Playgroud) 我在Buildroot Linux发行版ARM(Python 2.7.2)下交叉编译netifaces扩展时遇到了问题.根据这个博客http://whatschrisdoing.com/blog/2009/10/16/cross-compiling-python-extensions/我已经定义了CC,LDSHARE等环境变量,但是distutils/setuptools没有将CC带入帐户,所以所有测试都将失败:
running build
Setting prefix
Setting prefix
running build_ext
checking for getifaddrs... not found. (cached)
checking for getnameinfo... not found. (cached)
checking for socket IOCTLs... not found. (cached)
checking for optional header files... netash/ash.h netatalk/at.h netax25/ax25.h neteconet/ec.h netipx/ipx.h netpacket/packet.h linux/irda.h linux/atm.h linux/llc.h linux/tipc.h linux/dn.h. (cached)
checking whether struct sockaddr has a length field... no. (cached)
checking which sockaddr_xxx structs are defined... at ax25 in in6 ipx un ash ec ll atmpvc atmsvc dn irda llc. (cached) …Run Code Online (Sandbox Code Playgroud) 到目前为止,我们通过自定义pypi服务器安装了psutil.
现在我们有了一个新的环境,我们不应该安装gcc.
现在旧的方式(pip在安装期间启动gcc)不再起作用了.
上下文:
我看到了这些替代品:
创建一个RPM.因为我们已经用--system-site-packages这个作品来运行我们的virtualenv .这迫使服务器上的所有virtualenvs使用相同的版本psutil.但这不是什么大问题.
我从来没有用过那个.
使用像这样的工具cx_freeze.我以前从未这样做过.
我想还有其他的,可能更好的方法来解决这个问题.
psutil在这种情况下只是一个例子.其他包含c扩展的python包也出现了同样的问题.想象一下,这里还没有RPM.
我有一个项目取决于共享库.从头开始说明:共享库是纯C库而不是Python库.为简单起见,我创建了一个名为pkgtest的小型演示项目,我将参考该项目.
所以需要做的是:运行Makefile来编译库并将编译好的共享库(libhello.so此处称为)文件放在某个地方,可以从依赖Python包中访问它.
到目前为止,我最好的猜测是将makefile作为预安装例程运行,将libhello.so文件复制到packages目录中并将其添加到package_data安装脚本的参数中.安装后,共享库将被放置在site-packages/pkgtest/目录中,并可从模块访问.
包目录的结构就像这样简单:
pkgtest/
src/
libhello.c
libhello.h
Makefile
pkgtest/
__init__.py
hello.py
setup.py
Run Code Online (Sandbox Code Playgroud)
我的setup.py看起来像这样:
setup.py
import subprocess
from setuptools import setup
from distutils.command.install import install as _install
class install(_install):
def run(self):
subprocess.call(['make', 'clean', '-C', 'src'])
subprocess.call(['make', '-C', 'src'])
_install.run(self)
setup(
name='pkgtest',
version='0.0.1',
author='stefan',
packages=['pkgtest'],
package_data={'pkgtest': ['libhello.so']},
cmdclass={'install': install},
)
Run Code Online (Sandbox Code Playgroud)
Makefile实际上构建了库并将其复制到我的python包的目录中.
SRC/Makefile文件
all: libhello.so
libhello.o: libhello.c
gcc -fPIC -Wall -g -c libhello.c
libhello.so: libhello.o
gcc -shared -fPIC -o libhello.so libhello.o
cp …Run Code Online (Sandbox Code Playgroud) python ×4
makefile ×2
setuptools ×2
autotools ×1
build ×1
build-system ×1
cmake ×1
distutils ×1
gcc ×1
pip ×1
python-wheel ×1
scons ×1
setup.py ×1