FLINT_DIR:=.
SRC_DIR:=src
BUILD_DIR:=build
ABS_FLINT_DIR:=@abs_srcdir@
ABS_SRC_DIR:=$(ABS_FLINT_DIR)/$(SRC_DIR)
IS_OUT_OF_TREE:=@IS_OUT_OF_TREE@
FLINT_VERSION:=@FLINT_VERSION_FULL@
FLINT_MAJOR_SO:=@FLINT_MAJOR_SO@
FLINT_MINOR_SO:=@FLINT_MINOR_SO@
FLINT_PATCH_SO:=@FLINT_PATCH_SO@
FLINT_LIB:=@FLINT_LIB@
FLINT_LIB_MAJOR:=@FLINT_LIB_MAJOR@
FLINT_LIB_FULL:=@FLINT_LIB_FULL@
FLINT_IMPLIB:=@FLINT_IMPLIB@
FLINT_LIB_STATIC:=@FLINT_LIB_STATIC@
FLINT_DLLLIB:=@FLINT_DLLLIB@
FLINT_DYLIB:=@FLINT_DYLIB@
FLINT_SOLIB:=@FLINT_SOLIB@
prefix:=@prefix@
exec_prefix:=@exec_prefix@
INCLUDEDIR:=@includedir@
LIBDIR:=@libdir@
BINDIR:=@bindir@
PKGCONFIGDIR:=$(LIBDIR)/pkgconfig
HOST_OS:=@host_os@
EXEEXT:=@EXEEXT@
AR:=@AR@
CC:=@CC@
CXX:=@CXX@
DLLTOOL:=@DLLTOOL@
LD:=@LD@
LN_S:=@LN_S@
M4:=@M4@
MKDIR_P:=@MKDIR_P@
STRIP:=@STRIP@
RM_F:=rm -f
RM_RF:=rm -rf
CP:=cp
CP_A:=cp -pRP
GDB:=gdb
STATIC:=@STATIC@
SHARED:=@SHARED@
COVERAGE:=@COVERAGE@
WANT_NTL:=@WANT_NTL@
WANT_DEPTRACK:=@WANT_DEPTRACK@
WANT_ASSEMBLY:=@WANT_ASSEMBLY@
ASM_PATH:=$(ABS_SRC_DIR)/mpn_extras/@ASM_PATH@
WANT_LTO:=@WANT_LTO@
GMP_LIB_PATH:=@GMP_LIB_PATH@
MPFR_LIB_PATH:=@MPFR_LIB_PATH@
BLAS_LIB_PATH:=@BLAS_LIB_PATH@
GC_LIB_PATH:=@GC_LIB_PATH@
NTL_LIB_PATH:=@NTL_LIB_PATH@
_CFLAGS:=@CFLAGS@
CFLAGS=$(if $(filter inlines.c,$(notdir $<)),$(filter-out -Wmissing-prototypes,$(_CFLAGS)),$(_CFLAGS))
TESTCFLAGS:=$(filter-out -Wmissing-prototypes,$(_CFLAGS))
CPPFLAGS:=-I$(ABS_SRC_DIR) -I$(SRC_DIR) @CPPFLAGS@ -DBUILDING_FLINT
CPPFLAGS2:=-L$(FLINT_DIR) $(CPPFLAGS)
LIB_CPPFLAGS:=@LIB_CPPFLAGS@
CXXFLAGS:=@CXXFLAGS@
LIBS:=@LIBS@
ifneq ($(WANT_NTL), 0)
LIBS += -lstdc++ -lntl
endif
LIBS2:=-lflint $(LIBS)
PIC_FLAG:=@PIC_FLAG@
ifeq ($(WANT_ASSEMBLY),1)
ASMFLAGS:=@ASMFLAGS@
ASM_PIC_FLAG:=$(filter-out -D%,$(PIC_FLAG))
endif
UNROLL_LOOPS:=@UNROLL_LOOPS@
ifeq ($(UNROLL_LOOPS), 1)
ulong_extras_CFLAGS:=-funroll-loops
nmod_CFLAGS:=-funroll-loops
nmod_vec_CFLAGS:=-funroll-loops
nmod_mat_CFLAGS:=-funroll-loops
nmod_poly_CFLAGS:=-funroll-loops
arith_CFLAGS:=-funroll-loops
endif
LDFLAGS:=@LDFLAGS@
EXTRA_SHARED_FLAGS:=@EXTRA_SHARED_FLAGS@ $(foreach path, $(sort $(GMP_LIB_PATH) $(MPFR_LIB_PATH) $(BLAS_LIB_PATH) $(GC_LIB_PATH) $(NTL_LIB_PATH)), @WL@-rpath,$(path))
EXE_LDFLAGS:=$(LDFLAGS) $(foreach path, $(sort $(FLINT_DIR) $(GMP_LIB_PATH) $(MPFR_LIB_PATH) $(BLAS_LIB_PATH) $(GC_LIB_PATH) $(NTL_LIB_PATH)), @WL@-rpath,$(path))
JOBS:=$(filter -j%,$(MAKEFLAGS))
NJOBS:=$(patsubst -j%,%,$(JOBS))
ifneq ($(JOBS),)
ifeq ($(NJOBS),)
NJOBS:=8
endif
endif
V ?= 0
ifeq ($(V),1)
MSG = @:
CMD =
else
MSG = @echo
CMD = @
endif
CFG_HEADERS := \
$(SRC_DIR)/config.h $(SRC_DIR)/flint-config.h \
$(SRC_DIR)/flint.h $(SRC_DIR)/gmpcompat.h \
$(SRC_DIR)/flint-mparam.h
_CFG_FILES := \
$(FLINT_DIR)/config.log $(FLINT_DIR)/flint.pc \
$(FLINT_DIR)/Makefile $(SRC_DIR)/fmpz/fmpz.c \
$(FLINT_DIR)/config.m4 $(FLINT_DIR)/config.status
CFG_FILES := $(_CFG_FILES) $(CFG_HEADERS)
HEADLESS_DIRS := generic_files
HEADER_DIRS := \
thread_pool thread_support \
\
ulong_extras long_extras perm \
double_extras d_vec d_mat \
\
mpn_extras radix mpn_mod nfloat \
\
nmod nmod_vec nmod_mat nmod_poly \
fmpz fmpz_vec fmpz_mat fmpz_poly \
fmpz_mod fmpz_mod_vec fmpz_mod_mat fmpz_mod_poly \
fmpq fmpq_vec fmpq_mat fmpq_poly \
fq_nmod fq_nmod_vec fq_nmod_mat fq_nmod_poly \
fq_zech fq_zech_mat fq_zech_poly \
n_poly \
fq fq_vec fq_mat fq_poly \
padic padic_mat padic_poly \
qadic \
\
fmpz_extras fmpz_factor fmpzi \
fft @FFT_SMALL@ \
fmpz_lll \
arith \
qsieve aprcl \
\
fq_default fq_default_mat fq_default_poly \
fq_nmod_embed fq_zech_embed fq_embed \
nmod_poly_mat fmpz_poly_mat \
\
mpoly nmod_mpoly fmpz_mpoly \
fmpz_mod_mpoly fmpq_mpoly fq_nmod_mpoly \
fq_zech_mpoly \
\
fmpz_poly_q fmpz_mpoly_q fmpz_mod_mpoly_q \
\
nmod_poly_factor \
fmpz_poly_factor fmpz_mod_poly_factor \
fq_poly_factor fq_nmod_poly_factor \
fq_zech_poly_factor fq_default_poly_factor \
nmod_mpoly_factor fmpz_mpoly_factor \
fmpz_mod_mpoly_factor fmpq_mpoly_factor \
fq_nmod_mpoly_factor fq_zech_mpoly_factor \
\
nf nf_elem qfb \
\
mag arf acf arb acb \
arb_mat arb_poly arb_calc arb_hypgeom \
acb_mat acb_poly acb_calc acb_hypgeom \
double_interval dlog \
arb_fmpz_poly arb_fpwrap \
acb_dft acb_elliptic acb_modular \
acb_dirichlet acb_theta \
dirichlet bernoulli hypgeom \
bool_mat partitions \
\
gr gr_generic gr_vec gr_mat \
gr_poly gr_mpoly gr_ore_poly \
gr_series gr_special \
\
calcium \
\
fexpr fexpr_builtin \
qqbar \
ca ca_vec ca_mat ca_poly \
ca_ext ca_field
DIRS := $(HEADLESS_DIRS) $(HEADER_DIRS)
TEMPLATE_DIRS := \
fq_vec_templates fq_mat_templates \
fq_poly_templates fq_poly_factor_templates \
fq_embed_templates fq_templates
BUILD_DIRS := \
$(BUILD_DIR) \
$(patsubst %, $(BUILD_DIR)/%, $(DIRS)) \
$(patsubst %, $(BUILD_DIR)/%/profile, $(DIRS)) \
$(patsubst %, $(BUILD_DIR)/%/test, $(DIRS)) \
$(patsubst %, $(BUILD_DIR)/%/tune, $(DIRS)) \
$(BUILD_DIR)/examples $(BUILD_DIR)/profile \
$(BUILD_DIR)/test $(BUILD_DIR)/tune
ifneq ($(WANT_NTL), 0)
BUILD_DIRS += \
$(BUILD_DIR)/interfaces $(BUILD_DIR)/interfaces/test
endif
ifneq ($(COVERAGE), 0)
BUILD_DIRS += \
$(BUILD_DIR)/coverage
endif
ifeq ($(WANT_ASSEMBLY),1)
BUILD_DIRS += \
$(patsubst $(ABS_SRC_DIR)/%,$(BUILD_DIR)/%,$(ASM_PATH))
endif
INSTALL_DIRS := \
$(DESTDIR)$(LIBDIR) $(DESTDIR)$(INCLUDEDIR)/flint \
$(DESTDIR)$(PKGCONFIGDIR)
ifneq ($(FLINT_DLLLIB),0)
INSTALL_DIRS += $(DESTDIR)$(BINDIR)
endif
HEADERS := $(wildcard $(ABS_SRC_DIR)/*.h) $(CFG_HEADERS)
define xxx_SOURCES
$(1)_SOURCES := $(wildcard $(ABS_SRC_DIR)/$(1)/*.c)
endef
$(foreach dir, $(DIRS), $(eval $(call xxx_SOURCES,$(dir))))
ifeq ($(IS_OUT_OF_TREE),1)
fmpz_SOURCES += $(SRC_DIR)/fmpz/fmpz.c
endif
SOURCES := $(foreach dir,$(DIRS),$($(dir)_SOURCES))
ifeq ($(WANT_ASSEMBLY),1)
mpn_extras_ASM_SOURCES := $(wildcard $(ASM_PATH)/*.asm)
mpn_extras_PIC_S_SOURCES := $(patsubst $(ABS_SRC_DIR)/%.asm,$(BUILD_DIR)/%_pic.s,$(mpn_extras_ASM_SOURCES))
mpn_extras_S_SOURCES := $(patsubst $(ABS_SRC_DIR)/%.asm,$(BUILD_DIR)/%.s,$(mpn_extras_ASM_SOURCES))
ifneq ($(SHARED), 0)
mpn_extras_SOURCES += $(mpn_extras_PIC_S_SOURCES)
endif
ifneq ($(STATIC), 0)
mpn_extras_SOURCES += $(mpn_extras_S_SOURCES)
endif
endif
define xxx_PROF_SOURCES
$(1)_PROF_SOURCES := $(wildcard $(ABS_SRC_DIR)/$(1)/profile/*.c)
endef
_PROF_SOURCES := $(wildcard $(ABS_SRC_DIR)/profile/*.c)
$(foreach dir, $(DIRS), $(eval $(call xxx_PROF_SOURCES,$(dir))))
PROF_SOURCES := $(foreach dir,$(DIRS),$($(dir)_PROF_SOURCES)) $(_PROF_SOURCES)
fq_zech_vec_TEST_SOURCES := $(wildcard $(ABS_SRC_DIR)/fq_zech_vec/test/main.c)
define xxx_TEST_SOURCES
$(1)_TEST_SOURCES := $(wildcard $(ABS_SRC_DIR)/$(1)/test/main.c)
endef
_TEST_SOURCES := $(wildcard $(ABS_SRC_DIR)/test/main.c)
$(foreach dir, $(DIRS), $(eval $(call xxx_TEST_SOURCES,$(dir))))
TEST_SOURCES := $(_TEST_SOURCES) $(foreach dir,$(DIRS),$($(dir)_TEST_SOURCES)) $(fq_zech_vec_TEST_SOURCES)
ifneq ($(WANT_NTL), 0)
interfaces_TEST_SOURCES := $(ABS_SRC_DIR)/interfaces/test/t-NTL-interface.cpp
endif
define xxx_TUNE_SOURCES
$(1)_TUNE_SOURCES := $(wildcard $(ABS_SRC_DIR)/$(1)/tune/*.c)
endef
_TUNE_SOURCES := $(wildcard $(ABS_SRC_DIR)/tune/*.c)
$(foreach dir, $(DIRS), $(eval $(call xxx_TUNE_SOURCES,$(dir))))
TUNE_SOURCES := $(foreach dir,$(DIRS),$($(dir)_TUNE_SOURCES)) $(_TUNE_SOURCES)
EXMP_SOURCES := $(wildcard $(ABS_FLINT_DIR)/examples/*.c)
ifneq ($(STATIC), 0)
define xxx_OBJS
$(1)_OBJS := $(patsubst $(ABS_SRC_DIR)/%.c,$(BUILD_DIR)/%.o,$(filter-out %.s,$($(1)_SOURCES)))
endef
$(foreach dir, $(DIRS), $(eval $(call xxx_OBJS,$(dir))))
ifeq ($(IS_OUT_OF_TREE),1)
fmpz_OBJS := $(subst $(SRC_DIR)/fmpz/fmpz.c,$(BUILD_DIR)/fmpz/fmpz.o,$(fmpz_OBJS))
endif
ifeq ($(WANT_ASSEMBLY),1)
mpn_extras_OBJS += $(patsubst %.s,%.o,$(mpn_extras_S_SOURCES))
endif
OBJS := $(foreach dir, $(DIRS), $($(dir)_OBJS))
endif
ifneq ($(SHARED), 0)
define xxx_LOBJS
$(1)_LOBJS := $(patsubst $(ABS_SRC_DIR)/%.c,$(BUILD_DIR)/%.lo,$(filter-out %.s, $($(1)_SOURCES)))
endef
$(foreach dir, $(DIRS), $(eval $(call xxx_LOBJS,$(dir))))
ifeq ($(IS_OUT_OF_TREE),1)
fmpz_LOBJS := $(subst $(SRC_DIR)/fmpz/fmpz.c,$(BUILD_DIR)/fmpz/fmpz.lo,$(fmpz_LOBJS))
endif
ifeq ($(WANT_ASSEMBLY),1)
mpn_extras_LOBJS += $(patsubst %_pic.s,%.lo,$(mpn_extras_PIC_S_SOURCES))
endif
LOBJS := $(foreach dir, $(DIRS), $($(dir)_LOBJS))
endif
define xxx_PROFS
$(1)_PROFS := $(patsubst $(ABS_SRC_DIR)/%.c,$(BUILD_DIR)/%$(EXEEXT),$($(1)_PROF_SOURCES))
endef
_PROFS := $(patsubst $(ABS_SRC_DIR)/%.c,$(BUILD_DIR)/%$(EXEEXT),$(_PROF_SOURCES))
$(foreach dir, $(DIRS), $(eval $(call xxx_PROFS,$(dir))))
PROFS := $(foreach dir,$(DIRS),$($(dir)_PROFS)) $(_PROFS)
define xxx_TESTS
$(1)_TESTS := $(patsubst $(ABS_SRC_DIR)/%.c,$(BUILD_DIR)/%$(EXEEXT),$($(1)_TEST_SOURCES))
endef
_TESTS := $(patsubst $(ABS_SRC_DIR)/%.c,$(BUILD_DIR)/%$(EXEEXT),$(_TEST_SOURCES))
$(foreach dir, $(DIRS), $(eval $(call xxx_TESTS,$(dir))))
ifneq ($(WANT_NTL), 0)
interfaces_TESTS := $(BUILD_DIR)/interfaces/test/t-NTL-interface$(EXEEXT)
endif
TESTS := $(_TESTS) $(foreach dir,$(DIRS),$($(dir)_TESTS)) $(interfaces_TESTS)
define xxx_TUNES
$(1)_TUNES := $(patsubst $(ABS_SRC_DIR)/%.c,$(BUILD_DIR)/%$(EXEEXT),$($(1)_TUNE_SOURCES))
endef
_TUNES := $(patsubst $(ABS_SRC_DIR)/%.c,$(BUILD_DIR)/%$(EXEEXT),$(_TUNE_SOURCES))
$(foreach dir, $(DIRS), $(eval $(call xxx_TUNES,$(dir))))
TUNES := $(foreach dir,$(DIRS),$($(dir)_TUNES)) $(_TUNES)
EXMPS := $(patsubst $(ABS_FLINT_DIR)/%.c,$(BUILD_DIR)/%$(EXEEXT),$(EXMP_SOURCES))
all: library
ifneq ($(SHARED), 0)
library: shared
endif
ifneq ($(STATIC), 0)
library: static
endif
ifneq ($(SHARED), 0)
shared: $(FLINT_DIR)/$(FLINT_LIB_FULL)
define xxx_merged_lobj_rule
$(BUILD_DIR)/$(1)_merged.lo: $($(1)_LOBJS) | $(BUILD_DIR)
@$(LD) -r $($(1)_LOBJS) -o $(BUILD_DIR)/$(1)_merged.lo
endef
$(foreach dir, $(DIRS), $(eval $(call xxx_merged_lobj_rule,$(dir))))
MERGED_LOBJS:=$(foreach dir, $(DIRS),$(BUILD_DIR)/$(dir)_merged.lo)
ifeq ($(WANT_LTO),1)
SHARED_LIB_DEPS:=$(LOBJS)
else
SHARED_LIB_DEPS:=$(MERGED_LOBJS)
endif
$(FLINT_DIR)/$(FLINT_LIB_FULL): $(SHARED_LIB_DEPS)
@echo "Building $(FLINT_LIB_FULL)"
$(CMD) $(CC) $(CFLAGS) -shared $(EXTRA_SHARED_FLAGS) $(SHARED_LIB_DEPS) -o $(FLINT_LIB_FULL) $(LDFLAGS) $(LIBS)
@$(RM_F) $(FLINT_LIB)
@$(RM_F) $(FLINT_LIB_MAJOR)
@$(LN_S) $(FLINT_LIB_FULL) $(FLINT_LIB)
@$(LN_S) $(FLINT_LIB_FULL) $(FLINT_LIB_MAJOR)
endif
ifneq ($(STATIC), 0)
static: $(FLINT_DIR)/$(FLINT_LIB_STATIC)
define xxx_merged_obj_rule
$(BUILD_DIR)/$(1)_merged.o: $($(1)_OBJS) | $(BUILD_DIR)
@$(LD) -r $($(1)_OBJS) -o $(BUILD_DIR)/$(1)_merged.o
endef
$(foreach dir, $(DIRS), $(eval $(call xxx_merged_obj_rule,$(dir))))
MERGED_OBJS:=$(foreach dir, $(DIRS),$(BUILD_DIR)/$(dir)_merged.o)
ifeq ($(WANT_LTO),1)
STATIC_LIB_DEPS:=$(OBJS)
else
STATIC_LIB_DEPS:=$(MERGED_OBJS)
endif
$(FLINT_DIR)/$(FLINT_LIB_STATIC): $(STATIC_LIB_DEPS)
@echo "Building $(FLINT_LIB_STATIC)"
@$(AR) rcs $(FLINT_DIR)/$(FLINT_LIB_STATIC) $(STATIC_LIB_DEPS)
endif
$(BUILD_DIRS) $(INSTALL_DIRS):
$(MKDIR_P) $@
$(BUILD_DIR)/include: $(HEADERS)
$(MKDIR_P) $@/flint && $(CP) $(HEADERS) $@/flint
ifneq ($(WANT_DEPTRACK), 0)
ifeq ($(words $(MAKECMDGOALS)), 0)
-include $(BUILD_DIR)/*/*.o.d
-include $(BUILD_DIR)/*/*.lo.d
else ifeq ($(words $(MAKECMDGOALS)), 1)
ifeq ($(MAKECMDGOALS), clean)
else ifeq ($(MAKECMDGOALS), dist)
else ifeq ($(MAKECMDGOALS), distclean)
else ifeq ($(MAKECMDGOALS), uninstall)
else ifeq ($(findstring print-,$(MAKECMDGOALS)), print-)
else ifeq ($(MAKECMDGOALS), static)
-include $(BUILD_DIR)/*/*.o.d
else ifeq ($(MAKECMDGOALS), shared)
-include $(BUILD_DIR)/*/*.lo.d
else ifeq ($(MAKECMDGOALS), library)
-include $(BUILD_DIR)/*/*.o.d
-include $(BUILD_DIR)/*/*.lo.d
else ifeq ($(MAKECMDGOALS), install)
-include $(BUILD_DIR)/*/*.o.d
-include $(BUILD_DIR)/*/*.lo.d
else ifeq ($(MAKECMDGOALS), examples)
-include $(BUILD_DIR)/*/*.o.d
-include $(BUILD_DIR)/*/*.lo.d
-include $(BUILD_DIR)/examples/*.d
else ifeq ($(MAKECMDGOALS), profile)
ifdef MOD
$(warning Dependency tracking only set to cover the profile executables of $(MOD).)
-include $(foreach dir, $(MOD), $(BUILD_DIR)/$(dir)/profile/*.d)
else
-include $(BUILD_DIR)/*/*.o.d
-include $(BUILD_DIR)/*/*.lo.d
-include $(BUILD_DIR)/profile/*.d
-include $(BUILD_DIR)/*/profile/*.d
endif
else ifeq ($(MAKECMDGOALS), tests)
-include $(BUILD_DIR)/*/*.o.d
-include $(BUILD_DIR)/*/*.lo.d
-include $(BUILD_DIR)/test/*.d
-include $(BUILD_DIR)/*/test/*.d
else ifeq ($(MAKECMDGOALS), check)
ifdef MOD
$(warning Dependency tracking only set to cover the test executables of $(MOD).)
-include $(foreach dir, $(MOD), $(BUILD_DIR)/$(dir)/test/*.d)
else
-include $(BUILD_DIR)/*/*.o.d
-include $(BUILD_DIR)/*/*.lo.d
-include $(BUILD_DIR)/test/*.d
-include $(BUILD_DIR)/*/test/*.d
endif
else ifeq ($(MAKECMDGOALS), debug)
ifdef MOD
$(warning Dependency tracking only set to cover the test executables of $(MOD).)
-include $(foreach dir, $(MOD), $(BUILD_DIR)/$(dir)/test/*.d)
else
-include $(BUILD_DIR)/*/*.o.d
-include $(BUILD_DIR)/*/*.lo.d
-include $(BUILD_DIR)/test/*.d
-include $(BUILD_DIR)/*/test/*.d
endif
else ifeq ($(MAKECMDGOALS), tune)
-include $(BUILD_DIR)/*/*.o.d
-include $(BUILD_DIR)/*/*.lo.d
-include $(BUILD_DIR)/tune/*.d
-include $(BUILD_DIR)/*/tune/*.d
else ifeq ($(MAKECMDGOALS), valgrind)
ifdef MOD
$(warning Dependency tracking only set to cover the test executables of $(MOD).)
-include $(foreach dir, $(MOD), $(BUILD_DIR)/$(dir)/test/*.d)
else
-include $(BUILD_DIR)/*/*.o.d
-include $(BUILD_DIR)/*/*.lo.d
-include $(BUILD_DIR)/test/*.d
-include $(BUILD_DIR)/*/test/*.d
endif
else
-include $(BUILD_DIR)/*/*.o.d
-include $(BUILD_DIR)/*/*.lo.d
-include $(BUILD_DIR)/test/*.d
-include $(BUILD_DIR)/*/test/*.d
-include $(BUILD_DIR)/profile/*.d
-include $(BUILD_DIR)/*/profile/*.d
-include $(BUILD_DIR)/examples/*.d
endif
else
-include $(BUILD_DIR)/*/*.o.d
-include $(BUILD_DIR)/*/*.lo.d
-include $(BUILD_DIR)/test/*.d
-include $(BUILD_DIR)/*/test/*.d
-include $(BUILD_DIR)/profile/*.d
-include $(BUILD_DIR)/*/profile/*.d
-include $(BUILD_DIR)/examples/*.d
endif
endif
DEPFLAGS = -MMD -MP -MF $(@:%=%.d)
ifeq ($(WANT_ASSEMBLY),1)
$(BUILD_DIR)/%.s: $(ABS_SRC_DIR)/%.asm $(FLINT_DIR)/config.m4 | $(BUILD_DIR)/mpn_extras/@ASM_PATH@
@$(M4) $< > $@
$(BUILD_DIR)/%_pic.s: $(ABS_SRC_DIR)/%.asm $(FLINT_DIR)/config.m4 | $(BUILD_DIR)/mpn_extras/@ASM_PATH@
@$(M4) -DPIC $< > $@
endif
ifneq ($(STATIC), 0)
define xxx_OBJS_rule
$(BUILD_DIR)/$(1)/%.o: $(ABS_SRC_DIR)/$(1)/%.c | $(BUILD_DIR)/$(1)
$(MSG) " CC $$(<:$(ABS_SRC_DIR)/%=%)"
$(CMD) $(CC) $$(CFLAGS) $($(1)_CFLAGS) $(CPPFLAGS) $(LIB_CPPFLAGS) -c $$< -o $$@ $$(DEPFLAGS)
endef
ifeq ($(IS_OUT_OF_TREE),1)
$(BUILD_DIR)/fmpz/fmpz.o: $(SRC_DIR)/fmpz/fmpz.c | $(BUILD_DIR)/fmpz
$(MSG) " CC $(<:$(SRC_DIR)/%=%)"
$(CMD) $(CC) $(CFLAGS) $(fmpz_CFLAGS) $(CPPFLAGS) $(LIB_CPPFLAGS) -c $< -o $@ $(DEPFLAGS)
endif
ifeq ($(WANT_ASSEMBLY),1)
%.o: %.s
$(MSG) " CC $(<:$(BUILD_DIR)/%.s=%.asm)"
$(CMD) $(CC) $(ASMFLAGS) -c $< -o $@
endif
$(foreach dir, $(DIRS), $(eval $(call xxx_OBJS_rule,$(dir))))
endif
ifneq ($(SHARED), 0)
define xxx_LOBJS_rule
$(BUILD_DIR)/$(1)/%.lo: $(ABS_SRC_DIR)/$(1)/%.c | $(BUILD_DIR)/$(1)
$(MSG) " CC $$(<:$(ABS_SRC_DIR)/%=%)"
$(CMD) $(CC) $(PIC_FLAG) $$(CFLAGS) $($(1)_CFLAGS) $(CPPFLAGS) $(LIB_CPPFLAGS) -c $$< -o $$@ $$(DEPFLAGS)
endef
ifeq ($(IS_OUT_OF_TREE),1)
$(BUILD_DIR)/fmpz/fmpz.lo: $(SRC_DIR)/fmpz/fmpz.c | $(BUILD_DIR)/fmpz
$(MSG) " CC $(<:$(SRC_DIR)/%=%)"
$(CMD) $(CC) $(PIC_FLAG) $(CFLAGS) $(fmpz_CFLAGS) $(CPPFLAGS) $(LIB_CPPFLAGS) -c $< -o $@ $(DEPFLAGS)
endif
ifeq ($(WANT_ASSEMBLY),1)
%.lo: %_pic.s
$(MSG) " CC $(<:$(BUILD_DIR)/%.s=%.asm)"
$(CMD) $(CC) $(ASMFLAGS) $(ASM_PIC_FLAG) -c $< -o $@
endif
$(foreach dir, $(DIRS), $(eval $(call xxx_LOBJS_rule,$(dir))))
endif
ifeq ($(SHARED), 0)
$(BUILD_DIR)/profile/%$(EXEEXT): $(ABS_SRC_DIR)/profile/%.c $(FLINT_DIR)/$(FLINT_LIB_STATIC) | $(BUILD_DIR)/profile
$(MSG) " CC $(<:$(ABS_SRC_DIR)/%=%)"
$(CMD) $(CC) $(TESTCFLAGS) $(CPPFLAGS2) $< -o $@ $(EXE_LDFLAGS) $(LIBS2) $(DEPFLAGS)
else
$(BUILD_DIR)/profile/%$(EXEEXT): $(ABS_SRC_DIR)/profile/%.c | $(FLINT_DIR)/$(FLINT_LIB_FULL) $(BUILD_DIR)/profile
$(MSG) " CC $(<:$(ABS_SRC_DIR)/%=%)"
$(CMD) $(CC) $(TESTCFLAGS) $(CPPFLAGS2) $< -o $@ $(EXE_LDFLAGS) $(LIBS2) $(DEPFLAGS)
endif
ifeq ($(SHARED), 0)
define xxx_PROFS_rule
$(BUILD_DIR)/$(1)/profile/%$(EXEEXT): $(ABS_SRC_DIR)/$(1)/profile/%.c $(FLINT_DIR)/$(FLINT_LIB_STATIC) | $(BUILD_DIR)/$(1)/profile
$(MSG) " CC $$(<:$(ABS_SRC_DIR)/%=%)"
$(CMD) $(CC) $(TESTCFLAGS) $(CPPFLAGS2) $$< -o $$@ $(EXE_LDFLAGS) $(LIBS2) $$(DEPFLAGS)
endef
else
define xxx_PROFS_rule
$(BUILD_DIR)/$(1)/profile/%$(EXEEXT): $(ABS_SRC_DIR)/$(1)/profile/%.c | $(FLINT_DIR)/$(FLINT_LIB_FULL) $(BUILD_DIR)/$(1)/profile
$(MSG) " CC $$(<:$(ABS_SRC_DIR)/%=%)"
$(CMD) $(CC) $(TESTCFLAGS) $(CPPFLAGS2) $$< -o $$@ $(EXE_LDFLAGS) $(LIBS2) $$(DEPFLAGS)
endef
endif
$(foreach dir, $(DIRS), $(eval $(call xxx_PROFS_rule,$(dir))))
ifeq ($(SHARED), 0)
$(BUILD_DIR)/test/%$(EXEEXT): $(ABS_SRC_DIR)/test/%.c $(FLINT_DIR)/$(FLINT_LIB_STATIC) | $(BUILD_DIR)/test
$(MSG) " CC $(<:$(ABS_SRC_DIR)/%=%)"
$(CMD) $(CC) $(TESTCFLAGS) $(CPPFLAGS2) $< -o $@ $(EXE_LDFLAGS) $(LIBS2) $(DEPFLAGS)
else
$(BUILD_DIR)/test/%$(EXEEXT): $(ABS_SRC_DIR)/test/%.c | $(FLINT_DIR)/$(FLINT_LIB_FULL) $(BUILD_DIR)/test
$(MSG) " CC $(<:$(ABS_SRC_DIR)/%=%)"
$(CMD) $(CC) $(TESTCFLAGS) $(CPPFLAGS2) $< -o $@ $(EXE_LDFLAGS) $(LIBS2) $(DEPFLAGS)
endif
ifeq ($(SHARED), 0)
define xxx_TESTS_rule
$(BUILD_DIR)/$(1)/test/%$(EXEEXT): $(ABS_SRC_DIR)/$(1)/test/%.c $(FLINT_DIR)/libflint.a | $(BUILD_DIR)/$(1)/test
$(MSG) " CC $$(<:$(ABS_SRC_DIR)/%=%)"
$(CMD) $(CC) $(TESTCFLAGS) $(CPPFLAGS2) $$< -o $$@ $(EXE_LDFLAGS) $(LIBS2) $$(DEPFLAGS)
endef
else
define xxx_TESTS_rule
$(BUILD_DIR)/$(1)/test/%$(EXEEXT): $(ABS_SRC_DIR)/$(1)/test/%.c | $(FLINT_DIR)/$(FLINT_LIB_FULL) $(BUILD_DIR)/$(1)/test
$(MSG) " CC $$(<:$(ABS_SRC_DIR)/%=%)"
$(CMD) $(CC) $(TESTCFLAGS) $(CPPFLAGS2) $$< -o $$@ $(EXE_LDFLAGS) $(LIBS2) $$(DEPFLAGS)
endef
endif
$(foreach dir, $(DIRS), $(eval $(call xxx_TESTS_rule,$(dir))))
ifneq ($(WANT_NTL), 0)
ifeq ($(SHARED), 0)
$(BUILD_DIR)/interfaces/test/t-NTL-interface$(EXEEXT): $(ABS_SRC_DIR)/interfaces/test/t-NTL-interface.cpp $(FLINT_DIR)/$(FLINT_LIB_STATIC) | $(BUILD_DIR)/interfaces/test
$(MSG) " CXX $(<:$(ABS_SRC_DIR)/%=%)"
$(CMD) $(CXX) $(CXXFLAGS) $(CPPFLAGS2) $< -o $@ $(EXE_LDFLAGS) $(LIBS2) $(DEPFLAGS)
else
$(BUILD_DIR)/interfaces/test/t-NTL-interface$(EXEEXT): $(ABS_SRC_DIR)/interfaces/test/t-NTL-interface.cpp | $(FLINT_DIR)/$(FLINT_LIB_FULL) $(BUILD_DIR)/interfaces/test
$(MSG) " CXX $(<:$(ABS_SRC_DIR)/%=%)"
$(CMD) $(CXX) $(CXXFLAGS) $(CPPFLAGS2) $< -o $@ $(EXE_LDFLAGS) $(LIBS2) $(DEPFLAGS)
endif
endif
ifeq ($(SHARED), 0)
$(BUILD_DIR)/tune/%$(EXEEXT): $(ABS_SRC_DIR)/tune/%.c $(FLINT_DIR)/$(FLINT_LIB_STATIC) | $(BUILD_DIR)/tune
$(MSG) " CC $(<:$(ABS_SRC_DIR)/%=%)"
$(CMD) $(CC) $(TESTCFLAGS) $(CPPFLAGS2) $< -o $@ $(EXE_LDFLAGS) $(LIBS2) $(DEPFLAGS)
else
$(BUILD_DIR)/tune/%$(EXEEXT): $(ABS_SRC_DIR)/tune/%.c | $(FLINT_DIR)/$(FLINT_LIB_FULL) $(BUILD_DIR)/tune
$(MSG) " CC $(<:$(ABS_SRC_DIR)/%=%)"
$(CMD) $(CC) $(TESTCFLAGS) $(CPPFLAGS2) $< -o $@ $(EXE_LDFLAGS) $(LIBS2) $(DEPFLAGS)
endif
ifeq ($(SHARED), 0)
define xxx_TUNES_rule
$(BUILD_DIR)/$(1)/tune/%$(EXEEXT): $(ABS_SRC_DIR)/$(1)/tune/%.c $(FLINT_DIR)/$(FLINT_LIB_STATIC) | $(BUILD_DIR)/$(1)/tune
$(MSG) " CC $$(<:$(ABS_SRC_DIR)/%=%)"
$(CMD) $(CC) $(TESTCFLAGS) $(CPPFLAGS2) $$< -o $$@ $(EXE_LDFLAGS) $(LIBS2) $$(DEPFLAGS)
endef
else
define xxx_TUNES_rule
$(BUILD_DIR)/$(1)/tune/%$(EXEEXT): $(ABS_SRC_DIR)/$(1)/tune/%.c | $(FLINT_DIR)/$(FLINT_LIB_FULL) $(BUILD_DIR)/$(1)/tune
$(MSG) " CC $$(<:$(ABS_SRC_DIR)/%=%)"
$(CMD) $(CC) $(TESTCFLAGS) $(CPPFLAGS2) $$< -o $$@ $(EXE_LDFLAGS) $(LIBS2) $$(DEPFLAGS)
endef
endif
$(foreach dir, $(DIRS), $(eval $(call xxx_TUNES_rule,$(dir))))
ifeq ($(SHARED), 0)
$(BUILD_DIR)/examples/%$(EXEEXT): $(ABS_FLINT_DIR)/examples/%.c $(FLINT_DIR)/$(FLINT_LIB_STATIC) | $(BUILD_DIR)/examples $(BUILD_DIR)/include
$(MSG) " CC $(<:$(ABS_FLINT_DIR)/%=%)"
$(CMD) $(CC) $(TESTCFLAGS) $(CPPFLAGS2) $< -o $@ $(EXE_LDFLAGS) $(LIBS2) $(DEPFLAGS) -I$(BUILD_DIR)/include
else
$(BUILD_DIR)/examples/%$(EXEEXT): $(ABS_FLINT_DIR)/examples/%.c | $(FLINT_DIR)/$(FLINT_LIB_FULL) $(BUILD_DIR)/examples $(BUILD_DIR)/include
$(MSG) " CC $(<:$(ABS_FLINT_DIR)/%=%)"
$(CMD) $(CC) $(TESTCFLAGS) $(CPPFLAGS2) $< -o $@ $(EXE_LDFLAGS) $(LIBS2) $(DEPFLAGS) -I$(BUILD_DIR)/include
endif
examples: library $(EXMPS)
%_EXMP_RUN: %
@$(ABS_FLINT_DIR)/dev/check_examples.sh $(patsubst $(BUILD_DIR)/examples/%,%,$<) $(BUILD_DIR)/examples
checkexamples: examples $(EXMPS:%=%_EXMP_RUN)
ifdef MOD
profile: library $(foreach dir, $(MOD), $($(dir)_PROFS))
else
profile: library $(PROFS)
endif
tests: library $(TESTS)
%_TEST_RUN: %
@$<
%_TEST_RUN_ARGS: %
@$< $(ARGS)
ifneq ($(NJOBS),)
number_generator=$(words $2) $(if $(word $1,$2),,$(call number_generator,$1,w $2))
THREAD_LIST:=$(call number_generator,$(NJOBS),w)
define xxx_test_run_parallel
%_TEST_RUN_$(1): %
@$$< --numthreads=$(NJOBS) --thread=$(1)
endef
$(foreach num, $(THREAD_LIST), $(eval $(call xxx_test_run_parallel,$(num))))
endif
ifdef PYTHON
ifeq ($(findstring linux,$(HOST_OS)),linux)
check: library
@LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$(ABS_FLINT_DIR) python3 $(ABS_SRC_DIR)/python/flint_ctypes.py
@echo ''
@echo 'All Python tests passed.'
else
check: library
@python3 $(ABS_SRC_DIR)/python/flint_ctypes.py
@echo ''
@echo 'All Python tests passed.'
endif
else ifdef MOD
ifdef ARGS
ifneq ($(words $(sort $(MOD))),1)
$(error Can only check one modules with arguments.)
else
check: library $(patsubst %,%_TEST_RUN_ARGS, $($(sort $(MOD))_TESTS))
@echo ''
@echo 'All tests passed for $(sort $(MOD)).'
endif
else
ifeq ($(NJOBS),)
check: library $(patsubst %,%_TEST_RUN,$(foreach dir, $(MOD), $($(dir)_TESTS)))
@echo ''
ifeq ($(words $(sort $(MOD))),0)
@echo 'No tests where performed.'
else ifeq ($(words $(sort $(MOD))),1)
@echo 'All tests passed for $(sort $(MOD)).'
else ifeq ($(words $(sort $(MOD))),2)
@echo 'All tests passed for $(firstword $(sort $(MOD))) and $(lastword $(sort $(MOD))).'
else
@echo 'All tests passed for $(foreach dir,$(filter-out $(lastword $(filter-out $(lastword $(sort $(MOD))),$(sort $(MOD)))) $(lastword $(sort $(MOD))),$(sort $(MOD))),$(dir),) $(lastword $(filter-out $(lastword $(sort $(MOD))),$(sort $(MOD)))) and $(lastword $(sort $(MOD))).'
endif
else
check: library $(foreach x_test,$(patsubst %,%_TEST_RUN,$(foreach dir,$(MOD),$($(dir)_TESTS))),$(foreach num,$(THREAD_LIST),$(x_test)_$(num)))
@echo ''
ifeq ($(words $(sort $(MOD))),0)
@echo 'No tests where performed.'
else ifeq ($(words $(sort $(MOD))),1)
@echo 'All tests passed for $(sort $(MOD)).'
else ifeq ($(words $(sort $(MOD))),2)
@echo 'All tests passed for $(firstword $(sort $(MOD))) and $(lastword $(sort $(MOD))).'
else
@echo 'All tests passed for $(foreach dir,$(filter-out $(lastword $(filter-out $(lastword $(sort $(MOD))),$(sort $(MOD)))) $(lastword $(sort $(MOD))),$(sort $(MOD))),$(dir),) $(lastword $(filter-out $(lastword $(sort $(MOD))),$(sort $(MOD)))) and $(lastword $(sort $(MOD))).'
endif
endif
endif
else
check: library $(TESTS:%=%_TEST_RUN)
@echo ''
@echo 'All tests passed.'
endif
%_TEST_DBG_RUN_ARGS: %
@$(GDB) --args $< $(ARGS)
ifdef MOD
ifdef ARGS
DEBUG:=1
debug: library $(patsubst %,%_TEST_DBG_RUN_ARGS, $($(sort $(MOD))_TESTS))
endif
endif
ifneq ($(DEBUG),1)
debug:
$(error Can only run debugger with one module and one argument at a time)
endif
tune: library $(TUNES)
%_VALGRIND_RUN: %
valgrind --track-origins=yes --leak-check=full --show-reachable=yes --log-file="$*.valgrind" $<
ifdef MOD
valgrind: library $(patsubst %,%_VALGRIND_RUN,$(foreach dir, $(MOD), $($(dir)_TESTS)))
else
valgrind: library $(TESTS:%=%_VALGRIND_RUN)
endif
ifneq ($(COVERAGE), 0)
coverage: | $(BUILD_DIR)/coverage
lcov -j $(NJOBS) --capture --rc geninfo_unexecuted_blocks=1 --ignore-errors unused --omit-lines "flint_throw" --omit-lines '^}$$' --exclude "/usr/*" --exclude "src/*/inlines.c" --exclude "src/test/main.c" --exclude "src/test/t-*.c" --exclude "src/*/test/main.c" --exclude "src/*/test/t-*.c" --exclude "src/generic_files/exception.c" --exclude "src/generic_files/profiler.c" --exclude "src/profiler.h" --directory build --output-file build/coverage/coverage.info
coverage_html: coverage
genhtml $(NJOBS) $(BUILD_DIR)/coverage/coverage.info --output-directory $(BUILD_DIR)/coverage
endif
clean:
$(RM_F) $(FLINT_DIR)/$(FLINT_LIB)
$(RM_F) $(FLINT_DIR)/$(FLINT_LIB_MAJOR)
$(RM_F) $(FLINT_DIR)/$(FLINT_LIB_FULL)
ifneq ($(FLINT_DLLLIB), 0)
$(RM_F) $(FLINT_DIR)/$(FLINT_IMPLIB)
endif
$(RM_F) $(FLINT_DIR)/$(FLINT_LIB_STATIC)
$(RM_RF) $(BUILD_DIR)
distclean: clean
$(RM_F) $(CFG_FILES)
install: library | $(INSTALL_DIRS)
$(CP) flint.pc $(DESTDIR)$(PKGCONFIGDIR)/flint.pc
ifneq ($(SHARED), 0)
ifneq ($(FLINT_DLLLIB),0)
$(CP_A) $(FLINT_DIR)/$(FLINT_LIB) $(DESTDIR)$(BINDIR)
$(CP_A) $(FLINT_DIR)/$(FLINT_LIB_MAJOR) $(DESTDIR)$(BINDIR)
$(CP_A) $(FLINT_DIR)/$(FLINT_LIB_FULL) $(DESTDIR)$(BINDIR)
$(CP) $(FLINT_DIR)/$(FLINT_IMPLIB) $(DESTDIR)$(LIBDIR)
else
$(CP_A) $(FLINT_DIR)/$(FLINT_LIB) $(DESTDIR)$(LIBDIR)
$(CP_A) $(FLINT_DIR)/$(FLINT_LIB_MAJOR) $(DESTDIR)$(LIBDIR)
$(CP_A) $(FLINT_DIR)/$(FLINT_LIB_FULL) $(DESTDIR)$(LIBDIR)
endif
ifneq ($(FLINT_DYLIB),0)
install_name_tool -id $(LIBDIR)/$(FLINT_LIB_FULL) $(DESTDIR)$(LIBDIR)/$(FLINT_LIB)
endif
endif
ifneq ($(STATIC), 0)
$(CP) $(FLINT_DIR)/$(FLINT_LIB_STATIC) $(DESTDIR)$(LIBDIR)
endif
$(CP) $(HEADERS) $(DESTDIR)$(INCLUDEDIR)/flint
@echo ""
@echo '############################################################'
@echo '# NOTE: @echo '# @echo '# Before installing FLINT, ensure its reliability and @echo '# functionality by running the command `make check'"'"'. @echo '# @echo '# This will initiate a series of tests that validates the @echo '# execution of FLINT. This verification is a crucial step @echo '# in guaranteeing a stable and error-free execution of @echo '# your software. @echo '# @echo '############################################################'
uninstall:
$(RM_F) $(DESTDIR)$(PKGCONFIGDIR)/flint.pc
ifneq ($(FLINT_DLLLIB),0)
$(RM_F) $(DESTDIR)$(BINDIR)/$(FLINT_LIB)
$(RM_F) $(DESTDIR)$(BINDIR)/$(FLINT_LIB_MAJOR)
$(RM_F) $(DESTDIR)$(BINDIR)/$(FLINT_LIB_FULL)
$(RM_F) $(DESTDIR)$(LIBDIR)/$(FLINT_IMPLIB)
else
$(RM_F) $(DESTDIR)$(LIBDIR)/$(FLINT_LIB)
$(RM_F) $(DESTDIR)$(LIBDIR)/$(FLINT_LIB_MAJOR)
$(RM_F) $(DESTDIR)$(LIBDIR)/$(FLINT_LIB_FULL)
endif
$(RM_F) $(DESTDIR)$(LIBDIR)/$(FLINT_LIB_STATIC)
$(RM_RF) $(DESTDIR)$(INCLUDEDIR)/flint
ifneq ($(MAINTAINER_MODE),no) # disable this for releases?
ifneq ($(shell command -v autoreconf 2> /dev/null),)
$(ABS_FLINT_DIR)/configure: $(ABS_FLINT_DIR)/configure.ac $(ABS_FLINT_DIR)/bootstrap.sh
@echo "Running bootstrap.sh!"
@cd $(ABS_FLINT_DIR) && ./bootstrap.sh && cd - >/dev/null
else
$(ABS_FLINT_DIR)/configure: $(ABS_FLINT_DIR)/configure.ac
$(warning autoreconf not available, proceeding with stale configure)
endif
endif
config.status: $(ABS_FLINT_DIR)/configure
./config.status --recheck
Makefile: $(ABS_FLINT_DIR)/Makefile.in config.status
./config.status $@
flint.pc: $(ABS_FLINT_DIR)/flint.pc.in config.status
./config.status $@
$(SRC_DIR)/flint.h: $(ABS_SRC_DIR)/flint.h.in config.status
./config.status $@
libtool: config.status
./config.status $@
dist:
$(FLINT_DIR)/dev/make_dist.sh $(FLINT_VERSION)
print-%:
@echo "$*=$($*)"
.PHONY: all library shared static examples checkexamples profile tests check tune valgrind clean distclean install uninstall dist %_TEST_RUN %_TEST_RUN_% %_TEST_DGB_RUN_ARGS %_VALGRIND_RUN print-% coverage coverage_html debug
.PRECIOUS: $(mpn_extras_PIC_S_SOURCES) $(mpn_extras_S_SOURCES)