Writing Free Software – Part 3: Command line options


In this installment, we will look at parsing command-line options. We’re going to use Jon Pryor‘s NDesk.Options library. Since he has not made a .deb package yet, we’ll use curl to integrate NDesk.Options.cs into our codebase.

Get back to our workspace

$ cd ~/src/greeting

Get curl

$ sudo apt-get install curl

Pull down a copy of NDesk.Options

$ curl "http://git.ndesk.org/?p=ndesk-options;a=blob_plain;f=src/NDesk.Options/NDesk.Options/Options.cs;hb=c52aa20569b49b620deb0fd28b19909b7c577d47" > NDesk.Options.cs

Update our Makefile

Updates are bolded below.

$ cat > Makefile
# the first target is the one executed when no target is named
all: Greeting.exe
#don't do anything

# running 'make clean' will execute this target
        rm Greeting.exe

# running 'make Greeting.exe' will execute this target
Greeting.exe: Greeting.cs NDesk.Options.cs
# the same as gmcs -out:Greeting.exe Greeting.cs NDesk.Options.cs
        gmcs -out:$@ $^

Update our C# code

Updates are bolded below.

$ cat > Greeting.cs
using System;        // This brings in Console.Writeline, used below
using NDesk.Options; // This brings in the options parser used below

class Greeting {
  private static string [] planet =
    { "World", "Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn",
      "Uranus", "Neptune", "Pluto" };

  // This is the program entry point
  public static int Main( string [] argv ){

    // default to "World"
    int planetNum = 0;

    // set up an option parser
    var p = new OptionSet () {
        { "n|number=",  "The planet number to greet",
          (int v) => planetNum = (v < planet.Length ? v : 0) }
    p.Parse (argv);

    // A simple operation to confirm that our app is running:
    Console.WriteLine("Greetings, {0}!", planet[planetNum]); 

    // Well-behaved software returns an int from Main
    return 0;


$ make

Run it a few times

$ ./Greeting.exe
Greetings, World!
$ ./Greeting.exe –n 1
Greetings, Mercury!
$ ./Greeting.exe ––number 2
Greetings, Venus!
$ ./Greeting.exe ––number 10
Greetings, World!
$ ./Greeting.exe –n 99
Greetings, World!


That about wraps up sending command line arguments to the application. Thanks to Jon for providing support for NDesk on #mono. You’re right. I should read your docs instead of bothering you!

We now have a bit more complication in our build system and have something we can re-factor a bit. In the next article, we’ll start to make use of some of the autotools bits.

, , , , , , ,

Leave a Reply