|
| 1 | +VERSION := $(shell grep . VERSION.txt | cut -f1 -d:) |
| 2 | +PROGRAM_NAME := project |
| 3 | + |
| 4 | +CC := g++ |
| 5 | +# CC := g++-mp-7 # typical macports compiler name |
| 6 | +# CC := g++-7 # typical homebrew compiler name |
| 7 | + |
| 8 | +# Check for environment definitions of compiler |
| 9 | +# e.g., on CC = g++-7 on OSX |
| 10 | +ifdef PHYSICELL_CPP |
| 11 | + CC := $(PHYSICELL_CPP) |
| 12 | +endif |
| 13 | + |
| 14 | +ifndef STATIC_OPENMP |
| 15 | + STATIC_OPENMP = -fopenmp |
| 16 | +endif |
| 17 | + |
| 18 | +ARCH := native # best auto-tuning |
| 19 | +# ARCH := core2 # a reasonably safe default for most CPUs since 2007 |
| 20 | +# ARCH := corei7 |
| 21 | +# ARCH := corei7-avx # earlier i7 |
| 22 | +# ARCH := core-avx-i # i7 ivy bridge or newer |
| 23 | +# ARCH := core-avx2 # i7 with Haswell or newer |
| 24 | +# ARCH := nehalem |
| 25 | +# ARCH := westmere |
| 26 | +# ARCH := sandybridge # circa 2011 |
| 27 | +# ARCH := ivybridge # circa 2012 |
| 28 | +# ARCH := haswell # circa 2013 |
| 29 | +# ARCH := broadwell # circa 2014 |
| 30 | +# ARCH := skylake # circa 2015 |
| 31 | +# ARCH := bonnell |
| 32 | +# ARCH := silvermont |
| 33 | +# ARCH := skylake-avx512 |
| 34 | +# ARCH := nocona #64-bit pentium 4 or later |
| 35 | + |
| 36 | +# CFLAGS := -march=$(ARCH) -Ofast -s -fomit-frame-pointer -mfpmath=both -fopenmp -m64 -std=c++11 |
| 37 | +CFLAGS := -march=$(ARCH) -O3 -fomit-frame-pointer -mfpmath=both -fopenmp -m64 -std=c++11 |
| 38 | + |
| 39 | +ifeq ($(OS),Windows_NT) |
| 40 | +else |
| 41 | + UNAME_S := $(shell uname -s) |
| 42 | + ifeq ($(UNAME_S),Darwin) |
| 43 | + UNAME_P := $(shell uname -p) |
| 44 | + var := $(shell which $(CC) | xargs file) |
| 45 | + ifeq ($(lastword $(var)),arm64) |
| 46 | + CFLAGS := -march=$(ARCH) -O3 -fomit-frame-pointer -fopenmp -m64 -std=c++11 |
| 47 | + endif |
| 48 | + endif |
| 49 | +endif |
| 50 | + |
| 51 | +CFLAGS_LINK := $(shell echo $(CFLAGS) | sed -e "s/-fopenmp//g") |
| 52 | +COMPILE_COMMAND := $(CC) $(CFLAGS) $(EXTRA_FLAGS) |
| 53 | +LINK_COMMAND := $(CC) $(CFLAGS_LINK) $(EXTRA_FLAGS) |
| 54 | + |
| 55 | +BioFVM_OBJECTS := BioFVM_vector.o BioFVM_mesh.o BioFVM_microenvironment.o BioFVM_solvers.o BioFVM_matlab.o \ |
| 56 | +BioFVM_utilities.o BioFVM_basic_agent.o BioFVM_MultiCellDS.o BioFVM_agent_container.o |
| 57 | + |
| 58 | +PhysiCell_core_OBJECTS := PhysiCell_phenotype.o PhysiCell_cell_container.o PhysiCell_standard_models.o \ |
| 59 | +PhysiCell_cell.o PhysiCell_custom.o PhysiCell_utilities.o PhysiCell_constants.o PhysiCell_basic_signaling.o \ |
| 60 | +PhysiCell_signal_behavior.o PhysiCell_rules.o |
| 61 | + |
| 62 | +PhysiCell_module_OBJECTS := PhysiCell_SVG.o PhysiCell_pathology.o PhysiCell_MultiCellDS.o PhysiCell_various_outputs.o \ |
| 63 | +PhysiCell_pugixml.o PhysiCell_settings.o PhysiCell_geometry.o |
| 64 | + |
| 65 | +# put your custom objects here (they should be in the custom_modules directory) |
| 66 | + |
| 67 | +PhysiCell_custom_module_OBJECTS := custom.o |
| 68 | + |
| 69 | +pugixml_OBJECTS := pugixml.o |
| 70 | + |
| 71 | +PhysiCell_OBJECTS := $(BioFVM_OBJECTS) $(pugixml_OBJECTS) $(PhysiCell_core_OBJECTS) $(PhysiCell_module_OBJECTS) |
| 72 | +ALL_OBJECTS := $(PhysiCell_OBJECTS) $(PhysiCell_custom_module_OBJECTS) |
| 73 | + |
| 74 | +# compile the project |
| 75 | + |
| 76 | +all: main.cpp $(ALL_OBJECTS) |
| 77 | + $(COMPILE_COMMAND) -o $(PROGRAM_NAME) $(ALL_OBJECTS) main.cpp |
| 78 | + make name |
| 79 | + |
| 80 | +static: main.cpp $(ALL_OBJECTS) $(MaBoSS) |
| 81 | + $(LINK_COMMAND) $(INC) -o $(PROGRAM_NAME) $(ALL_OBJECTS) main.cpp $(LIB) -static-libgcc -static-libstdc++ $(STATIC_OPENMP) |
| 82 | + |
| 83 | +name: |
| 84 | + @echo "" |
| 85 | + @echo "Executable name is" $(PROGRAM_NAME) |
| 86 | + @echo "" |
| 87 | + |
| 88 | +# PhysiCell core components |
| 89 | + |
| 90 | +PhysiCell_phenotype.o: ./core/PhysiCell_phenotype.cpp |
| 91 | + $(COMPILE_COMMAND) -c ./core/PhysiCell_phenotype.cpp |
| 92 | + |
| 93 | +PhysiCell_digital_cell_line.o: ./core/PhysiCell_digital_cell_line.cpp |
| 94 | + $(COMPILE_COMMAND) -c ./core/PhysiCell_digital_cell_line.cpp |
| 95 | + |
| 96 | +PhysiCell_cell.o: ./core/PhysiCell_cell.cpp |
| 97 | + $(COMPILE_COMMAND) -c ./core/PhysiCell_cell.cpp |
| 98 | + |
| 99 | +PhysiCell_cell_container.o: ./core/PhysiCell_cell_container.cpp |
| 100 | + $(COMPILE_COMMAND) -c ./core/PhysiCell_cell_container.cpp |
| 101 | + |
| 102 | +PhysiCell_standard_models.o: ./core/PhysiCell_standard_models.cpp |
| 103 | + $(COMPILE_COMMAND) -c ./core/PhysiCell_standard_models.cpp |
| 104 | + |
| 105 | +PhysiCell_utilities.o: ./core/PhysiCell_utilities.cpp |
| 106 | + $(COMPILE_COMMAND) -c ./core/PhysiCell_utilities.cpp |
| 107 | + |
| 108 | +PhysiCell_custom.o: ./core/PhysiCell_custom.cpp |
| 109 | + $(COMPILE_COMMAND) -c ./core/PhysiCell_custom.cpp |
| 110 | + |
| 111 | +PhysiCell_constants.o: ./core/PhysiCell_constants.cpp |
| 112 | + $(COMPILE_COMMAND) -c ./core/PhysiCell_constants.cpp |
| 113 | + |
| 114 | +PhysiCell_signal_behavior.o: ./core/PhysiCell_signal_behavior.cpp |
| 115 | + $(COMPILE_COMMAND) -c ./core/PhysiCell_signal_behavior.cpp |
| 116 | + |
| 117 | +PhysiCell_rules.o: ./core/PhysiCell_rules.cpp |
| 118 | + $(COMPILE_COMMAND) -c ./core/PhysiCell_rules.cpp |
| 119 | + |
| 120 | +# BioFVM core components (needed by PhysiCell) |
| 121 | + |
| 122 | +BioFVM_vector.o: ./BioFVM/BioFVM_vector.cpp |
| 123 | + $(COMPILE_COMMAND) -c ./BioFVM/BioFVM_vector.cpp |
| 124 | + |
| 125 | +BioFVM_agent_container.o: ./BioFVM/BioFVM_agent_container.cpp |
| 126 | + $(COMPILE_COMMAND) -c ./BioFVM/BioFVM_agent_container.cpp |
| 127 | + |
| 128 | +BioFVM_mesh.o: ./BioFVM/BioFVM_mesh.cpp |
| 129 | + $(COMPILE_COMMAND) -c ./BioFVM/BioFVM_mesh.cpp |
| 130 | + |
| 131 | +BioFVM_microenvironment.o: ./BioFVM/BioFVM_microenvironment.cpp |
| 132 | + $(COMPILE_COMMAND) -c ./BioFVM/BioFVM_microenvironment.cpp |
| 133 | + |
| 134 | +BioFVM_solvers.o: ./BioFVM/BioFVM_solvers.cpp |
| 135 | + $(COMPILE_COMMAND) -c ./BioFVM/BioFVM_solvers.cpp |
| 136 | + |
| 137 | +BioFVM_utilities.o: ./BioFVM/BioFVM_utilities.cpp |
| 138 | + $(COMPILE_COMMAND) -c ./BioFVM/BioFVM_utilities.cpp |
| 139 | + |
| 140 | +BioFVM_basic_agent.o: ./BioFVM/BioFVM_basic_agent.cpp |
| 141 | + $(COMPILE_COMMAND) -c ./BioFVM/BioFVM_basic_agent.cpp |
| 142 | + |
| 143 | +BioFVM_matlab.o: ./BioFVM/BioFVM_matlab.cpp |
| 144 | + $(COMPILE_COMMAND) -c ./BioFVM/BioFVM_matlab.cpp |
| 145 | + |
| 146 | +BioFVM_MultiCellDS.o: ./BioFVM/BioFVM_MultiCellDS.cpp |
| 147 | + $(COMPILE_COMMAND) -c ./BioFVM/BioFVM_MultiCellDS.cpp |
| 148 | + |
| 149 | +pugixml.o: ./BioFVM/pugixml.cpp |
| 150 | + $(COMPILE_COMMAND) -c ./BioFVM/pugixml.cpp |
| 151 | + |
| 152 | +# standard PhysiCell modules |
| 153 | + |
| 154 | +PhysiCell_SVG.o: ./modules/PhysiCell_SVG.cpp |
| 155 | + $(COMPILE_COMMAND) -c ./modules/PhysiCell_SVG.cpp |
| 156 | + |
| 157 | +PhysiCell_pathology.o: ./modules/PhysiCell_pathology.cpp |
| 158 | + $(COMPILE_COMMAND) -c ./modules/PhysiCell_pathology.cpp |
| 159 | + |
| 160 | +PhysiCell_MultiCellDS.o: ./modules/PhysiCell_MultiCellDS.cpp |
| 161 | + $(COMPILE_COMMAND) -c ./modules/PhysiCell_MultiCellDS.cpp |
| 162 | + |
| 163 | +PhysiCell_various_outputs.o: ./modules/PhysiCell_various_outputs.cpp |
| 164 | + $(COMPILE_COMMAND) -c ./modules/PhysiCell_various_outputs.cpp |
| 165 | + |
| 166 | +PhysiCell_pugixml.o: ./modules/PhysiCell_pugixml.cpp |
| 167 | + $(COMPILE_COMMAND) -c ./modules/PhysiCell_pugixml.cpp |
| 168 | + |
| 169 | +PhysiCell_settings.o: ./modules/PhysiCell_settings.cpp |
| 170 | + $(COMPILE_COMMAND) -c ./modules/PhysiCell_settings.cpp |
| 171 | + |
| 172 | +PhysiCell_basic_signaling.o: ./core/PhysiCell_basic_signaling.cpp |
| 173 | + $(COMPILE_COMMAND) -c ./core/PhysiCell_basic_signaling.cpp |
| 174 | + |
| 175 | +PhysiCell_geometry.o: ./modules/PhysiCell_geometry.cpp |
| 176 | + $(COMPILE_COMMAND) -c ./modules/PhysiCell_geometry.cpp |
| 177 | + |
| 178 | +# user-defined PhysiCell modules |
| 179 | + |
| 180 | +custom.o: ./custom_modules/custom.cpp |
| 181 | + $(COMPILE_COMMAND) -c ./custom_modules/custom.cpp |
| 182 | + |
| 183 | +# cleanup |
| 184 | + |
| 185 | +reset: |
| 186 | + rm -f *.cpp |
| 187 | + cp ./sample_projects/Makefile-default Makefile |
| 188 | + rm -f ./custom_modules/* |
| 189 | + touch ./custom_modules/empty.txt |
| 190 | + touch ALL_CITATIONS.txt |
| 191 | + touch ./core/PhysiCell_cell.cpp |
| 192 | + rm ALL_CITATIONS.txt |
| 193 | + cp ./config/PhysiCell_settings-backup.xml ./config/PhysiCell_settings.xml |
| 194 | + touch ./config/empty.csv |
| 195 | + rm -f ./config/*.csv |
| 196 | + |
| 197 | +clean: |
| 198 | + rm -f *.o |
| 199 | + rm -f $(PROGRAM_NAME)* |
| 200 | + |
| 201 | +data-cleanup: |
| 202 | + rm -rf ./output |
| 203 | + mkdir ./output |
| 204 | + touch ./output/empty.txt |
| 205 | + |
| 206 | +# archival |
| 207 | + |
| 208 | +checkpoint: |
| 209 | + zip -r $$(date +%b_%d_%Y_%H%M).zip Makefile *.cpp *.h config/*.xml custom_modules/* |
| 210 | + |
| 211 | +zip: |
| 212 | + zip -r latest.zip Makefile* *.cpp *.h BioFVM/* config/* core/* custom_modules/* matlab/* modules/* sample_projects/* |
| 213 | + cp latest.zip $$(date +%b_%d_%Y_%H%M).zip |
| 214 | + cp latest.zip VERSION_$(VERSION).zip |
| 215 | + mv *.zip archives/ |
| 216 | + |
| 217 | +tar: |
| 218 | + tar --ignore-failed-read -czf latest.tar Makefile* *.cpp *.h BioFVM/* config/* core/* custom_modules/* matlab/* modules/* sample_projects/* |
| 219 | + cp latest.tar $$(date +%b_%d_%Y_%H%M).tar |
| 220 | + cp latest.tar VERSION_$(VERSION).tar |
| 221 | + mv *.tar archives/ |
| 222 | + |
| 223 | +unzip: |
| 224 | + cp ./archives/latest.zip . |
| 225 | + unzip latest.zip |
| 226 | + |
| 227 | +untar: |
| 228 | + cp ./archives/latest.tar . |
| 229 | + tar -xzf latest.tar |
| 230 | + |
| 231 | +# easier animation |
| 232 | + |
| 233 | +FRAMERATE := 24 |
| 234 | +OUTPUT := output |
| 235 | + |
| 236 | +jpeg: |
| 237 | + @magick identify -format "%h" $(OUTPUT)/initial.svg > __H.txt |
| 238 | + @magick identify -format "%w" $(OUTPUT)/initial.svg > __W.txt |
| 239 | + @expr 2 \* \( $$(grep . __H.txt) / 2 \) > __H1.txt |
| 240 | + @expr 2 \* \( $$(grep . __W.txt) / 2 \) > __W1.txt |
| 241 | + @echo "$$(grep . __W1.txt)!x$$(grep . __H1.txt)!" > __resize.txt |
| 242 | + @magick mogrify -format jpg -resize $$(grep . __resize.txt) $(OUTPUT)/s*.svg |
| 243 | + rm -f __H*.txt __W*.txt __resize.txt |
| 244 | + |
| 245 | +gif: |
| 246 | + magick convert $(OUTPUT)/s*.svg $(OUTPUT)/out.gif |
| 247 | + |
| 248 | +movie: |
| 249 | + ffmpeg -r $(FRAMERATE) -f image2 -i $(OUTPUT)/snapshot%08d.jpg -vcodec libx264 -pix_fmt yuv420p -strict -2 -tune animation -crf 15 -acodec none $(OUTPUT)/out.mp4 |
| 250 | + |
| 251 | +# upgrade rules |
| 252 | + |
| 253 | +SOURCE := PhysiCell_upgrade.zip |
| 254 | +get-upgrade: |
| 255 | + @echo $$(curl https://raw.githubusercontent.com/MathCancer/PhysiCell/master/VERSION.txt) > VER.txt |
| 256 | + @echo https://github.com/MathCancer/PhysiCell/releases/download/$$(grep . VER.txt)/PhysiCell_V.$$(grep . VER.txt).zip > DL_FILE.txt |
| 257 | + rm -f VER.txt |
| 258 | + $$(curl -L $$(grep . DL_FILE.txt) --output PhysiCell_upgrade.zip) |
| 259 | + rm -f DL_FILE.txt |
| 260 | + |
| 261 | +PhysiCell_upgrade.zip: |
| 262 | + make get-upgrade |
| 263 | + |
| 264 | +upgrade: $(SOURCE) |
| 265 | + unzip $(SOURCE) PhysiCell/VERSION.txt |
| 266 | + mv -f PhysiCell/VERSION.txt . |
| 267 | + unzip $(SOURCE) PhysiCell/core/* |
| 268 | + cp -r PhysiCell/core/* core |
| 269 | + unzip $(SOURCE) PhysiCell/modules/* |
| 270 | + cp -r PhysiCell/modules/* modules |
| 271 | + unzip $(SOURCE) PhysiCell/sample_projects/* |
| 272 | + cp -r PhysiCell/sample_projects/* sample_projects |
| 273 | + unzip $(SOURCE) PhysiCell/BioFVM/* |
| 274 | + cp -r PhysiCell/BioFVM/* BioFVM |
| 275 | + unzip $(SOURCE) PhysiCell/documentation/User_Guide.pdf |
| 276 | + mv -f PhysiCell/documentation/User_Guide.pdf documentation |
| 277 | + rm -f -r PhysiCell |
| 278 | + rm -f $(SOURCE) |
| 279 | + |
| 280 | +# use: make save PROJ=your_project_name |
| 281 | +PROJ := my_project |
| 282 | + |
| 283 | +save: |
| 284 | + echo "Saving project as $(PROJ) ... " |
| 285 | + mkdir -p ./user_projects |
| 286 | + mkdir -p ./user_projects/$(PROJ) |
| 287 | + mkdir -p ./user_projects/$(PROJ)/custom_modules |
| 288 | + mkdir -p ./user_projects/$(PROJ)/config |
| 289 | + cp main.cpp ./user_projects/$(PROJ) |
| 290 | + cp Makefile ./user_projects/$(PROJ) |
| 291 | + cp VERSION.txt ./user_projects/$(PROJ) |
| 292 | + cp ./config/* ./user_projects/$(PROJ)/config |
| 293 | + cp ./custom_modules/* ./user_projects/$(PROJ)/custom_modules |
| 294 | + |
| 295 | +load: |
| 296 | + echo "Loading project from $(PROJ) ... " |
| 297 | + cp ./user_projects/$(PROJ)/main.cpp . |
| 298 | + cp ./user_projects/$(PROJ)/Makefile . |
| 299 | + cp ./user_projects/$(PROJ)/config/* ./config/ |
| 300 | + cp ./user_projects/$(PROJ)/custom_modules/* ./custom_modules/ |
| 301 | + |
| 302 | +pack: |
| 303 | + @echo " " |
| 304 | + @echo "Preparing project $(PROJ) for sharing ... " |
| 305 | + @echo " " |
| 306 | + cd ./user_projects && zip -r $(PROJ).zip $(PROJ) |
| 307 | + @echo " " |
| 308 | + @echo "Share ./user_projects/$(PROJ).zip ... " |
| 309 | + @echo "Other users can unzip $(PROJ).zip in their ./user_projects, compile, and run." |
| 310 | + @echo " " |
| 311 | + |
| 312 | +unpack: |
| 313 | + @echo " " |
| 314 | + @echo "Preparing shared project $(PROJ).zip for use ... " |
| 315 | + @echo " " |
| 316 | + cd ./user_projects && unzip $(PROJ).zip |
| 317 | + @echo " " |
| 318 | + @echo "Load this project via make load PROJ=$(PROJ) ... " |
| 319 | + @echo " " |
| 320 | + |
| 321 | +list-user-projects: |
| 322 | + @echo "user projects::" |
| 323 | + @cd ./user_projects && ls -dt1 * | grep . | sed 's!empty.txt!!' |
0 commit comments