# Makefile for random number generator libraries
# By Agner Fog, 2004-07-11
# Works with Borland make or MS nmake.

all: randomc.zip randoma.zip stocc.zip evolc.zip
  echo You may remake all zip files under UNIX to make sure filenames are lowercase!
# unzip -L -d directory xxx.zip
# cd directory
# zip -X xxx.zip *

# archive of random number generators in C++
# (can't use $? because this will make the command line too long)
randomc.zip: randomc.htm randomc.h ranrotb.cpp ranrotw.cpp mother.cpp \
  mersenne.cpp rancombi.cpp userintf.cpp ex-ran.cpp
  pkzip -a $@ randomc.htm randomc.h ranrotb.cpp ranrotw.cpp mother.cpp
  pkzip -a $@ mersenne.cpp rancombi.cpp userintf.cpp ex-ran.cpp

# archive of non-uniform random number generators in C++
stocc.zip: stocc.htm randomc.h stocc.h stoc1.cpp stoc2.cpp stoc3.cpp \
  mersenne.cpp userintf.cpp wnchyppr.cpp fnchyppr.cpp erfres.cpp \
  erfresmk.cpp ex-stoc.cpp ex-cards.cpp ex-lotto.cpp \
  testpois.cpp testbino.cpp testhype.cpp testfnch.cpp testwnch.cpp testmfnc.cpp testmwnc.cpp \
  distrib.pdf sampmet.pdf
  pkzip -a $@ stocc.htm randomc.h stocc.h stoc1.cpp stoc2.cpp stoc3.cpp
  pkzip -a $@ mersenne.cpp userintf.cpp wnchyppr.cpp fnchyppr.cpp erfres.cpp
  pkzip -a $@ erfresmk.cpp ex-stoc.cpp ex-cards.cpp ex-lotto.cpp 
  pkzip -a $@ testpois.cpp testbino.cpp testhype.cpp testfnch.cpp testwnch.cpp 
  pkzip -a $@ testmfnc.cpp testmwnc.cpp distrib.pdf sampmet.pdf

# archive of random number generators in assembly
randoma.zip: randoma.h randoma.htm \
  ranrot.asm mothera.asm mersenna.asm motrot.asm instrset.asm randomad.asm \
  log1mx.asm log1pow.asm pow21.asm round.asm truncate.asm minmaxi.asm minmaxd.asm detectpr.asm \
  ranmoro.cpp ex-lib.cpp ranlib.cpp ranlib.pas ranlib.cs ranlib.vb userintf.cpp makefile \
  randomao.lib randomam.lib randomae.a randomad.dll randomad.lib randomad.def randomad.txt \
  randomao.zip random16.zip
  pkzip -a $@ randoma.h randoma.htm ranrot.asm mothera.asm mersenna.asm motrot.asm randomad.asm
  pkzip -a $@ instrset.asm log1mx.asm log1pow.asm pow21.asm round.asm minmaxi.asm minmaxd.asm
  pkzip -a $@ truncate.asm detectpr.asm ranmoro.cpp ex-lib.cpp ranlib.cpp
  pkzip -a $@ ranlib.pas ranlib.cs ranlib.vb userintf.cpp makefile
  pkzip -a $@ randomao.lib randomam.lib randomae.a randomad.dll randomad.lib randomad.def
  pkzip -a $@ randomad.txt randomao.zip random16.zip

# archive of tools for simulating biological evolution
evolc.zip: evolc.htm randomc.htm stocc.htm \
  randomc.h ranrotw.cpp mother.cpp mersenne.cpp rancombi.cpp ranmoro.cpp ex-ran.cpp \
  stocc.h stoc1.cpp stoc3.cpp userintf.cpp wnchyppr.cpp fnchyppr.cpp erfres.cpp \
  ex-stoc.cpp ex-evol1.cpp ex-evol2.cpp distrib.pdf
  pkzip -a $@ evolc.htm randomc.htm stocc.htm randomc.h ranrotw.cpp
  pkzip -a $@ mother.cpp mersenne.cpp rancombi.cpp ranmoro.cpp ex-ran.cpp
  pkzip -a $@ stocc.h stoc1.cpp stoc3.cpp userintf.cpp wnchyppr.cpp fnchyppr.cpp erfres.cpp
  pkzip -a $@ ex-stoc.cpp ex-evol1.cpp ex-evol2.cpp distrib.pdf

# zipfiles for compilers that don't accept .lib
randomao.zip: ranrot.obj mothera.obj mersenna.obj motrot.obj instrset.obj \
  log1mx.obj log1pow.obj pow21.obj round.obj truncate.obj minmaxi.obj minmaxd.obj detectpr.obj
  pkzip -a $@ ranrot.obj mothera.obj mersenna.obj motrot.obj instrset.obj
  pkzip -a $@ log1mx.obj log1pow.obj pow21.obj round.obj truncate.obj minmaxi.obj minmaxd.obj detectpr.obj

# archive of random number generators in assembly for 16-bit systems
random16.zip: ranrot16.asm ranrot16.obj ranrot16.h  
  pkzip $@ $?

# make library in OMF format
randomao.lib: ranrot.obj mothera.obj mersenna.obj motrot.obj instrset.obj \
  log1mx.obj log1pow.obj pow21.obj round.obj truncate.obj detectpr.obj minmaxi.obj minmaxd.obj
  tlib $@ /C -+ranrot.obj -+mothera.obj -+mersenna.obj -+motrot.obj -+instrset.obj
  tlib $@ /C -+log1mx.obj -+log1pow.obj -+pow21.obj -+round.obj -+truncate.obj -+minmaxi.obj -+minmaxd.obj -+detectpr.obj

# make library in MS-COFF format
randomam.lib: ranrot.cof mothera.cof mersenna.cof motrot.cof instrset.cof \
  log1mx.cof log1pow.cof pow21.cof round.cof truncate.cof minmaxi.cof minmaxd.cof detectpr.cof
  lib /link50compat /OUT:$@ ranrot.cof mothera.cof mersenna.cof motrot.cof instrset.cof
  lib /link50compat $@ log1mx.cof log1pow.cof pow21.cof round.cof truncate.cof minmaxi.cof minmaxd.cof detectpr.cof
  lib /LIST:$*.lst $@

# make library in ELF format
# Get objcopy.exe by downloading binutils from www.mingw.org
randomae.a: randomam.lib
  objcopy -Oelf32-i386 $? $@

# make dynamic link library in Windows DLL format
randomad.dll: randomam.lib randomad.cof randomad.def
  link /DLL /DEF:randomad.def /SUBSYSTEM:WINDOWS randomad.cof randomam.lib
  
# generic rule for obj files in OMF format
# Borland Delphi v. 6 doesn't like .obj files from ML, use TASM instead if necessary:
.asm.obj:
  # tasm /mx /m /z /w2 /l $<
  ML /c /Cx /W3 /omf /DOMF /Fo$@ $<

# generic rule for obj files in MS-COFF format
.asm.cof:
  ML /c /Cx /W3 /coff /DCOFF /Fo$@ $<

# generic rule for obj files in ELF format
.cof.o:
  objcopy -Oelf32-i386 $< $@
  
