Building a hello world application
From Openmoko
Contents |
Preparation
This guide assumes that you have performed the steps in Building_OpenMoko_from_scratch
The commandline program
Store the following more or less standard hello world code in hello.c
#include <stdio.h> int main() { printf ("Hello World\n"); return 0; }
Compiling it the wrong / easy way
Assuming your current working directory is /home/moko, and that you stored the code in /home/moko/hello.c it should now be possible to compile the application using
./build/tmp/cross/arm-linux/bin/gcc -o hello hello.c
Testing it
Assuming you have followed Setting up USB connection and you have a working network connection to either a qemu Neo or a real Neo.
scp hello root@192.168.0.202:/tmp/ ssh root@192.168.0.202 /tmp/hello
This sequence of commands ought to give you a nice Hello World, btw. the default root password is blank, just press return.
GDK the Wrong / Easy Way
Building a GDK application the wrong way is slightly more complex, but is still fun to try. It requires using pkg-config to specify including and linking with the ARM header files and libraries.
Given the following program as main.c:
#include <gtk/gtk.h> gchar *hello = "Howdy"; gchar *world = "World"; GtkWidget *label; gchar *labeltext; void buttoncb(GtkWidget *widget, gpointer data) { if (labeltext == hello) { labeltext = world; gtk_label_set_text(GTK_LABEL(label), labeltext); } else if (labeltext == world) gtk_main_quit(); } int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *button; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); button = gtk_button_new(); labeltext = hello; label = gtk_label_new(labeltext); gtk_container_add(GTK_CONTAINER(button), label); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(buttoncb), NULL); gtk_container_add(GTK_CONTAINER(window), button); gtk_widget_show_all(window); gtk_main(); return 0; }
You must first point pkg-config to the proper directory:
export PKG_CONFIG_PATH=/home/username/moko/build/tmp/staging/arm-linux/lib/pkgconfig
And set up an environment variable to make things easier:
export OMDIR=/home/username/moko
The compile/link line is rather long - you will only want to do this once before you decide to create a shell script or make file:
$OMDIR/build/tmp/cross/arm-angstrom-linux-gnueabi/bin/gcc -L $OMDIR/build/tmp/staging/arm-angstrom-linux-gnueabi/lib/ \ -Wl, rpath-link, $OMDIR/build/tmp/staging/arm-angstrom-linux-gnueabi/lib/ -Wl, -O1 -g -o hw main.c \ '$OMDIR/build/tmp/staging/i686-linux/bin/pkg-config --cflags --libs openmoko-libs gtk+-2.0'
Then copy and run as in the original hello world command line program above.
Why was it the wrong way?
OpenMoko provides a precompiled Toolchain package for that. It also comes with some scripts that make your life much easier. Besides, you don't need OpenEmbedded to build applications. If you do want to customize your complete distribution, then read on how to use bitbake when building stuff. In any way, at least you now know that you can easily cross compile for OpenMoko.
The Right Way: Using the gnome build system
Even if I am no expert in this - somebody had to make a start so I'll write down everything I still believe to remember from my 1st 'real' gnome application that used the autotools and all: I have never been able to find a good tutorial for making a "canonical" gnome application - and such a tutorial is urgently needed.
Since I know that many of these things will be missing or even inaccurate in the 1st step - if You find out to make it work better or at all - please document how to do this.
Creating the necessary documentation files and directory structure
First of all go into the directory you want to be the topmost application of yout new application, and create the following files:
I remember that some of these files were mandatory - it's better create them all
Then create a directory named 'src - and copy the source code of the program there.
The configuration of the autotools
autogen.sh
This file is a shell script that calls all autotools in the right order and with the right parameters so they will in the end generate the standard configure script that will detect how to build our program.
As you can see all of the following examples these files are taken from audiorec. Feel free to change PKG_NAME to something more accurate for your application.
#! /bin/sh # # Most if not all of the contents of this file was taken from the openmoko # sample application as it was shipped with the openmoko toolchain on # January 31st, 2008 # srcdir=`dirname $0` test -z "$srcdir" && srcdir=. PKG_NAME="audiorec" (test -f $srcdir/configure.ac) || { echo -n "**Error**: Directory "\`$srcdir\'" does not look like the" echo " top-level $PKG_NAME directory" exit 1 } which gnome-autogen.sh || { echo "You need to install gnome-common from the GNOME CVS" exit 1 } REQUIRED_AUTOMAKE_VERSION=1.7 USE_GNOME2_MACROS=0 REQUIRED_GETTEXT_VERSION=0.10.36 . gnome-autogen.sh
Languages: |
English • العربية • Български • Česky • Dansk • Deutsch • Esperanto • Eesti • Español • فارسی • Suomi • Français • עברית • Magyar • Italiano • 한국어 • Nederlands • Norsk (bokmål) • Polski • Português • Română • Русский • Svenska • Slovenčina • Українська • 中文(中国大陆) • 中文(台灣) • Euskara • Català |