FFTW Logo
Go back to the FFTW download page.

VMS Installation Notes

Bernd Ulmann has graciously created a page containing FFTW installation instructions for OpenVMS, as well as a prepackaged version.

Another patch file for OpenVMS is posted at Jouk J.'s web page, including support for FFTW 3.0.


The following notes were for FFTW 1.2, and are not applicable to later versions of FFTW. We leave them here for historical purposes. (You will probably need to create your own Makefile; see the section of the FFTW manual on installation on non-Unix systems.)


Jouk Jansen sent us his changes to get FFTW 1.2 running under VMS.

To get fftw_test working, he copied GETOPT.C from http://www.openvms.digital.com/cd/UUDECODE/SRC.

He also made the following changes to FFTW files:

In src/Makefile:

# VMS
LIBFFT = libfftw.olb
HEADERS = fftw.h
INCLUDE = /include=[]
LIBDIR = sys$library
INCLUDEDIR =sys$library
RM = delete
CP = copy
MAKE = mms
AR = library

CC = cc
CFLAGS = /optimize$(INCLUDE)

NOTW_PREFIX=fn_
TWID_PREFIX=ftw_
NOTWI_PREFIX=fni_
TWIDI_PREFIX=ftwi_

NOTW_BLOCKS=$(NOTW_PREFIX)1.obj;,$(NOTW_PREFIX)2.obj;,$(NOTW_PREFIX)3.obj;,  \
$(NOTW_PREFIX)4.obj;,$(NOTW_PREFIX)5.obj;,$(NOTW_PREFIX)6.obj;,        \
$(NOTW_PREFIX)7.obj;,$(NOTW_PREFIX)8.obj;,$(NOTW_PREFIX)9.obj;,        \
$(NOTW_PREFIX)10.obj;,$(NOTW_PREFIX)11.obj;,$(NOTW_PREFIX)12.obj;,     \
$(NOTW_PREFIX)13.obj;,$(NOTW_PREFIX)14.obj;,$(NOTW_PREFIX)15.obj;,     \
$(NOTW_PREFIX)16.obj;,$(NOTW_PREFIX)32.obj;,$(NOTW_PREFIX)64.obj;,     

TWID_BLOCKS=$(TWID_PREFIX)2.obj;,$(TWID_PREFIX)3.obj;,$(TWID_PREFIX)4.obj;,  \
$(TWID_PREFIX)5.obj;,$(TWID_PREFIX)6.obj;,$(TWID_PREFIX)7.obj;,        \
$(TWID_PREFIX)8.obj;,$(TWID_PREFIX)9.obj;,$(TWID_PREFIX)10.obj;,       \
$(TWID_PREFIX)16.obj;,$(TWID_PREFIX)32.obj;,$(TWID_PREFIX)64.obj;,

NOTWI_BLOCKS=$(NOTWI_PREFIX)1.obj;,$(NOTWI_PREFIX)2.obj;,$(NOTWI_PREFIX)3.obj;,\
$(NOTWI_PREFIX)4.obj;,$(NOTWI_PREFIX)5.obj;,$(NOTWI_PREFIX)6.obj;,     \
$(NOTWI_PREFIX)7.obj;,$(NOTWI_PREFIX)8.obj;,$(NOTWI_PREFIX)9.obj;,     \
$(NOTWI_PREFIX)10.obj;,$(NOTWI_PREFIX)11.obj;,$(NOTWI_PREFIX)12.obj;,  \
$(NOTWI_PREFIX)13.obj;,$(NOTWI_PREFIX)14.obj;,$(NOTWI_PREFIX)15.obj;,  \
$(NOTWI_PREFIX)16.obj;,$(NOTWI_PREFIX)32.obj;,$(NOTWI_PREFIX)64.obj;,

TWIDI_BLOCKS=$(TWIDI_PREFIX)2.obj;,$(TWIDI_PREFIX)3.obj;,            \
$(TWIDI_PREFIX)4.obj;,$(TWIDI_PREFIX)5.obj;,$(TWIDI_PREFIX)6.obj;,   \
$(TWIDI_PREFIX)7.obj;,$(TWIDI_PREFIX)8.obj;,$(TWIDI_PREFIX)9.obj;,   \
$(TWIDI_PREFIX)10.obj;,$(TWIDI_PREFIX)16.obj;,$(TWIDI_PREFIX)32.obj;,\
        $(TWIDI_PREFIX)64.obj;,

NOTW_SRC=$(NOTW_PREFIX)1.c $(NOTW_PREFIX)2.c $(NOTW_PREFIX)3.c   \
$(NOTW_PREFIX)4.c $(NOTW_PREFIX)5.c $(NOTW_PREFIX)6.c         \
$(NOTW_PREFIX)7.c $(NOTW_PREFIX)8.c $(NOTW_PREFIX)9.c         \
$(NOTW_PREFIX)10.c $(NOTW_PREFIX)11.c $(NOTW_PREFIX)12.c      \
$(NOTW_PREFIX)13.c $(NOTW_PREFIX)14.c $(NOTW_PREFIX)15.c      \
$(NOTW_PREFIX)16.c $(NOTW_PREFIX)32.c $(NOTW_PREFIX)64.c

TWID_SRC=$(TWID_PREFIX)2.c $(TWID_PREFIX)3.c $(TWID_PREFIX)4.c   \
$(TWID_PREFIX)5.c $(TWID_PREFIX)6.c $(TWID_PREFIX)7.c         \
$(TWID_PREFIX)8.c $(TWID_PREFIX)9.c $(TWID_PREFIX)10.c        \
$(TWID_PREFIX)16.c $(TWID_PREFIX)32.c $(TWID_PREFIX)64.c

NOTWI_SRC=$(NOTWI_PREFIX)1.c $(NOTWI_PREFIX)2.c $(NOTWI_PREFIX)3.c    \
$(NOTWI_PREFIX)4.c $(NOTWI_PREFIX)5.c $(NOTWI_PREFIX)6.c      \
$(NOTWI_PREFIX)7.c $(NOTWI_PREFIX)8.c $(NOTWI_PREFIX)9.c      \
$(NOTWI_PREFIX)10.c $(NOTWI_PREFIX)11.c $(NOTWI_PREFIX)12.c   \
$(NOTWI_PREFIX)13.c $(NOTWI_PREFIX)14.c $(NOTWI_PREFIX)15.c   \
$(NOTWI_PREFIX)16.c $(NOTWI_PREFIX)32.c $(NOTWI_PREFIX)64.c

TWIDI_SRC=$(TWIDI_PREFIX)2.c $(TWIDI_PREFIX)3.c $(TWIDI_PREFIX)4.c  \
$(TWIDI_PREFIX)5.c $(TWIDI_PREFIX)6.c $(TWIDI_PREFIX)7.c    \
$(TWIDI_PREFIX)8.c $(TWIDI_PREFIX)9.c $(TWIDI_PREFIX)10.c   \
$(TWIDI_PREFIX)16.c $(TWIDI_PREFIX)32.c $(TWIDI_PREFIX)64.c

OTHEROBJ = timer.obj;,config.obj;,planner.obj;,twiddle.obj;,executor.obj;,naive.obj;,\
generic.obj;,fftwnd.obj;,malloc.obj;,wisdom.obj;,common_io.obj;

BLOCKS = $(NOTW_BLOCKS) $(NOTWI_BLOCKS) $(TWID_BLOCKS) $(TWIDI_BLOCKS) 

ALLOBJ = $(BLOCKS) $(OTHEROBJ)

all :
        $(MAKE) $(LIBFFT) 

install : $(LIBFFT)
        $(CP) $(LIBFFT) $(LIBDIR)
        $(RANLIB) $(LIBDIR)/$(LIBFFT)
        $(CP) $(HEADERS) $(INCLUDEDIR)

$(LIBFFT) : $(ALLOBJ)
        $(AR)/create $(LIBFFT) $(ALLOBJ)

sources : 
        $(MAKE) -f Makefile.sources $(NOTW_SRC) $(NOTWI_SRC) \
             $(TWID_SRC) $(TWIDI_SRC) \
             NOTW_PREFIX=$(NOTW_PREFIX)     \
             NOTWI_PREFIX=$(NOTWI_PREFIX)   \
             TWID_PREFIX=$(TWID_PREFIX)     \
             TWIDI_PREFIX=$(TWIDI_PREFIX)

realclean : clean
        $(RM) $(LIBFFT)  $(NOTW_SRC) $(NOTWI_SRC) $(TWID_SRC) $(TWIDI_SRC)

clean :
        $(RM) -f *.obj;,*~ core a.out test gmon.objut mon.out *.zi *.zo *.s genfft

$(ALLOBJ) : $(HEADERS) konst.h

In tests/Makefile:

# VMS
FFTWDIR=[-.src]
LIBFFT = $(FFTWDIR)libfftw.olb
HEADERS = $(FFTWDIR)fftw.h
INCLUDE = /include=$(FFTWDIR)

# DECC
CC = cc
CFLAGS = /optimize$(INCLUDE)

all :
        mms fftw_test
        mms testnd

fftw_test :fftw_test.c $(LIBFFT)
        $(CC) $(CFLAGS) fftw_test.c
        $(CC) $(CFLAGS) getopt.c
        link fftw_test,getopt,$(LIBFFT)/l

testnd :testnd.c go_fft.c $(LIBFFT)
        $(CC) $(CFLAGS) testnd.c
        $(CC) $(CFLAGS) go_fft.c
        link testnd,go_fft,$(LIBFFT)/l

clean :
        rm -f *.o *~ core a.out test testnd gmon.out mon.out *.s

In tests/fftw_test.c:

Define the following global variable:
char *__progname;
In the main() subroutine, just before the "if (argc <= 1)" line, insert:
__progname = argv[0];

Go back to the FFTW download page.