AUTH's THMMY "Parallel and distributed systems" course assignments.
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

Makefile 8.3 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. #
  2. # PDS homework_1 Makefile
  3. #
  4. # Copyright (C) 2024 Christos Choutouridis <christos@choutouridis.net>
  5. #
  6. # This program is free software: you can redistribute it and/or modify
  7. # it under the terms of the GNU Lesser General Public License as
  8. # published by the Free Software Foundation, either version 3
  9. # of the License, or (at your option) any later version.
  10. #
  11. # This program is distributed in the hope that it will be useful,
  12. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. # GNU Lesser General Public License for more details.
  15. #
  16. # You should have received a copy of the GNU Lesser General Public License
  17. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  18. #
  19. # ============== Project settings ==============
  20. # Project's name
  21. PROJECT := PDS_homework_1
  22. # Excecutable's name
  23. TARGET := knnsearch
  24. # Source directories list(space seperated). Makefile-relative path, UNDER current directory.
  25. SRC_DIR_LIST := src
  26. # Include directories list(space seperated). Makefile-relative path.
  27. INC_DIR_LIST := src inc
  28. # Exclude files list(space seperated). Filenames only.
  29. # EXC_FILE_LIST := bad.cpp old.cpp
  30. # Build directories
  31. BUILD_DIR := bin
  32. OBJ_DIR := $(BUILD_DIR)/obj
  33. DEP_DIR := $(BUILD_DIR)/.dep
  34. # ========== Compiler settings ==========
  35. # Compiler flags for debug and release
  36. DEB_CFLAGS := -DDEBUG -g3 -Wall -Wextra -std=c11
  37. REL_CFLAGS := -Wall -Wextra -O3 -std=c11
  38. DEB_CXXFLAGS := -DDEBUG -g3 -Wall -Wextra -std=c++17
  39. REL_CXXFLAGS := -Wall -Wextra -O3 -std=c++17
  40. # Pre-defines
  41. # PRE_DEFS := MYCAB=1729 SUPER_MODE
  42. PRE_DEFS :=
  43. # ============== Linker settings ==============
  44. # Linker flags (example: -pthread -lm)
  45. LDFLAGS := -pthread
  46. # Map output file
  47. MAP_FILE := output.map
  48. MAP_FLAG := -Xlinker -Map=$(BUILD_DIR)/$(MAP_FILE)
  49. # ============== Docker settings ==============
  50. # We need:
  51. # - Bind the entire project directory(the dir that icludes all the code) as volume.
  52. # - In docker instance, change to working directory(where the makefile is).
  53. DOCKER_VOL_DIR := $${PWD}
  54. DOCKER_WRK_DIR :=
  55. DOCKER_RUN := docker run --rm
  56. DOCKER_FLAGS := -v $(DOCKER_VOL_DIR):/usr/src/$(PROJECT) -w /usr/src/$(PROJECT)/$(DOCKER_WRK_DIR)
  57. # docker invoke mechanism (edit with care)
  58. # note:
  59. # Here, `DOCKER` variable is empty. Rules can assign `DOCKER := DOCKER_CMD` when docker
  60. # functionality is needed.
  61. DOCKER_CMD = $(DOCKER_RUN) $(DOCKER_FLAGS) $(IMAGE)
  62. DOCKER :=
  63. # ============== Tool selection ==============
  64. # compiler and compiler flags.
  65. CSIZE := size
  66. CFLAGS := $(DEB_CFLAGS)
  67. CXXFLAGS := $(DEB_CXXFLAGS)
  68. CXX := g++
  69. #
  70. # =========== Main body and Patterns ===========
  71. #
  72. #ifeq ($(OS), Windows_NT)
  73. # TARGET := $(TARGET).exe
  74. #endif
  75. INC := $(foreach dir,$(INC_DIR_LIST),-I$(dir))
  76. DEF := $(foreach def,$(PRE_DEFS),-D$(def))
  77. EXC := $(foreach fil,$(EXC_FILE_LIST), \
  78. $(foreach dir,$(SRC_DIR_LIST),$(wildcard $(dir)/$(fil))) \
  79. )
  80. # source files. object and dependencies list
  81. # recursive search into current and source directories
  82. SRC := $(wildcard *.cpp)
  83. SRC += $(foreach dir,$(SRC_DIR_LIST),$(wildcard $(dir)/*.cpp))
  84. SRC += $(foreach dir,$(SRC_DIR_LIST),$(wildcard $(dir)/**/*.cpp))
  85. SRC := $(filter-out $(EXC),$(SRC))
  86. #SRC := $(abspath $(SRC))
  87. OBJ := $(foreach file,$(SRC:%.cpp=%.o),$(OBJ_DIR)/$(file))
  88. DEP := $(foreach file,$(SRC:%.cpp=%.d),$(DEP_DIR)/$(file))
  89. # Make Dependencies pattern.
  90. # This little trick enables recompilation only when dependencies change
  91. # and it does so for changes both in source AND header files ;)
  92. #
  93. # It is based on Tom Tromey's method.
  94. #
  95. # Invoke cpp to create makefile rules with dependencies for each source file
  96. $(DEP_DIR)/%.d: %.c
  97. @mkdir -p $(@D)
  98. @$(DOCKER) $(CC) -E $(CFLAGS) $(INC) $(DEF) -MM -MT $(OBJ_DIR)/$(<:.c=.o) -MF $@ $<
  99. # c file objects depent on .c AND dependency files, which have an empty recipe
  100. $(OBJ_DIR)/%.o: %.c $(DEP_DIR)/%.d
  101. @mkdir -p $(@D)
  102. $(DOCKER) $(CC) -c $(CFLAGS) $(INC) $(DEF) -o $@ $<
  103. $(DEP_DIR)/%.d: %.cpp
  104. @mkdir -p $(@D)
  105. @$(DOCKER) $(CXX) -E $(CXXFLAGS) $(INC) $(DEF) -MM -MT $(OBJ_DIR)/$(<:.cpp=.o) -MF $@ $<
  106. # cpp file objects depent on .cpp AND dependency files, which have an empty recipe
  107. $(OBJ_DIR)/%.o: %.cpp $(DEP_DIR)/%.d
  108. @mkdir -p $(@D)
  109. $(DOCKER) $(CXX) -c $(CXXFLAGS) $(INC) $(DEF) -o $@ $<
  110. # empty recipe for dependency files. This prevents make errors
  111. $(DEP):
  112. # now include all dependencies
  113. # After all they are makefile dependency rules ;)
  114. include $(wildcard $(DEP))
  115. # main target rule
  116. $(BUILD_DIR)/$(TARGET): $(OBJ)
  117. @mkdir -p $(@D)
  118. @echo Linking to target: $(TARGET)
  119. @echo $(DOCKER) $(CXX) $(LDFLAGS) $(MAP_FLAG) -o $(@D)/$(TARGET) '$$(OBJ)'
  120. @$(DOCKER) $(CXX) $(LDFLAGS) $(MAP_FLAG) -o $(@D)/$(TARGET) $(OBJ)
  121. @echo
  122. @echo Print size information
  123. @$(CSIZE) $(@D)/$(TARGET)
  124. @echo Done
  125. .PHONY: clean
  126. clean:
  127. @echo Cleaning build directories
  128. @rm -rf $(OBJ_DIR)
  129. @rm -rf $(DEP_DIR)
  130. @rm -rf $(BUILD_DIR)
  131. #
  132. # ================ Local build rules =================
  133. # example:
  134. # make debug
  135. debug: CFLAGS := $(DEB_CFLAGS)
  136. debug: $(BUILD_DIR)/$(TARGET)
  137. release: CFLAGS := $(REL_CFLAGS)
  138. release: $(BUILD_DIR)/$(TARGET)
  139. all: release
  140. hpc-results/post:
  141. $(CXX) $(CFLAGS) -o $@ hpc-results/main.cpp
  142. hpc-clean:
  143. rm hpc-results/post
  144. #
  145. # ================ Local via docker build rules =================
  146. #
  147. # examples:
  148. # make IMAGE=hpcimage v0
  149. # make IMAGE=hpcimage v1_cilk
  150. #
  151. local_v0: CFLAGS := $(DEB_CFLAGS) -DCODE_VERSION=0
  152. local_v0: CXXFLAGS := $(DEB_CXXFLAGS) -DCODE_VERSION=0
  153. local_v0: TARGET := local_v0
  154. local_v0: $(BUILD_DIR)/$(TARGET)
  155. cp $(BUILD_DIR)/$(TARGET) out/$(TARGET)
  156. local_v1: CFLAGS := $(DEB_CFLAGS) -DCODE_VERSION=4
  157. local_v1: CXXFLAGS := $(DEB_CXXFLAGS) -DCODE_VERSION=4
  158. local_v1: TARGET := local_v1
  159. local_v1: $(BUILD_DIR)/$(TARGET)
  160. cp $(BUILD_DIR)/$(TARGET) out/$(TARGET)
  161. v0: DOCKER := $(DOCKER_CMD)
  162. v0: CFLAGS := $(REL_CFLAGS) -DCODE_VERSION=0
  163. v0: CXXFLAGS := $(REL_CXXFLAGS) -DCODE_VERSION=0
  164. v0: TARGET := knnsearch_v0
  165. v0: $(BUILD_DIR)/$(TARGET)
  166. cp $(BUILD_DIR)/$(TARGET) out/$(TARGET)
  167. v1_cilk: DOCKER := $(DOCKER_CMD)
  168. v1_cilk: CXX := /usr/local/OpenCilk-9.0.1-Linux/bin/clang++
  169. v1_cilk: CFLAGS := $(REL_CFLAGS) -fcilkplus -DCODE_VERSION=1 -DCILK
  170. v1_cilk: CXXFLAGS := $(REL_CXXFLAGS) -fcilkplus -DCODE_VERSION=1 -DCILK
  171. v1_cilk: LDFLAGS += -fcilkplus
  172. v1_cilk: TARGET := knnsearch_cilkv1
  173. v1_cilk: $(BUILD_DIR)/$(TARGET)
  174. cp $(BUILD_DIR)/$(TARGET) out/$(TARGET)
  175. v1_omp: DOCKER := $(DOCKER_CMD)
  176. v1_omp: CFLAGS := $(REL_CFLAGS) -fopenmp -DCODE_VERSION=1 -DOMP
  177. v1_omp: CXXFLAGS := $(REL_CXXFLAGS) -fopenmp -DCODE_VERSION=1 -DOMP
  178. v1_omp: LDFLAGS += -fopenmp
  179. v1_omp: TARGET := knnsearch_ompv1
  180. v1_omp: $(BUILD_DIR)/$(TARGET)
  181. cp $(BUILD_DIR)/$(TARGET) out/$(TARGET)
  182. v1: DOCKER := $(DOCKER_CMD)
  183. v1: CFLAGS := $(REL_CFLAGS) -DCODE_VERSION=1
  184. v1: CXXFLAGS := $(REL_CXXFLAGS) -DCODE_VERSION=1
  185. v1: TARGET := knnsearch_v1
  186. v1: $(BUILD_DIR)/$(TARGET)
  187. cp $(BUILD_DIR)/$(TARGET) out/$(TARGET)
  188. #
  189. # ========= Inside CSAL Image build rules ===========
  190. #
  191. # 1) first jump into image (make sure you are in the directory where Makefile is):
  192. # > docker run -it -v ${PWD}:/usr/src/exercise_1 -w /usr/src/exercise_1/ hpcimage
  193. # 2) Clean binaries first **important**
  194. # > make clean
  195. # 3) for v4 cilk for example:
  196. # > make csal_v4_cilk
  197. # 4) run executables from `bin/`. Examples:
  198. # > ./bin/tcount_ompv3 -i mtx/NACA0015.mtx --timing -r 3 -o /dev/null
  199. # > ./bin/tcount_pthv4 -i mtx/com_Youtube.mtx --timing --dynamic --print_count
  200. csal_v0: CFLAGS := $(REL_CFLAGS) -DCODE_VERSION=0
  201. csal_v0: TARGET := knnsearch_v0
  202. csal_v0: $(BUILD_DIR)/$(TARGET)
  203. csal_v1_cilk: CXX := /usr/local/OpenCilk-9.0.1-Linux/bin/clang++
  204. csal_v1_cilk: CFLAGS := $(REL_CFLAGS) -fcilkplus -DCODE_VERSION=1 -DCILK
  205. csal_v1_cilk: CXXFLAGS := $(REL_CXXFLAGS) -fcilkplus -DCODE_VERSION=1 -DCILK
  206. csal_v1_cilk: LDFLAGS += -fcilkplus
  207. csal_v1_cilk: TARGET := knnsearch_cilkv1
  208. csal_v1_cilk: $(BUILD_DIR)/$(TARGET)
  209. csal_v1_omp: CFLAGS := $(REL_CFLAGS) -fopenmp -DCODE_VERSION=1 -DOMP
  210. csal_v1_omp: CXXFLAGS := $(REL_CXXFLAGS) -fopenmp -DCODE_VERSION=1 -DOMP
  211. csal_v1_omp: LDFLAGS += -fopenmp
  212. csal_v1_omp: TARGET := knnsearch_ompv1
  213. csal_v1_omp: $(BUILD_DIR)/$(TARGET)
  214. csal_v1: CFLAGS := $(REL_CFLAGS) -DCODE_VERSION=1
  215. csal_v1: CXXFLAGS := $(REL_CXXFLAGS) -DCODE_VERSION=1
  216. csal_v1: TARGET := knnsearch_v1
  217. csal_v1: $(BUILD_DIR)/$(TARGET)