#! /bin/sh

CC="/opt/mingw/bin/i386-mingw32msvc-gcc -Wall"

# without export decoration
cat > foo1.c <<EOF
#include <stdio.h>

#define EXTERN(type)	extern type

EXTERN(void) foo1a() { printf("foo1a\n"); }
EXTERN(void) foo1b() { printf("foo1b\n"); }
EOF

cat > foo1.def <<EOF
EXPORTS
        foo1a
EOF


# with export decoration
cat > foo2.c <<EOF
#include <stdio.h>

#define EXTERN(type)	extern type __declspec(dllexport)

EXTERN(void) foo2a() { printf("foo2a\n"); }
EXTERN(void) foo2b() { printf("foo2b\n"); }
EOF

cat > foo2.def <<EOF
EXPORTS
        foo2a
EOF


# apps

cat > app1.c <<EOF
extern void foo1a();
extern void foo1b();

int main() {
  foo1a();
  foo1b();

  return(0);
}
EOF

cat > app2.c <<EOF
extern void foo2a();
extern void foo2b();

int main() {
  foo2a();
  foo2b();

  return(0);
}
EOF

# makefile

cat > Makefile <<EOF
CC = $CC


all:

app1.exe: app1.c libfoo1.dll
	\$(CC) -o \$@ app1.c -L. -lfoo1
	./\$@

app2.exe: app2.c libfoo2.dll
	\$(CC) -o \$@ app2.c -L. -lfoo2
	./\$@


app1x.exe: app1.c libfoo1x.dll
	\$(CC) -o \$@ app1.c -L. -lfoo1x
	./\$@

app2x.exe: app2.c libfoo2x.dll
	\$(CC) -o \$@ app2.c -L. -lfoo2x
	./\$@


libfoo1.dll: foo1.c
	\$(CC) -shared -o \$@ foo1.c

libfoo1x.dll: foo1.c
	\$(CC) -shared -o \$@ foo1.def foo1.c


libfoo2.dll: foo2.c
	\$(CC) -shared -o \$@ foo2.c

libfoo2x.dll: foo2.c
	\$(CC) -shared -o \$@ foo2.def foo2.c
EOF


# test
make app1.exe
make app2.exe
make app2x.exe
make app1x.exe

