首页 > 代码库 > 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