3 from distutils.core import setup,Extension,CompileError
4 from distutils import ccompiler
6 from setuptools import setup, Extension, ccompiler, CompileError
8 cc = ccompiler.new_compiler()
14 DATADIR = "/usr/share/swftools/"
16 def update_list(list1, list2):
21 COMPILER_OPTIONS = ['-fPIC', '-Wparentheses', '-Wimplicit', '-Wreturn-type',
22 '-O3', '-fomit-frame-pointer', '-Winline',
23 '-Wno-unused', '-Wno-strict-prototypes','-DHAVE_CONFIG_H',
24 '-DSWFTOOLS_DATADIR="'+DATADIR+'"']
25 INCLUDE=['lib/lame/', 'lib/pdf/xpdf', 'lib/pdf']
27 update_list(cc.include_dirs, [os.path.join(sys.prefix,"include"),
28 os.path.join(sys.prefix,'include/freetype2'),
29 os.path.join(sys.prefix,'include/fontconfig')])
31 update_list(cc.library_dirs, ["/usr/lib", "/usr/local/lib"])
32 if sys.platform == "darwin":
33 update_list(cc.include_dirs, ["/sw/include/freetype2", "/sw/lib/freetype2/include", "/sw/include", "/opt/local/include"])
34 update_list(cc.library_dirs, ["/sw/lib", "/opt/local/lib"])
39 self.includefiles = []
42 def unlink(self, filename):
48 def test_code(self, head, body, stdh=1):
49 fi = open("setup_test.c", "wb")
51 fi.write("#include <stdlib.h>\n")
52 fi.write("#include <stdio.h>\n")
53 for i in self.includefiles:
54 fi.write("#include <%s>\n" % i)
55 for d in self.defines:
58 fi.write("\nint main()\n")
63 #fi = open("setup_test.c", "rb")
72 err = open('/dev/null', 'a+', 0)
73 olderr = open('/dev/null', 'a+', 0)
74 os.dup2(2, olderr.fileno())
75 os.dup2(err.fileno(), 2)
81 cc.compile(["setup_test.c"], include_dirs=cc.include_dirs)
89 err = open('/dev/null', 'a+', 0)
90 os.dup2(olderr.fileno(), 2)
96 self.unlink("setup_test.o")
97 self.unlink("setup_test.obj")
98 self.unlink("setup_test.c")
104 def system_has_property(self,name):
105 if name.startswith("STD"):
107 elif name.startswith("HAVE_LIB") \
108 or name.startswith("HAVE_FONTCONFIG") \
109 or name.startswith("HAVE_FREETYPE"):
110 if name.startswith("HAVE_LIB"):
111 libname = name[8:].lower()
113 libname = name[5:].lower()
114 if cc.find_library_file(cc.library_dirs, libname):
115 update_list(self.libraries, [libname])
117 elif name.startswith("HAVE_LAME"):
119 elif name.startswith("O_BINARY"):
120 if sys.platform.startswith("win"):
124 elif name == "boolean":
125 if self.test_code("", "boolean b;"):
128 self.defines += ["typedef int boolean"]
130 elif name.startswith("SIZEOF_"):
131 t = name[7:].lower().replace("_", " ")
133 if self.test_code("", "static int test_array [%d+1-sizeof(%s)];\ntest_array [0] = 0;" % (i,t)):
136 elif name.startswith("HAVE_") and name.endswith("_H"):
137 header = name[5:].lower()
138 c = header.rfind("_")
140 header = header[0:c]+"."+header[c+1]
141 header = header.replace("_","/")
143 for dir in cc.include_dirs:
144 if os.path.isfile(os.path.join(dir,header)):
147 if ok and self.test_code("#include <"+header+">", ""):
148 if header.startswith("sys"):
149 self.includefiles += [header]
151 elif name.startswith("USE_FREEETYPE"):
152 # TODO: run a test here?
154 elif name.startswith("HAVE_"):
155 function = name[5:].lower()
157 if function=="bcopy":
159 elif function=="bzero":
161 return self.test_code("", "%s(%s);" % (function,params), stdh=0)
164 def create_config(self):
165 print "Creating config.h..."
167 fi = open("config.h.in", "rb")
168 fo = open("config.h", "wb")
169 for line in fi.readlines():
170 if line.startswith("#undef "):
174 name = name.split(" ")[0]
175 value = self.system_has_property(name)
177 fo.write("// %s is not set\n" % (name))
179 fo.write("#define %s %s\n" % (name, value))
182 fo.write("// python:lib "+(" ".join(self.libraries))+"\n")
187 if not os.path.isfile("config.h"):
189 fi = open("config.h", "rb")
190 for line in fi.readlines():
191 if line.startswith("// python: lib "):
192 self.libraries = line[15:].split(" ")
196 config = ConfigScript()
197 # if either setup.py or config.h.in were modfied, rebuild config.h
198 if not config.load() or \
199 os.stat("setup.py")[stat.ST_MTIME] > os.stat("config.h")[stat.ST_MTIME] or \
200 os.stat("config.h.in")[stat.ST_MTIME] > os.stat("config.h")[stat.ST_MTIME]:
201 config.create_config()
205 if "jpeg" not in config.libraries:
206 print "Error: Couldn't find jpeg library on your system"
209 if "freetype" not in config.libraries:
210 print "Error: Couldn't find freetype library on your system"
214 "lib/q.c", "lib/utf8.c", "lib/png.c", "lib/wav.c", "lib/mp3.c", "lib/os.c", "lib/bitio.c", "lib/log.c", "lib/mem.c",
217 "lib/modules/swfabc.c", "lib/modules/swfaction.c", "lib/modules/swfbits.c", "lib/modules/swfbutton.c",
218 "lib/modules/swfcgi.c", "lib/modules/swfdraw.c", "lib/modules/swfdump.c", "lib/modules/swffilter.c",
219 "lib/modules/swffont.c", "lib/modules/swfobject.c", "lib/modules/swfrender.c", "lib/modules/swfshape.c",
220 "lib/modules/swfsound.c", "lib/modules/swftext.c", "lib/modules/swftools.c",
221 "lib/rfxswf.c", "lib/drawer.c", "lib/MD5.c", "lib/h.263/dct.c", "lib/h.263/h263tables.c",
222 "lib/h.263/swfvideo.c", "lib/action/assembler.c", "lib/action/compile.c",
223 "lib/action/lex.swf4.c", "lib/action/lex.swf5.c", "lib/action/libming.c",
224 "lib/action/swf4compiler.tab.c", "lib/action/swf5compiler.tab.c", "lib/action/actioncompiler.c"
227 "lib/pdf/GFXOutputDev.cc", "lib/pdf/InfoOutputDev.cc", "lib/pdf/BitmapOutputDev.cc",
228 "lib/pdf/FullBitmapOutputDev.cc", "lib/pdf/pdf.cc", "lib/pdf/fonts.c", "lib/pdf/xpdf/GHash.cc",
229 "lib/pdf/xpdf/GList.cc", "lib/pdf/xpdf/GString.cc", "lib/pdf/xpdf/gmem.cc", "lib/pdf/xpdf/gfile.cc",
230 "lib/pdf/xpdf/FoFiTrueType.cc", "lib/pdf/xpdf/FoFiType1.cc", "lib/pdf/xpdf/FoFiType1C.cc",
231 "lib/pdf/xpdf/FoFiBase.cc", "lib/pdf/xpdf/FoFiEncodings.cc", "lib/pdf/xpdf/OutputDev.cc", "lib/pdf/xpdf/PDFDoc.cc",
232 "lib/pdf/xpdf/Error.cc", "lib/pdf/xpdf/Stream.cc", "lib/pdf/xpdf/Object.cc", "lib/pdf/xpdf/Decrypt.cc",
233 "lib/pdf/xpdf/Array.cc", "lib/pdf/xpdf/XRef.cc", "lib/pdf/xpdf/Dict.cc", "lib/pdf/xpdf/Parser.cc",
234 "lib/pdf/xpdf/Lexer.cc", "lib/pdf/xpdf/Outline.cc", "lib/pdf/xpdf/PDFDocEncoding.cc", "lib/pdf/xpdf/Catalog.cc",
235 "lib/pdf/xpdf/Link.cc", "lib/pdf/xpdf/GlobalParams.cc", "lib/pdf/xpdf/JBIG2Stream.cc", "lib/pdf/xpdf/Page.cc",
236 "lib/pdf/xpdf/JPXStream.cc", "lib/pdf/xpdf/JArithmeticDecoder.cc", "lib/pdf/xpdf/Gfx.cc", "lib/pdf/xpdf/GfxFont.cc",
237 "lib/pdf/xpdf/CMap.cc", "lib/pdf/xpdf/CharCodeToUnicode.cc", "lib/pdf/xpdf/PSTokenizer.cc", "lib/pdf/xpdf/FontEncodingTables.cc",
238 "lib/pdf/xpdf/BuiltinFont.cc", "lib/pdf/xpdf/BuiltinFontTables.cc", "lib/pdf/xpdf/GfxState.cc", "lib/pdf/xpdf/Function.cc",
239 "lib/pdf/xpdf/Annot.cc", "lib/pdf/xpdf/NameToCharCode.cc", "lib/pdf/xpdf/UnicodeMap.cc", "lib/pdf/xpdf/SecurityHandler.cc",
240 "lib/pdf/xpdf/SplashOutputDev.cc", "lib/pdf/xpdf/SplashFont.cc", "lib/pdf/xpdf/SplashState.cc", "lib/pdf/xpdf/Splash.cc",
241 "lib/pdf/xpdf/SplashBitmap.cc", "lib/pdf/xpdf/SplashClip.cc", "lib/pdf/xpdf/SplashPattern.cc", "lib/pdf/xpdf/SplashFontEngine.cc",
242 "lib/pdf/xpdf/SplashFontFile.cc", "lib/pdf/xpdf/SplashFontFileID.cc", "lib/pdf/xpdf/SplashScreen.cc", "lib/pdf/xpdf/SplashPath.cc",
243 "lib/pdf/xpdf/SplashXPath.cc", "lib/pdf/xpdf/SplashXPathScanner.cc", "lib/pdf/xpdf/SplashFTFontEngine.cc",
244 "lib/pdf/xpdf/SplashFTFontFile.cc", "lib/pdf/xpdf/SplashFTFont.cc"]
247 "lib/gfxtools.c", "lib/gfxfont.c", "lib/gfxpoly.c",
248 "lib/devices/dummy.c", "lib/devices/file.c", "lib/devices/render.c", "lib/devices/text.c", "lib/devices/record.c",
249 "lib/devices/ops.c", "lib/devices/polyops.c", "lib/devices/bbox.c", "lib/devices/rescale.c",
250 "lib/art/art_affine.c", "lib/art/art_alphagamma.c", "lib/art/art_bpath.c", "lib/art/art_gray_svp.c",
251 "lib/art/art_misc.c", "lib/art/art_pixbuf.c", "lib/art/art_rect.c", "lib/art/art_rect_svp.c",
252 "lib/art/art_rect_uta.c", "lib/art/art_render.c", "lib/art/art_render_gradient.c", "lib/art/art_render_mask.c",
253 "lib/art/art_render_svp.c", "lib/art/art_rgb.c", "lib/art/art_rgb_a_affine.c", "lib/art/art_rgb_affine.c",
254 "lib/art/art_rgb_affine_private.c", "lib/art/art_rgb_bitmap_affine.c", "lib/art/art_rgb_pixbuf_affine.c",
255 "lib/art/art_rgb_rgba_affine.c", "lib/art/art_rgb_svp.c", "lib/art/art_rgba.c", "lib/art/art_svp.c",
256 "lib/art/art_svp_intersect.c", "lib/art/art_svp_ops.c", "lib/art/art_svp_point.c",
257 "lib/art/art_svp_render_aa.c", "lib/art/art_svp_vpath.c", "lib/art/art_svp_vpath_stroke.c",
258 "lib/art/art_svp_wind.c", "lib/art/art_uta.c", "lib/art/art_uta_ops.c", "lib/art/art_uta_rect.c",
259 "lib/art/art_uta_svp.c", "lib/art/art_uta_vpath.c", "lib/art/art_vpath.c", "lib/art/art_vpath_bpath.c",
260 "lib/art/art_vpath_dash.c", "lib/art/art_vpath_svp.c",
262 gfxswf_sources = ["lib/devices/swf.c"]
264 swf_module = Extension(
266 include_dirs=cc.include_dirs+INCLUDE,
267 sources=['lib/python/SWF.c', 'lib/python/taglist.c', 'lib/python/tag.c', 'lib/python/image.c',
268 'lib/python/tags.c', 'lib/python/tagmap.c', 'lib/python/action.c', 'lib/python/primitives.c',
269 'lib/python/pyutils.c'] + base_sources + rfxswf_sources,
270 library_dirs=cc.library_dirs,
271 libraries=config.libraries,
272 extra_objects=['%s/lib/python%s/site-packages/PIL/_imaging.so' % (sys.prefix, sys.version[:3])],
273 extra_compile_args=COMPILER_OPTIONS,
276 gfx_module = Extension(
278 sources=['lib/python/gfx.c'] + base_sources + libgfx_sources + rfxswf_sources + libpdf_sources + gfxswf_sources,
279 include_dirs=cc.include_dirs+INCLUDE,
280 library_dirs=cc.library_dirs,
281 libraries=config.libraries + ["stdc++"],
283 extra_compile_args=COMPILER_OPTIONS,
286 setup(name='SWFTools',
287 version='2008-03-26-1351',
288 description='Python wrapper for SWFTools',
289 author='Matthias Kramm',
290 author_email='kramm@quiss.org',
291 url='http://www.swftools.org/',
292 ext_modules=[swf_module, gfx_module],