Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-10-14 08:08:00

0001 ########################################
0002 ########## HOW TO USE
0003 ########################################
0004 
0005 ######### Clean build
0006 # make clean
0007 
0008 ######### Build evth: both interface to G4 and its tests:
0009 # make
0010 # (or make all)
0011 # (obviously, you can also do: make -j8)
0012 
0013 ######### Build test executables only
0014 # make test
0015 
0016 ######### Build interface to G4 only
0017 # make interface
0018 
0019 ######### Create environment scripts
0020 # make env
0021 # (creates env_FLUKA.sh and env_FLUKA_G4_interface.sh)
0022 
0023 ######### Create env_FLUKA_G4_interface.sh only
0024 # make env_FLUKA_G4_interface
0025 # (env_FLUKA_G4_interface.sh needs to be sourced before compiling / running any test or G4 application using the FLUKA-G4 interface).
0026 
0027 
0028 
0029 ########################################
0030 ########## EXTERNAL DEPENDENCIES
0031 ########################################
0032 
0033 ######### FLUKA
0034 FLUKA_PATH := $(realpath $(shell dirname $(shell which fluka))/..)
0035 ifeq ($(wildcard $(FLUKA_PATH)/.*),)
0036 $(error "fluka executables not found. FLUKA_REPO=$(FLUKA_PATH). Add your fluka_repo/bin to the PATH." )
0037 endif
0038 
0039 FLUKA_INCLUDE_DIR := $(FLUKA_PATH)/include
0040 ifeq ($(wildcard $(FLUKA_INCLUDE_DIR)/.*),) 
0041 $(error "FLUKA_INCLUDE_DIR=$(FLUKA_INCLUDE_DIR)/ does not contain any file. Add your fluka_repo/bin to the PATH." )
0042 endif
0043 FLUKA_LIB_DIR := $(FLUKA_PATH)/lib
0044 ifeq ($(wildcard $(FLUKA_LIB_DIR)/$(FLUKA_LIB)),)
0045 $(error "FLUKA_LIB_DIR=$(FLUKA_LIB_DIR)/ does not contain $(FLUKA_LIB). Add your fluka_repo/bin to the PATH." )
0046 endif
0047 FLUKA_LIB_NAME := fluka
0048 FLUKA_LIB := lib$(FLUKA_LIB_NAME).a
0049 FLUKA_NO_RANDOM_LIB_NAME := fluka_no_random
0050 FLUKA_NO_RANDOM_LIB := lib$(FLUKA_NO_RANDOM_LIB_NAME).a
0051 FLUKA_OBJ_REMOVE := flrm64.o flrndm.o flrnlp.o flrnoc.o
0052 FLUKA_RELEASE_LIB_LINK := -L$(FLUKA_LIB_DIR) -l$(FLUKA_LIB_NAME)
0053 FLUKA_LIB_LINK := -L$(FLUKA_LIB_DIR) -l$(FLUKA_NO_RANDOM_LIB_NAME)
0054 
0055 
0056 ######### G4
0057 G4_PATH := $(realpath $(shell geant4-config --prefix))
0058 G4_INCLUDE_DIR := $(G4_PATH)/include/Geant4
0059 G4_INCLUDE := -I$(G4_INCLUDE_DIR)
0060 G4_CXX_FLAGS := $(shell geant4-config --cflags)
0061 G4_LIBRARIES := $(shell geant4-config --libs)
0062 
0063 
0064 
0065 ########################################
0066 ########## COMPILER & FLAGS
0067 ########################################
0068 
0069 ######### C++ compiler and flags
0070 CXX_COMP := g++
0071 CXX_FLAGS := $(shell fluka-config --cppflags)
0072 
0073 
0074 ######### Fortran compiler and flags
0075 F_COMP := gfortran
0076 F_FLAGS := $(shell fluka-config --fflags)
0077 
0078 
0079 ######### Linker flag
0080 LD_FLAGS := -lgfortran
0081 
0082 
0083 ######### Check compilers collection version
0084 IS_CXX_COMP_GT_7 := $(shell expr `gcc -dumpversion | cut -f1 -d.` \>= 7)
0085 ifneq "$(IS_CXX_COMP_GT_7)" "1"
0086 $(error "gcc suite version = $(shell gcc -dumpversion). Only versions >= 7 are supported!")
0087 endif
0088 
0089 
0090 
0091 ########################################
0092 ########## PROJECT DIRECTORIES
0093 ########################################
0094 
0095 # Base dir
0096 BASE_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
0097 
0098 # Source code
0099 SRC_DIR := $(BASE_DIR)/source
0100 
0101 # Directory where to put object and dependency files
0102 OBJ_DIR := $(BASE_DIR)/obj
0103 INTERFACE_OBJ_DIR := $(OBJ_DIR)/interface
0104 TEST_INTERFACE_TO_G4_OBJ_DIR := $(OBJ_DIR)/test_interface_to_G4
0105 
0106 # Directory where to put executables
0107 BIN_DIR := $(BASE_DIR)/bin
0108 
0109 CLEAN_DIR := $(OBJ_DIR) $(BIN_DIR)
0110 
0111 
0112 
0113 ########################################
0114 ########## PROJECT FILES
0115 ########################################
0116 
0117 ######### FORTRAN SOURCE
0118 F_SRC_DIR := $(SRC_DIR)/fluka4_wrapper/fortran/procedures \
0119         $(SRC_DIR)/cpp_fortran_bridges/fortran
0120 
0121 F_INCLUDE := -I$(FLUKA_INCLUDE_DIR) -J$(FLUKA_INCLUDE_DIR)
0122 F_SRC := $(foreach src_dir, $(F_SRC_DIR), $(wildcard $(src_dir)/*.f))
0123 F_OBJ := $(addprefix $(OBJ_DIR)/, $(notdir $(F_SRC:.f=.o)))
0124 
0125 ######### C++ SOURCE
0126 CXX_SRC_DIR := $(SRC_DIR)/fluka4_wrapper/cpp/procedures \
0127         $(SRC_DIR)/cpp_fortran_bridges/cpp \
0128         $(SRC_DIR)/cpp_utils
0129         
0130 CXX_INCLUDE_DIR := $(CXX_SRC_DIR) $(FLUKA_INCLUDE_DIR)
0131 CXX_INCLUDE := $(addprefix -I, $(CXX_INCLUDE_DIR))
0132 CXX_SRC := $(foreach src_dir, $(CXX_SRC_DIR), $(wildcard $(src_dir)/*.cc))
0133 CXX_OBJ := $(addprefix $(OBJ_DIR)/, $(notdir $(CXX_SRC:.cc=.o)))
0134 
0135 ######### INTERFACE TO G4
0136 INTERFACE_SRC_DIR := $(SRC_DIR)/fluka5/hadronic_interactions/interface_to_G4 \
0137         $(SRC_DIR)/fluka_G4_bridges \
0138         $(SRC_DIR)/fluka_G4_physics_list
0139         
0140 INTERFACE_INCLUDE_DIR := $(INTERFACE_SRC_DIR)
0141 INTERFACE_INCLUDE := $(addprefix -I, $(INTERFACE_INCLUDE_DIR))
0142 INTERFACE_SRC := $(foreach src_dir, $(INTERFACE_SRC_DIR), $(wildcard $(src_dir)/*.cc))
0143 INTERFACE_OBJ := $(addprefix $(INTERFACE_OBJ_DIR)/, $(notdir $(INTERFACE_SRC:.cc=.o)))
0144 
0145 ######### TEST INTERFACE TO G4 (EXECUTABLE)
0146 TEST_INTERFACE_TO_G4_SRC_DIR := $(SRC_DIR)/fluka5/hadronic_interactions/test/interface_to_G4
0147 TEST_INTERFACE_TO_G4_SRC := $(foreach src_dir, $(TEST_INTERFACE_TO_G4_SRC_DIR), $(wildcard $(src_dir)/*.cc))
0148 TEST_INTERFACE_TO_G4_INCLUDE_DIR := $(TEST_INTERFACE_TO_G4_SRC_DIR)
0149 TEST_INTERFACE_TO_G4_INCLUDE := $(addprefix -I, $(TEST_INTERFACE_TO_G4_INCLUDE_DIR))
0150 TEST_INTERFACE_TO_G4_OBJ := $(addprefix $(TEST_INTERFACE_TO_G4_OBJ_DIR)/, $(notdir $(TEST_INTERFACE_TO_G4_SRC:.cc=.o)))
0151 TEST_INTERFACE_TO_G4_EXE := $(BIN_DIR)/test_interface
0152 
0153 
0154 
0155 ########################################
0156 ########## TARGETS RULES
0157 ########################################
0158 
0159 .PHONY: all
0160 all: interface test
0161         @echo
0162         @echo "Full build successfull."
0163         
0164 .PHONY: test
0165 test: test_interface_to_g4
0166         @echo
0167         @echo "Full tests build successfull."
0168         
0169 .PHONY: interface
0170 interface: check_G4 $(INTERFACE_OBJ) fluka_no_random_lib
0171         @echo
0172         @echo "Full FLUKA-G4 interface build successfull."
0173         
0174 .PHONY: check_G4
0175 check_G4:
0176         @[ -d $(G4_PATH) ] || { echo "!!! G4 repo not found. Please source geant4.sh, or G4 setup.sh (need to have G4 already installed). !!!"; exit 1; }
0177         @[ -d $(G4_INCLUDE_DIR) ] || { echo "!!! G4_INCLUDE_DIR=$(G4_INCLUDE_DIR)/ does not exist. !!! "; exit 1; }
0178         
0179 .PHONY: env
0180 env: env_FLUKA env_FLUKA_G4_interface
0181         @echo
0182         @echo "Full env scripts creation successfull."
0183         
0184 .PHONY: env_FLUKA
0185 env_FLUKA: env_FLUKA.sh
0186 env_FLUKA.sh: GNUmakefile
0187         @echo '#! /bin/bash'                                                    >  $@
0188         @echo                                                                   >> $@
0189         @echo 'export FLUKA_PATH=$$(realpath $$(dirname $$(which fluka))/..)'   >> $@
0190         @echo 'if [ ! -d "$$FLUKA_PATH" ]; then'                                >> $@
0191         @echo '   echo "!!! fluka not found. FLUKA_REPO=$$FLUKA_PATH. Add your fluka_repo/bin to the PATH. !!!";'  >> $@
0192         @echo 'fi'                                                              >> $@
0193         @echo                                                                   >> $@
0194         @echo 'export FLUKADATA=$$FLUKA_PATH/data'                              >> $@
0195         @echo 'if [ ! -d "$$FLUKADATA" ]; then'                                 >> $@
0196         @echo '   echo "!!! fluka data repo not found. FLUKADATA=$$FLUKADATA. Add your fluka_repo/bin to the PATH. !!!";'  >> $@
0197         @echo 'fi'                                                              >> $@
0198         @echo                                                                   >> $@
0199         @echo 'export FLUKA_LIB_DIR=$$FLUKA_PATH/lib'                           >> $@
0200         @echo 'if [ ! -d "$$FLUKA_LIB_DIR" ]; then'                             >> $@
0201         @echo '   echo "!!! fluka lib repo not found. FLUKA_LIB_DIR=$$FLUKA_LIB_DIR. Add your fluka_repo/bin to the PATH. !!!";'  >> $@
0202         @echo 'fi'                                                              >> $@
0203         @echo
0204         @echo "Created file: env_FLUKA.sh"
0205         
0206 .PHONY: env_FLUKA_G4_interface
0207 env_FLUKA_G4_interface: env_FLUKA_G4_interface.sh
0208 env_FLUKA_G4_interface.sh: GNUmakefile
0209         @echo '#! /bin/bash'                                                    >  $@
0210         @echo 'echo "source $(BASE_DIR)/env_FLUKA.sh"'                          >> $@
0211         @echo 'if [ ! -e "$(BASE_DIR)/env_FLUKA.sh" ]; then'                    >> $@
0212         @echo '   echo "env_FLUKA.sh does not exist. Please create it: go to $(BASE_DIR), and do make env. Then, source again this script."'   >> $@
0213         @echo 'else'                                                            >> $@
0214         @echo '   source $(BASE_DIR)/env_FLUKA.sh'                              >> $@
0215         @echo '   echo ""'                                                      >> $@
0216         @echo '   echo "Setting FLUKAInterface_INCLUDE_DIR:"'                  >> $@
0217         @echo '   export FLUKAInterface_INCLUDE_DIR="$(SRC_DIR)/cpp_utils $(INTERFACE_INCLUDE_DIR)"'  >> $@
0218         @echo '   echo "export FLUKAInterface_INCLUDE_DIR=$$FLUKAInterface_INCLUDE_DIR"'  >> $@
0219         @echo '   echo "FLUKAInterface_INCLUDE_DIR successfully set."'         >> $@
0220         @echo '   echo ""'                                                      >> $@
0221         @echo '   echo "Setting FLUKAInterface_LIBRARIES:"'                    >> $@
0222         @echo '   export FLUKAInterface_LIBRARIES="$(INTERFACE_OBJ) $(CXX_OBJ) $(F_OBJ)"'  >> $@
0223         @echo '   missing_obj=false;'                                           >> $@
0224         @echo '   for obj in $$FLUKAInterface_LIBRARIES; do'                   >> $@
0225         @echo '      if [ ! -e "$$obj" ]; then'                                 >> $@
0226         @echo '         echo "$$obj does not exist."'                           >> $@
0227         @echo '         missing_obj=true'                                       >> $@
0228         @echo '      fi'                                                        >> $@
0229         @echo '   done'                                                         >> $@
0230         @echo '   if [ "$$missing_obj" = true ]; then'                          >> $@
0231         @echo '      echo "!!! Object file(s) in FLUKAInterface_LIBRARIES is/are missing. Please (re)compile the G4 interface (make or make interface)!";'  >> $@
0232         @echo '   else'                                                         >> $@
0233         @echo '      export FLUKAInterface_LIBRARIES="$$FLUKAInterface_LIBRARIES $(FLUKA_LIB_DIR)/$(FLUKA_NO_RANDOM_LIB)"'  >> $@
0234         @echo '      export FLUKAInterface_LIBRARIES="$$FLUKAInterface_LIBRARIES $(LD_FLAGS)"'  >> $@
0235         @echo '      echo "export FLUKAInterface_LIBRARIES=$$FLUKAInterface_LIBRARIES"'  >> $@
0236         @echo '      echo "FLUKAInterface_LIBRARIES successfully set."'        >> $@
0237         @echo '   fi'                                                           >> $@
0238         @echo 'fi'                                                              >> $@
0239         @echo 'echo ""'                                                         >> $@
0240         @echo "Created file: env_FLUKA_G4_interface.sh"
0241 
0242 .PHONY: clean
0243 clean:
0244         rm -fr $(CLEAN_DIR) env_FLUKA_G4_interface.sh
0245 
0246 
0247 
0248 ########################################
0249 ########## COMPILE & LINK
0250 ########################################
0251 
0252 # BUILD TEST INTERFACE TO G4 (EXECUTABLE)
0253 .PHONY: test_interface_to_g4
0254 test_interface_to_g4: fluka_no_random_lib $(TEST_INTERFACE_TO_G4_EXE)
0255 $(TEST_INTERFACE_TO_G4_EXE): $(TEST_INTERFACE_TO_G4_OBJ) $(INTERFACE_OBJ) $(CXX_OBJ) $(F_OBJ)
0256         @[ -d $(@D) ] || mkdir -p $(@D)
0257         @echo
0258         @echo "Building $(notdir $@) executable to test FLUKA-G4 interface:"
0259         $(CXX_COMP) $^ $(FLUKA_LIB_LINK) $(LD_FLAGS) $(G4_LIBRARIES) -o $@
0260         @echo "Built $(notdir $@) successfully."
0261         
0262 # COMPILE TEST INTERFACE TO G4 SOURCES
0263 define TEST_INTERFACE_TO_G4_BUILD_template
0264 $(TEST_INTERFACE_TO_G4_OBJ_DIR)/%.o: $(1)/%.cc
0265         @echo
0266         @echo "Building $$(notdir $$@) to test FLUKA-G4 interface:"
0267         @[ -d $$(@D) ] || mkdir -p $$(@D)
0268         $(CXX_COMP) -DG4_USE_FLUKA $(G4_CXX_FLAGS) $(CXX_INCLUDE) $(TEST_INTERFACE_TO_G4_INCLUDE) $(INTERFACE_INCLUDE) -c $$< -o $$@
0269         @echo "Built $$(notdir $$@) successfully."
0270 endef
0271 $(foreach src_dir, $(TEST_INTERFACE_TO_G4_SRC_DIR), $(eval $(call TEST_INTERFACE_TO_G4_BUILD_template, $(src_dir))))
0272 
0273 # COMPILE INTERFACE SOURCES
0274 define INTERFACE_BUILD_template
0275 $(INTERFACE_OBJ_DIR)/%.o: $(1)/%.cc $(CXX_OBJ) $(F_OBJ)
0276         @echo
0277         @echo "Building $$(notdir $$@) for FLUKA-G4 interface:"
0278         @[ -d $$(@D) ] || mkdir -p $$(@D)
0279         $(CXX_COMP) -DG4_USE_FLUKA $(G4_CXX_FLAGS) $(CXX_INCLUDE) $(INTERFACE_INCLUDE) -c $$< -o $$@
0280         @echo "Built $$(notdir $$@) successfully."
0281 endef
0282 $(foreach src_dir, $(INTERFACE_SRC_DIR), $(eval $(call INTERFACE_BUILD_template, $(src_dir))))
0283 
0284 # COMPILE CPP SOURCE
0285 define CXX_BUILD_template
0286 $(OBJ_DIR)/%.o: $(1)/%.cc
0287         @echo
0288         @echo "Building $$(notdir $$@) for core FLUKA5 C++ source:"
0289         @[ -d $$(@D) ] || mkdir -p $$(@D)
0290         $(CXX_COMP) -DG4_USE_FLUKA $(CXX_FLAGS) -c $$< -o $$@
0291         @echo "Built $$(notdir $$@) successfully."
0292 endef
0293 $(foreach src_dir, $(CXX_SRC_DIR), $(eval $(call CXX_BUILD_template, $(src_dir))))
0294 
0295 # COMPILE FORTRAN SOURCE
0296 define F_BUILD_template
0297 $(OBJ_DIR)/%.o: $(1)/%.f
0298         @echo
0299         @echo "Building $$(notdir $$@) for core FLUKA5 FORTRAN source:"
0300         @[ -d $$(@D) ] || mkdir -p $$(@D)
0301         $(F_COMP) -DG4_USE_FLUKA $(F_FLAGS) $(F_INCLUDE) -c $$< -o $$@
0302         @echo "Built $$(notdir $$@) successfully."
0303 endef
0304 $(foreach src_dir, $(F_SRC_DIR), $(eval $(call F_BUILD_template, $(src_dir))))
0305 
0306         
0307 
0308 ########################################
0309 ########## FLUKA4 WAS UPDATED   
0310 ########################################
0311 
0312 .PHONY: fluka
0313 fluka: fluka_no_random_lib
0314 
0315 .PHONY: fluka_no_random_lib
0316 fluka_no_random_lib: $(FLUKA_LIB_DIR)/$(FLUKA_NO_RANDOM_LIB)
0317 $(FLUKA_LIB_DIR)/$(FLUKA_NO_RANDOM_LIB): $(FLUKA_LIB_DIR)/$(FLUKA_LIB)
0318         @echo
0319         @cp $(FLUKA_LIB_DIR)/$(FLUKA_LIB) $(FLUKA_LIB_DIR)/$(FLUKA_NO_RANDOM_LIB)
0320         @echo "cp $(FLUKA_LIB_DIR)/$(FLUKA_LIB) $(FLUKA_LIB_DIR)/$(FLUKA_NO_RANDOM_LIB)"
0321         $(foreach obj,$(FLUKA_OBJ_REMOVE),ar d $(FLUKA_LIB_DIR)/$(FLUKA_NO_RANDOM_LIB) $(obj);)
0322         @echo "$(FLUKA_NO_RANDOM_LIB) creation / update successfull."
0323