File indexing completed on 2025-10-14 08:08:00
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
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
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
0067
0068
0069
0070 CXX_COMP := g++
0071 CXX_FLAGS := $(shell fluka-config --cppflags)
0072
0073
0074
0075 F_COMP := gfortran
0076 F_FLAGS := $(shell fluka-config --fflags)
0077
0078
0079
0080 LD_FLAGS := -lgfortran
0081
0082
0083
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
0093
0094
0095
0096 BASE_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
0097
0098
0099 SRC_DIR := $(BASE_DIR)/source
0100
0101
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
0107 BIN_DIR := $(BASE_DIR)/bin
0108
0109 CLEAN_DIR := $(OBJ_DIR) $(BIN_DIR)
0110
0111
0112
0113
0114
0115
0116
0117
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
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
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
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
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
0250
0251
0252
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
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
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
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
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
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