| 182 | | """ |
| 183 | | Usage: |
| 184 | | python setup_osx.py [build | dist] |
| 185 | | """ |
| 186 | | |
| 187 | | from setuptools import setup |
| 188 | | import sys, glob, os, commands, types |
| 189 | | from os import system, unlink, symlink, getcwd, mkdir, utime |
| 190 | | from shutil import move, copy, copytree, rmtree |
| 191 | | |
| 192 | | ### |
| 193 | | ### Globals |
| 194 | | ### |
| 195 | | |
| 196 | | GTK_DIR="/Library/Frameworks/GTK+.framework/Versions/Current" |
| 197 | | NAME = 'Gajim' |
| 198 | | VERSION = '0.11' |
| 199 | | DESCRIPTION = 'A full featured Jabber client' |
| 200 | | AUTHOR = 'Gajim Development Team' |
| 201 | | URL = 'http://www.gajim.org/' |
| 202 | | DOWNLOAD_URL = 'http://www.gajim.org/downloads.php' |
| 203 | | LICENSE = 'GPL' |
| 204 | | PWD = getcwd() |
| 205 | | APP_RS = "dist/Gajim.app/Contents/Resources" |
| 206 | | |
| 207 | | GAJIM_SCRIPT = \ |
| 208 | | '#!/bin/bash \n\ |
| 209 | | export DYLD_LIBRARY_PATH=%s/lib \n\ |
| 210 | | export PATH=%s/bin:$PATH \n\ |
| 211 | | exec ${0}.bin \n\ |
| 212 | | ' % (GTK_DIR, GTK_DIR) |
| 213 | | |
| 214 | | GAJIM_REMOTE_SCRIPT = \ |
| 215 | | '#!/bin/bash \n\ |
| 216 | | export DYLD_LIBRARY_PATH=%s/lib \n\ |
| 217 | | TOPDIR=${0%%/MacOS/gajim-remote} \n\ |
| 218 | | echo "${TOPDIR}" | grep -e "^/" \n\ |
| 219 | | [ $? -ne 0 ] && TOPDIR=`pwd`/${TOPDIR} \n\ |
| 220 | | export RESOURCEPATH=${TOPDIR}/Resources \n\ |
| 221 | | export PYTHONHOME=${RESOURCEPATH}/lib/python2.5 \n\ |
| 222 | | export PYTHONPATH=${RESOURCEPATH}/lib/python2.5/lib-dynload:${RESOURCEPATH}/lib/python2.5/site-packages.zip:${PYTHONPATH} \n\ |
| 223 | | cd ${RESOURCEPATH} \n\ |
| 224 | | exec ${TOPDIR}/MacOS/Python ${RESOURCEPATH}/gajim-remote.py $* \n\ |
| 225 | | ' % GTK_DIR |
| 226 | | |
| 227 | | ### |
| 228 | | ### Functions |
| 229 | | ### |
| 230 | | |
| 231 | | def check(ret): |
| 232 | | if type(ret) == types.ListType: |
| 233 | | if ret[0] != 0: |
| 234 | | raise Exception("Command failed: " + ret[1]) |
| 235 | | elif type(ret) == types.IntType: |
| 236 | | if ret != 0: |
| 237 | | raise Exception("Command failed") |
| 238 | | return |
| 239 | | |
| 240 | | |
| 241 | | def force(func): |
| 242 | | try: |
| 243 | | func() |
| 244 | | except: |
| 245 | | pass |
| 246 | | return |
| 247 | | |
| 248 | | |
| 249 | | def writeScript(filename, contents): |
| 250 | | script = file(filename, "w+") |
| 251 | | script.write(contents) |
| 252 | | script.close() |
| 253 | | system("chmod +x %s" % filename) |
| 254 | | return |
| 255 | | |
| 256 | | |
| 257 | | def cleanup(): |
| 258 | | force(lambda:rmtree("build")) |
| 259 | | force(lambda:rmtree("dist")) |
| 260 | | |
| 261 | | def stageInstall(): |
| 262 | | check(system("make DATADIR=%s/build/inst LIBDIR=%s/build/inst prefix=%s/build/inst DOCDIR=%s/build/inst/share/doc install" % (PWD, PWD, PWD, PWD))) |
| 263 | | force(lambda:unlink("src/osx/growl/_growl.so")) |
| 264 | | force(lambda:unlink("src/osx/growl/_growlImage.so")) |
| 265 | | force(lambda:unlink("src/osx/idle.so")) |
| 266 | | force(lambda:unlink("src/osx/nsapp.so")) |
| 267 | | force(lambda:unlink("src/osx/syncmenu.so")) |
| 268 | | force(lambda:unlink("src/gtkspell.so")) |
| 269 | | symlink("%s/build/inst/lib/gajim/_growl.so" % PWD, "src/osx/growl/_growl.so") |
| 270 | | symlink("%s/build/inst/lib/gajim/_growlImage.so" % PWD, |
| 271 | | "src/osx/growl/_growlImage.so") |
| 272 | | symlink("%s/build/inst/lib/gajim/idle.so" % PWD, "src/osx/idle.so") |
| 273 | | symlink("%s/build/inst/lib/gajim/nsapp.so" % PWD, "src/osx/nsapp.so") |
| 274 | | symlink("%s/build/inst/lib/gajim/syncmenu.so" % PWD, "src/osx/syncmenu.so") |
| 275 | | if os.path.isfile("build/inst/lib/gajim/gtkspell.so"): |
| 276 | | symlink("%s/build/inst/lib/gajim/gtkspell.so" % PWD, "src/gtkspell.so") |
| 277 | | return |
| 278 | | |
| 279 | | |
| 280 | | def buildApp(): |
| 281 | | sys.path.append('src') |
| 282 | | sys.path.append(GTK_DIR + "/lib/python2.5/site-packages") |
| 283 | | sys.path.append(GTK_DIR + "/lib/python2.5/site-packages/gtk-2.0") |
| 284 | | OPTIONS = {'argv_emulation':True, |
| 285 | | 'excludes':'docutils,Crypto,dbus,OpenSSL,cairo,gtk,gobject,atk,pangocairo', |
| 286 | | 'iconfile':'data/pixmaps/gajim.icns', |
| 287 | | 'includes':'osx,ConfigParser,compiler,UserString,history_manager', |
| 288 | | 'plist':{'LSMinimumSystemVersion':'10.4.0', |
| 289 | | 'NSHumanReadableCopyright':'GNU General Public License', |
| 290 | | 'CFBundleIdentifier':'org.gajim', |
| 291 | | 'NSMainNibFile':'Gajim', |
| 292 | | }, |
| 293 | | } |
| 294 | | setup( |
| 295 | | name = NAME, version = VERSION, description = DESCRIPTION, |
| 296 | | author = AUTHOR, url = URL, download_url = DOWNLOAD_URL, |
| 297 | | license = LICENSE, |
| 298 | | app=['src/gajim.py'], |
| 299 | | data_files=['data/nibs/Gajim.nib'], |
| 300 | | options={'py2app': OPTIONS}, |
| 301 | | setup_requires=['py2app'], |
| 302 | | ) |
| 303 | | return |
| 304 | | |
| 305 | | |
| 306 | | def finishApp(): |
| 307 | | # setup gajim dirs |
| 308 | | copytree("build/inst/share/gajim/data", APP_RS + "/data") |
| 309 | | copy("data/pixmaps/gajim.icns", APP_RS + "/data/pixmaps") |
| 310 | | copytree("build/inst/locale", APP_RS + "/locale") |
| 311 | | copytree("build/inst/share/man", APP_RS + "/man") |
| 312 | | force(lambda:unlink("dist/Gajim.app/Contents/data")) |
| 313 | | symlink("Resources/data", "dist/Gajim.app/Contents/data") |
| 314 | | copy("src/gajim-remote.py", "dist/Gajim.app/Contents/Resources") |
| 315 | | # Nuke libs that are in the framework |
| 316 | | move("dist/Gajim.app/Contents/Frameworks/Python.framework", |
| 317 | | "dist/Gajim.app/Contents/Python.framework") |
| 318 | | rmtree("dist/Gajim.app/Contents/Frameworks") |
| 319 | | mkdir("dist/Gajim.app/Contents/Frameworks") |
| 320 | | move("dist/Gajim.app/Contents/Python.framework", |
| 321 | | "dist/Gajim.app/Contents/Frameworks/Python.framework") |
| 322 | | # Adjust the running of the app |
| 323 | | move("dist/Gajim.app/Contents/MacOS/Gajim", |
| 324 | | "dist/Gajim.app/Contents/MacOS/Gajim.bin") |
| 325 | | writeScript("dist/Gajim.app/Contents/MacOS/Gajim", GAJIM_SCRIPT) |
| 326 | | # Setup the gajim-remote script |
| 327 | | writeScript("dist/Gajim.app/Contents/MacOS/gajim-remote", |
| 328 | | GAJIM_REMOTE_SCRIPT) |
| 329 | | # Touch the top dir so Finder knows to update its idea of this bundle |
| 330 | | utime("dist/Gajim.app", None) |
| 331 | | return |
| 332 | | |
| 333 | | |
| 334 | | def distApp(): |
| 335 | | force(lambda:rmtree("dist/Gajim")) |
| 336 | | force(lambda:rmtree("dist/Gajim.tar.bz2")) |
| 337 | | mkdir("dist/Gajim") |
| 338 | | check(system("tar -cf - -C dist Gajim.app | tar -xf - -C dist/Gajim")) |
| 339 | | copy("README.osx", "dist/Gajim/README") |
| 340 | | copy("TODO.osx", "dist/Gajim/TODO") |
| 341 | | check(system("tar -C dist -jcf dist/Gajim-OSX-`date | awk '{printf(\"%s-%s-%s\", $6, $2, $3);}'`.tar.bz2 Gajim")) |
| 342 | | rmtree("dist/Gajim") |
| 343 | | return |
| 344 | | |
| 345 | | |
| 346 | | |
| 347 | | ### |
| 348 | | ### Start |
| 349 | | ### |
| 350 | | if ((len(sys.argv) != 2) or ((sys.argv[1] != "build") and |
| 351 | | (sys.argv[1] != "dist"))): |
| 352 | | print "usage: python setup_osx.py [build]" |
| 353 | | print " or: python setup_osx.py [dist]" |
| 354 | | sys.exit(1) |
| 355 | | elif sys.argv[1] == "build": |
| 356 | | sys.argv[1] = "py2app" |
| 357 | | cleanup() |
| 358 | | stageInstall() |
| 359 | | buildApp() |
| 360 | | finishApp() |
| 361 | | elif sys.argv[1] == "dist": |
| 362 | | distApp() |