configure.info: Getting Started Example 2
Go forward to Getting Started Example 3
Go backward to Getting Started Example 1
Go up to Getting Started Example
Go to the top op configure
Second Try
Here is our second try at this program.
We modify `poke.c' to use preprocessor macros to control what
features are available. (I've cheated a bit by using the same macro
names which autoconf will use).
#include <stdio.h>
#ifdef STDC_HEADERS
#include <stdlib.h>
#endif
#include <sys/types.h>
#ifdef HAVE_UTIME_H
#include <utime.h>
#endif
#ifndef HAVE_UTIME_NULL
#include <time.h>
#ifndef HAVE_STRUCT_UTIMBUF
struct utimbuf
{
long actime;
long modtime;
};
#endif
static int
utime_now (file)
char *file;
{
struct utimbuf now;
now.actime = now.modtime = time (NULL);
return utime (file, &now);
}
#define utime(f, p) utime_now (f)
#endif /* HAVE_UTIME_NULL */
int
main (argc, argv)
int argc;
char **argv;
{
if (argc != 2)
{
fprintf (stderr, "Usage: poke file\n");
exit (1);
}
if (utime (argv[1], NULL) < 0)
{
perror ("utime");
exit (1);
}
exit (0);
}
Here is the associated `Makefile'. We've added support for the
preprocessor flags we use. We've also added `install' and `clean'
targets.
# Set this to your installation directory.
bindir = /usr/local/bin
# Uncomment this if you have the standard ANSI/ISO C header files.
# STDC_HDRS = -DSTDC_HEADERS
# Uncomment this if you have utime.h.
# UTIME_H = -DHAVE_UTIME_H
# Uncomment this if utime (FILE, NULL) works on your system.
# UTIME_NULL = -DHAVE_UTIME_NULL
# Uncomment this if struct utimbuf is defined in utime.h.
# UTIMBUF = -DHAVE_STRUCT_UTIMBUF
CC = gcc
CFLAGS = -g -O2
ALL_CFLAGS = $(STDC_HDRS) $(UTIME_H) $(UTIME_NULL) $(UTIMBUF) $(CFLAGS)
all: poke
poke: poke.o
$(CC) -o poke $(ALL_CFLAGS) $(LDFLAGS) poke.o
.c.o:
$(CC) -c $(ALL_CFLAGS) poke.c
install: poke
cp poke $(bindir)/poke
clean:
rm poke poke.o
Some problems with this approach should be clear.
Users who want to compile poke will have to know how `utime' works
on their systems, so that they can uncomment the `Makefile' correctly.
The installation is done using `cp', but many systems have an
`install' program which may be used, and which supports optional
features such as stripping debugging information out of the installed
binary.
The use of `Makefile' variables like `CC', `CFLAGS' and `LDFLAGS'
follows the requirements of the GNU standards. This is convenient for
all packages, since it reduces surprises for users. However, it is
easy to get the details wrong, and wind up with a slightly nonstandard
distribution.
Created Wed Sep 1 16:41:59 2004 on bee with info_to_html version 0.9.6.