Friday, September 14, 2012
Thursday, September 13, 2012
Compile xz for Windows using MinGW
xz is the new popular compression format. To build xz tools and libraries, I issued the following commands.
./configure --prefix=/mingw --disable-shared --disable-nls --disable-lzma-links --disable-scripts
make
make install
I got the following files:
lzmadec.exe
lzmainfo.exe
unxz.exe
xz.exe
xzcat.exe
xzdec.exe
Note that xz can be used to create and decompress lzma files also.
Wednesday, September 12, 2012
Compile libcddb for Windows
libcddb is used to query for information about audio Compact Discs that has been loaded in media players and CD rippers. Compiling libcddb is not so hard with MinGW.
First, I installed MinGW. I compiled zlib and libiconv.
Then, I compiled libcdio. I downloaded the latest development source from its git web server.
./autogen.sh
./configure --prefix=/mingw
make
make installI compiled libcddb like this:
./configure --prefix=/mingw
make
make install
FLAC for Windows
FLAC, short for Free Lossless Audio Codec, is an audio format similar to MP3, but lossless. Thus, audio compressed in FLAC has no loss in quality. With digital storage getting cheaper everyday, it makes sense to copy or preserve sound in the near-perfect quality. I'm compiling FLAC with MinGW because it's needed by some programs I want to build.
I installed MinGW, of course. I also instaled NASM because it was suggested during configure. I just downloaded yasm-1.2.0-win32.exe and renamed it as nasm.exe.
I think it's not necessary, but I compiled zlib and libiconv.
I built OGG.
./configure --prefix=/mingw
make
make installThen, I built FLAC.
./configure --prefix=/mingw --enable-sse
The --enable-sse option is for SSE-capable CPU's which mean nearly all new desktop CPU's today. I began
make.make
I got errors about SIZE_T_MAX. To fix it, I just changed the line 38 in flac-1.2.1/include/share/alloc.h
# if defined _MSC_VER || defined __MINGW32__
I got another error compiling examples/cpp/encode/file/main.cpp. To fix it, I inserted the following line after <stdlib.h> on line 33.
#include <string.h>
I got no more error. I installed flac.
make install
Tuesday, September 11, 2012
Kung Fu Hustle (2004) 功夫
Kung Fu Hustle is a funny but memorable movie from Hong Kong star Stephen Chow. If you haven't seen it yet, here's your chance to watch the movie.
And the one below is the original Chinese version with English subtitles.
Compile libRTMP with MinGW
The libRTMP library provides online multimedia streaming support for many open-source projects, such as ffmpeg and curl. I am building librtmp for use with ffmpeg and mplayer. I downloaded the latest release tarball from here.
First, I compiled zlib as shown in this post.
make -f win32/Makefile.gcc
cp -iv zlib1.dll /mingw/bin
cp -iv zconf.h zlib.h /mingw/include
cp -iv libz.a /mingw/lib
cp -iv libz.dll.a /mingw/libThen, I built OpenSSL as shown in this post.
./Configure -DHAVE_STRUCT_TIMESPEC -L/mingw/lib -lz -lpthreadGC2 -lws2_32 --prefix=/mingw threads zlib mingw
make
make installThen, I built librtmp.
make SYS=mingw
cp -iv *.exe /mingw/binTo build the shared library, I typed:
cd librtmp
gcc -shared -o librtmp.dll -Wl,--out-implib,librtmp.dll.a rtmp.o log.o amf.o hashswf.o parseurl.o -lssl -lcrypto -lz -lws2_32 -lwinmm -lgdi32To install librtmp, I typed the following:
cp -iv librtmp.dll /mingw/bin
cp -iv amf.h http.h log.h rtmp.h /mingw/include/librtmp
cp -iv librtmp*.a /mingw/lib
cp -iv librtmp.pc /mingw/lib/pkgconfigSometimes, librtmp.pc fails to be generated. In that case, make it yourself and copy it to /mingw/lib/pkgconfig.
prefix=/mingw
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
incdir=${prefix}/include/librtmp
Name: librtmp
Description: RTMP implementation
Version: 2.3
Requires: openssl libcrypto
URL: http://rtmpdump.mplayerhq.hu
Libs: -L${libdir} -lrtmp -lz
Libs.private: -lws2_32 -lwinmm -lgdi32 -lssl -lcrypto
Cflags: -I${incdir}
Monday, September 10, 2012
Build OpenSSL with MinGW
OpenSSL is an open-source library that provides cryptographic and network security functions. It is used by so many open-source software that require SSL/TLS support. To build OpenSSL for Windows, first install MinGW. There are two flavors of MinGW: mingw and mingw64. Just pick one of the following and set it up accordingly:
Then, download the latest source tarball from the OpenSSL website and unpack it with 7-zip. 7-zip should be used because MinGW/MSYS tar has trouble with tarballs containing symlinks. However, cygwin has no problem with tarballs containing symlinks.
OpenSSL optionally incorporates the following libraries when found.
Assuming that you compiled both zlib and pthread as shown in the above links, configure OpenSSL like this.
./Configure -DHAVE_STRUCT_TIMESPEC -DPTW32_STATIC_LIB -L/mingw/lib -lz -lpthreadGC2 -lws2_32 --prefix=/mingw threads zlib mingw
Then, run make.
make
If you run into errors compiling some test codes, just copy dummytest.c over. However, it doesn't happen under Cygwin.
cp -iv test/dummytest.c test/md2test.c
cp -iv test/dummytest.c test/rc5test.c
cp -iv test/dummytest.c test/jpaketest.c
Then, install OpenSSL.
make install
To Build the Live555 library with MinGW
The Live555 streaming media library is an open-source implementation of RTP/RTCP/RTSP/SIP multimedia streaming protocols. I mainly use it with MPlayer. To compile it with MinGW, download the source for live555 library and extract the tarball under /mingw/lib:
cd /mingw/lib
tar xzvf live555-latest.tar.gz
cd live
compile it like this:
./genMakefiles mingw
make
Live555 and MPlayer
Normally, mplayer will detect the live555 library automatically. If not, append --enable-live to the ./configure command.
- Append the following text to CXXFLAGS= line.
-I/mingw/lib/live/liveMedia/include -I/mingw/lib/live/UsageEnvironment/include -I/mingw/lib/live/BasicUsageEnvironment/include -I/mingw/lib/live/groupsock/include
- Append the following text to EXTRALIBS= line.
/mingw/lib/live/liveMedia/libliveMedia.a /mingw/lib/live/UsageEnvironment/libUsageEnvironment.a /mingw/lib/live/BasicUsageEnvironment/libBasicUsageEnvironment.a /mingw/lib/live/groupsock/libgroupsock.a -lstdc++
Creating a Shared Library for live555
To create a shared library from the static live555 libraries, I ran the following command:
gcc -shared -o livemedia.dll -Wl,--out-implib,liblivemedia.dll.a -Wl,--whole-archive liveMedia/libliveMedia.a UsageEnvironment/libUsageEnvironment.a BasicUsageEnvironment/libBasicUsageEnvironment.a groupsock/libgroupsock.a -Wl,--no-whole-archive -lstdc++ -lws2_32
I got livemedia.dll and liblivemedia.dll.a. I copied these files under MinGW.
cp -iv livemedia.dll /mingw/bin
cp -iv liblivemedia.dll.a /mingw/lib
To use these files, I would define environment variables as follows:
CXXFLAGS='-I/mingw/lib/live/liveMedia/include -I/mingw/lib/live/UsageEnvironment/include -I/mingw/lib/live/BasicUsageEnvironment/include -I/mingw/lib/live/groupsock/include'
LIBS='-lstdc++ /mingw/lib/liblivemedia.dll.a'
Bonsai Rock Study #2 - Lake Tahoe, Nevada, USA by Rich Capture
Bonsai by Rob Birchard
Bonsai Rock Lake Tahoe IV by Joe Y Jiang
Sunday, September 9, 2012
Hilariously Awesome Martial Arts Classic: The Story of Ricky (电影: 力王)
Do you like classic horror movies or a Chinese kung-fu movie? Then, you may like the Hong Kong movie, “Ricki Oh: the Story of Ricky.” It's got both: blood and gore, and awesome kung fu. The fight scenes are gross and brutal like Kill Bill, but otherwise have outrageously cool kung-fu moves. However, I warn that some viewer discretion is advised.
Here's the same movie in Mandarin Chinese.
Saturday, September 8, 2012
Building MPlayer and Mencoder for Windows
MPlayer is one of my favorite media players. It is used with a frontend like smplayer, gnome-mplayer and MPlayerGUI to provide a good alternative to Windows Media Player. Although there are already several Win32 builds of MPlayer on the net, I like to build MPlayer on my own using MinGW compiler because I want to optimize my build for my CPU. So I installed MinGW and compiled MPlayer as follows.
Build ffmpeg statically or dynamically as shown in this post.
- (Optional) Compile the lzo library:
./configure --prefix=/mingw && make && make install
(Optional) Fribidi is a rendering library for right-to-left scripts, such as Arabic and Hebrew. If you are a speaker of such right-to-left languages, compile fribidi statically as shown below:
./configure --prefix=/mingw --disable-shared --disable-debug
make
make installMore information can be found here.
- Download JPEG source from ijg.org and complie JPEG:
./configure --prefix=/mingw --enable-static
make
make install - Compile libPNG:
./configure --prefix=/mingw --disable-shared
make
make install - Compile libiconv, Freetype, expat and fontconfig statically in that order:
./configure --prefix=/mingw --disable-shared
make install - Compile libdca:
./configure --prefix=/mingw
make
make install - (Optional) Download DirectX headers from any of the following locations and unpack them in /mingw/include:
- http://www.videolan.org/vlc/dx7headers.tgz
- http://www.mplayerhq.hu/MPlayer/contrib/win32/dx7headers.tgz
- http://www.videolan.org/vlc/dx7headers.tgz
- Download the latest mplayer source (mplayer-export-snapshot.tar.bz2) and unpack it. (patch 1 and patch 2)
tar xjvf mplayer-export-snapshot.tar.bz2
cd mplayer-export-2010-02-07/Then, run
./configure:CPPFLAGS='-DFRIBIDI_ENTRY="" ' ./configure --prefix=/mingw --enable-runtime-cpudetection --enable-static --enable-theora --enable-fribidi --disable-ffmpeg_a --disable-gl --disable-vidix --yasm=/mingw/bin/yasm --extra-libs='-lfribidi'
The CPPFLAGS value allows fribidi to be linked statically.
- Build Mplayer:
make
After successful build, strip the executables:
strip m*.exe
Optionally, compress the executables with upx:
upx --best --strip-relocs=0 mplayer.exe
upx --best --strip-relocs=0 mencoder.exe Download MPlayer codecs from here. The MPlayer codecs for Windows platform has a filename like windows-essential-20071007.zip. Extract the codecs package and you'll get a folder "windows-essential-20071007". Rename it as "codecs" and move the "codecs" folder inside where mplayer.exe file is located.
Make sure that HOME environment variable is set to your personal folder(for example, C:\Users\Jocelyn). Upon the first run of mplayer, a new folder named
mplayerwill be created in your HOME folder. Copy codecs.conf to themplayerfolder. The "config" file stores default options for playing movie files. Open the "config" file and make changes as follows:# Write your default config options here!
cdrom-device=D:
dvd-device=D:
ao=dsound
vo=direct3d
font=C:\WINDOWS\FONTS\MALGUN.TTF
framedrop=yes
subcp=cp949
My win32 build of mplayer can be downloaded from here. It is recommended that the zip archive should be extracted in C:\Program Files.
Running MPlayer
Now, let's try mplayer. First, get a movie file ready. In the Command Prompt, type a command in the following form:
mplayer mymoviefile.avi
Alternatively,
mplayer -vo direct3d -ao win32 -font C:\WINDOWS\FONTS\Tahoma.ttf -framedrop mymoviefile.avi
A new window will pop up with the movie playing inside it.
The next step is to get and set up SMPlayer.
Friday, September 7, 2012
Building cdrkit for Windows
cdrkit is another CD/DVD burning tool that was spun off from the cdrtools project. Some say cdrkit is inferior to cdrtools, but I haven't found a problem with cdrkit yet. Although I prefer cdrtools to cdrkit, I'd like to give cdrkit a try. To build cdrkit with MinGW, I had to compile some libraries first.
- zlib
First, I compiled zlib:
tar xzvf zlib-1.2.7.tar.gz
cd zlib-1.2.7
make -f win32/Makefile.gcc
cp -iv zlib1.dll /mingw/bin
cp -iv zconf.h zlib.h /mingw/include
cp -iv libz.a /mingw/lib
cp -iv libz.dll.a /mingw/lib - POSIX threads for Win32
New genisoimage seems to use pthread for making checksums. I compiled pthread like this:
make clean GC
cp -iv pthreadGC2.dll /mingw/bin
cp -iv pthread.h semaphore.h sched.h /mingw/include/
cp -iv libpthreadGC2.a /mingw/lib
cp -iv libpthreadGC2.a /mingw/lib/libpthread.a - PCRE
Then, I compile PCRE:
./configure --prefix=/mingw --enable-pcre16 --enable-unicode-properties
make
make install
cp /mingw/include/pcreposix.h /mingw/include/regex.h
cp /mingw/lib/libpcreposix.a /mingw/lib/libregex.a
cp /mingw/lib/libpcreposix.dll.a /mingw/lib/libregex.dll.a - libmagic
I built the open-source file command. I configured it like this:
./configure --prefix=/mingw
Then, I added the following lines to
config.h:#define WIN32 1
#define MAGIC "magic"Compile libmagic:
make && make install
I got an error trying to build file.exe, so I modified src/Makefile:
file_LDADD = libmagic.la /mingw/lib/libpcreposix.dll.a
- libiconv
I built libiconv like this:
./configure --prefix=/mingw
make
make install - CMake
Then, I built CMake.
./bootstrap --prefix=/mingw
make
make install - cdrkit
I unpacked the cdrkit source and applied the patch that I found at the mailing list. Here are the modified patches of mine.
I used the command below to applied the patch.
patch -p1 -l < ../cdrkit-1.1.9-mingw.patch
Then, I compiled cdrkit:
cmake -G "MSYS Makefiles"
makeAfter successful build, I copied the executable files (*.exe) to my folder.
Issues and Fixes
I got an error linking genisoimage. I edited genisoimage/CMakeLists.txt to resolve the issue:
IF(USE_MAGIC)
ADD_DEFINITIONS(-DUSE_MAGIC)
LIST(APPEND EXTRA_LIBS "shlwapi")
SET(MAGICLIBS magic)
ENDIF(USE_MAGIC)I got errors compiling sha256.* and sha512.*. I made the following changes.
- I removed all lines that read #include <endian.h>.
- Assume the target machine is little endian.
- change all occurrences of
__THROWto__attribute__ ((__nothrow__)).
- I removed all lines that read #include <endian.h>.
The code in genisoimage/checksum.c gave me errors linking with pthread-w32. To fix it, I replaced
a->threadwith(a->thread).p.I found that genisoimage and readom still used
/dev/null. I changed it toNULin genisoimage.c and readom.c.
Download my cdrkit Build
Here's my cdrkit build for Windows.
Related Links
Thursday, September 6, 2012
Building cdrtools under Cygwin

cdrtools is a powerful open-source CD/DVD/BD burning tool. It is used as backend software for free DVD-burning applications, such as Infrarecorder and cdrtfe. To build cdrtools for Windows, install Cygwin as shown in this post. Additionally, I installed the following Cygwin packages.
- bison
- gcc4-core
- gcc4-g++
- gettext-devel
- libiconv
- libtool
- make
- patch
- pkg-config
I set up some environment variables before I started.
export CC=/usr/bin/gcc.exe
export CC_OPT="-O2"
export CFLAGS="-march=pentium2 -mtune=i586 -mthreads -mms-bitfields"
export LDFLAGS="-L/usr/lib -Wl,--enable-auto-image-base -Wl,--enable-auto-import -Wl,--enable-runtime-pseudo-reloc"
Then, I built smake.
cd smake-1.2
make
make INS_BASE=/usr install
Then, I built cdrtools.
smake
smake INS_BASE=/usr install
Using cdrtools
I tested my cdrtools build. To create an ISO file from a folder, I ran mkisofs:
mkisofs -J -R -hide-rr-moved ~/Downloads > dl.iso
To burn an ISO:
cdrecord -scanbus
cdrecord dev=0,0,0 speed=8 driveropts=burnfree dl.iso
To make a copy of a data CD:
readcd dev=0,0,0 f=dl2.iso speed=8 retries=16 -nocorr -noerror
To scan a music CD, I ran cdda2wav:
cdda2wav -scanbus
cdda2wav dev=0,0,0 cddb=1 -cddbp-server=freedb.freedb.org -cddbp-port=8880 -J -N
To rip the second track of the music CD:
cdda2wav dev=0,0,0 cddb=1 track=2 ~/Music/track2.wav

Download my cdrtools build for Windows
Here you can get my cdrtools build.
Free cdrtools Graphical Interfaces for Windows
If you don't want to deal with the command line, there are, of course, user-friendly GUI frontends for cdrtools.
Related Links
Wednesday, September 5, 2012
Compiling CMake with MinGW
CMake is a portable build system. CMake can be used to replace the traditional GNU build process, as in:
./configure
make
make install
Compiling CMake is fairly simple. After you install MinGW (as shown in this post), download and unpack the CMake source tarball. Run the following commands in order.
tar xzvf cmake-2.8.9.tar.gz
cd cmake-2.8.9
./bootstrap --prefix=/mingw
make
make install
To Compile ffmpeg with MinGW
ffmpeg is an important component of many open-source projects, such as MPlayer and VLC. I am compiling ffmpeg so that I can use it to transcode multimedia files. This guide shows how to use MinGW to compile ffmpeg either statically or dynamically. Installation of MinGW is explained in this post. The example commands below are meant to be entered into an MSYS window (not Command Prompt). I downloaded the FFmpeg source and unpacked it.
Preparing External Libraries for FFMpeg
FFMpeg can be linked with external libraries to add features to FFmpeg. I am adding most features to FFMpeg by compiling additional libraries. Most of these libraries are also covered in my posts on compiling MPlayer and Mencoder.
- Compression Libraries: Zlib and bzLib
Get the zlib source (zlib127.zip), unzip and compile it:unzip zlib127.zip
cd zlib-1.2.7/
make -f win32/Makefile.gcc
cp -iv zlib1.dll /mingw/bin
cp -iv zconf.h zlib.h /mingw/include
cp -iv libz.a /mingw/lib
cp -iv libz.dll.a /mingw/libOptionally, get bzip2 source from bzip.org and compile it like this:
tar xzvf bzip2-1.0.6.tar.gz
cd bzip2-1.0.6
make
cp bzlib.h /mingw/include/
cp libbz2.a /mingw/lib - libgsm
Download gsm-1.0.13.tar.bz2, unpack and compile it as follows:tar xzvf gsm-1.0.13.tar.bz2
cd gsm-1.0-pl13/
makeJust ignore the compile errors with fchmod and fchown when trying to build applications. Copy the header and static library to /mingw:
mkdir /mingw/include/gsm
cp inc/gsm.h /mingw/include/gsm
cp lib/libgsm.a /mingw/lib - LAME is an excellent MP3 encoder. LAME makes use of the nasm assembler if available. So download yasm and save it as /mingw/bin/nasm.exe. Then, download the LAME source from lame.sf.net and compile it like this.
./configure --prefix=/mingw --enable-expopt=full
make
make install - OGG, Vorbis, Speex and Theora
The source code for these libraries can be obtained from xiph.org. Compile them each like this:
./configure --prefix=/mingw
make
make installAs for speex, use the version 1.2rc1 or later.
- FAAC
FAAC is an MPEG-4 AAC audio encoder. Get the source (faac-1.28.tar.gz) and unpack the package. Then, edit Makefile.am:
SUBDIRS = include libfaac
Also, edit the line beginning with AC_OUTPUT in the file configure.in:
AC_OUTPUT(libfaac/Makefile include/Makefile Makefile)
Then, compile FAAC like this
sh bootstrap
./configure --prefix=/mingw
make
make install - XviD is a popular video encoder used to create movie files distributed in p2p networks. Xvid can use yasm assembler to build optimized binaries if found (
/mingw/bin/yasm.exe). Get the XviD source from xvid.org and compile as follows:tar xzvf xvidcore-1.3.2.tar.gz
cd xvidcore/build/generic
./configure --prefix=/mingw
make
make installIf you encounter "unrecognized command-line option
-mno-cygwin" errors, open the file platform.inc in a text editor and delete "-mno-cygwin". Then, runmakeandmake installagain.Copy the import library for xvidcore.dll:
cp -iv \=build/xvidcore.dll.a /mingw/lib/libxvidcore.a
- x264 is yet another good video encoder. x264 requires YASM to build an optimized executable. So get yasm and save it as /mingw/bin/yasm.exe. Then, compile x264 like this:
configure --prefix=/mingw --enable-win32thread --extra-cflags="-DX264_VERSION=20100422"
make
make install
cp -iv x264.h x264_config.h /mingw/include
cp -iv libx264.a /mingw/lib
cp -iv x264.pc /mingw/lib/pkgconfig - Compile librtmp as shown in this post.
Building FFMpeg Statically
You need pr.exe from MYS coreutils package (coreutils-5.97-3-msys-1.0.13-ext.tar.lzma). I configured ffmpeg with the following command:
CPPFLAGS='-DHAVE_INT32_T' ./configure --prefix=/mingw --enable-gpl --enable-nonfree --enable-postproc --enable-avfilter --enable-w32threads --enable-runtime-cpudetect --enable-memalign-hack --enable-bzlib --enable-libfaac --enable-libgsm --enable-libmp3lame --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-zlib --disable-debug
-DHAVE_INT32_T is used to allow static FAAC to be linked. Then, I began compilation and installation:
make
make install
Compiling FFmpeg Dynamically
Some Windows applications, such as Audacity, uses FFmpeg libraries when available. If you want to compile FFmpeg dynamically, append --enable-shared --disable-static to the ./configure command for FFmpeg.
./configure --prefix=/mingw --enable-gpl --enable-nonfree --enable-postproc --enable-avfilter --enable-w32threads --enable-runtime-cpudetect --enable-memalign-hack --enable-bzlib --enable-libfaac --enable-libgsm --enable-libmp3lame --enable-librtmp --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-zlib --enable-shared --disable-static --disable-debug
If you get "int32_t" error when compiling libfaac.o, open /mingw/include/faac.h and insert the following line:
#include <stdint.h>
When I built mplayer with --enable-static and --disable-ffmpeg_a options to force linking with shared ffmpeg libraries, I had to rename ffmpeg libraries so their names end in *.a.
cd /mingw/lib
cp -iv libavcodec.dll.a libavcodec.a
cp -iv libavformat.dll.a libavformat.a
cp -iv libavutil.dll.a libavutil.a
cp -iv libpostproc.dll.a libpostproc.a
cp -iv libswscale.dll.a libswscale.a
Tuesday, September 4, 2012
Using cdrtfe 1.5
cdrtfe is free CD/DVD/BD burning software for Windows. cdrtfe actually use the command-line program cdrtools as its burning engine. I have used cdrtools on Linux to create ISO images and burn or rip CD. I'd like to have cdrtools on Windows also. Fortunately, cdrtfe includes cdrtools Win32 binaries along with the nice-looking GUI application.
To install cdrtfe, I downloaded the cdrtfe zip archive (cdrtfe-1.5.zip) and unpacked the zip archive. Double-clicking on the cdrtfe file will start the cdrtfe program. (Warning: Running the Cygwin terminal and cdrtfe at the same time can cause a problem due to cygwin1.dll incompatibility, so close the Cygwin terminal before starting cdrtfe.)
So far, I have only tried ripping music CD's with cdrtfe. I will add more as I get to know more about cdrtfe.
Ripping Audio CD's
To rip a music CD, click on the DAE tab and click the Options button. Check to make sure the options are okay.
Back to the main window, click Read TOC to update the track list, check the Save tracks to folder, and click Start to begin ripping.
Sunday, September 2, 2012
Setting Up Cygwin For C/C++ Software Development on Windows
Cygwin provides a Unix-like environment for Windows users. Cygwin is useful for people who want to learn Unix or popular Linux without having to install Unix or Linux. Cygwin can also be used to port Linux applications to Windows or develop genuine Windows applications. To install Cygwin, download setup.exe from the Cygwin website and run it.
Cygwin Packages for Software Development
In addition to the default packages, select the following packages for common development environment:
- bison
- gettext-devel
- libtool
- make
- patch
- pkg-config
To select a package for installation, type the name of the package in the Search box, expand the categories by clicking a plus, and clicking on the package until its version number shows up.
If you want to develop software applications that depend on cygwin1.dll (which emulates Unix on Windows), install one of the following packages. This is when you want to port Linux applications to Windows with little modification.
- gcc-g++
outdated version 3.4.4 - gcc4-g++
GCC 4.x that links applications with cygwin1.dll
If you want to develop pure Windows applications, install one of the following packages.
- mingw-gcc-g++
The original MinGW compiler from mingw.org can't build 64-bit applications. - mingw64-i686-gcc-g++
New MinGW compiler from mingw-w64.sourceforge.net. - mingw64-x86_64-gcc-g++
Install these to develop 64-bit Windows applications.
When you see the Resolving Dependencies window, just accept and click Next.
Setting HOME Variable
Setting the environment variable %HOME% is useful for various reasons. First of all, it allows regular users to compile freely in their user folder without requiring access to C:\Cygwin. Secondly, it allows users to save user-specific configuration in their user folder. For example, user configuration files such as .profile, .gtkrc-2.0, .fonts.conf and .pango-aliases can be saved in the folder specified by %HOME%.
Setting Up mingw* compiler for Cygwin
The file C:\Cygwin\etc\fstab is used to set up mount points in Cygwin. If you installed mingw64 packages, open the file C:\Cygwin\etc\fstab in a text editor and append the following line.
/usr/i686-w64-mingw32/sys-root/mingw /mingw none bind
Start the Cygwin terminal and type the following commands to set up Cygwin for Windows compilation.
ln -s /usr/bin/i686-w64-mingw32-g++.exe /usr/i686-w64-mingw32/bin/g++.exe
ln -s /usr/bin/i686-w64-mingw32-gcc.exe /usr/i686-w64-mingw32/bin/gcc.exe
Also, set up some environment variables.
export CFLAGS="-march=pentium2 -mtune=i586 -mthreads -mms-bitfields -O2"
export CXXFLAGS="-march=pentium2 -mtune=i586 -mthreads -mms-bitfields -O2"
export CPPFLAGS="-I/mingw/include"
export LDFLAGS="-L/mingw/lib -Wl,--enable-auto-image-base -Wl,--enable-auto-import -Wl,--enable-runtime-pseudo-reloc"
export PATH=/mingw/bin:/usr/i686-w64-mingw32/bin:/usr/local/bin:/usr/bin
export PKG_CONFIG_PATH=/mingw/lib/pkgconfig
Setting Up gcc* Compiler for Cygwin
If you installed the gcc4 compiler (as opposed to mingw*), set up some environment variables to customize your build environment. I usually type the following commands:
CC="/usr/bin/gcc.exe"
CFLAGS="-march=pentium2 -mtune=i586 -mthreads -mms-bitfields -O2"
CPPFLAGS="-I/usr/include"
CXXFLAGS="-march=pentium2 -mtune=i586 -mthreads -mms-bitfields -O2"
LDFLAGS="-L/usr/lib -Wl,--enable-auto-image-base -Wl,--enable-auto-import -Wl,--enable-runtime-pseudo-reloc"
export CC CFLAGS CPPFLAGS CXXFLAGS LDFLAGS
Friday, August 31, 2012
To Create a Live Linux CD/DVD
A live CD is a bootable CD that contains the whole operating system and any applications you want to run from the CD. With the increasing popularity of DVD and Blu-ray drives, there is even a live DVD. A live CD is useful when you want to copy your existing Linux system to a CD and run it on multiple computers. In this post, I show how I normally create a live CD.
Rebuild a kernel with SquashFS and UnionFS patch
A new kernel should be built with SquashFS and UnionFS patches. The live CD will have a huge file that is actually a SquashFS image containing a copy of your existing Linux system. We will use UnionFS so that any changes to the read-only SquashFS will be saved to the volatile memory. Download the patches from the following locations.
After patching the kernel and rebuilding it, install the new kernel.
Make a SquashFS image of an existing Linux system
A SquashFS image needs to be created from an existing Linux system. Copy the contents of the Linux filesystem to an empty directory, assuming the filesystem is mounted at /mnt.
mkdir /tmp/livecd
cd /mnt
tar cf - . | (cd /tmp/livecd; tar xf -)
Empty the contents of fstab so that the live CD will not mount any hard disk partition, including the original root partition.
cp /dev/null /tmp/livecd/etc/fstab
Create a squashfs image.
mksquashfs /tmp/livecd /tmp/linuxfs.sqz -comp xz -b 262144 -Xdict-size 196608 -no-xattrs -e boot lost+found selinux srv
Create a Custom InitRamFS image
This is a tricky part of the job. Basically, the init script of the initramfs image will mount the CD-ROM, then mount the SquashFS image, and then mount a UnionFS. Refer to this post on building an initramfs image.
Create a Live CD structure.
Create an empty directory which will be the contents of live CD. The live CD will contain:
- SquashFS image (named linuxfs.sqz, for example)
- isolinux.bin and isolinux.cfg
- kernel
- initramfs image
Finally, create an ISO image for the live CD.
genisoimage -V LIVECD -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table /tmp/isofs > ~/livecd.iso
Burn the ISO image.
cdrskin -v dev=/dev/sr0 speed=8 driveropts=burnfree ~/livecd.iso
Tuesday, August 28, 2012
Manually Creating initrd / initramfs to Boot Linux
Initrd and initramfs files are used together with a Linux kernel and a bootloader (such as GRUB and syslinux) to start up Linux and boot it in many different ways. Many Linux distributions provide prepackaged kernels and convenient tools for creating initramfs, but I like to build my own kernel and initramfs because it allows me to customize the boot process. For instance, one can choose to boot from the local disk or network-mounted disk with the help of initramfs and some user-defined boot parameters. Here's a list of things that I'd like to achieve with my custom initramfs.
- Boot from a live CD
- Boot from a read-only filesystem image, compressed with SquashFS
- Copy the filesystem image to a RAM disk and run Linux entirely on memory
- Boot Linux from a USB flash drive or a Firewire disk
- Boot Linux from a local disk partition
- Boot Linux from a network drive
- Run a rescue shell without booting Linux
- Start a kdrive X-server and run gparted, partclone or partimage
In this post, I show how I normally create initrd / initramfs files. For this tutorial, the following Debian/Ubuntu packages are needed:
- busybox
provides small essential utilities for booting and rescue shell. - cpio
is used to create the actual initramfs format. - dash
provides a minimalist shell for running the init script and the rescue shell. - e2fsprogs, jfsutils, etc.
provides fsck to check Linux filesystems and replay any stale journal - lzma or xz-utils
compresses the initramfs - module-init-tools
is used to load kernel modules necessary to activate hardware and mount the filesystem - pciutils
is used to detect PCI hardware - unionfs-fuse
makes it possible to use read-only Linux systems, such as live CD and filesystem images - unzip
is used to apply customized settings and changes to the unionfs boot mode - v86d
is used to set the screen resolution for the framebuffer screen
First, create a text file with a list of files to put in initramfs. The following is an example of such file:
bin/busybox
bin/dash
bin/mount
etc/filesystems
etc/fuse.conf
etc/group
etc/modprobe.d
lib/ld-linux.so.2
lib/libacl.so.1
lib/libattr.so.1
lib/libblkid.so.1
lib/libbz2.so.1.0
lib/libcom_err.so.2
lib/libc.so.6
lib/libdl.so.2
lib/libe2p.so.2
lib/libext2fs.so.2
lib/libfuse.so.2
lib/libkmod.so.2
lib/libmount.so.1
lib/libm.so.6
lib/libpci.so.3
lib/libpthread.so.0
lib/libresolv.so.2
lib/librt.so.1
lib/libselinux.so.1
lib/libsepol.so.1
lib/libuuid.so.1
lib/libx86.so.1
lib/libz.so.1
lib/modules/3.5.3/kernel/drivers/ata
lib/modules/3.5.3/kernel/drivers/block/loop.ko
lib/modules/3.5.3/kernel/drivers/cdrom/cdrom.ko
lib/modules/3.5.3/kernel/drivers/connector/cn.ko
lib/modules/3.5.3/kernel/drivers/firewire/firewire-core.ko
lib/modules/3.5.3/kernel/drivers/firewire/firewire-ohci.ko
lib/modules/3.5.3/kernel/drivers/firewire/firewire-sbp2.ko
lib/modules/3.5.3/kernel/drivers/i2c/algos/i2c-algo-bit.ko
lib/modules/3.5.3/kernel/drivers/scsi/sd_mod.ko
lib/modules/3.5.3/kernel/drivers/scsi/sr_mod.ko
lib/modules/3.5.3/kernel/drivers/usb/host/ehci-hcd.ko
lib/modules/3.5.3/kernel/drivers/usb/host/ohci-hcd.ko
lib/modules/3.5.3/kernel/drivers/usb/host/uhci-hcd.ko
lib/modules/3.5.3/kernel/drivers/usb/storage/usb-storage.ko
lib/modules/3.5.3/kernel/drivers/video
lib/modules/3.5.3/kernel/fs/ext3/ext3.ko
lib/modules/3.5.3/kernel/fs/ext4/ext4.ko
lib/modules/3.5.3/kernel/fs/fat/fat.ko
lib/modules/3.5.3/kernel/fs/fat/vfat.ko
lib/modules/3.5.3/kernel/fs/fuse/fuse.ko
lib/modules/3.5.3/kernel/fs/isofs/isofs.ko
lib/modules/3.5.3/kernel/fs/jbd2/jbd2.ko
lib/modules/3.5.3/kernel/fs/jbd/jbd.ko
lib/modules/3.5.3/kernel/fs/jfs/jfs.ko
lib/modules/3.5.3/kernel/fs/nls/nls_cp437.ko
lib/modules/3.5.3/kernel/fs/nls/nls_iso8859-1.ko
lib/modules/3.5.3/kernel/fs/nls/nls_utf8.ko
lib/modules/3.5.3/kernel/fs/reiserfs/reiserfs.ko
lib/modules/3.5.3/kernel/fs/squashfs/squashfs.ko
lib/modules/3.5.3/kernel/fs/xfs/xfs.ko
lib/modules/3.5.3/kernel/lib/crc16.ko
lib/modules/3.5.3/kernel/lib/crc-t10dif.ko
lib/modules/3.5.3/modules.dep
lib/modules/3.5.3/modules.dep.bin
lib/modules/3.5.3/modules.pcimap
sbin/blkid
sbin/e2fsck
sbin/jfs_fsck
sbin/modprobe
sbin/v86d
usr/bin/pcimodules
usr/bin/unionfs-fuse
usr/bin/unzip
Then, create an empty directory, for example, /tmp/initrd and copy the files listed in the above-mentioned text file (called rd354.txt) to the new directory.
mkdir /tmp/initrd
cd /
tar cvhf - -T rd354.txt | (cd /tmp/initrd; tar xf -)
Then, create the necessary directory structure under /tmp/initrd:
cd /tmp/initrd
mkdir -p dev media mnt proc root sys tmp
Since I chose to use busybox, I need to create symbolic links to busybox in /bin. Busybox provides incomplete functionality for modprobe, mount, sh and unzip, so I removed their symbolic links.
cd /tmp/initrd/bin
for f in $(./busybox --list); do [ -e $f ] || ln -s busybox $f ; done
rm modprobe unzip
Then, create essential device nodes in /tmp/initrd/dev:
cd /tmp/initrd/dev
MAKEDEV std fb0 fd0 sda sdb scd
mknod console c 5 1
mknod fuse c 10 229
chmod 666 fuse
Now, create an init script. The contents of this init script is crucial for customization of the boot process. The following is the script I use. This script is capable of booting a live CD and running Linux within memory in addition to booting Linux from hard drives and USB flash.
#!/bin/dash
# Define a function to parse kernel command line options.
get_opt() {
echo $@ | cut -d "=" -f 2
}
# Define a function to load drivers.
loadmod() {
for i in $@ ; do
for j in $(grep $i /tmp/pcimodules.txt); do
modprobe $j
done
done
}
# Define a function to guess the partition type.
gpart() {
for i in $(blkid | grep $1); do
case $i in
*\=*)
eval $i
;;
*)
true
;;
esac
done
}
# Define a function for mounting the root partition.
mountr() {
if [ $uuid ]; then
if [ $# = 2 ]; then
mount -r -U $uuid $2
elif [ $# = 1 ]; then
mount -r -U $uuid $1
else mount -r -U $uuid /mnt
fi
elif [ $label ]; then
if [ $# = 2 ]; then
mount -r -L $label $2
elif [ $# = 1 ]; then
mount -r -L $label $1
else mount -r -L $label /mnt
fi
else
gpart $1
case $TYPE in
ext*)
e2fsck -p $1
[ $# = 2 ] && mount $1 $2 || mount $1 /mnt
;;
jfs)
jfs_fsck $1
if [ $# = 2 ]; then
mount -t jfs -o ro,iocharset=utf8 $1 $2
else mount -t jfs -o ro,iocharset=utf8 $1 /mnt
fi
;;
vfat)
if [ $# = 2 ]; then
mount -t vfat -o ro,gid=100,dmask=2,fmask=113 $1 $2
else mount -t vfat -o ro,gid=100,dmask=2,fmask=113 $1 /mnt
fi
;;
*)
[ $# = 2 ] && mount -r $1 $2 || mount -r $1 /mnt
;;
esac
fi
}
# Create a union filesystem
union() {
mount -t tmpfs none /opt/tmp
modinfo unionfs > /dev/null 2>&1 &&
mount -t unionfs -o dirs=/opt/tmp=rw:/opt=ro none /mnt ||
( mkdir /opt/tmp/.change
modprobe fuse
unionfs-fuse -o allow_other,use_ino,suid,dev,nonempty,kernel_cache \
-o cow,chroot=/opt,max_files=32768 /tmp/.change=RW:/=RO /mnt )
}
# Mount proc and sysfs.
mount -t proc none /proc
mount -t sysfs none /sys
# Find the available PCI hardware
mount -t tmpfs none /tmp
pcimodules > /tmp/pcimodules.txt
# Populate /dev (Needs kernel >= 2.6.32)
mount -t devtmpfs none /dev
mkdir -m 755 /dev/pts
mount -t devpts -o gid=5,mode=620 none /dev/pts
# Set default values
boot=ata
root=/dev/sda6
# Find the root=, label=, uuid= and boot= values on kernel command line.
for i in $(cat /proc/cmdline); do
case $i in
root\=*)
root=$(get_opt $i)
case $root in
/dev/cdr* | /dev/dvd* | /dev/sr* | /dev/scd*)
boot=cdrom
;;
0x200)
root=/dev/fd0
;;
esac
;;
label\=* | uuid\=* | boot\=* | vmode\=* )
eval $i
;;
single)
RUNLEVEL=single
;;
nox)
RUNLEVEL=2
;;
esac
done
# Activate framebuffer display devices.
if [ $vmode ]; then
if [ $boot = cdrom ]; then
modprobe uvesafb scroll=ywrap mode_option=$vmode-16
else for i in $(grep fb /tmp/pcimodules.txt); do
case $i in
atyfb)
modprobe $i mode=$vmode-16
;;
nvidiafb | rivafb)
modprobe nvidiafb mode_option=$vmode bpp=16 hwcur=1
;;
radeonfb | savagefb)
modprobe $i mode_option=$vmode-16
;;
sisfb)
modprobe $i mode=$vmodex16 mem=12288 font=SUN12x22
;;
viafb | vt8623fb)
modprobe viafb viafb_mode=$vmode viafb_bpp=16
;;
*)
modprobe $i
;;
esac
done
if grep -q i915 /tmp/pcimodules.txt; then true
else [ -c /dev/fb0 ] || modprobe uvesafb scroll=ywrap mode_option=$vmode-16
fi
fi
fi
case $boot in
cdrom)
# Boot Linux from a live CD.
loadmod ata_ ahci pdc_adma ^.hci-hcd
modprobe usb-storage &&
modprobe sr_mod &&
sleep 7
modprobe isofs
mount -t iso9660 /dev/sr0 /media
[ -d /media/isolinux -o -d /media/boot/isolinux ] ||
mount -t iso9660 /dev/sr1 /media
if [ -f /media/*.[Ss][Qq]* ]; then
SQF=$(ls -t /media/*.[Ss][Qq]* | head -n 1)
if [ $root = /dev/ram ]; then
echo "Please wait until the RAM disk is ready."
dd if=$SQF of=/dev/ram1 bs=2048 &&
mount -t squashfs /dev/ram1 /opt
else modprobe loop
mount -t squashfs -o loop $SQF /opt
fi
else
mount --move /media /opt
fi
union
;;
loop)
# Boot Linux from an image file.
loadmod ata_ ahci pdc_adma ^.hci-hcd
modprobe usb-storage &&
modprobe sd_mod &&
sleep 7
mountr $root /media
modprobe loop
if [ -f /media/*.[Ss][Qq]* ]; then
SQF=$(ls -t /media/*.[Ss][Qq]* | head -n 1)
mount -t squashfs -o loop $SQF /opt
elif [ -f /media/*.[Ii][Ss][Oo] ]; then
ISO=$(ls -t /media/*.[Ii][Ss][Oo] | head -n 1)
modprobe isofs
mount -t iso9660 -o loop $ISO /opt
fi
union
;;
ram)
# Boot Linux from ramdisk.
loadmod ata_ ahci pdc_adma ^.hci-hcd
modprobe usb-storage &&
modprobe sd_mod &&
sleep 7
mountr $root /media
echo "Please wait until the RAM disk is ready."
if [ -f /media/*.[Ss][Qq]* ]; then
SQF=$(ls -t /media/*.[Ss][Qq]* | head -n 1)
dd if=$SQF of=/dev/ram1 &&
mount -t squashfs /dev/ram1 /opt
elif [ -f /media/*.[Ii][Ss][Oo] ]; then
ISO=$(ls -t /media/*.[Ii][Ss][Oo] | head -n 1)
dd if=$ISO of=/dev/ram1 bs=2048 &&
modprobe isofs
mount -t iso9660 /dev/ram1 /opt
fi
union
;;
usb*)
# Boot Linux from a USB drive.
loadmod ^.hci-hcd
modprobe usb-storage &&
modprobe sd_mod &&
sleep 7
mountr $root
;;
ata*)
loadmod ata_ ahci pdc_adma &&
modprobe sd_mod &&
mountr $root
;;
esac
# Make sure that init exists and is executable.
if [ -x /mnt/sbin/init ]; then
mount --move /dev /mnt/dev
mount --move /proc /mnt/proc
mount --move /sys /mnt/sys
umount /tmp
# Start init from the root filesystem.
cd /mnt
[ -f /media/updates.zip ] && unzip -o /media/updates.zip
case $boot in
cdrom)
[ $root = /dev/ram ] && umount /media
[ $RUNLEVEL ] || RUNLEVEL=3
;;
loop | ram)
umount /media
[ $RUNLEVEL ] || RUNLEVEL=3
;;
*)
[ $RUNLEVEL ] || RUNLEVEL=5
;;
esac
[ -d initrd ] && pivot_root . initrd
exec chroot . /sbin/init $RUNLEVEL
fi
# Start a shell as a last resort.
echo "Error booting from the root filesystem. Starting a shell."
exec /bin/dash
Copy the init script to the initrd folder (Assuming its filename is init.sh).
cp init.sh /tmp/initrd/init
cp init.sh /tmp/initrd/etc
chmod 775 /tmp/initrd/init
Now, use cpio and lzma to create an initramfs file. This assumes that the kernel was compiled with CONFIG_RD_LZMA option enabled.
cd /tmp/initrd
find . | cpio -H newc -o | lzma -c > ../initram.lzm
A file named initram.lzm will be created. If you want to create an old-style initrd file instead, use the mkcramfs command. This assumes your kernel has built-in cramfs support (CONFIG_CRAMFS):
mkcramfs /tmp/initrd /boot/initrd.bin
Copy the kernel and the initramfs file to your boot directory (whereever it is). I use SYSLINUX which I installed at /dev/sda1 partition. Finally, edit the boot configuration file. The following is the contents of a sample syslinux.cfg:
LABEL debian
KERNEL 314.lnx
INITRD /initrd/initram.lzm
APPEND root=/dev/sda7
LABEL sid
KERNEL 314.lnx
INITRD /initrd/initram.lzm
APPEND boot=usb label=SID edd=off vmode=800x600
LABEL bfile
KERNEL 314.lnx
INITRD /initrd/initram.lzm
APPEND boot=loop root=/dev/sda1
LABEL ram
KERNEL 314.lnx
INITRD /initrd/initram.lzm
APPEND boot=ram ramdisk_size=524288 root=/dev/sda1
Friday, August 24, 2012
Getting Eclipse to Work with MinGW C/C++ Compilers
Eclipse is one of my favorite programming environment which is used to develop C, C++ and/or Java software efficiently. Let's set up Eclipse so that we can use it to work with MinGW C/C++ compiler and Java.
- First, install MinGW (as shown in this post). You have two choices for the MinGW compiler:
- MinGW (www.mingw.org)
The original GCC toolchain for 32-bit Windows only - MinGW-w64 (mingw-w64.sourceforge.net)
New breed of tools that allow you to compile for both 32-bit and 64-bit Windows
I prefer the original MinGW compiler to MinGW-w64, but individual tastes may vary. Make sure that you add the folder containing gcc.exe to the PATH environment variable.
- MinGW (www.mingw.org)
Then, install JRE because Eclipse won't run without it. If you want to develop Java, then install JDK (Java SE or Java EE) instead of JRE.
Now, download Eclipse IDE for C/C++ Developers (eclipse-cpp-juno-win32.zip) and unpack it. You need it to develop C/C++ programs.
If you also want to develop Java, then download Eclipse IDE for Java Developers (eclipse-java-juno-win32.zip). Just unpack the Java Developer package into the same folder as Eclipse for C/C++, avoiding to overwrite existing files.
Create a shortcut on your desktop that points to the Eclipse program (eclipse.exe). To start Eclipse, double-click the Eclipse shortcut that you just created.
Let's test our Eclipse installation and create a simple C++ program. Start a new C++ project (File->New->C++ Project). Type in any Project name, and select Empty Project under Executable Project types. Choose MinGW GCC for toolchains. Click Finish.

Once a new C++ project is open, create a new source file (File->New->Source File).

Try typing in a simple code like the following:
#include <iostream>
using namespace std;
int main()
{
cout << "Hello, boys and girls.\n";
return 0;
}Save the project (File->Save). Build the project (Project->Build Project). If the build was successful, run the generated program (Run->Run, or Ctrl+F11).
Thursday, August 23, 2012
MinGW: Compiling LZO Compression Library
LZO, short for Lempel-Ziv-Oberhumer, is compression software that is designed for decompression speed. I compiled the LZO library like this.
tar xzvf lzo-2.03.tar.gz
cd lzo-2.03/
./configure --prefix=/mingw
make
make install
I only got a static library liblzo2.a. So I had to convert it to a DLL.
gcc -shared -o liblzo2-2.dll -Wl,--out-implib,liblzo2.dll.a -Wl,--whole-archive /mingw/lib/liblzo2.a -Wl,--no-whole-archive -L/mingw/lib -lwinmm
Compiling gtkmm for Windows with MinGW
gtkmm is a C++ wrapper library that makes it possible to write C++ programs with GTK+. After compiling the GTK+ library, you can build gtkmm as follows.
libsigc++ 2.2.10
libsigc++ implements a typesafe callback system for standard C++. Download the libsigc++ source code from here and compile it:
./configure --prefix=/mingw
make
make installglibmm 2.32.1
glibmm is a C++ wrapper for Glib. Compile it like this:
./configure --prefix=/mingw
make
make installatkmm 2.22.6
atkmm is a C++ wrapper for ATK. Compile it like this:
./configure --prefix=/mingw
make
make installcairomm 1.10.0
cairomm provides C++ interface to the Cairo library. Compile it like this:
./configure --prefix=/mingw
make
make installpangomm 2.28.4
pangomm is a C++ wrapper for Pango. Compile it like this:
./configure --prefix=/mingw
make
make installgtkmm 3.4.0
gtkmm is a C++ wrapper for GTK+. Build it as follows:
./configure --prefix=/mingw
make
make install
Friday, August 17, 2012
Building GraphicsMagick
GraphicsMagick is a powerful tool for processing image files. I'm using MinGW to build GraphicsMagick for Windows.
zlib 1.2.7
Download the zlib source (zlib-1.2.7.tar.gz) and unpack it.
tar xzvf zlib-1.2.7.tar.gz
cd zlib-1.2.7Compile and install zlib.
make -f win32/Makefile.gcc
cp -iv zlib1.dll /mingw/bin
cp -iv zconf.h zlib.h /mingw/include
cp -iv libz.a /mingw/lib
cp -iv libz.dll.a /mingw/libbzip2
Now download bzip2 source from bzip.org and unpack it.
tar xzvf bzip2-1.0.6.tar.gz
cd bzip2-1.0.6Change line 78 of bzlib.h to read:
#if defined(_WIN32) && !defined(__MINGW32__)
Compile and install bzip2.
make
cp bzlib.h /mingw/include/
cp libbz2.a /mingw/libliblzma
Get the XZ Utils source code and unpack it. Go to the src/liblzma folder and compile liblzma like this:
tar xzvf xz-5.0.4.tar.gz
cd xz-5.0.4
./configure --prefix=/mingw
cd src/liblzma
make
make installlibpng 1.5.12 and libjpeg 8d
Compile libpng and libjpeg as follows:
./configure --prefix=/mingw
make
make installlibjasper
Compile Jasper:
./configure --prefix=/mingw
make
make installIf you encounter an error "undefined reference to _sleep", replace sleep() with _sleep with a factor of 1000 in the code:
_sleep(1000)
JBig
Get jbigkit from here.
make
cp libjbig/*.h /mingw/include
cp libjbig/*.a /mingw/liblibtiff 4.0.2
Compile libtiff like this:
./configure --prefix=/mingw
make
make installIf the shared library libtiff-5.dll is not generated and you want to create it manually, use such a command as the following and update libtiff.la accordingly:
gcc -shared -o libtiff-5.dll -Wl,--out-implib,libtiff.dll.a -Wl,--whole-archive /mingw/lib/libtiff.a -Wl,--no-whole-archive -L/mingw/lib -ljpeg -ljbig -llzma -lz
freetype
Compile freetype:
./configure --prefix=/mingw
make
make installlibxml2
Compile libxml2:
./configure --prefix=/mingw
make
make installlibwmf 0.2.8.4
Compile libwmf:
./configure --prefix=/mingw
make
make installLittle CMS
Compile liblcms:
./configure --prefix=/mingw
make
make installBuild GraphicsMagick
Get GraphicsMagick code and build it like this:
./configure --prefix=/mingw --with-gs-font-dir='C:/Windows/Fonts' --with-windows-font-dir='C:/Windows/Fonts' LIBS='-ljbig'
make
make install
Creating a PDF document from JPEG files
GraphicsMagick comes in handy when you want to convert scanned JPEG images to a PDF document:
gm convert *.jpg doc.pdf
Monday, February 20, 2012
HSQLDB Installation and Usage
HSQLDB Installation
I downloaded the HyperSQL package (hsqldb-2.2.8.zip) and extracted its contents into the "C:\Program Files\hsqldb" folder.
Starting an HSQLDB Server
The following example command starts the HyperSQL server with one database called "mydb" and the public name of "xdb". The public name hides the file names from users.
java -cp ../lib/hsqldb.jar org.hsqldb.server.Server --database.0 file:mydb --dbname.0 xdb
If the files named "mydb.*" do not already exist, they will be created. This way you can start the HSQLDB server and create a new database at the same time.
If the computer hosting the database server is restricted to the HTTP protocol by a firewall, use the HyperSQL HTTP Server.
java -cp ../lib/hsqldb.jar org.hsqldb.server.WebServer --database.0 file:mydb --dbname.0 xdb
When a HyperSQL server is running, client programs can connect to it using the HSQLDB JDBC Driver contained in hsqldb.jar.
Running Database Access Tools
HyperSQL includes the Database Manager JDBC frontend to connect to a HSQLDB server, query and modify tables.
java -cp ../lib/hsqldb.jar org.hsqldb.util.DatabaseManagerSwing
At the Connect dialog, enter the information necessary for connecting to the database.
SQL Commands
After I started the Database Manager using the command above, I entered the following SQL commands to create tables for MyBooks database.
CREATE CACHED TABLE Publishers (pnum INTEGER NOT NULL PRIMARY KEY, publisher VARCHAR(50) NOT NULL, parent VARCHAR(50));
CREATE CACHED TABLE Authors (anum BIGINT NOT NULL PRIMARY KEY, author
VARCHAR(50) NOT NULL, lastname VARCHAR(25), aka VARCHAR(50));
CREATE CACHED TABLE Books (index VARCHAR_IGNORECASE(20) NOT NULL PRIMARY KEY, title VARCHAR(50) NOT NULL, edition TINYINT, pubdate DATE NOT NULL, author VARCHAR(64) NOT NULL, anum BIGINT NOT NULL REFERENCES Authors, pnum INTEGER NOT NULL REFERENCES Publishers, pages SMALLINT, format VARCHAR_IGNORECASE(20), isbn13 CHAR(13), isbn10 CHAR(10));
CREATE CACHED TABLE Keywords (index VARCHAR_IGNORECASE(20) NOT NULL PRIMARY KEY REFERENCES Books, genre1 VARCHAR_IGNORECASE(25), genre2
VARCHAR_IGNORECASE(25), subject1 VARCHAR_IGNORECASE(36), subject2
VARCHAR_IGNORECASE(36), subject3 VARCHAR_IGNORECASE(36), keyword1
VARCHAR_IGNORECASE(25), keyword2 VARCHAR_IGNORECASE(25), keyword3
VARCHAR_IGNORECASE(25));
When you finish using the Database Manager, make sure that you properly shut down the database.
SHUTDOWN: To save changes and close the database.
SHUTDOWN COMPACT: To save the database in the minimal size and close it. Should be used periodically.
Using OpenOffice.org Base to Work with HSQLDB Server
You can use OpenOffice.org Base to work with a server-based HyperSQL database. First, you need to set up OpenOffice.org so that it can use the HyperSQL JDBC driver. Select Tools > Options > Java and click Class Path.
Click the Add Archive... button and enter the path to the hsqldb.jar file. Click OK to save the changes and restart OpenOffice.org Base. Make sure that you also close the OpenOffice.org Quickstart in the notification area of the taskbar. At the Database wizard, choose JDBC to connect to an existing database, and enter org.hsqldb.jdbc.JDBCDriver for the JDBC driver class.
Enter SA as username. Password is not required.
Thursday, January 5, 2012
Setting Up Filezilla FTP Server In Windows 7
The Windows operating system has built-in features that allow you to share documents, photos, music and video with other Windows users in the local network. However, users of Linux or another non-Windows OS may have a hard time trying to access shared resources on Windows computers. Setting up an FTP server on a Windows machine can solve such interoperability issues in sharing files between different types of computers.
FileZilla Server is a free, fast and powerful FTP server for Windows. By default, the FileZilla server starts automatically with Windows, and the admin port is 14147.

I don't like to see the admin interface started at every login.

You should define some ports for passive mode.

I like to enable TLS/SSL for added security in FTP transfers.

I created a group called users.

Then, I created a user for myself.

You should create a new rule for FileZilla in Windows Firewall.

In the new inbound rule wizard, select the following settings.
- What type of rule would you like to create? Port
- Does this rule apply to TCP or UDP? TCP
- Does this rule apply to all local ports or specific local ports? 21, 990, 2100-2121
- What action should be taken when a connection matches specific conditions? Allow the connection
- Name: FTP connections
Sunday, January 1, 2012
Open-Source Database Servers
I've been thinking about installing an open-source database server for personal and commercial uses. My choices were limited as shown below.
Monday, December 26, 2011
Compiling MLDonkey for Windows
- Cygwin Setup
First, install Cygwin using the Cygwin installer(setup.exe). I set the Root directory toC:\Cygwinand chose to install the following packages in addition to base packages.- bison
- gettext-devel
- libtool
- make
- mingw64-i686-binutils
- mingw64-i686-gcc-core
- mingw64-i686-gcc-fortran
- mingw64-i686-gcc-g++
- patch
- pkg-config
- bison
- Compile zlib and bzip2
Download the zlib source (zlib-1.2.7.tar.gz) and unpack it.tar xzvf zlib-1.2.7.tar.gz
cd zlib-1.2.7
Compile and install zlib.make -f win32/Makefile.gcc
cp -iv zlib1.dll /mingw/bin
cp -iv zconf.h zlib.h /mingw/include
cp -iv libz.a /mingw/lib
cp -iv libz.dll.a /mingw/lib
Now download bzip2 source from bzip2.org and unpack it.tar xzvf bzip2-1.0.6.tar.gz
cd bzip2-1.0.6
Change line 78 of bzlib.h to read:#if defined(_WIN32) && !defined(__MINGW32__)
Compile and install bzip2.make
cp bzlib.h /mingw/include/
cp libbz2.a /mingw/lib - libiconv
Download and compile libiconv:tar xzvf libiconv-1.14.tar.gz
cd libiconv-1.14
./configure --build=i686-w64-mingw32 --prefix=/mingw --enable-static
make
make install - JPEG, PNG & Freetype
Compile JPEG, libPNG and Freetype in the following way:./configure --build=i686-w64-mingw32 --prefix=/mingw
make
make install - GD Graphics Library
Now get the libgd source, unpack and configure:./configure --build=i686-w64-mingw32 --prefix=/mingw LIBS="-lbz2 -ljpeg -lws2_32 -liconv"
Once Makefile is generated, change line 233 to read:
DEFS = -DHAVE_CONFIG_H -DBGDWIN32
Also fix gd.h near line 25:--- ./gd.h Sat Oct 30 12:54:58 2004
+++ ./gd.h Sun Jan 05 17:56:09 2006
@@ -24,7 +24,7 @@
#endif /* WIN32 */
#ifdef NONDLL
-#define BGD_DECLARE(rt) extern rt
+#define BGD_DECLARE(rt) extern rt _stdcall
#else
#ifdef BGDWIN32
#define BGD_DECLARE(rt) __declspec(dllexport) rt __stdcall
Then, build and install gdlib:make install
To create a DLL file called libgd-2.dll, run the following commands:
mkdir /tmp/gdlib
cd /tmp/gdlib
ar x /mingw/lib/libgd.a
gcc -shared -o /mingw/bin/libgd-2.dll -Wl,--out-implib,libgd.dll.a *.o -L/mingw/lib -lz -lbz2 -ljpeg -lpng -liconv -lfreetype - wget
Build wget as shown in this post. If you don't want to compile wget yourself, get the executable (wget.exe) somewhere, and put it in the same folder as mlnet.exe later. - regex and libmagic
Download regex-0.12.tar.gz and compile regex as required by libmagic.
gcc -DSTDC_HEADERS -DHAVE_STRING_H=1 -I. -c regex.c
ar ru libregex.a regex.o
cp -iv libregex.a /mingw/lib
cp -iv libregex.a /mingw/lib/libgnurx.a
cp -iv regex.h /mingw/includeGet the source tarball of open-source file command. Configure as follows:
./configure --build=i686-w64-mingw32 --prefix=/mingw
Open config.h and add the following lines:
#define WIN32 1
#define MAGIC "magic"Then compile:
make && make install
- OCaml
You need flexdll (flexdll-0.27.zip) to build OCaml. Extract it to /mingw/bin. Then, download the latest OCaml source (3.12.1). Patch ocaml with this Unicode patch.tar xzvf ocaml-3.12.1.tar.gz
cd ocaml-3.12.1
patch -p1 -l < ../ocaml-3.12.1-unicode.patchIn the
configsubfolder, copy Makefile.mingw to Makefile.cp config/m-nt.h config/m.h
cp config/s-nt.h config/s.h
cp config/Makefile.mingw config/Makefile
Begin compiling OCaml.make -f Makefile.nt world
make -f Makefile.nt opt
make -f Makefile.nt opt.opt
make -f Makefile.nt install
Set up OCaml environment variables:export CAMLLIB=/mingw/lib
export OCAMLLIB=/mingw/lib
export CAMLP4LIB=/mingw/lib/camlp4 - Build MLDonkey
Get the MLDonkey source, then unpack and configure it.tar xjvf mldonkey-3.1.0.tar.bz2
cd mldonkey-3.1.0
./configure --build=i686-w64-mingw32 --prefix=/mingw --disable-fasttrackTo link with the static GD library, append
-DNONDLLto the CPPFLAG line of config/Makefile.configCPPFLAGS=-I/mingw/include -DNONDLL
Start compilation.export OCAML_SRC=~/ocaml-3.12.1
cp -iv /mingw/lib/stublibs/dllunix.dll .
make depend
make mlnet.static
strip mlnet.static
mv mlnet.static mlnet.exe
If the final linking stage fails, here is the command I used to produce mlnet.exe:g++ -g0 -O3 -o mlnet.exe -Wl,--subsystem,windows -L/lib/gcc/i686-w64-mingw32/4.5.3 -L/mingw/lib /tmp/camlstartup00193d.s build/flexdll_mingw.o /mingw/lib/std_exit.o src/daemon/common/commonMain.o build/driver.a build/core.a build/client.a build/common.a build/magic.a build/bitstring.a build/cdk.a build/extlib.a /mingw/lib/nums.a /mingw/lib/str.a /mingw/lib/unix.a /mingw/lib/bigarray.a /mingw/lib/stdlib.a src/utils/cdk/gdstubs.o src/networks/direct_connect/che3_c.o src/utils/lib/CryptoPP.o src/utils/lib/CryptoPP_stubs.o src/utils/net/upnp_stubs.o src/daemon/common/commonHasher_c.o src/utils/lib/magiclib_stub.o src/utils/bitstring/bitstring_c.o src/utils/cdk/zlibstubs.o src/utils/cdk/heap_c.o src/config/mingw/os_stubs_c.o src/utils/lib/fst_hash.o src/utils/lib/md4_comp.o src/utils/lib/md4_c.o src/utils/lib/charsetstubs.o src/utils/lib/md5_c.o src/utils/lib/sha1_c.o src/utils/lib/tiger.o src/utils/lib/stubs_c.o -lnums -lcamlstr -lunix -lbigarray -lgdi32 -luser32 -ladvapi32 -limm32 -lshell32 -lole32 resfile.o -lpthread -lmagic -lgd -ljpeg -lfreetype -lpng -lz -lbz2 -lws2_32 -lshlwapi /mingw/lib/libasmrun.a /mingw/lib/libcharset.dll.a /mingw/lib/libiconv.dll.a
Optonally, compress the executable with upx.upx --best --strip-relocs=0 mlnet.exe
Open the file
C:\Cygwin\etc\fstab in a text editor and append the following line./usr/i686-w64-mingw32/sys-root/mingw /mingw none bind
Set the HOME variable.
Start the Cygwin terminal and type the following commands to set up Cygwin for Windows compilation.
cp /usr/bin/i686-w64-mingw32-g++.exe /usr/i686-w64-mingw32/bin/g++.exe
cp /usr/bin/i686-w64-mingw32-gcc.exe /usr/i686-w64-mingw32/bin/gcc.exe
cp /usr/bin/i686-w64-mingw32-cpp.exe /usr/i686-w64-mingw32/bin/cpp.exe
export PATH=/mingw/bin:/usr/i686-w64-mingw32/bin:/usr/local/bin:/usr/bin:/usr/lib/gcc/i686-w64-mingw32/4.5.3
export CC=/usr/bin/i686-w64-mingw32-gcc.exe
export PKG_CONFIG_PATH=/mingw/lib/pkgconfig
Here's my mldonkey builds.
Tuesday, December 20, 2011
To build wget.exe with MinGW
wget is a useful command-line downloader. To build wget for the Windows platform, first install MinGW. Then, compile zlib, openssl and wget in that order. To compile zlib:
make -f win32/Makefile.gcc
cp -iv zlib1.dll /mingw/bin
cp -iv zconf.h zlib.h /mingw/include
cp -iv libz.a /mingw/lib
cp -iv libz.dll.a /mingw/lib
To compile openssl:
./Configure -DHAVE_STRUCT_TIMESPEC -DPTW32_STATIC_LIB -L/mingw/lib -lz -lpthreadGC2 -lws2_32 --prefix=/mingw threads zlib mingw
make
make test
make install
Now, build wget
./configure --prefix=/mingw --enable-threads=win32 --disable-nls --with-ssl=openssl
make
make install
Monday, October 17, 2011
Compiling Zip and Unzip with MinGW
The current version of zip supports higher compression with the bzip2 method. To build zip with bzip2 compression using MinGW, first prepare the bzip2 library:
tar xzvf bzip2-1.0.6.tar.gz
cd bzip2-1.0.6
make
cp bzlib.h /mingw/include/
cp libbz2.a /mingw/lib
Then, get the zip source. Use the LOCAL_ZIP environment variable to configure zip.
export LOCAL_ZIP='-DLARGE_FILE_SUPPORT -DZIP64_SUPPORT -DUNICODE_SUPPORT -DBZIP2_SUPPORT -DALLOW_REGEX
Edit the LIBS line in the file makefile.gcc in the win32 folder to link zip with bzip2 library
LIBS=-luser32 -ladvapi32 -lbz2
Compile zip.
make -f win32/makefile.gcc
You'll find zip.exe in the source folder.
Compiling Unzip with MinGW
Unzip is a command-line extraction tool for .zip archives. In order to be able to unpack bzipped .ZIP archive, I need to compile unzip with bzip2 support. After compiling bzip2 as above, I downloaded unzip60.tar.gz from Info-Zip project at Sourceforge and unpacked it.
tar xzvf unzip60.tar.gz
cd unzip60
I fixed the file win32/Makefile.gcc in the section following "# optional inclusion of bzip2 decompression"
INC_BZ2LIB = -I/mingw/include
LOCFLAGS = -I/mingw/include -DUSE_BZIP2
LD_BZ2LIB = -L/mingw/lib -lbz2
LIBBZIP2 = /mingw/lib/libbz2.a
Then, I compiled Unzip like this:
make -f win32/Makefile.gcc
ls -l *.exe
Three executables unzip.exe, unzipsfx.exe and funzip.exe are created. Copy them to a folder in your path or /bin.
cp -iv *.exe /C/Windows
Usage Examples
To back up a folder:
zip -Z bzip2 -b C:\Windows\Temp -SDurX backup.zip *
Thursday, August 18, 2011
Logging Into Linux Desktop with Xming, Xnest and Putty
I use Xming and Putty to remotely log into my Linux desktop over a secure connection. Since I use xdm for the X11 login screen, I had to set up xdm for remote login. I made sure /etc/X11/xdm/xdm-config had this setting:
DisplayManager.requestPort: 117
I changed /etc/X11/xdm/Xaccess to allow any connection:
echo "*" > /etc/X11/xdm/Xaccess
I installed xnest on the Linux machine.
On Windows, install xming and X11 fonts. Start the Xming server.
Xming.exe :16 -clipboard -multiwindow -nolisten inet6
Then, start putty, enable X11 port forwarding and connect to the Linux box. Once you are logged into the remote terminal, start Xnest:
Xnest :16 -ac -geometry 960x720 -once -query 127.0.0.1
A window will pop up showing your lovely Linux destkop. Now, enjoy your Linux applications on Windows.






