Initiate
This commit is contained in:
@@ -0,0 +1,186 @@
|
||||
###################################################################
|
||||
#
|
||||
# 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)
|
||||
Reference in New Issue
Block a user