Sunday, December 21, 2008

Compiling SQLite 2 on Mac OS X 10.5 Leopard (for x86_64)

Mac OS X 10.5 Leopard comes with SQLite v3 bundled. But many times having SQLite v2 can be handy, given that version 3 is not backwards compatible. The hardest step here is to find the download link for version 2 in the official SQLite site. Don't ask me how did I achieve that... I don't remember ;) Fortunately I wrote down the link so you don't have to bother digging the web again :)

So we start with:
$ wget
$ tar -zxf sqlite-2.8.17.tar.gz

The next big problem comes with CFLAGS. The package we are about to install comes with a pre-made configure script that doesn't respects the CFLAGS environment variable when creating the dynamic library. It took me a while but I have the patch for you, too.

--- configure.old 2008-12-21 18:50:24.000000000 -0200
+++ configure 2008-12-21 18:57:11.000000000 -0200
@@ -8253,7 +8253,7 @@
- archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring'
+ archive_cmds='$CC '$CFLAGS' -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring'
module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
# Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's
archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'

After applying the patch to the configure file we can proceed as usual:

$ ./configure --prefix=/usr/local LDFLAGS="-arch i686 -arch x86_64" CFLAGS="-arch i686 -arch x86_64"
$ make

I like to take full advantage of my system so I like to have things working at 64 bits. Just for the case I ever need a tool that won't go 64, I keep a fat binary with both archs 32 and 64. At this point we should check our work:

$ file .libs/libsqlite.0.8.6.dylib
.libs/libsqlite.0.8.6.dylib: Mach-O universal binary with 2 architectures
.libs/libsqlite.0.8.6.dylib (for architecture i386): Mach-O dynamically linked shared library i386
.libs/libsqlite.0.8.6.dylib (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64

Everything seems fine. So we finally install it:

$ sudo make install

Monday, May 19, 2008

How to sync your Nokia 5200 with your Mac OS 10.5 Leopard

  1. Download the following plugin:
  2. Go to your Applications folder, look for iSync.
  3. Right click iSync, click "Show Package Contents"
  4. Navigate thru Contents\PlugIns\ApplePhoneConduit.syncdevice\Contents\PlugIns
  5. Extract here the zip you just got
  6. Enable bluetooth on your computer and phone
  7. Open iSync
  8. Press Command+N to configure your phone settings and you are done

Wednesday, May 7, 2008

How to record your Mac OS 10.5 Leopard screen to SWF

Sometimes when you want to demo an application or even create a step by step tutorial on something, there is nothing better then a live recording of the action. In those cases vnc2swf is a small and very handy python script able to help you on that job.

I am not very sure on what it depends, but you would need X11, Freetype 2, jpeg and Python Imaging Library (PIL) at least. Python of course, but Leopard already comes with version 2.5. I am not sure about GTK, I already had that on my system. If you don't, please take a look at Compiling GTK+ on Mac OS X 10.5 Leopard and get it to your system. That same post would help you setup all the dependencies but PIL, that we are going to cover now.

Download PIL source code to /usr/src. I assume all your own compiled libraries are installed to /usr/local and you used architecture i686.

cd /usr/src
tar -zxf Imaging-1.1.6.tar.gz
cd Imaging-1.1.6

Now you need to hack accoding to that diff:

--- 2006-12-03 09:37:29.000000000 -0200
+++ 2008-05-06 21:13:29.000000000 -0300
@@ -131,14 +131,10 @@

elif sys.platform == "darwin":
# attempt to make sure we pick freetype2 over other versions
- add_directory(include_dirs, "/sw/include/freetype2")
- add_directory(include_dirs, "/sw/lib/freetype2/include")
+ add_directory(include_dirs, "/usr/local/include/freetype2")
# fink installation directories
- add_directory(library_dirs, "/sw/lib")
- add_directory(include_dirs, "/sw/include")
- # darwin ports installation directories
- add_directory(library_dirs, "/opt/local/lib")
- add_directory(include_dirs, "/opt/local/include")
+ add_directory(library_dirs, "/usr/local/lib")
+ add_directory(include_dirs, "/usr/local/include")

add_directory(library_dirs, "/usr/local/lib")
# FIXME: check /opt/stuff directories here?

Then you are done to build:

export ARCHFLAGS="-arch i686"
export CFLAGS="-arch i686"
python build
sudo python install

Now you would just unzip and go vnc2swf but I couldn't make it work with Leopard's built-in VNC server (Screen Sharing) so you first need OSXVnc. Download the disc image, mount it and copy Vine Server to your Applications folder. Run and start the server.

You are now ready to go vnc2swf:

cd /usr/src
tar -zxf pyvnc2swf-0.9.3.tar.gz
cd pyvnc2swf-0.9.3/pyvnc2swf/
./ -n -o /tmp/myMovie.swf

Friday, March 28, 2008

How to hack iphone locales

You may already seen out there some projects that translates the iPhone user interface to many different languages. Locale strings are stored in a totally different way though. Things like "Monday" and the Portuguese equivalent "Segunda-Feira" are stored in a ICU (International Components for Unicode) data file.

For 12 mondays I had to stand looking at "Segunda-Feira" being printed out of the bounds of iCal icon. Until today. I tried fgrep'ng the whole iPhone for the string "segunda" with no luck. Then I tried converting all the plists from binaries to XML and fgrep'ng again and still no luck. Doing some research I found that apple uses ICU on iPhone, which drove me to find our target: /usr/share/icu/icudt34l.dat. This is a 8.5MB file bundled with all the locales (timezones, region formats, etc.).

To start playing with it, the first thing we will need is obviously the file itself:
cd /tmp
ssh root@iPhone cp /usr/share/icu/icudt34l.dat /usr/share/icu/icudt34l.dat.bak
scp root@iPhone:/usr/share/icu/icudt34l.dat .
Now we need the ICU version 3.4 tools. Again, I don't like macports or fink so I had a bad time trying to compile it myself (remember I am on a Mac OS X Leopard). You have now the cake recipe:
cd /usr/src
tar -zxf icu-3.4.1.tgz
mv icu icu-3.4.1
cd icu-3.4.1/source
For some weird reason the configure script for darwin is broken, so I had to fix that with the following patch:
--- config/mh-darwin 2004-05-18 18:54:24.000000000 -0300
+++ config/ 2008-03-27 23:48:45.000000000 -0300
@@ -58,6 +58,7 @@
@echo "generating dependency information for $<" @$(GEN_DEPS.c) $< > /dev/null
@mv $@ $@~
- @echo -n "$@ " > $@
@cat < $@~ >> $@
@-rm $@~

@@ -65,6 +66,7 @@
@echo "generating dependency information for $<" @$( $< >/dev/null
@mv $@ $@~
- @echo -n "$@ " > $@
@cat < $@~ >> $@
@-rm $@~
Now we can run configure:
./runConfigureICU MacOSX --disable-samples --disable-draft --disable-extras --disable-tracing --disable-tests
and make it:
sudo make install
I couldn't manage to get file from bin/ installed on my system, but anyway I wasn't really interested on going deeply on that. Heck, I want to get rid of that "Segunda-Feira" thing !

Lets extract our package now:
cd /tmp
/usr/src/icu-3.4.1/source/bin/decmn icudt34l.dat --pkgdata > out.lst
cd icudt34l
boom ! we got a lot of files... and look who is laying around:
-rw-r--r-- 1 igor wheel 51K Mar 28 00:14 pt.res
-rw-r--r-- 1 igor wheel 496B Mar 27 23:06 pt_BR.res
-rw-r--r-- 1 igor wheel 3.7K Mar 27 23:06 pt_PT.res
The file we want is pt.res, but its a binary file. I couldn't manage to convert it back to something readable but again I am more interested in the quickest solution possible. Just download the pt.txt here. Near to the end you will find the calendar day names. Edit accordingly. Important: remember to use UTF-8.

Now its time to generate our new resource:
/usr/src/icu-3.4.1/source/bin/genrb pt.txt
and re-package:
/usr/src/icu-3.4.1/source/bin/gencmn -v -n icudt34l 0 < ../out.lst
At this point you cross your fingers and hope this works... worked for me :)
scp icudt34l.dat root@iPhone:/usr/share/icu
reboot and you are all set.

If you can read Portuguese you might find this entry interesting as well. It describes the similar process of updating Mac OS X timezone. It makes use of `icupkg` though, that is not available on ICU version 3.4.

Wednesday, March 26, 2008

GTK Python bindings for Mac OS X 10.5 Leopard

Following my previous post we are now ready to compile and install the python bindings in order to have UMIT ready to go.

we start with pygobject which is cursed by Murphy's law. At the first attempt I got make stopped by an error message, that could be fixed by telling which python version we would like to use (one more time thanks to macports).
tar -jxf pygobject-2.14.1.tar.bz2
cd pygobject-2.14.1
./configure --prefix=/usr/local --disable-glibtest CFLAGS="-arch i686" PYTHON=/usr/bin/python2.5
sudo make install
next pycairo:
tar -zxf pycairo-1.4.12.tar.gz
./configure --prefix=/usr/local CFLAGS="-arch i686" PYTHON=/usr/bin/python2.5
sudo make install
and finally pygtk:
tar -jxf pygtk-2.12.1.tar.bz2
cd pygtk-2.12.1
./configure --prefix=/usr/local CFLAGS="-arch i686" PYTHON=/usr/bin/python2.5
sudo make install
that's the end of our saga. You can now enjoy UMIT on your Mac OS :)

Thursday, March 6, 2008

Compiling GTK+ on Mac OS X 10.5 Leopard

UMIT is an awesome graphical frontend for nmap. It works out of the box, that is, unzip and go. But, it requires GTK+2, which is a totally different history...

Compiling GTK+ on Mac OS X can be a time consuming task, specially if you don't want to use tools like Fink or MacPorts. Obviously I don't keep backup of my libs so after my last HDD crash (less than a year brand new MacBook, thanks to MacSaber) I had to redo all the GTK saga again. This time I am going to record the whole process to the history, so I can drastically reduce the efforts on future attempts.

Yes, GTK has a million dependencies that have a million dependencies themselves leaving us with a gazillion libraries to take care of. While I was going forward and back across the dependencies I wrote down what depends on what. That's what I came up with:
  • gtk
    • glib
      • pkg_config
      • gettext
        • expat
      • libpng
    • atk
    • pango
      • cairo
        • pixman
        • freetype
        • fontconfig
    • libtiff
      • libjpeg
Easy, huh ? No its not what it looks like. It took me a whole day and a half to fix every little issue that kept me from going ahead during the process. For each library, there is a special trick you have to learn.

For the architecture I decided to go with i686 after gettext complained about x86_64. Yes, I had to go back and re-compile everything that was already done until that step.

I like to install everything on /usr/local so I know where my stuff is laying around. Also, I tried to find the latest version of each package in the time this blog entry was written. Some stuff is hosted on more than one "official" place and not always it is updated everywhere. So I could fail on finding the state of the art for everything here but I am probably close to that.

I am not going to report any error message or to detail any problem that I faced during the process. Instead I will go direct to the point.


we start with pkg_config:
tar -zxf pkg-config-0.23.tar.gz
cd pkg-config-0.23
./configure --prefix=/usr/local CFLAGS="-arch i686"
sudo make install
then we move to gettext, that requires expat:
tar -zxf expat-2.0.1.tar.gz
cd expat-2.0.1
./configure --prefix=/usr/local CFLAGS="-arch i686"
sudo make install
before going to gettext we need to hack emacs as found here:
sudo mv /usr/bin/emacs-i386 /usr/bin/emacs-i386.backup
sudo /usr/libexec/dumpemacs -d
finally gettext:
tar -zxf gettext-0.17.tar.gz
cd gettext-0.17
./configure --prefix=/usr/local CFLAGS="-arch i686"
sudo make install
and the last item on glib, libpng:
tar -jxf libpng-1.2.25.tar.bz2
cd libpng-1.2.25
./configure --prefix=/usr/local CFLAGS="-arch i686"
sudo make install
now glib itself, that is by far more problematic than the libs above:
tar -jxf glib-2.14.6.tar.bz2
cd glib-2.14.6
at this point we have to patch glib/gutils.h as seen here:
--- gutils.h 2008-02-07 03:24:59.000000000 -0200
+++ /usr/src/glib-2.14.6/glib/gutils.h 2008-03-06 16:43:34.000000000 -0300
@@ -108,6 +108,8 @@
# define G_INLINE_FUNC
# undef G_CAN_INLINE
+#elif defined (__APPLE__)
+# define G_INLINE_FUNC static inline
#elif defined (__GNUC__)
# if __GNUC_PREREQ (4,2) && defined (__STDC_VERSION__) \
&& __STDC_VERSION__ >= 199901L
also the C compiler need some special flags. the SSE instructions have to be enabled with -msse2 which is mandatory here. I copied the other flags from the portfile at MacPorts. Finally:
./configure --prefix=/usr/local --enable-static CFLAGS="-arch i686 -msse2 -funroll-loops -fstrict-aliasing -finline-functions" LDFLAGS="-bind_at_load"
sudo make install


the next is atk:
tar -jxf atk-1.21.92.tar.bz2
cd atk-1.21.92
./configure --prefix=/usr/local CFLAGS="-arch i686"
sudo make install
and following cairo deps, pixman:
tar -zxf pixman-0.9.6.tar.gz
cd pixman-0.9.6
./configure --prefix=/usr/local CFLAGS="-arch i686"
sudo make install
tar -jxf freetype-2.3.5.tar.bz2
cd freetype-2.3.5
./configure --prefix=/usr/local CFLAGS="-arch i686 -msse2"
sudo make install
tar -zxf fontconfig-2.4.92.tar.gz
cd fontconfig-2.4.92
./configure --prefix=/usr/local CFLAGS="-arch i686"
sudo make install
and finally cairo. note we need again the SSE instructions plus we have to specify the location of the X development libraries. If you don't have it, refer to apple support on how to install Xcode tools and X11.
tar -zxf cairo-1.4.14.tar.gz
cd cairo-1.4.14
./configure --prefix=/usr/local --enable-xlib --x-includes=/usr/X11/include --x-libraries=/usr/X11/lib CFLAGS="-arch i686 -msse2"
sudo make install
now that we have cairo done, we can do pango:
tar -jxf pango-1.19.4.tar.bz2
cd pango-1.19.4
./configure --prefix=/usr/local CFLAGS="-arch i686 -msse2"
sudo make install
libjpeg has a special rule hidden inside the makefile, that you don't want to miss:
tar -zxf jpegsrc.v6b.tar.gz
cd jpeg-6b
./configure --prefix=/usr/local CFLAGS="-arch i686"
sudo make install
sudo make install-lib
and the last one, libtiff:
tar -zxf tiff-3.8.2.tar.gz
cd tiff-3.8.2
./configure --prefix=/usr/local --with-apple-opengl-framework CFLAGS="-arch i686"
sudo make install
we are now all ready to the big guy:
tar -jxf gtk+-2.12.8.tar.bz2
cd gtk+-2.12.8
./configure --prefix=/usr/local --x-includes=/usr/X11/include --x-libraries=/usr/X11/lib CFLAGS="-arch i686 -msse2"
sudo make install
and voilá ! it took me many hours to get here, I hope you can do it in minutes ;)

We are not ready for UMIT yet. We need the python bindings still. see you in the next adventure.

update: thanks to Gregory and Antoine for pointing out the typos