From 7fce74e667c2849f2d699e6bc9e7f5c86e2ba28f Mon Sep 17 00:00:00 2001 From: heinzel Date: Mon, 26 Nov 2007 23:37:48 +0000 Subject: [PATCH] Added my own implementation of "Hello world" as an example. --- COPYING | 1 + INSTALL | 13 +++ Makefile | 5 + Makefile.dist | 5 + Makefile.in | 72 ++++++++++++ README | 48 ++++++++ configure | 291 +++++++++++++++++++++++++++++++++++++++++++++++ configure.files | 1 + configure.macros | 35 ++++++ hello.1 | 26 +++++ hello.c | 12 ++ 11 files changed, 509 insertions(+) create mode 100644 COPYING create mode 100644 INSTALL create mode 100644 Makefile create mode 100644 Makefile.dist create mode 100644 Makefile.in create mode 100644 README create mode 100755 configure create mode 100644 configure.files create mode 100644 configure.macros create mode 100644 hello.1 create mode 100644 hello.c diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..ebe4fc5 --- /dev/null +++ b/COPYING @@ -0,0 +1 @@ +This is public domain, I think. diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..c3e444b --- /dev/null +++ b/INSTALL @@ -0,0 +1,13 @@ +To build hello, run the following commands: +./configure +make + +To build a static binary, run: +./configure --static +make + +To install the binary and the man page, run: +make install + +To only install the binary, run: +make install-bin diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4ec4489 --- /dev/null +++ b/Makefile @@ -0,0 +1,5 @@ +help: + @echo "Run ./configure first!" + @echo "Or even better: take a look at the file README." +install: help +all: help diff --git a/Makefile.dist b/Makefile.dist new file mode 100644 index 0000000..4ec4489 --- /dev/null +++ b/Makefile.dist @@ -0,0 +1,5 @@ +help: + @echo "Run ./configure first!" + @echo "Or even better: take a look at the file README." +install: help +all: help diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..5eb08dc --- /dev/null +++ b/Makefile.in @@ -0,0 +1,72 @@ +# @Makefile.in@ + +PREFIX := @PREFIX@ +BINDIR := @BINDIR@ +MAN1DIR := @MAN1DIR@ + +MAIN := hello +OBJS := hello.o +#LIBS := +MAN1 := hello.1 + +MANGZ := @MANGZ@ +ifeq ($(MANGZ), 1) + MAN1 := $(addsuffix .gz, $(MAN1)) +endif + +CC := @CC@ +CP := @CP@ +GZIP := @GZIP@ +INSTALL := @INSTALL@ +RM := @RM@ +STRIP := @STRIP@ +TAR := @TAR@ + +.PHONY: help strip install install-bin install-man install-man1 uninstall \ + clean distclean mrproper dist +.DEFAULT: $(MAIN) + +$(MAIN): $(OBJS) +ifeq (@STATIC@, 1) + $(CC) --static -g -o $(MAIN) $(LIBS) $(OBJS) +else + $(CC) -g -o $(MAIN) $(LIBS) $(OBJS) +endif + +%.o : %.c + $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@ + +help: + @echo "There is no help." + +strip: $(MAIN) + $(STRIP) $(MAIN) + +install: install-bin install-man + +install-bin: strip + $(INSTALL) $(MAIN) $(BINDIR) + +install-man: install-man1 + +install-man1: $(MAN1) + $(INSTALL) $^ $(MAN1DIR) + +%.gz : % + $(GZIP) -c $< > $@ + +uninstall: + -$(RM) $(BINDIR)/$(MAIN) + cd $(MAN1DIR) ; -$(RM) $(MAN1) + +clean: + $(RM) -f *.o $(MAIN) + +distclean: clean + $(CP) Makefile.dist Makefile +mrproper: distclean + +dist: distclean + cd .. ; $(TAR) -czf $(notdir $(PWD)).tar.gz $(notdir $(PWD)) + +#end diff --git a/README b/README new file mode 100644 index 0000000..e85f446 --- /dev/null +++ b/README @@ -0,0 +1,48 @@ +Hello World. + +ABOUT +===== + +hello is the famous example application implemented in C. + +But this package not only provides this marvellous program including its +documentation. Also there comes a configure script and a sample makefile +with it. + +The configure script ('configure' plus its own two configuration files +'configure.files' and 'configure.macros') is capable to read in the makefile +template 'Makefile.in' to produce the real makefile 'Makefile'. + +Together with the standard unix tool 'make' the makefile can assist you to +- compile the hello source code ('hello.c') into a binary ('hello') +- install the binary onto your system +- install the manual page of hello ('hello.1') onto your system +- proceed the development of hello + + +INSTALL +======= +For information about building and installing hello, see the file INSTALL. + + +DEPENDENCIES +============ + +Dependencies to build hello: +- a C library (tested with GNU C library glibc-2.6.1) + If not building a static binary, only the headers are needed. +- a C compiler and linker (tested with GNU Compiler Collection gcc-4.1.2) +- a make tool (tested with GNU Make 3.81) +- a bourne compatible shell (tested with bash 3.2) +- some other tools, used by the configure script: + cut, expr, grep, mktemp, rm, sed, tr +- some other tools, used by the makefile: + cp, gzip, install, rm, strip, tar + +Dependencies to use hello: +- a C library (tested with GNU C library glibc-2.6.1) + If compiled a static binary, the C library is not needed at run time. + +Dependecies to use the hello documentation: +- a man page viewer + diff --git a/configure b/configure new file mode 100755 index 0000000..1a83353 --- /dev/null +++ b/configure @@ -0,0 +1,291 @@ +#!/bin/sh +# +# configure +# +# A simple script to configure Makefiles +# (i.e. read Makefile.in, replace strings and write Makefile). +# +# heinzel +# +# $Id: configure,v 1.1 2007/11/26 23:37:48 heinzel Exp $ +# +VERSION='configure Version 0.1 $Revision: 1.1 $ ($Date: 2007/11/26 23:37:48 $ $Author: heinzel $)' + +### config ### +FILES="" +FILES_DEF="configure.files" + +TEMPLATE_SUFFIX=".in" +MACROS_DEF="configure.macros" + +MACROS="CTEMPLATE" +MACRO_CTEMPLATE="@CFILE@ (created by configure script)" + +### functions ### +function print_help() { + cat </dev/null ; then + MACROS="$MACROS ${name}" + fi +} + +function eval_macro() { + local name="$1" + local text="" + local return="" + + eval text="\$MACRO_${name}" + while : ; do + # Test if text contains more macros. + echo "$text" | grep -E "@[A-Z][A-Z0-9]*@" >/dev/null + r=$? + if test "1${r}" != "10" ; then + # Text is macro free. + return="$text" + break + else + # Get the last macro name from text... + sm_name="`echo $text | sed -e 's=^.*@\([A-Z][A-Z0-9]*\)@.*$=\1='`" + # Resolve it... + sm_text="`eval_macro $sm_name`" + # Substitute macro... + text="`echo $text | sed -e 's=@'${sm_name}'@='${sm_text}'=g'`" + fi + done + + echo "$return" +} + +function load_defaults() { + local inc="${MACROS_DEF:-configure.macros}" + local i=0 + local line="" + + if test "X${inc}" = "X" ; then + return 1 + fi + if test ! -r "$inc" -o -d "$inc" ; then + echo "${inc}: not a readable file." >&2 + return 1 + fi + + while read line ; do + i="`expr $i + 1`" + case "$line" in + \#*|\ *|'') + continue + ;; + *=*) + set_macro "$line" + ;; + *) + echo "Warning: $inc: unexpected line ($i)." >&2 + ;; + esac + done < "$inc" +} + +function configure() { + local file="$1" + local ext="${TEMPLATE_SUFFIX:-.in}" + local template="" + + local static_file="" + + local expr="" + local name="" + local text="" + + if test "X${file}" = "X" ; then + echo "No filename given." >&2 + return 1 + fi + template="${file}${ext}" + if test ! -r "$template" -o -d "$template" ; then + echo "$file: cannot read template ($template)." + return 1 + fi + + set_macro CFILE="$file" + ctext="`eval_macro CTEMPLATE`" + cexpr="s=@${template}@=${ctext}=g" + + if test "X${CONFIGURE_STATIC_FILE}" != "X" ; then + static_file="$CONFIGURE_STATIC_FILE" + read expr < "$static_file" + else + static_file="`mktemp configure.tmp.XXXXXX`" + if test "1$?" -ne "10" -o "X${static_file}" = "X" \ + -o ! -w "$static_file" ; then + echo "Cannot create temp file." >&2 + return 1 + fi + CONFIGURE_STATIC_FILE="$static_file" + + expr="" + for name in $MACROS ; do + case "$name" in + CFILE|CTEMPLATE) + continue + ;; + esac + text="`eval_macro $name`" + expr="s=@$name@=$text=g +$expr" + done + + echo "$expr" > "$static_file" + fi + + sed -e "$cexpr" -e "$expr" "$template" > "$file" +} + +function clean_up() { + if test "X${CONFIGURE_STATIC_FILE}" != "X" -a -f "$CONFIGURE_STATIC_FILE" ; then + rm "$CONFIGURE_STATIC_FILE" + fi +} + +### set options ### +load_defaults + +while test "1$#" -gt "10" ; do +case "$1" in +-h|--help) + print_help + exit 0 + ;; +-V|--version) + print_version + exit 0 + ;; +--with-*|--without-*) + set_macro "$1" + shift + ;; +--enable-*|--disable-*) + set_macro "$1" + shift + ;; +--*=*) + set_macro "$1" + shift + ;; +--*) + case "$2" in + ''|-*) + set_macro "${1}=1" + shift + ;; + *) + set_macro "$1" "$2" + shift + shift + ;; + esac + ;; +esac +done + +### action ### + +files="$FILES" +if test "X${FILES_DEF}" != "X" -a -f "$FILES_DEF" ; then + read buf < "$FILES_DEF" + files="$files $buf" +fi + + +if test "X${files}" = "X" ; then + echo "No files to configure." >&2 + echo " Make sure '$FILES_DEF' is there and readable." >&2 + exit 1 +fi + +for f in $files ; do + echo "Creating file $f..." + configure $f +done + +clean_up +### end ### diff --git a/configure.files b/configure.files new file mode 100644 index 0000000..f3c7a7c --- /dev/null +++ b/configure.files @@ -0,0 +1 @@ +Makefile diff --git a/configure.macros b/configure.macros new file mode 100644 index 0000000..80912f3 --- /dev/null +++ b/configure.macros @@ -0,0 +1,35 @@ +# configure.macros + +# Directories +PREFIX="/usr/local" +BINDIR="@PREFIX@/bin" +SBINDIR="@PREFIX@/sbin" +MANDIR="@PREFIX@/share/man" +MAN1DIR="@MANDIR@/man1" +MAN2DIR="@MANDIR@/man2" +MAN3DIR="@MANDIR@/man3" +MAN4DIR="@MANDIR@/man4" +MAN5DIR="@MANDIR@/man5" +MAN6DIR="@MANDIR@/man6" +MAN7DIR="@MANDIR@/man7" +MAN8DIR="@MANDIR@/man8" +MAN9DIR="@MANDIR@/man9" + +# Programms +CAT="cat" +CC="cc" +CP="cp" +GZIP="gzip" +INSTALL="install" +RM="rm" +SHELL="/bin/sh" +STRIP="strip" +TAR="tar" +ZCAT="zcat" + +# Magic macros +# @CFILE@ will be expanded to the name of the file, that will be created. +# Also the current template name (e.g. @Makefile.in@) can be used as a macro +# that will be expanded to another macro named CTEMPLATE (which can be +# defined here or will default to a buildin text). +#end diff --git a/hello.1 b/hello.1 new file mode 100644 index 0000000..e014690 --- /dev/null +++ b/hello.1 @@ -0,0 +1,26 @@ +.\" hello.1 +.TH HELLO 1 "Nov. 2007" "heinzel" "User Commands" + +.SH NAME +hello \- Send greetings to everyone + +.SH SYNOPSIS +.B hello + +.SH DESCRIPTION +.B hello +print the message "Hello World." to standard output. + +.SH OPTIONS +none + +.SH BUGS +.B hello +is maybe the only program that has no bugs. + +.SH AUTHOR +heinzel + +.SH SEE ALSO +.BR echo (1) + diff --git a/hello.c b/hello.c new file mode 100644 index 0000000..f01dc31 --- /dev/null +++ b/hello.c @@ -0,0 +1,12 @@ +/* + * hello.c + */ + +#include +#include +#include + +int main(int argc, char** argv) { + printf("Hello World.\n"); + exit(EX_OK); +}