-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile
142 lines (118 loc) · 4.16 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
## This file is subject to the terms and conditions defined in
# file 'LICENSE', which is part of Hpmoon repository.
#
# This work has been funded by:
#
# Spanish 'Ministerio de Economı́a y Competitividad' under grants number
# TIN2012-32039 and TIN2015-67020-P.
# Spanish 'Ministerio de Ciencia, Innovación y Universidades' under grant number
# PGC2018-098813-B-C31.
# European Regional Development Fund (ERDF).
#
# @file Makefile
# @author Francisco Rodríguez Jiménez
# @date 26/06/2021
# @brief File with the necessary rules to compile the project. Also, documentation is generated
# @copyright Hpknn (c) 2015 EFFICOMP
# ************ Vars ************
CXX = g++
MPICXX ?= mpic++
MPIEXEC ?= mpiexec --bind-to none --map-by node
COMPILER := $(if $(filter true,${mpi}),$(MPICXX),$(CXX))
# EXECUTOR := $(if $(filter true,${mpi}),$(MPIEXEC),)
NP := $(if ${np},-np $(np),)
NT := $(if ${nt},-x OMP_NUM_THREADS=$(nt),)
# NT := $(if ${nt},-x OMP_NUM_THREADS=$(nt) -x OMP_NESTED=TRUE,) # in main omp_set_max_active_levels
MODE := $(if ${mode},-mode $(mode),)
CXXFLAGS := -std=c++17 -Wall -g
# CPR := -lcpr
# CURL := -lcurl-d
SSL := -lssl
CRYPTO := -lcrypto
OPT := -O2 -funroll-loops
OMP = -fopenmp
GPROF = -pg
BIN := bin
SRC := src
OBJ := obj
INCLUDE := include
LIB := lib
DOC := docs
# ************ Plataform ************
ifeq ($(OS),Windows_NT)
MAIN := hpknn.exe
SOURCEDIRS := $(SRC)
INCLUDEDIRS := $(INCLUDE)
FIXPATH = $(subst /,\,$1)
RM := del /q /f
RMDIR = rmdir /S /Q
MD := mkdir
else
MAIN := hpknn
SOURCEDIRS := $(shell find $(SRC) -type d)
INCLUDEDIRS := $(shell find $(INCLUDE) -type d)
LIBSDIRS := $(shell find $(LIB) -type d)
FIXPATH = $1
RM = rm -f
RMDIR = rmdir
MD := mkdir -p
endif
INCLUDES := $(patsubst %,-I%, $(INCLUDEDIRS:%/=%))
LIBS := $(patsubst %,-L%, $(LIBSDIRS:%/=%))
SOURCES := $(wildcard $(patsubst %,%/*.cpp, $(SOURCEDIRS)))
OBJECTS := $(subst $(SRC), $(OBJ), $(SOURCES:.cpp=.o))
OUTPUTMAIN := $(call FIXPATH,$(BIN)/$(MAIN))
FOLDERS_CREATE = $(OBJ) $(BIN) $(DOC)
CONF_FILE = config.json
# ************ Targets ************
all: $(FOLDERS_CREATE) $(OUTPUTMAIN)
@echo "\n\e[32mBinary $(OUTPUTMAIN) has been created!"
# ************ Folders to create ************
$(FOLDERS_CREATE):
@$(MD) $@
# ************ Compilation of modules ************
$(OBJ)/%.o: $(SRC)/%.cpp
@echo "\e[33mCompiling module $< \e[0m"
@if [ $< = "src/main.cpp" ]; then\
$(MPICXX) $(OMP) $(CXXFLAGS) $(INCLUDES) -c $< -o $@;\
else\
$(MPICXX) $(OMP) $(CXXFLAGS) $(INCLUDES) -c $< -o $@;\
fi
# ************ Linking and creating executable ************
$(OUTPUTMAIN): $(OBJECTS)
@echo "\n\e[33mLinking and creating executable $@ \e[0m"
$(MPICXX) $(OMP) $(CXXFLAGS) $(INCLUDES) -o $(OUTPUTMAIN) $(OBJECTS) $(SSL) $(CRYPTO)
# ************ Documentation ************
# Update Doxyfile with command doxygen -u
documentation:
@echo "\e[35mCreating documentation..."
@mkdir -p $(DOC)/html
@doxygen $(DOC)/Doxyfile
@printf "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n" > $(DOC)/index.html
@printf "<html>\n <head>\n <meta http-equiv=Refresh content=\"0;url=html/index.html\">\n </head>\n</html>" >> $(DOC)/index.html
@echo "\e[35mDocumentation created!"
# ************ Cleaning ***************
.PHONY: clean
clean:
-@$(RM) $(OUTPUTMAIN)
-@if [ -d $(BIN) ]; then $(RMDIR) $(BIN); fi
@echo "\e[31mBianarians removed!"
-@$(RM) $(OBJ)/*
-@if [ -d $(OBJ) ]; then $(RMDIR) $(OBJ); fi
@echo "\e[31mObjects removed!"
-@$(RM) $(DOC)/html/*
-@if [ -d $(DOC)/html ]; then $(RMDIR) $(DOC)/html; fi
-@$(RM) $(DOC)/index.html
@echo "\e[31mDocs removed!"
@echo "\e[31mCleanup complete!"
run: all
@echo "\e[0mExecuting $(OUTPUTMAIN)...\n $(MODE) $(NP) $(NT) -conf config.json\nOUTPUT:\n"
@$(MPIEXEC) $(NP) $(NT) ./$(OUTPUTMAIN) $(MODE) -conf config.json
info:
@echo "\e[36mMade by Francisco Rodríguez Jiménez ([email protected])\nHpknn (c) 2015 EFFICOMP"
# Show version omp when execute program
# export OMP_DISPLAY_ENV="TRUE"
openmp_version:
@echo "\e[36mOpenMP version: $(shell echo | cpp -fopenmp -dM | grep -i open | cut -d '_' -f 2)"
openmpi_version:
@echo "\e[36mOpenMPI version: $(shell mpirun --version | head -1 | cut -d " " -f 4)"