################################################################### # # This software is part of Jean-Sébastien Caux's Abacus toolsuite. # # Copyright © Jean-Sébastien Caux. # ################################################################### VERSION = abacus-2.0.0 SRC_DIR = src SRC_EXT = cc DEP_DIR = dep OBJ_DIR = obj LIB_DIR = lib BIN_DIR = bin $(shell mkdir -p $(DEP_DIR) >/dev/null) $(shell mkdir -p $(OBJ_DIR) >/dev/null) $(shell mkdir -p $(LIB_DIR) >/dev/null) $(shell mkdir -p $(BIN_DIR) >/dev/null) ###################### # Compilation with g++ ###################### # NOTE: g++-15 is required # Uncomment the lines below for g++ compilation CXX = g++ #g++-15 OPTIMIZATIONS = -O3 CXXFLAGS = -std=c++23 -fmodules -Wall -Wextra -Wconversion -pedantic-errors $(OPTIMIZATIONS) #-g -pg COMPILE = $(CXX) $(CXXFLAGS) COMPILE_EXECS = $(COMPILE) ######################## # Compilation with clang ######################## # NOTE 2025-03-14: -O3 compilation fails on Linux with clang++ 18.1.3 # ******* NOTE FOR FUTURE: once -O3 compilation problem is solved, # ******* also add -O3 to clang-std make option at bottom of this Makefile # Uncomment the lines below for clang++ compilation # clang 18: # CXX = clang++ # CXXFLAGS = -std=c++23 -stdlib=libc++ --gcc-toolchain=/usr/local/gcc-15-20250302 -fprebuilt-module-path=obj/ #-O3 # COMPILE = $(CXX) $(CXXFLAGS) -x c++-module -fmodule-output # COMPILE_EXECS = $(CXX) $(CXXFLAGS) obj/std.pcm # clang 21 # CXX = clang++-21 # CXXFLAGS = -std=c++23 -stdlib=libc++ --gcc-toolchain=/usr/local/gcc-15.2.0 -fprebuilt-module-path=obj/ -O3 # COMPILE = $(CXX) $(CXXFLAGS) -x c++-module -fmodule-output # COMPILE_EXECS = $(CXX) $(CXXFLAGS) CXXINFO = $(shell $(CXX) --version) ############################# # Dependencies auto-detection # 2025-03: not working yet DEPFLAGS = -MT $@ -MMD -MP -MF $(DEP_DIR)/$*.Td # COMPILE = $(CXX) $(CXXFLAGS) $(DEPFLAGS) -c POSTCOMPILE = mv -f $(DEP_DIR)/$*.Td $(DEP_DIR)/$*.d && touch $@ # All sources SOURCES_ALL = $(shell find $(SRC_DIR) -name '*.$(SRC_EXT)') # Sources for executables SOURCES_EXECS = $(shell find $(SRC_DIR)/execs -name '*.$(SRC_EXT)') # Library sources SOURCES = $(filter-out $(SOURCES_EXECS), $(SOURCES_ALL)) # Dependencies DEPS = $(patsubst %.$(SRC_EXT), $(DEP_DIR)/%.d, $(notdir $(SOURCES))) # Objects to go into library OBJECTS = $(patsubst %.$(SRC_EXT), $(OBJ_DIR)/%.o, $(notdir $(SOURCES))) # Executables EXECS = $(patsubst %.$(SRC_EXT), $(BIN_DIR)/%, $(notdir $(SOURCES_EXECS))) #EXECS = $(BIN_DIR)/debug # Default target: executables all: $(EXECS) echo "Abacus version $(VERSION) copyright © Jean-Sébastien Caux\ncompiled on $(shell date -Imin) with\n$(CXXINFO)\nusing flags:\n$(CXXFLAGS)" | tee abacus.makeinfo > /dev/null # Create the library $(LIB_DIR)/lib$(VERSION).a : $(OBJECTS) ar -cr $(LIB_DIR)/lib$(VERSION).a $(OBJECTS) # Build executables $(EXECS): $(BIN_DIR)/%: $(SRC_DIR)/execs/%.$(SRC_EXT) $(LIB_DIR)/lib$(VERSION).a $(COMPILE_EXECS) $< -o $@ -L$(LIB_DIR) -l$(VERSION) # Autodetection of dependencies fails using DEPFLAGS above. # Temporary backup strategy: dependencies set by hand $(OBJ_DIR)/conveniences.o: $(SRC_DIR)/generic/conveniences.cc $(COMPILE) -c $< -o $@ $(OBJ_DIR)/timer.o: $(SRC_DIR)/util/timer.cc $(COMPILE) -c $< -o $@ $(OBJ_DIR)/labels.o: $(SRC_DIR)/generic/labels.cc $(OBJ_DIR)/conveniences.o $(COMPILE) -c $< -o $@ $(OBJ_DIR)/spaces.o: $(SRC_DIR)/generic/spaces.cc $(OBJ_DIR)/conveniences.o $(COMPILE) -c $< -o $@ $(OBJ_DIR)/model.o: $(SRC_DIR)/generic/model.cc $(OBJ_DIR)/conveniences.o $(OBJ_DIR)/spaces.o $(OBJ_DIR)/labels.o $(COMPILE) -c $< -o $@ $(OBJ_DIR)/model_LiebLiniger.o: $(SRC_DIR)/LiebLiniger/repulsive/model_LiebLiniger.cc $(OBJ_DIR)/conveniences.o $(OBJ_DIR)/spaces.o $(OBJ_DIR)/model.o $(COMPILE) -c $< -o $@ $(OBJ_DIR)/quantumnumbers.o: $(SRC_DIR)/generic/quantumnumbers.cc $(OBJ_DIR)/conveniences.o $(OBJ_DIR)/labels.o $(COMPILE) -c $< -o $@ $(OBJ_DIR)/plex.o: $(SRC_DIR)/generic/plex.cc $(OBJ_DIR)/conveniences.o $(OBJ_DIR)/labels.o $(OBJ_DIR)/quantumnumbers.o $(COMPILE) -c $< -o $@ $(OBJ_DIR)/matrix.o: $(SRC_DIR)/math/matrix.cc $(OBJ_DIR)/conveniences.o $(COMPILE) -c $< -o $@ $(OBJ_DIR)/state.o: $(SRC_DIR)/generic/state.cc $(OBJ_DIR)/conveniences.o $(OBJ_DIR)/timer.o $(OBJ_DIR)/labels.o $(OBJ_DIR)/spaces.o $(OBJ_DIR)/model.o $(OBJ_DIR)/plex.o $(OBJ_DIR)/matrix.o $(COMPILE) -c $< -o $@ $(OBJ_DIR)/state_LiebLiniger.o: $(SRC_DIR)/LiebLiniger/repulsive/state_LiebLiniger.cc $(OBJ_DIR)/conveniences.o $(OBJ_DIR)/labels.o $(OBJ_DIR)/spaces.o $(OBJ_DIR)/model.o $(OBJ_DIR)/model_LiebLiniger.o $(OBJ_DIR)/matrix.o $(OBJ_DIR)/state.o $(OBJ_DIR)/tba_LiebLiniger.o $(COMPILE) -c $< -o $@ $(OBJ_DIR)/matrixelements_LiebLiniger.o: $(SRC_DIR)/LiebLiniger/repulsive/matrixelements_LiebLiniger.cc $(OBJ_DIR)/conveniences.o $(OBJ_DIR)/matrix.o $(OBJ_DIR)/state_LiebLiniger.o $(COMPILE) -c $< -o $@ $(OBJ_DIR)/calculus.o: $(SRC_DIR)/math/calculus.cc $(OBJ_DIR)/conveniences.o $(COMPILE) -c $< -o $@ $(OBJ_DIR)/tba_LiebLiniger.o: $(SRC_DIR)/LiebLiniger/repulsive/tba_LiebLiniger.cc $(OBJ_DIR)/conveniences.o $(OBJ_DIR)/calculus.o $(COMPILE) -c $< -o $@ $(OBJ_DIR)/abacus.o: $(SRC_DIR)/abacus.cc $(OBJ_DIR)/conveniences.o $(OBJ_DIR)/timer.o $(OBJ_DIR)/labels.o $(OBJ_DIR)/spaces.o $(OBJ_DIR)/model.o $(OBJ_DIR)/model_LiebLiniger.o $(OBJ_DIR)/quantumnumbers.o $(OBJ_DIR)/plex.o $(OBJ_DIR)/matrix.o $(OBJ_DIR)/state.o $(OBJ_DIR)/state_LiebLiniger.o $(OBJ_DIR)/matrixelements_LiebLiniger.o $(OBJ_DIR)/calculus.o $(OBJ_DIR)/tba_LiebLiniger.o $(COMPILE) -c $< -o $@ ########################################### # g++ precompiled standard library elements .PHONY: gcm gcm: rm -rf gcm.cache rm -f obj/std.o $(CXX) -std=c++23 -fmodules -fsearch-include-path $(OPTIMIZATIONS) -c bits/std.cc mv std.o obj/ ########################################### # clang++ std precompilation # NOTE: # In Linux, this requires installation of llvm-18, to ensure std.cppm is available. # Installing on other platforms might require specifying the location of std.cppm differently .PHONY: clang-std clang-std: clang++-21 -std=c++23 -stdlib=libc++ --precompile -o obj/std.pcm /usr/lib/llvm-21/share/libc++/v1/std.cppm ################# # General cleanup .PHONY: clean clean: rm -f abacus.makeinfo rm -rf gcm.cache rm -rf $(DEP_DIR) rm -f $(OBJ_DIR)/* rm -f $(LIB_DIR)/lib$(VERSION).a rm -rf $(BIN_DIR)