3 # Author : Cedric.Bilat@he-arc.ch
5 # See : OptionCompilateur.txt
7 # Hyp : Application that must be in path
13 ##############################################
15 ##############################################
17 # Hyp : Environement Variables must be set
19 # ARCHI_32_64 : 32 or 64
24 ##############################################
26 ##############################################
29 #MACHINE:=${shell uname -m}
36 TARGET_NAME:=${TARGET_NAME}_$(ARCHI_32_64)
38 TARGET_NAME:=$(TARGET_NAME)_ARM
45 OBJ_FILES_CPP:= $(SRC_CPP_FILES:.cpp=.$(EXTENSION_OBJ))
46 OBJ_FILES_C:= $(SRC_C_FILES:.c=.$(EXTENSION_OBJ))
48 OBJ_FILES:= ${OBJ_FILES_CPP} ${OBJ_FILES_C}
54 TARGET_NAME_EXE:=$(TARGET_NAME).${EXTENSION_EXE}
55 TARGET_NAME_DLL:=${LIB_PREFIXE}$(TARGET_NAME).$(EXTENSION_DLL)
56 TARGET_NAME_LIB:=${LIB_PREFIXE}$(TARGET_NAME).${EXTENSION_LIB}
58 TARGET_EXE:=${TARGET_BIN_PATH}/$(TARGET_NAME_EXE)
59 TARGET_DLL:=${TARGET_BIN_PATH}/$(TARGET_NAME_DLL)
60 TARGET_LIB:=${TARGET_BIN_PATH}/$(TARGET_NAME_LIB)
61 TARGET_OBJ:=$(addprefix $(TARGET_OBJ_PATH)/,$(notdir $(OBJ_FILES)))
63 #Selection de la target en fonction TARGET_MODE
64 ifeq ($(TARGET_MODE),EXE)
66 TARGET_DEPLOY:=$(TARGET_DEPLOY_PATH_BIN)/$(TARGET_NAME_EXE)
69 ifeq ($(TARGET_MODE),SHARED_LIB)
71 TARGET_DEPLOY:=$(TARGET_DEPLOY_PATH_BIN)/$(TARGET_NAME_DLL)
72 override LDFLAGS += $(LINK_FLAG_DLL)
75 ifeq ($(TARGET_MODE),STATIC_LIB)
77 TARGET_DEPLOY:=$(TARGET_DEPLOY_PATH_BIN)/$(TARGET_NAME_LIB)
84 ifeq (,$(findstring $(RESOURCES_PATH),$(wildcard $(RESOURCES_PATH) )))
87 nbFileRessources:=$(shell ls $(RESOURCES_PATH) | wc -l )
94 VPATH := $(SRC_PATH_ALL)
101 space:= #ne suufit pas ajoutre espaca, mais += le fait!
110 API_BIN_FORMATTER:=$(subst ${space},${separateurPath},${API_BIN})
113 override PATH:=${PATH}${separateurPath}${API_BIN_FORMATTER}#
116 override LD_LIBRARY_PATH:=${LD_LIBRARY_PATH}${separateurPath}${API_BIN_FORMATTER}#
117 export ${LD_LIBRARY_PATH}#fixme semble pas marcher
126 include ${ROOT_MAKEFILE_PRIVATE_CPP}/optimisation.mk
132 include ${ROOT_MAKEFILE_PRIVATE_CPP}/gcc_arm.mk
138 override CXXFLAGS:=$(filter-out $(CXXFLAGS_EXCLUDE),$(CXXFLAGS))
139 #https://www.gnu.org/software/make/manual/make.html#Functions
149 override CXXFLAGS:=$(call uniq,${CXXFLAGS})
150 override CXXLDFLAGS:=$(call uniq,${CXXLDFLAGS})
151 override ARFLAGS:=$(call uniq,${ARFLAGS})
152 #override AR_OUT_FLAG:=$(call uniq,${AR_OUT_FLAG})#met espace apres /out, pas pour visual/intel
155 #${info "CXXFLAGS= "${CXXFLAGS}}#print immediately
156 #${info "CXXLDFLAGS"= ${CXXLDFLAGS}}#print immediatel
157 #${info "ARFLAGS= "${ARFLAGS}}#print immediatel
158 #${info "AR_OUT_FLAG= "${AR_OUT_FLAG}}#print immediatel
166 #let a minimum of one space
171 override CXXFLAGS:=$(strip ${CXXFLAGS})
172 override CXXLDFLAGS:=$(strip ${CXXLDFLAGS})
173 override ARFLAGS:=$(strip ${ARFLAGS})
174 #override AR_OUT_FLAG:=$(strip ${AR_OUT_FLAG}) #pas pour mingw car enleve espace apres -r
176 #override CXXFLAGS:=$(subst $(space),,$(CXXFLAGS))
185 override TIME_START:=$(shell date +%T)
186 TIME_CURRENT=$(shell date +%T)
187 #TIME_DELTA:=$(shell echo $(TIME_CURRENT) - $(TIME_START) | bc) #marche pas
189 ##############################################
191 ##############################################
193 # tabulation obligatoire before @
195 TITLE:=$(TARGET_NAME)
201 ${TARGET_EXE}:$(TARGET_OBJ)
202 #@echo "$(CXX) $(OUT_FILE_LINK)${TARGET_EXE} $^ $(LDFLAGS)"
204 @echo "[CBI] -> Linking to : "$(TARGET)
206 @echo "[CBI] -> Library Link :"
208 ifeq (${COMPILATEUR},VISUAL)
209 @${ROOT_MAKEFILE_PRIVATE_COMMON_SCRIPT}/print.sh $(sort $(call containing,.${EXTENSION_LIB},$(LDFLAGS)))
211 ifeq (${COMPILATEUR},INTEL)
212 @${ROOT_MAKEFILE_PRIVATE_COMMON_SCRIPT}/print.sh $(sort $(call containing,.${EXTENSION_LIB},$(LDFLAGS)))
214 ifeq (${COMPILATEUR},MINGW)
215 @${ROOT_MAKEFILE_PRIVATE_COMMON_SCRIPT}/print.sh $(sort $(call containing,-${LIB_FLAG_SEPARATOR},$(LDFLAGS)))
218 @${ROOT_MAKEFILE_PRIVATE_COMMON_SCRIPT}/print.sh $(sort $(call containing,-l,$(LDFLAGS)))
220 @$(CXX) $(OUT_FILE_LINK)${TARGET_EXE} $^ $(LDFLAGS)
222 @echo "=================================================================================="
223 @echo "[CBI] -> Target Name : "$(TARGET_NAME)
224 @echo "[CBI] -> Location : "$(TARGET)
225 @echo "[CBI] -> Deploy : "$(TARGET_DEPLOY_PATH_BIN)
227 @echo "[CBI] -> Type : "$(TARGET_MODE)
228 @echo "[CBI] -> Arch : "$(ARCHI_32_64)
229 @echo "[CBI] -> OS : "$(OS)
230 @echo "[CBI] -> User : "$(USER)
232 @echo "[CBI] -> Compilateur : ${COMPILATEUR} (${CXX})"
233 @echo "[CBI] -> Task : End Compiling-Linking !"
234 @echo "[CBI] -> Time : "${TIME_CURRENT}
235 @echo "=================================================================================="
242 ${TARGET_DLL}:$(TARGET_OBJ)
243 #@echo "$(CXX) $(OUT_FILE_LINK)${TARGET_DLL} $^ $(LDFLAGS)"
245 @echo "[$(TITLE)] -> Linking to : "$(TARGET)
247 @echo "[$(TITLE)] -> Library Link :"
251 ifeq (${COMPILATEUR},VISUAL)
252 @${ROOT_MAKEFILE_PRIVATE_COMMON_SCRIPT}/print.sh $(sort $(call containing,.${EXTENSION_LIB},$(LDFLAGS)))
254 ifeq (${COMPILATEUR},INTEL)
255 @${ROOT_MAKEFILE_PRIVATE_COMMON_SCRIPT}/print.sh $(sort $(call containing,.${EXTENSION_LIB},$(LDFLAGS)))
257 ifeq (${COMPILATEUR},MINGW)
258 @${ROOT_MAKEFILE_PRIVATE_COMMON_SCRIPT}/print.sh $(sort $(call containing,-${LIB_FLAG_SEPARATOR},$(LDFLAGS)))
261 @${ROOT_MAKEFILE_PRIVATE_COMMON_SCRIPT}/print.sh $(sort $(call containing,-l,$(LDFLAGS)))
264 @$(CXX) $(OUT_FILE_LINK)${TARGET_DLL} $^ $(LDFLAGS)
266 @echo "=================================================================================="
267 @echo "[CBI] -> Target Name : "$(TARGET_NAME)
268 @echo "[CBI] -> Location : "$(TARGET)
269 @echo "[CBI] -> Deploy : "$(TARGET_DEPLOY_PATH_BIN)
271 @echo "[CBI] -> Type : "$(TARGET_MODE)
272 @echo "[CBI] -> Arch : "$(ARCHI_32_64)
273 @echo "[CBI] -> OS : "$(OS)
274 @echo "[CBI] -> User : "$(USER)
276 @echo "[CBI] -> Compilateur : ${COMPILATEUR} (${CXX})"
277 @echo "[CBI] -> Task : End Compiling-Linking !"
278 @echo "[CBI] -> Time : "${TIME_CURRENT}
279 @echo "=================================================================================="
286 ${TARGET_LIB}:$(TARGET_OBJ)
287 #@echo "${AR} ${AR_OUT_FLAG}${TARGET_LIB} ${ARFLAGS} $^"
289 @${AR} ${AR_OUT_FLAG}${TARGET_LIB} ${ARFLAGS} $^
291 @echo "=================================================================================="
292 @echo "[CBI] -> Target Name : "$(TARGET_NAME)
293 @echo "[CBI] -> Location : "$(TARGET)
294 @echo "[CBI] -> Deploy : "$(TARGET_DEPLOY_PATH_BIN)
296 @echo "[CBI] -> Type : "$(TARGET_MODE)
297 @echo "[CBI] -> Arch : "$(ARCHI_32_64)
298 @echo "[CBI] -> OS : "$(OS)
299 @echo "[CBI] -> User : "$(USER)
301 @echo "[CBI] -> Compilateur : ${COMPILATEUR} (${CXX})"
302 @echo "[CBI] -> Task : End Compiling-Archive !"
303 @echo "[CBI] -> Time : "${TIME_CURRENT}
304 @echo "=================================================================================="
311 $(TARGET_OBJ_PATH)/%.$(EXTENSION_OBJ):%.cpp
312 #@echo "$(CXX) $(CXXFLAGS) $(OUT_FILE_COMPILE)$@ -c $<"
313 #intelWin et visual affiche deja file
314 ifeq (${COMPILATEUR},MINGW)
315 @echo "[$(TITLE)] -> ${CXX} compiling .cpp : "$<
317 ifeq (${COMPILATEUR},g++)
318 @echo "[$(TITLE)] -> ${CXX} compiling .cpp : "$<
320 ifeq (${COMPILATEUR},INTEL)
322 @echo "[$(TITLE)] -> ${CXX} compiling .cpp : "$<
325 @$(CXX) $(CXXFLAGS) $(OUT_FILE_COMPILE)$@ -c $<
333 $(TARGET_OBJ_PATH)/%.$(EXTENSION_OBJ):%.c
334 #@echo "" $(CXX) $(CXXFLAGS) $(OUT_FILE_COMPILE)$@ -c $<
335 #intelWin et visual affiche deja file
336 ifeq (${COMPILATEUR},MINGW)
337 @echo "[$(TITLE)] -> ${CXX} compiling .c : "$<
339 ifeq (${COMPILATEUR},g++)
340 @echo "[$(TITLE)] -> ${CXX} compiling .c : "$<
342 ifeq (${COMPILATEUR},INTEL)
344 @echo "[$(TITLE)] -> ${CXX} compiling .cpp : "$<
347 @$(CXX) $(CXXFLAGS) $(OUT_FILE_COMPILE)$@ -c $<
351 ##############################################
353 ##############################################
355 all: echoing init $(TARGET) deploy
357 @echo "[CBI] -> "$(TITLE)" : End ALL!"
374 #create folder heirerarchy TARGET_BIN_PATH iff don't exist
375 ifeq (,$(findstring $(TARGET_BIN_PATH),$(wildcard $(TARGET_BIN_PATH) )))
376 @$(shell mkdir -p $(TARGET_BIN_PATH))
377 @echo "[CBI] -> Create folder : "$(TARGET_BIN_PATH)
379 #create folder heirerarchy TARGET_OBJ_PATH iff don't exist
380 ifeq (,$(findstring $(TARGET_OBJ_PATH),$(wildcard $(TARGET_OBJ_PATH) )))
381 @$(shell mkdir -p $(TARGET_OBJ_PATH))
382 @echo "[CBI] -> Create folder : "$(TARGET_OBJ_PATH)
384 ifeq (,$(findstring $(TARGET_DEPLOY_PATH_BIN),$(wildcard $(TARGET_DEPLOY_PATH_BIN) )))
385 @$(shell mkdir -p $(TARGET_DEPLOY_PATH_BIN))
386 @echo "[CBI] -> Create folder : "$(TARGET_DEPLOY_PATH_BIN)
390 # -p permet de cr�er l�arborescence complete si existe pas
397 run: printRuntimeInfo
399 @echo "[CBI] -> Running : "$(TARGET) $(ARGS)
401 @echo "------------------------------------------------------------------------"
405 #$(MAKECMDGOALS) donne liste des para de make, et ainsi les args du code en c si il y en a
408 runDeploy: printRuntimeInfo
410 @echo "[CBI] -> Running : "$(TARGET_DEPLOY) $(ARGS)
412 @echo "------------------------------------------------------------------------"
415 @$(TARGET_DEPLOY) $(ARGS)
418 runGl: printRuntimeInfo
419 #gl is a wrapper of virtualgl
420 #gl is necessary to run opengl remotely with turbovnc
423 @echo "[CBI] -> Running remote-gl : "$(TARGET) $(ARGS)
426 @gl $(TARGET) $(ARGS)
429 runGlDeploy: printRuntimeInfo
430 #gl is a wrapper of virtualgl
431 #gl is necessary to run opengl remotely with turbovnc
434 @echo "[CBI] -> Running remote-gl : "$(TARGET_DEPLOY) $(ARGS)
437 @gl $(TARGET_DEPLOY) $(ARGS)
440 .PHONY: printRuntimeInfo
442 @echo "[CBI] -> API BIN :"
443 @${ROOT_MAKEFILE_PRIVATE_COMMON_SCRIPT}/print.sh ${sort ${API_BIN}}
445 @echo "[CBI] -> ARGS :"
446 @${ROOT_MAKEFILE_PRIVATE_COMMON_SCRIPT}/print.sh ${sort ${ARGS}}
455 @echo "[CBI] -> killing : "${TARGET_NAME_EXE}
456 @killall ${TARGET_NAME_EXE}
458 @echo "[CBI] -> done!"
462 @echo "[CBI] -> killing : "${TARGET_NAME_EXE}
463 @powershell stop-process -processname ${TARGET_NAME}
465 @echo "[CBI] -> done"!
471 .PHONY: dependenciesLinux
472 dependenciesLinux: printRuntimeInfo
474 ifeq (${TARGET_MODE},STATIC_LIB)
475 @echo "[${TARGET_NAME}.${EXTENSION_LIB}] depends from :"
477 @ar -t ${TARGET_DEPLOY}
478 else ifeq (${TARGET_MODE},SHARED_LIB)
479 @echo "[${TARGET_NAME}.${EXTENSION_DLL}] depends from :"
481 @ldd -v ${TARGET_DEPLOY}
483 @echo "[${TARGET_NAME}.run] depends from :"
485 @ldd -v ${TARGET_DEPLOY}
489 .PHONY: dependenciesWin
490 dependenciesWin: printRuntimeInfo
492 @echo "[CBI] -> Dependencies .dll : "${TARGET_NAME_EXE}
493 @${DEPENDS_EXE} ${TARGET_DEPLOY}
500 .PHONY: contentsLinux
503 ifeq (${TARGET_MODE},STATIC_LIB)
504 @echo "[${TARGET_NAME}.${EXTENSION_LIB}] export :"
506 @ar -t ${TARGET_DEPLOY}
507 else ifeq (${TARGET_MODE},SHARED_LIB)
508 @echo "[${TARGET_NAME}.${EXTENSION_DLL}] export:"
512 @nm -D --defined-only --extern--only ${TARGET_DEPLOY}
514 @echo "[CBI] -> readelf"
516 @readelf -s ${TARGET_DEPLOY}
520 .PHONY: contententsWin
521 contententsWin: printRuntimeInfo
523 @echo "[CBI] -> Dependencies .dll : "${TARGET_NAME_EXE}
524 @${DEPENDS_EXE} ${TARGET_DEPLOY}
533 @$(shell cp $(TARGET) $(TARGET_DEPLOY))
535 @echo "[CBI] -> Deploying : "$(TARGET_DEPLOY)
536 ifneq ($(nbFileRessources),0)
537 @echo "[CBI] -> Copying : "$(RESOURCES_PATH)" -> "${TARGET_DEPLOY_PATH_BIN}
538 @cp -f -r $(RESOURCES_PATH)/* $(TARGET_DEPLOY_PATH_BIN)
546 include ${ROOT_MAKEFILE_PRIVATE_DOC}/doxyCPP.mk
554 @rm -f $(TARGET_OBJ_PATH)/*.o
555 @rm -f $(TARGET_OBJ_PATH)/*.obj
556 @rm -f $(TARGET_BIN_PATH)/*.exp
557 @rm -f $(TARGET_BIN_PATH)/*.html
558 @rm -f $(TARGET_BIN_PATH)/*.lib
559 @rm -f $(TARGET_BIN_PATH)/*.a
560 @rm -f $(TARGET_BIN_PATH)/*.def
561 @rm -f $(TARGET_BIN_PATH)/*.map
563 @rm -f $(TARGET_DEPLOY)
564 @rm -f $(TARGET_DOC_DEPLOY_FILE)
565 @rm -f -r $(TARGET_DOC_PATH)
567 @echo "=================================================================================="
568 @echo "[CBI] -> Target : "$(TARGET_NAME)
569 @echo "[CBI] -> Task : DELETE"
571 @echo "[CBI] -> Delete .obj : "$(TARGET_OBJ_PATH)
572 @echo "[CBI] -> Delete .bin : "$(TARGET_BIN_PATH)
573 @echo "[CBI] -> Delete doc : "$(TARGET_DOC_PATH)
575 @echo "[CBI] -> Delete deploy : "$(TARGET_DEPLOY)
576 @echo "[CBI] -> Delete deploy doc : "$(TARGET_DOC_DEPLOY_FILE)
577 @echo "=================================================================================="
582 # -f pas d'erreur si file existe pas
583 #rm -rf #serait recursif (dangereux!!)
587 @rm -f ${TARGET_DEPLOY_PATH_BIN}/*.lib
588 @rm -f ${TARGET_DEPLOY_PATH_BIN}/*.so
589 @rm -f ${TARGET_DEPLOY_PATH_BIN}/*.dll
590 @rm -f ${TARGET_DEPLOY_PATH_BIN}/*.run
591 @rm -f ${TARGET_DEPLOY_PATH_BIN}/*.exe
592 @rm -f ${TARGET_DEPLOY_PATH_BIN}/*.a
593 @rm -f ${TARGET_DEPLOY_PATH_DOC}/*.gz
598 @rm -f -r ${TARGET_PATH_ROOT}
601 cleanAll: cleanTitleStart cleanDeploy cleanTemp cleanTitleEnd
603 .PHONY: cleanTitleStart
605 @echo "=================================================================================="
606 @echo "[CBI] -> Delete : "${TARGET_DEPLOY_PATH_BIN}"/*"
607 @echo "[CBI] -> Delete : "${TARGET_DEPLOY_PATH_DOC}"/*"
608 @echo "[CBI] -> Delete : "${TARGET_PATH_ROOT}
609 @echo "=================================================================================="
611 @echo "[CBI] -> Please wait ..."
612 @echo "[CBI] -> Deleting ..."
615 .PHONY: cleanTitleEnd
617 @echo "=================================================================================="
618 @echo "[CBI] -> Delete : finished!"
619 @echo "=================================================================================="
627 @echo "=================================================================================="
628 @echo "[CBI] -> Target Name : "$(TARGET_NAME)
630 @echo "[CBI] -> Build : "$(TARGET)
631 @echo "[CBI] -> Deploy : "$(TARGET_DEPLOY_PATH_BIN)
633 @echo "[CBI] -> Type : "$(TARGET_MODE)
634 @echo "[CBI] -> Arch : "$(ARCHI_32_64)
635 @echo "[CBI] -> OS : "$(OS)
636 @echo "[CBI] -> User : "$(USER)
638 @echo "[CBI] -> Task : Compiling-Linking"
639 #@echo "[CBI]->Time : "${TIME_CURRENT}
640 @echo "=================================================================================="
642 @echo "[CBI] -> SRC AUX (Recursif) :"
645 @${ROOT_MAKEFILE_PRIVATE_COMMON_SCRIPT}/print.sh $(sort $(SRC_AUX))
647 @echo "[CBI] -> CXXFLAGS (Partial) :"
650 @${ROOT_MAKEFILE_PRIVATE_COMMON_SCRIPT}/print.sh $(sort $(call not-containing,${OPTION_SEPARATOR}$(HEADER_OPTION),$(CXXFLAGS)))
652 ifneq (${TARGET_MODE},STATIC_LIB)
653 @echo "[CBI] -> LDFLAGS (Partial) :"
657 ifeq (${COMPILATEUR},VISUAL)
658 @${ROOT_MAKEFILE_PRIVATE_COMMON_SCRIPT}/print.sh $(sort $(call not-containing,${LIB_PATH_SEPARATOR},$(call not-containing,.${EXTENSION_LIB},$(LDFLAGS))))
660 ifeq (${COMPILATEUR},INTEL)
661 @${ROOT_MAKEFILE_PRIVATE_COMMON_SCRIPT}/print.sh $(sort $(call not-containing,${LIB_PATH_SEPARATOR},$(call not-containing,.${EXTENSION_LIB},$(LDFLAGS))))
663 ifeq (${COMPILATEUR},MINGW)
664 @${ROOT_MAKEFILE_PRIVATE_COMMON_SCRIPT}/print.sh $(sort $(call not-containing,-${LIB_FLAG_SEPARATOR},$(call not-containing,-${LIB_PATH_SEPARATOR},$(LDFLAGS))))
667 @${ROOT_MAKEFILE_PRIVATE_COMMON_SCRIPT}/print.sh $(sort $(call not-containing,-${LIB_FLAG_SEPARATOR},$(call not-containing,-${LIB_PATH_SEPARATOR},$(LDFLAGS))))
671 @echo "[CBI] -> INC_PATH (auto detect):"
672 @${ROOT_MAKEFILE_PRIVATE_COMMON_SCRIPT}/print.sh $(sort $(INC_PATH))
675 @echo "[CBI] -> LIB_PATH (auto detect):"
676 @${ROOT_MAKEFILE_PRIVATE_COMMON_SCRIPT}/print.sh $(sort $(LIB_PATH))
680 ##############################################
682 ##############################################
684 # target : dependencies
686 # $@ = name of the target
687 # $^ = all dependencie of a target
688 # $< =first (unique dependency of a target) (rm, compilation,linking)
690 # @ = diminue verbosite commande
692 # Attention : tabulation obligatoire avant commande dans rule!!
694 # http://www.gnu.org/software/make/manual/
696 #############################################
698 #############################################