首页 > 代码库 > python2-gst0.10制作静态包的补丁 v1.1
python2-gst0.10制作静态包的补丁 v1.1
gst制作成了静态库,而python2的gst有多个动态库引用gst的库
因此,想了一个办法将python2所需要的gst打包成一个单独的共享库
办法就是,将python2_gst所有的.so先制作成.a
通过nm -g加过滤的办法得到所有链接的gst函数
将这些函数生成一个小文件,在一个静态函数中引用所有这些函数
然后,将这个小文件编译成so文件,并链接gst库,这样,python2_gst所需要的gst函数就全部链接进来了
同时,可以将gst动态插件的方式也在启动时就注册进来,那样,python2_gst得到的包就是自包含的了
新增加了安装gst_pack动态库的代码
diff -Nur gst-python-0.10.22/codegen/gen_gst_import_code.py gst-python-0.10.22_test/codegen/gen_gst_import_code.py--- gst-python-0.10.22/codegen/gen_gst_import_code.py 1970-01-01 08:00:00.000000000 +0800+++ gst-python-0.10.22_test/codegen/gen_gst_import_code.py 2015-01-20 05:12:45.107817971 +0800@@ -0,0 +1,33 @@+import os,sys,random++def main(argv):+ if len(argv) < 3:+ print "need more params."+ return -1++ src_file = argv[1]+ dest_file = argv[2]+ try:+ s_handle = open(src_file, "r")+ s_buff = s_handle.readlines()+ s_handle.close()+ except Exception, detail:+ print "Exception: {0}".format(detail)+ return -1+ try:+ d_handle = open(dest_file, "w")+ for line in s_buff:+ d_handle.write("extern void %s ();\n" % line[:-1])+ d_handle.write("\nvoid __gst_import_%s ()\n{\n" % random.randint(0,10000) )+ #d_handle.write("\nstatic void __gst_import_functions ()\n{\n")+ for line in s_buff:+ d_handle.write(" %s ();\n" % line[:-1])+ d_handle.write("}\n\n")+ d_handle.close()+ except Exception, detail:+ print "Exception: {0}".format(detail)+ return -1+ return 0+ +if __name__ == ‘__main__‘:+ sys.exit(main(sys.argv))diff -Nur gst-python-0.10.22/codegen/gen_imp_code.sh gst-python-0.10.22_test/codegen/gen_imp_code.sh--- gst-python-0.10.22/codegen/gen_imp_code.sh 1970-01-01 08:00:00.000000000 +0800+++ gst-python-0.10.22_test/codegen/gen_imp_code.sh 2015-01-19 03:03:07.211836824 +0800@@ -0,0 +1,4 @@+#!/bin/sh++nm -g $1 | grep " U " | awk "{ print \$2}" | grep "^gst_"+diff -Nur gst-python-0.10.22/gst/gst_static_plugin_reg.c gst-python-0.10.22_test/gst/gst_static_plugin_reg.c--- gst-python-0.10.22/gst/gst_static_plugin_reg.c 1970-01-01 08:00:00.000000000 +0800+++ gst-python-0.10.22_test/gst/gst_static_plugin_reg.c 2015-01-18 23:20:09.490976826 +0800@@ -0,0 +1,4 @@++void init_register_static_gst_plugin()+{+}diff -Nur gst-python-0.10.22/gst/Makefile.am gst-python-0.10.22_test/gst/Makefile.am--- gst-python-0.10.22/gst/Makefile.am 2011-10-20 20:31:28.000000000 +0800+++ gst-python-0.10.22_test/gst/Makefile.am 2015-01-21 06:17:45.551271251 +0800@@ -53,9 +53,9 @@ # GStreamer bindings _gst_la_CFLAGS = $(common_cflags)-_gst_la_LIBADD = $(common_libadd) $(GST_BASE_LIBS)+_gst_la_LIBADD = $(common_libadd) _gst_la_LDFLAGS = $(common_ldflags) -export-symbols-regex "^(init_gst|_PyGObject_API|pygstminiobject_).*" - $(GST_BASE_LIBS) $(GST_CONTROLLER_LIBS) $(GST_NET_LIBS) $(GST_DP_LIBS)+ -lgst_pack _gst_la_SOURCES = gst-argtypes.c gstmodule.c @@ -92,7 +92,7 @@ interfaces_la_CFLAGS = $(common_cflags) $(GST_PLUGINS_BASE_CFLAGS) interfaces_la_LIBADD = $(common_libadd) -lgstinterfaces-$(GST_MAJORMINOR) interfaces_la_LDFLAGS = $(common_ldflags) - -export-symbols-regex "^(initinterface|_PyGObject_API).*" $(GST_PLUGINS_BASE_LIBS)+ -export-symbols-regex "^(initinterface|_PyGObject_API).*" -lgst_pack interfaces_la_SOURCES = interfacesmodule.c nodist_interfaces_la_SOURCES = interfaces.c INTERFACES_OVERRIDES = interfaces.override xoverlay.override@@ -103,9 +103,9 @@ # GStreamer pbutils bindings pbutils_la_CFLAGS = $(common_cflags) $(GST_PLUGINS_BASE_CFLAGS)-pbutils_la_LIBADD = $(common_libadd) $(GST_PLUGINS_BASE_LIBS) -lgstpbutils-0.10+pbutils_la_LIBADD = $(common_libadd) -lgst_pack pbutils_la_LDFLAGS = $(common_ldflags) - -export-symbols-regex "^(initpbutils|_PyGObject_API).*" $(GST_PLUGINS_BASE_LIBS)+ -export-symbols-regex "^(initpbutils|_PyGObject_API).*" -lgst_pack pbutils_la_SOURCES = pbutilsmodule.c gst-argtypes.c nodist_pbutils_la_SOURCES = pbutils.c PBUTILS_OVERRIDES = pbutils.override@@ -129,7 +129,7 @@ audio_la_CFLAGS = $(common_cflags) $(GST_PLUGINS_BASE_CFLAGS) audio_la_LIBADD = $(common_libadd) $(GST_PLUGINS_BASE_LIBS) -lgstaudio-0.10 audio_la_LDFLAGS = $(common_ldflags) - -export-symbols-regex "^(initaudio|_PyGObject_API).*" $(GST_PLUGINS_BASE_LIBS)+ -export-symbols-regex "^(initaudio|_PyGObject_API).*" -lgst_pack audio_la_SOURCES = audiomodule.c gst-argtypes.c nodist_audio_la_SOURCES = audio.c audio.c: $(AUDIO_DEFS) $(AUDIO_OVERRIDES) $(GEN_FILES)@@ -151,7 +151,7 @@ video_la_CFLAGS = $(common_cflags) $(GST_PLUGINS_BASE_CFLAGS) video_la_LIBADD = $(common_libadd) $(GST_PLUGINS_BASE_LIBS) -lgstvideo-0.10 video_la_LDFLAGS = $(common_ldflags) - -export-symbols-regex "^(initvideo|_PyGObject_API).*" $(GST_PLUGINS_BASE_LIBS)+ -export-symbols-regex "^(initvideo|_PyGObject_API).*" -lgst_pack video_la_SOURCES = videomodule.c gst-argtypes.c nodist_video_la_SOURCES = video.c video.c: $(VIDEO_DEFS) $(VIDEO_OVERRIDES) $(GEN_FILES)@@ -173,13 +173,108 @@ tag_la_CFLAGS = $(common_cflags) $(GST_PLUGINS_BASE_CFLAGS) tag_la_LIBADD = $(common_libadd) $(GST_PLUGINS_BASE_LIBS) -lgsttag-0.10 tag_la_LDFLAGS = $(common_ldflags) - -export-symbols-regex "^(inittag|_PyGObject_API).*" $(GST_PLUGINS_BASE_LIBS)+ -export-symbols-regex "^(inittag|_PyGObject_API).*" -lgst_pack tag_la_SOURCES = tagmodule.c gst-argtypes.c nodist_tag_la_SOURCES = tag.c tag.c: $(TAG_DEFS) $(TAG_OVERRIDES) $(GEN_FILES) endif +gstpackexecdir = /usr/lib+gstpackexec_LTLIBRARIES = libgst_pack.la+pygstexec_LTLIBRARIES: gstpackexec_LTLIBRARIES++libgst_pack_lib = libgst_pack.la+libgst_pack_la_SOURCES = gst_static_plugin_reg.c++libgst_pack_la_CFLAGS = $(common_cflags) -fPIC+libgst_pack_la_LIBADD = $(common_libadd) $(GST_BASE_LIBS)+libgst_pack_la_LDFLAGS = -shared -fPIC $(GST_BASE_LIBS) $(GST_CONTROLLER_LIBS) $(GST_NET_LIBS) $(GST_DP_LIBS)+nodist_libgst_pack_la_SOURCES = lib_gst_import.c+CLEANFILES += lib_gst_import.c+noinst_LIBRARIES = lib_gst.a+lib_gst_a_CFLAGS = $(_gst_la_CFLAGS)+lib_gst_a_SOURCES = $(_gst_la_SOURCES) $(nodist__gst_la_SOURCES)+_gst_la_DEPENDENCIES = $(libgst_pack_lib)+lib_gst_import.c: lib_gst.a+++if HAVE_PYGOBJECT_2_16++libgst_pack_la_LDFLAGS += $(GST_LIBS) $(GST_OPTION_LIBS)+nodist_libgst_pack_la_SOURCES += libgstoption_import.c+CLEANFILES += libgstoption_import.c+noinst_LIBRARIES += libgstoption.a+libgstoption_a_CFLAGS = $(common_cflags)+libgstoption_a_SOURCES = ../gstoptionmodule.c+libgstoption_import.c: libgstoption.a++endif++libgst_pack_la_LDFLAGS += $(GST_PLUGINS_BASE_LIBS) -lgstinterfaces-$(GST_MAJORMINOR) +nodist_libgst_pack_la_SOURCES += libinterfaces_import.c+CLEANFILES += libinterfaces_import.c+noinst_LIBRARIES += libinterfaces.a+libinterfaces_a_CFLAGS = $(interfaces_la_CFLAGS)+libinterfaces_a_SOURCES = $(interfaces_la_SOURCES) $(nodist_interfaces_la_SOURCES)+interfaces_la_DEPENDENCIES = $(libgst_pack_lib)+libinterfaces.c_import: libinterfaces.a+++libgst_pack_la_LDFLAGS += -lgstpbutils-0.10+nodist_libgst_pack_la_SOURCES += libpbutils_import.c+CLEANFILES += libpbutils_import.c+noinst_LIBRARIES += libpbutils.a+libpbutils_a_CFLAGS = $(pbutils_la_CFLAGS)+libpbutils_a_SOURCES = $(pbutils_la_SOURCES) $(nodist_pbutils_la_SOURCES)+pbutils_la_DEPENDENCIES = $(libgst_pack_lib)+libpbutils_import.c: libpbutils.a+++if HAVE_GST_AUDIO++ libgst_pack_la_LDFLAGS += -lgstaudio-0.10+ nodist_libgst_pack_la_SOURCES += libaudio_import.c+ CLEANFILES += libaudio_import.c+ noinst_LIBRARIES += libaudio.a+ libaudio_a_CFLAGS = $(audio_la_CFLAGS)+ libaudio_a_SOURCES=$(audio_la_SOURCES) $(nodist_audio_la_SOURCES)+ audio_la_DEPENDENCIES = $(libgst_pack_lib)+libaudio_import.c: libaudio.a+++endif++if HAVE_GST_VIDEO++ libgst_pack_la_LDFLAGS += -lgstvideo-0.10+ nodist_libgst_pack_la_SOURCES += libvideo_import.c+ CLEANFILES += libvideo_import.c+ noinst_LIBRARIES += libvideo.a+ libvideo_a_CFLAGS = $(video_la_CFLAGS)+ libvideo_a_SOURCES=$(video_la_SOURCES) $(nodist_video_la_SOURCES)+ video_la_DEPENDENCIES = $(libgst_pack_lib)+libvideo_import.c: libvideo.a+++endif++if HAVE_GST_TAG++ libgst_pack_la_LDFLAGS += -lgsttag-0.10+ nodist_libgst_pack_la_SOURCES += libtag_import.c+ CLEANFILES += libtag_import.c+ noinst_LIBRARIES += libtag.a+ libtag_a_CFLAGS = $(tag_la_CFLAGS)+ libtag_a_SOURCES = $(tag_la_SOURCES) $(nodist_tag_la_SOURCES)+ tag_la_DEPENDENCIES = $(libgst_pack_lib)+libtag_import.c: libtag.a++endif++%_import.c: %.a+ /bin/sh $(top_srcdir)/codegen/gen_imp_code.sh $< > $<.imp + && $(PYTHON) $(top_srcdir)/codegen/gen_gst_import_code.py $<.imp $@ && rm -f $<.imp .defs.c: $(AM_V_GEN)($(PYTHON) $(top_srcdir)/codegen/codegen.py diff -Nur gst-python-0.10.22/gst/Makefile_static.am gst-python-0.10.22_test/gst/Makefile_static.am--- gst-python-0.10.22/gst/Makefile_static.am 1970-01-01 08:00:00.000000000 +0800+++ gst-python-0.10.22_test/gst/Makefile_static.am 2015-01-19 04:20:32.000000000 +0800@@ -0,0 +1,92 @@++libgst_pack_lib = libgst_pack.la+pygstexec_LTLIBRARIES += $(libgst_pack_lib)+libgst_pack_la_SOURCES = gst_static_plugin_reg.c++libgst_pack_la_CFLAGS = $(common_cflags) -fPIC+libgst_pack_la_LIBADD = $(common_libadd) $(GST_BASE_LIBS)+libgst_pack_la_LDFLAGS = -shared -fPIC $(GST_BASE_LIBS) $(GST_CONTROLLER_LIBS) $(GST_NET_LIBS) $(GST_DP_LIBS)+nodist_libgst_pack_la_SOURCES = lib_gst.c+CLEANFILES += lib_gst.c+noinst_LIBRARIES = lib_gst.a+lib_gst_a_CFLAGS = $(_gst_la_CFLAGS)+lib_gst_a_SOURCES = $(_gst_la_SOURCES) $(nodist__gst_la_SOURCES)+_gst_la_DEPENDENCIES = $(libgst_pack_lib)+lib_gst.c: lib_gst.a+++if HAVE_PYGOBJECT_2_16+libgst_pack_la_LDFLAGS += $(GST_LIBS) $(GST_OPTION_LIBS)+nodist_libgst_pack_la_SOURCES += libgstoption.c+CLEANFILES += libgstoption.c+noinst_LIBRARIES += libgstoption.a+libgstoption_a_CFLAGS = $(common_cflags)+libgstoption_a_SOURCES = ../gstoptionmodule.c+libgstoption.c: libgstoption.a+++endif++libgst_pack_la_LDFLAGS += $(GST_PLUGINS_BASE_LIBS) -lgstinterfaces-$(GST_MAJORMINOR) +nodist_libgst_pack_la_SOURCES += libinterfaces.c+CLEANFILES += libinterfaces.c+noinst_LIBRARIES += libinterfaces.a+libinterfaces_a_CFLAGS = $(interfaces_la_CFLAGS)+libinterfaces_a_SOURCES = $(interfaces_la_SOURCES) $(nodist_interfaces_la_SOURCES)+interfaces_la_DEPENDENCIES = $(libgst_pack_lib)+libinterfaces.c: libinterfaces.a+++libgst_pack_la_LDFLAGS += -lgstpbutils-0.10+nodist_libgst_pack_la_SOURCES += libpbutils.c+CLEANFILES += libpbutils.c+noinst_LIBRARIES += libpbutils.a+libpbutils_a_CFLAGS = $(pbutils_la_CFLAGS)+libpbutils_a_SOURCES = $(pbutils_la_SOURCES) $(nodist_pbutils_la_SOURCES)+pbutils_la_DEPENDENCIES = $(libgst_pack_lib)+libpbutils.c: libpbutils.a+++if HAVE_GST_AUDIO+ libgst_pack_la_LDFLAGS += -lgstaudio-0.10+ nodist_libgst_pack_la_SOURCES += libaudio.c+ CLEANFILES += libaudio.c+ noinst_LIBRARIES += libaudio.a+ libaudio_a_CFLAGS = $(audio_la_CFLAGS)+ libaudio_a_SOURCES=$(audio_la_SOURCES) $(nodist_audio_la_SOURCES)+ audio_la_DEPENDENCIES = $(libgst_pack_lib)+libaudio.c: libaudio.a+++endif++if HAVE_GST_VIDEO+ libgst_pack_la_LDFLAGS += -lgstvideo-0.10+ nodist_libgst_pack_la_SOURCES += libvideo.c+ CLEANFILES += libvideo.c+ noinst_LIBRARIES += libvideo.a+ libvideo_a_CFLAGS = $(video_la_CFLAGS)+ libvideo_a_SOURCES=$(video_la_SOURCES) $(nodist_video_la_SOURCES)+ video_la_DEPENDENCIES = $(libgst_pack_lib)+libvideo.c: libvideo.a+++endif++if HAVE_GST_TAG+ libgst_pack_la_LDFLAGS += -lgsttag-0.10+ nodist_libgst_pack_la_SOURCES += libtag.c+ CLEANFILES += libtag.c+ noinst_LIBRARIES += libtag.a+ libtag_a_CFLAGS = $(tag_la_CFLAGS)+ libtag_a_SOURCES = $(tag_la_SOURCES) $(nodist_tag_la_SOURCES)+ tag_la_DEPENDENCIES = $(libgst_pack_lib)+libtag.c: libtag.a++endif++.a.c:+ /bin/sh $(top_srcdir)/codegen/gen_imp_code.sh $< > $<.imp + && $(PYTHON) $(top_srcdir)/codegen/gen_gst_import_code.py $<.imp $@ + && rm -f $<.imp+diff -Nur gst-python-0.10.22/gst-python.spec gst-python-0.10.22_test/gst-python.spec--- gst-python-0.10.22/gst-python.spec 2011-10-30 00:06:10.000000000 +0800+++ gst-python-0.10.22_test/gst-python.spec 1970-01-01 08:00:00.000000000 +0800@@ -1,100 +0,0 @@-%define majorminor 0.10-%define gstreamer gstreamer-%define _pygtk 2.6.3-%define _gst 0.10.20--Name: %{gstreamer}-python-Version: 0.10.22-Release: 1-Summary: Python bindings for GStreamer.--Group: Development/Languages-License: LGPL-URL: http://gstreamer.freedesktop.org/-Source: http://gstreamer.freedesktop.org/src/gst-python/gst-python-%{version}.tar.gz--BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)--Requires: python >= 2-Requires: gnome-python2-Requires: pygtk2 >= %_pygtk-Requires: %{gstreamer}-Requires: %{gstreamer}-plugins-base--BuildRequires: python >= 2-BuildRequires: python-devel >= 2-BuildRequires: pygtk2-devel >= %_pygtk-BuildRequires: xmlto-BuildRequires: links--BuildRequires: %{gstreamer}-devel >= %_gst-BuildRequires: %{gstreamer}-plugins-base-devel >= %_gst--# sigh, libtool-BuildRequires: gcc-c++--%description-This module contains a wrapper that allows GStreamer applications-to be written in Python.--%prep-%setup -q -n gst-python-%{version}--%build-%configure-make %{?_smp_mflags}--%install-rm -rf $RPM_BUILD_ROOT--%makeinstall-find $RPM_BUILD_ROOT -type f -name "*.la" -exec rm -f {} ‘;‘--%clean-rm -rf $RPM_BUILD_ROOT--%files-%defattr(-,root,root,-)-%doc AUTHORS COPYING ChangeLog NEWS README gst-python.doap-%dir %{_libdir}/python?.?/site-packages/gst-%{majorminor}-%{_libdir}/python?.?/site-packages/pygst.pth-%{_libdir}/python?.?/site-packages/pygst.py-%{_libdir}/python?.?/site-packages/gst-%{majorminor}/gst/__init__.py*-%{_libdir}/python?.?/site-packages/gst-%{majorminor}/gst/extend-%{_libdir}/python?.?/site-packages/gst-%{majorminor}/gst/_gst.so-%{_libdir}/python?.?/site-packages/gst-%{majorminor}/gst/interfaces.so-%{_libdir}/python?.?/site-packages/gst-%{majorminor}/gst/pbutils.so-%{_libdir}/gstreamer-%{majorminor}/libgstpython.so-%{_libdir}/python?.?/site-packages/gst-%{majorminor}/gst/audio.so-%{_libdir}/python?.?/site-packages/gst-%{majorminor}/gst/tag.so-%{_libdir}/python?.?/site-packages/gst-%{majorminor}/gst/video.so-%{_libdir}/python?.?/site-packages/gstoption.so---%{_datadir}/gst-python-%{_libdir}/pkgconfig/gst-python-%{majorminor}.pc--%changelog-* Fri Dec 15 2006 Thomas Vander Stichele <thomas at apestaart dot org>-- add doap file--* Tue Dec 20 2005 Thomas Vander Stichele <thomas at apestaart dot org>-- updated spec file--* Thu Oct 06 2005 Edward Hervey < edward at fluendo dot com >-- Updated spec file for 0.9--* Fri Nov 05 2004 Christian Schaller < uraeus at gnome org >-- Remerged spec file with cvs version--* Tue Oct 12 2004 Thomas Vander Stichele <thomas at apestaart dot org>-- 0.7.93-0.fdr.1: new upstream release--* Mon Jun 21 2004 Thomas Vander Stichele <thomas at apestaart dot org>-- 0.7.92-0.fdr.1: new upstream release--* Wed Mar 31 2004 Thomas Vander Stichele <thomas at apestaart dot org>-- 0.7.91-0.fdr.1: new upstream release--* Tue Sep 02 2003 Thomas Vander Stichele <thomas at apestaart dot org>-- 0.1.0-0.fdr.1: first fedora releasediff -Nur gst-python-0.10.22/Makefile.am gst-python-0.10.22_test/Makefile.am--- gst-python-0.10.22/Makefile.am 2010-11-20 02:44:51.000000000 +0800+++ gst-python-0.10.22_test/Makefile.am 2015-01-20 04:50:37.000000000 +0800@@ -1,8 +1,8 @@ SUBDIRS = common codegen gst examples plugin testsuite pkgconfig common_cflags = $(PYTHON_INCLUDES) $(PYGOBJECT_CFLAGS) $(GST_CFLAGS) $(GST_OPTION_CFLAGS) -fno-strict-aliasing-common_libadd = $(GST_LIBS) $(GST_OPTION_LIBS)-common_ldflags = -module -avoid-version+common_libadd =+common_ldflags = -module -avoid-version # include before EXTRA_DIST for win32 assignment include $(top_srcdir)/common/win32.mak@@ -22,6 +22,10 @@ -export-symbols-regex "^(initgstoption|_PyGObject_API).*" gstoption_la_SOURCES = gstoptionmodule.c +if HAVE_PYGOBJECT_2_16+gstoption_la_DEPENDENCIES = gst/libgst_pack.la+endif+ EXTRA_DIST = gstlibtoolimporter.py pygst.py.in
python2-gst0.10制作静态包的补丁 v1.1
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。