Makefile 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. # Example Makefile for building CSBQ projects
  2. # Directories for SCTL includes and quadrature tables
  3. SCTL_INCLUDE_DIR ?= ./CSBQ/SCTL/include
  4. CSBQ_INCLUDE_DIR ?= ./CSBQ/include
  5. SCTL_DATA_PATH ?= ./CSBQ/data
  6. # Compiler settings
  7. CXX = g++ # Requires g++-9 or newer, icpc (with gcc compatibility 7.5 or newer), or clang++ with llvm-10 or newer
  8. CXXFLAGS = -std=c++11 -fopenmp # Need C++11 and OpenMP
  9. # Define the path for quadrature tables and enable quadruple precision (for reading quadrature tables)
  10. CXXFLAGS += -DSCTL_DATA_PATH=$(SCTL_DATA_PATH)
  11. CXXFLAGS += -DSCTL_QUAD_T=__float128
  12. ############################################
  13. # OPTIONAL FLAGS #
  14. ############################################
  15. # Optional flags for debugging or release
  16. DEBUG ?= 0
  17. ifeq ($(DEBUG), 1)
  18. CXXFLAGS += -O0 -fsanitize=address,leak,undefined,pointer-compare,pointer-subtract,float-divide-by-zero,float-cast-overflow \
  19. -fno-sanitize-recover=all -fstack-protector # Debug build
  20. CXXFLAGS += -DSCTL_MEMDEBUG # Enable SCTL memory checks
  21. else
  22. CXXFLAGS += -O3 -march=native -DNDEBUG
  23. endif
  24. # Enable warnings
  25. CXXFLAGS += -Wall -Wfloat-conversion
  26. # Enable profiling
  27. CXXFLAGS += -DSCTL_PROFILE=5 -DSCTL_VERBOSE
  28. # Enable MPI (CXX must be set to mpicxx)
  29. # CXXFLAGS += -DSCTL_HAVE_MPI
  30. # Enable BLAS and LAPACK
  31. # CXXFLAGS += -lblas -DSCTL_HAVE_BLAS # Use BLAS
  32. # CXXFLAGS += -llapack -DSCTL_HAVE_LAPACK # Use LAPACK
  33. # CXXFLAGS += -lopenblas -DSCTL_HAVE_BLAS -DSCTL_HAVE_LAPACK # Use OpenBLAS
  34. # CXXFLAGS += -mkl -DSCTL_HAVE_BLAS -DSCTL_HAVE_LAPACK # Use MKL BLAS and LAPACK (Intel compiler)
  35. # CXXFLAGS += -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread -DSCTL_HAVE_BLAS -DSCTL_HAVE_LAPACK # Use MKL BLAS and LAPACK (non-Intel compiler)
  36. # CXXFLAGS += -L${MKLROOT}/lib/intel64 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -lpthread -lm -ldl -DSCTL_HAVE_BLAS -DSCTL_HAVE_LAPACK
  37. # CXXFLAGS += -L${MKLROOT}/lib/intel64 -lmkl_intel_lp64 -lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm -ldl -DSCTL_HAVE_BLAS -DSCTL_HAVE_LAPACK
  38. # Enable FFTW
  39. # CXXFLAGS += -lfftw3 -DSCTL_HAVE_FFTW
  40. # CXXFLAGS += -lfftw3f -DSCTL_HAVE_FFTWF
  41. # CXXFLAGS += -lfftw3l -DSCTL_HAVE_FFTWL
  42. # Enable SVML (Intel compiler)
  43. # CXXFLAGS += -DSCTL_HAVE_SVML
  44. # Enable PVFMM
  45. # PVFMM_INC_DIR = $(PVFMM_DIR)/include
  46. # PVFMM_LIB_DIR = $(PVFMM_DIR)/lib/.libs
  47. # CXXFLAGS += -DSCTL_HAVE_PVFMM -I$(PVFMM_INC_DIR)
  48. # LDLIBS += $(PVFMM_LIB_DIR)/libpvfmm.a
  49. # Settings for stack trace
  50. ifeq ($(shell uname -s),Darwin)
  51. CXXFLAGS += -g -rdynamic -Wl,-no_pie # For stack trace on Mac
  52. else
  53. CXXFLAGS += -gdwarf-4 -g -rdynamic # For stack trace on other systems
  54. endif
  55. # Utility commands
  56. RM = rm -f
  57. MKDIRS = mkdir -p
  58. # Directories for binaries, objects, includes, tests
  59. BINDIR = ./bin
  60. OBJDIR = ./obj
  61. INCDIR = ./include
  62. TESTDIR = ./test
  63. # Target binaries for tests
  64. TARGET_BIN = \
  65. $(BINDIR)/demo1-geometry \
  66. $(BINDIR)/demo2-bio \
  67. $(BINDIR)/demo3-bie-solve
  68. TEST_BIN = \
  69. $(BINDIR)/test
  70. # Test target: build all test binaries
  71. test: $(TEST_BIN)
  72. # Rules for building binaries
  73. $(BINDIR)/%: $(OBJDIR)/%.o
  74. -@$(MKDIRS) $(dir $@)
  75. $(CXX) $^ $(LDLIBS) -o $@ $(CXXFLAGS)
  76. ifeq "$(OS)" "Darwin"
  77. /usr/bin/dsymutil $@ -o $@.dSYM
  78. endif
  79. # Rules for compiling test source files
  80. $(OBJDIR)/%.o: $(TESTDIR)/%.cpp
  81. -@$(MKDIRS) $(dir $@)
  82. $(CXX) $(CXXFLAGS) -I$(INCDIR) -I$(SCTL_INCLUDE_DIR) -I$(CSBQ_INCLUDE_DIR) -c $^ -o $@
  83. # Clean target: remove all binaries and object files
  84. clean:
  85. $(RM) -r $(BINDIR)/* $(OBJDIR)/*