random123

Counter-based Random Number Generators
git clone git://git.meso-star.com/random123.git
Log | Files | Refs | README | LICENSE

GNUmakefile (6285B)


      1 no_target_specified: runcore
      2 	@echo
      3 	@echo The default make rule is equivalent to \'make runcore\' which runs only the most basic tests.
      4 	@echo The following \'meta-targets\' are available:
      5 	@echo "      " $(meta_targets)
      6 	@echo Here is the complete list of individual program targets:
      7 	@echo "      " $(all_primary_targets)
      8 	@echo Prepend \'run\' to any of the program targets or metatargets
      9 	@echo to run the binary and check for a zero exit status.
     10 	@echo Adding force=1 on the command line causes all targets to be considered out-of-date.
     11 .PHONY: no_target_specified
     12 
     13 # metatargets are variables which get mapped by METATARGET_template
     14 meta_targets:=kat core aesni timing c cpp gsl thread cuda opencl metal ut
     15 
     16 # Platform metatargets: each one typically has specific requirements in the build environment.
     17 # c is C99 (will work in MSVC), cpp is C++98, gsl requires the GNU Scientific Library
     18 # (specifically, the gsl-config program in the PATH), thread requires POSIX threads,
     19 # CUDA requires NVIDIA CUDA 3.x or newer, OpenCL requires OpenCL includes & libraries
     20 # (e.g. AMD APP SDK, NVIDIA SDK)
     21 c:=kat_c ut_ars time_serial
     22 cpp:=kat_cpp ut_carray ut_M128 ut_features ut_ReinterpretCtr ut_Engine ut_aes timers time_boxmuller ut_ua ut_uniform
     23 gsl:=ut_gsl
     24 thread:=time_thread
     25 cuda:=time_cuda kat_cuda time_boxmuller_cuda
     26 opencl:=time_opencl kat_opencl
     27 metal:=kat_metal
     28 
     29 # Convenience metatargets: these are to help developers test functional subsets across platforms
     30 kat:=kat_c kat_cpp
     31 core:=$(c) $(cpp)
     32 aesni:=ut_aes ut_ars
     33 timing:=timers time_serial time_thread
     34 #  N.B.  ut doesn't include ut_gsl, ut_ars or ut_aes
     35 ut:=ut_carray ut_Engine ut_features ut_M128 ut_ReinterpretCtr ut_ua ut_uniform ut_uniform_IEEEkat
     36 
     37 $(gsl) : override LDLIBS += `gsl-config --libs`
     38 $(gsl) : override CFLAGS += `gsl-config --cflags`
     39 
     40 $(opencl) : % : %_kernel.i
     41 # Or try this if we USE_GENCL in kat_opencl.c
     42 #$(opencl) : override CPPFLAGS += -DSRCDIR=\"$(dir $(abspath $<)).\"
     43 
     44 ifeq ($(shell uname),Darwin)
     45 $(opencl) : override LDLIBS+=-framework OpenCL
     46 else
     47 $(opencl) : override LDLIBS+=-lOpenCL
     48 endif
     49 $(opencl) : override CFLAGS+=-I.
     50 # Note, the Intel OpenCL SDK (1.5) has unresolved C++ symbols in its
     51 # libOpenCL.so Even though 'main' is a C program, you may need to link
     52 # it with a C++ compiler-driver, e.g., g++.  Since this Makefile does
     53 # compile-and-link in one step, use something like:
     54 # $(opencl) : CC=g++ -xc
     55 # which will invoke the g++ compiler-driver, but will treat the
     56 # program as C rather than C++.
     57 
     58 # N.B. gcc -pthread (without the -l) on linux at compile time also
     59 # adds -D_REENTRANT.  Unfortunately -pthread is unrecognized by
     60 # SunPRO.  Posix says that -lpthread is portable (as if anyone cares
     61 # what Posix says), and it seems to work in all the environments we've
     62 # tested.  Gcc's features.h says that _THREAD_SAFE is "often used by
     63 # other systems" as a synonym for _REENTRANT.  Cross your fingers...
     64 $(thread) : override LDLIBS+=-lpthread
     65 $(thread) : override CPPFLAGS+=-D_REENTRANT=1 -D_THREAD_SAFE=1
     66 
     67 $(metal) : % : %_kernel.metallib
     68 $(metal) : override LDLIBS+=-framework Metal -framework Foundation -framework CoreGraphics
     69 
     70 all_primary_targets += $(addsuffix _kernel.i, $(opencl))
     71 all_primary_targets += $(addsuffix _kernel.metallib, $(metal))
     72 all_primary_targets += $(addsuffix _kernel.air, $(metal))
     73 
     74 ################################################
     75 # Generic boilerplate from here down:
     76 vpath %.c $(srcdir/)
     77 vpath %.cpp $(srcdir/)
     78 vpath %.cu $(srcdir/)
     79 vpath %.ocl $(srcdir/)
     80 vpath %.metal $(srcdir/)
     81 
     82 define METATARGET_template
     83 .PHONY: $(1)
     84 $(1) : $(filter-out $(SKIP_TARGETS), $($(1)))
     85 .PHONY: run$(1)
     86 run$(1) : $(addprefix run, $(filter-out $(SKIP_TARGETS), $($(1))))
     87 all_primary_targets += $($(1))
     88 endef
     89 
     90 $(foreach T,$(meta_targets), $(eval $(call METATARGET_template,$(T))))
     91 
     92 # sort also does 'uniq'
     93 all_primary_targets:=$(sort $(all_primary_targets))
     94 
     95 INC=$(srcdir/)../include
     96 override CPPFLAGS += -I$(INC)
     97 
     98 ifndef NVCC
     99 NVCC:=nvcc
    100 endif
    101 # The rngs are *very* slow without optimization.  In the simplest case,
    102 # where the user just calls 'make', we don't want them to see terrible
    103 # performance.  Unfortunately, this might surprise someone
    104 # who says, e.g., make CPPFLAGS=-O0.  Oh well...
    105 ifndef CFLAGS
    106 CFLAGS:=-O
    107 endif
    108 ifndef CXXFLAGS
    109 CXXFLAGS:=-O
    110 endif
    111 
    112 %.i : %.ocl
    113 	CC="$(CC)" CPPFLAGS="$(CPPFLAGS)" $(srcdir/)./gencl.sh $< > $@
    114 
    115 % : %.cu
    116 	$(NVCC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $< $(LOADLIBES) $(LDLIBS) -o $@
    117 
    118 % : %.c
    119 	$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $< $(LOADLIBES) $(LDLIBS) -o $@
    120 
    121 % : %.cpp
    122 	$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $< $(LOADLIBES) $(LDLIBS) -o $@
    123 
    124 % : %.m
    125 	$(CC) $(OBJCFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $< $(LOADLIBES) $(LDLIBS) -o $@
    126 
    127 %.air : %.metal
    128 	xcrun --sdk macosx metal $(CPPFLAGS) -c $< -o $@
    129 
    130 %.metallib : %.air
    131 	xcrun --sdk macosx metallib $< -o $@
    132 
    133 run% : %
    134 	./$^ $(RUN_ARGS)
    135 
    136 # In lieu of autodepends, just say that all the compilation targets depend on all the headers.
    137 hdrs:=$(wildcard $(srcdir/)*.h $(srcdir/)gsl/*.c $(INC)/Random123/*.h $(INC)/Random123/*.hpp $(INC)/Random123/*/*.h $(INC)/Random123/*/*.hpp)
    138 misc:=$(wildcard $(srcdir/)*.cu $(srcdir/)*.ocl)
    139 $(all_primary_targets) : $(hdrs)
    140 $(misc) : $(hdrs)
    141 
    142 # If you put force=y on the command line, then $(all_primary_targets) will be
    143 # depend on FORCE, and hence will not be up-to-date.
    144 ifdef force
    145 $(all_primary_targets) : FORCE
    146 FORCE:
    147 endif
    148 
    149 .PHONY : echo_build_commands
    150 echo_build_commands:
    151 	make -n force=1 $(all_primary_targets) | grep -v 'is up to date'
    152 
    153 .PHONY : clean veryclean
    154 clean:
    155 	rm -f $(all_primary_targets)
    156 
    157 veryclean:
    158 	rm -f $(all_primary_targets) *.o \#* *~ *.pdb *.exe *.obj *.ilk *.suo
    159 
    160 .PHONY : install
    161 
    162 # N.B. normally these are exported by ../GNUmakefile
    163 prefix?=/usr/local
    164 datarootdir?=$(prefix)/share
    165 docdir?=$(datarootdir)/doc/Random123
    166 
    167 # Are 'tests/' "documentation" or "architecture independent data files"?
    168 # If the former, then they belong in $(docdir)/tests (aka /usr/local/share/doc/Random123/tests)
    169 # If the latter, then they belong in $(datarootdir)/Random123/tests (aka /usr/local/share/Random123/tests)
    170 install:
    171 	mkdir -p $(DESTDIR)$(docdir)/tests
    172 	cp README GNUmakefile BUILDVC* *kat_vectors* *.sh *.c *.h  *.cpp *.cu *.metal *.m *.ocl $(DESTDIR)$(docdir)/tests