# Makefile to build all the available variants
BUILDS = opencvfft-st opencvfft-async opencvfft-openmp fftw fftw-async fftw-openmp fftw-big fftw-big-openmp cufftw cufftw-big cufftw-big-openmp cufft cufft-openmp cufft-big cufft-big-openmp
-TESTSEQ = bag ball1 car1 book
-TESTFLAGS = default fit128
+TESTSEQ = bmx ball1 crossing racing book
+TESTFLAGS = default fit
all: $(BUILDS)
+print_%:
+ @$(foreach v,$($*),echo $(v);)
+
ninja: build.ninja
ninja
clean: build.ninja
ninja $@
-CMAKE_OPTS += -G Ninja
-
## Useful setting - uncomment and modify as needed
# CMAKE_OPTS += -DOpenCV_DIR=~/opt/opencv-2.4/share/OpenCV
# CMAKE_OPTS += -DCUDA_VERBOSE_BUILD=ON -DCUDA_NVCC_FLAGS="--verbose;--save-temps"
.INTERMEDIATE: vot2016.zip
.SECONDARY: vot2016.zip
vot2016.zip:
- wget -O $@ http://data.votchallenge.net/vot2016/vot2016.zip
+ wget --progress=dot:giga -O $@ http://data.votchallenge.net/vot2016/vot2016.zip
###################
# Ninja generator #
# compiles all variants in the same ways as this makefile, but faster.
# The down side is that the build needs about 10 GB of memory.
-define nl
+# Define echo depending on whether make supports the $(file) function.
+$(file >.test.file)
+ifneq ($(wildcard .test.file),)
+ echo = $(file $(1),$(2))
+else
+ define nl
-endef
-define echo
-echo $(1) '$(subst $(nl),\n,$(subst \,\\,$(2)))';
-endef
+ endef
+ echo = echo $(1) '$(subst $(nl),\n,$(subst \,\\,$(2)))';
+endif
# Ninja generator - to have faster parallel builds and tests
.PHONY: build.ninja
-build.ninja: Makefile
+build.ninja:: $(MAKEFILE_LIST)
+ @echo "Generating $@"
@$(call echo,>$@,$(ninja-rule))
@$(foreach build,$(BUILDS),\
$(call echo,>>$@,$(call ninja-build,$(build),$(CMAKE_OTPS_$(build)))))
@$(call echo,>>$@,build test: PRINT_RESULTS $(foreach build,$(BUILDS),$(foreach seq,$(TESTSEQ),$(foreach f,$(TESTFLAGS),$(call ninja-test,$(build),$(seq),$(f))))) | print-test-results)
@$(foreach build,$(BUILDS),$(call echo,>>$@,build test-$(build): PRINT_RESULTS $(foreach seq,$(TESTSEQ),$(foreach f,$(TESTFLAGS),$(call ninja-test,$(build),$(seq),$(f)))) | print-test-results))
@$(foreach seq,$(TESTSEQ),$(call echo,>>$@,build test-$(seq): PRINT_RESULTS $(foreach build,$(BUILDS),$(foreach f,$(TESTFLAGS),$(call ninja-test,$(build),$(seq),$(f)))) | print-test-results))
+ @$(call echo,>>$@,build plot: PLOT_RESULTS $(foreach build,$(BUILDS),$(foreach seq,$(TESTSEQ),$(foreach f,$(TESTFLAGS),$(call ninja-test,$(build),$(seq),$(f))))) | graphGen.sh)
+ @$(foreach build,$(BUILDS),$(call echo,>>$@,build plot-$(build): PLOT_RESULTS $(foreach seq,$(TESTSEQ),$(foreach f,$(TESTFLAGS),$(call ninja-test,$(build),$(seq),$(f)))) | graphGen.sh))
+ @$(foreach seq,$(TESTSEQ),$(call echo,>>$@,build plot-$(seq): PLOT_RESULTS $(foreach build,$(BUILDS),$(foreach f,$(TESTFLAGS),$(call ninja-test,$(build),$(seq),$(f)))) | graphGen.sh))
@$(foreach seq,$(TESTSEQ),$(call echo,>>$@,build vot2016/$(seq): MAKE))
ninja-test = build-$(1)/kcf_vot-$(2)-$(3).log
define ninja-rule
rule REGENERATE
- command = make $$out BUILDS="$(BUILDS)" TESTSEQ="$(TESTSEQ)" TESTFLAGS="$(TESTFLAGS)"
+ command = MAKEFLAGS='$(MAKEFLAGS)' $(MAKE) $$out
+ description = Regenerating $$out
generator = 1
rule CMAKE
- command = cd $$$$(dirname $$out) && cmake $(CMAKE_OPTS) $$opts ..
+ command = cd $$subdir && cmake -G Ninja $(CMAKE_OPTS) $$opts ..
rule NINJA
# Absolute path in -C allows Emacs to properly jump to error message locations
- command = ninja -C $(CURDIR)/$$$$(dirname $$out)
- description = ninja $$out
+ command = ninja -C $(CURDIR)/$$subdir
restat = 1
rule TEST_SEQ
# Errors are ignored - they will be reported by PRINT_RESULTS
- command = build-$$build/kcf_vot $$flags $$seq > $$out || :
+ command = build-$$build/kcf_vot $$flags $$seq $(if $(TRAVIS),2>&1) >$$out $(if $(TRAVIS),| grep -v libdc1394); true
rule PRINT_RESULTS
description = Print results
- command = ./wvtool -w125 -v run ./print-test-results $$in
+ command = ./wvtool -w120 -v run ./print-test-results $$in
+rule PLOT_RESULTS
+ description = Plot results
+ command = ./graphGen.sh -f -s $$in
rule MAKE
command = make $$out
pool = make
description = Cleaning all built files...
command = rm -rf $(BUILDS:%=build-%)
build clean: CLEAN
-build build.ninja: REGENERATE Makefile
+build build.ninja: REGENERATE $(MAKEFILE_LIST)
endef
GIT_LS_FILES := $(shell git ls-files)
define ninja-build
build build-$(1)/build.ninja: CMAKE
opts = $(2)
+ subdir = build-$(1)
build build-$(1)/kcf_vot: NINJA build-$(1)/build.ninja $(GIT_LS_FILES)
+ subdir = build-$(1)
default build-$(1)/kcf_vot
endef
build build-$(1)/kcf_vot-$(2)-$(3).log: TEST_SEQ build-$(1)/kcf_vot $(filter-out %/output.txt,$(wildcard vot2016/$(2)/*)) vot2016/$(2)
build = $(1)
seq = vot2016/$(2)
- flags = $(if $(3:fit128=),,--fit=128)
+ flags = $(if $(3:fit128=),,--fit=128)$(if $(3:fit=),,--fit)
endef