Files
Jean-Sébastien Caux a6a4a1bdb4 Initiate
2026-09-22 14:20:09 +02:00

187 lines
6.3 KiB
Makefile

###################################################################
#
# 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)