1#         $NetBSD: Makefile,v 1.35 2025/04/06 23:03:05 rillig Exp $
2
3.include <bsd.init.mk>
4
5# We don't install gmp, just provide it for GCC.
6LIBISPRIVATE?=      yes
7
8.include "../../Makefile.arch"
9
10.if ${LIBISPRIVATE} != "yes"
11INCS=         gmp.h
12INCSDIR=      /usr/include
13.endif
14
15DIST=${.CURDIR}/../../dist
16
17LIB=      gmp
18
19MPF_SRCS = \
20          init.c init2.c inits.c set.c                      \
21          set_ui.c set_si.c set_str.c set_d.c               \
22          set_z.c iset.c iset_ui.c iset_si.c                \
23          iset_str.c iset_d.c clear.c clears.c              \
24          get_str.c dump.c size.c eq.c reldiff.c            \
25          sqrt.c random2.c inp_str.c out_str.c              \
26          add.c add_ui.c sub.c sub_ui.c ui_sub.c            \
27          mul.c mul_ui.c div.c div_ui.c                     \
28          cmp.c cmp_d.c cmp_ui.c cmp_si.c cmp_z.c           \
29          mul_2exp.c div_2exp.c abs.c neg.c                 \
30          set_q.c get_d.c get_d_2exp.c set_dfl_prec.c       \
31          set_prc.c set_prc_raw.c get_dfl_prec.c            \
32          get_prc.c ui_div.c sqrt_ui.c                      \
33          ceilfloor.c trunc.c pow_ui.c                      \
34          urandomb.c swap.c                                 \
35          fits_sint.c fits_slong.c fits_sshort.c            \
36          fits_uint.c fits_ulong.c fits_ushort.c            \
37          get_si.c get_ui.c                                 \
38          int_p.c
39
40MPZ_SRCS = \
41          abs.c add.c add_ui.c                                        \
42          aorsmul.c aorsmul_i.c and.c array_init.c          \
43          bin_ui.c bin_uiui.c                               \
44          cdiv_q.c cdiv_q_ui.c                                        \
45          cdiv_qr.c cdiv_qr_ui.c                                      \
46          cdiv_r.c cdiv_r_ui.c cdiv_ui.c                              \
47          cfdiv_q_2exp.c cfdiv_r_2exp.c                     \
48          clear.c clears.c clrbit.c                         \
49          cmp.c cmp_d.c cmp_si.c cmp_ui.c                             \
50          cmpabs.c cmpabs_d.c cmpabs_ui.c                             \
51          com.c combit.c                                              \
52          cong.c cong_2exp.c cong_ui.c                      \
53          divexact.c divegcd.c dive_ui.c                              \
54          divis.c divis_ui.c divis_2exp.c dump.c            \
55          export.c fac_ui.c fdiv_q.c                        \
56          fdiv_q_ui.c fdiv_qr.c fdiv_qr_ui.c                \
57          fdiv_r.c fdiv_r_ui.c                                        \
58          fdiv_ui.c fib_ui.c fib2_ui.c fits_sint.c          \
59          fits_slong.c fits_sshort.c fits_uint.c            \
60          fits_ulong.c fits_ushort.c gcd.c                  \
61          gcd_ui.c gcdext.c get_d.c get_d_2exp.c            \
62          get_si.c get_str.c get_ui.c getlimbn.c            \
63          hamdist.c                                         \
64          import.c init.c init2.c inits.c                   \
65          inp_raw.c inp_str.c invert.c                      \
66          ior.c iset.c iset_d.c iset_si.c                             \
67          iset_str.c iset_ui.c jacobi.c kronsz.c            \
68          kronuz.c kronzs.c kronzu.c                        \
69          limbs_finish.c limbs_modify.c                     \
70          limbs_read.c limbs_write.c                        \
71          lcm.c lcm_ui.c lucnum_ui.c lucnum2_ui.c           \
72          millerrabin.c mod.c mul.c mul_2exp.c              \
73          mul_si.c mul_ui.c                                 \
74          n_pow_ui.c neg.c nextprime.c                      \
75          oddfac_1.c                                                  \
76          out_raw.c out_str.c perfpow.c perfsqr.c           \
77          popcount.c pow_ui.c powm.c                        \
78          powm_ui.c pprime_p.c                                        \
79          prodlimbs.c                                                 \
80          random.c random2.c                                \
81          realloc.c realloc2.c remove.c                     \
82          roinit_n.c                                                  \
83          root.c rootrem.c rrandomb.c scan0.c               \
84          scan1.c set.c set_d.c set_f.c                     \
85          set_q.c set_si.c set_str.c set_ui.c               \
86          setbit.c                                          \
87          size.c sizeinbase.c sqrt.c                        \
88          sqrtrem.c sub.c sub_ui.c swap.c                             \
89          tdiv_ui.c tdiv_q.c tdiv_q_2exp.c                  \
90          tdiv_q_ui.c tdiv_qr.c tdiv_qr_ui.c                \
91          tdiv_r.c tdiv_r_2exp.c tdiv_r_ui.c                \
92          tstbit.c ui_pow_ui.c ui_sub.c urandomb.c          \
93          urandomm.c xor.c
94
95MPQ_SRCS = \
96          abs.c aors.c                                                \
97          canonicalize.c clear.c clears.c                             \
98          cmp.c cmp_si.c cmp_ui.c div.c                     \
99          get_d.c get_den.c get_num.c get_str.c             \
100          init.c inits.c inp_str.c inv.c                              \
101          md_2exp.c mul.c neg.c out_str.c                             \
102          set.c set_den.c set_num.c                         \
103          set_si.c set_str.c set_ui.c                       \
104          equal.c set_z.c set_d.c                                     \
105          set_f.c swap.c
106
107PRINTF_SRCS =                                                         \
108          asprintf.c asprntffuns.c                          \
109          doprnt.c doprntf.c doprnti.c                      \
110          fprintf.c                                         \
111          obprintf.c obvprintf.c obprntffuns.c              \
112          printf.c printffuns.c                                       \
113          snprintf.c snprntffuns.c                          \
114          sprintf.c sprintffuns.c                                     \
115          vasprintf.c vfprintf.c vprintf.c                  \
116          vsnprintf.c vsprintf.c                                      \
117          repl-vsnprintf.c
118
119SCANF_SRCS =                                                          \
120          doscan.c fscanf.c fscanffuns.c                              \
121          scanf.c sscanf.c sscanffuns.c                     \
122          vfscanf.c vscanf.c vsscanf.c
123
124.include "${.CURDIR}/arch/${GMP_MACHINE_ARCH}/Makefile.inc"
125
126SRCS+=                                                                                    \
127          assert.c compat.c errno.c extract-dbl.c invalid.c memory.c  \
128          mp_bpl.c mp_clz_tab.c mp_dv_tab.c mp_minv_tab.c mp_get_fns.c          \
129          mp_set_fns.c randclr.c randdef.c randiset.c randlc2s.c      \
130          randlc2x.c randmt.c randmts.c rands.c randsd.c randsdui.c   \
131          randbui.c randmui.c version.c nextprime.c primesieve.c
132
133SRCS+=    tal-reent.c
134
135# these are generated
136SRCS+=    fib_table.c mp_bases.c
137
138# Build the files that may have multiple identical base names under
139# different names.
140.for _dir _srcfile in \
141          ${MPF_SRCS:C/^/mpf /} \
142          ${MPZ_SRCS:C/^/mpz /} \
143          ${MPQ_SRCS:C/^/mpq /} \
144          ${PRINTF_SRCS:C/^/printf /} \
145          ${SCANF_SRCS:C/^/scanf /}
146${_dir}_${_srcfile}: #Makefile
147          echo '#include "'${_dir}/${_srcfile}'"' > ${.TARGET}
148
149SRCS+=              ${_dir}_${_srcfile}
150CLEANFILES+=        ${_dir}_${_srcfile}
151
152.endfor
153
154CPPFLAGS+=          -I. -I${DIST} -I${.CURDIR}/arch/${GMP_MACHINE_ARCH} \
155                    -D__GMP_WITHIN_GMP -DHAVE_CONFIG_H
156
157WITHOUT_MAN=        yes
158
159DPSRCS= fac_table.h fib_table.h fib_table.c jacobitab.h mp_bases.h \
160          mp_bases.c perfsqr.h trialdivtab.h
161
162gen-fac: gen-fac.c
163          ${HOST_CC} ${HOST_CPPFLAGS} -o ${.OBJDIR}/gen-fac ${.ALLSRC}
164
165fac_table.h: gen-fac
166          ${.OBJDIR}/gen-fac ${GMP_LIMB_BITS} 0 > ${.OBJDIR}/fac_table.h
167
168gen-fib: gen-fib.c
169          ${HOST_CC} ${HOST_CPPFLAGS} -o ${.OBJDIR}/gen-fib ${.ALLSRC}
170
171fib_table.h: gen-fib
172          ${.OBJDIR}/gen-fib header ${GMP_LIMB_BITS} 0 > ${.OBJDIR}/fib_table.h
173
174fib_table.c: gen-fib
175          ${.OBJDIR}/gen-fib table ${GMP_LIMB_BITS} 0 > ${.OBJDIR}/fib_table.c
176
177gen-bases: gen-bases.c
178          ${HOST_CC} ${HOST_CPPFLAGS} -o ${.OBJDIR}/gen-bases ${.ALLSRC} -lm
179
180mp_bases.h: gen-bases
181          ${.OBJDIR}/gen-bases header ${GMP_LIMB_BITS} 0 > ${.OBJDIR}/mp_bases.h
182
183mp_bases.c: gen-bases
184          ${.OBJDIR}/gen-bases table ${GMP_LIMB_BITS} 0 > ${.OBJDIR}/mp_bases.c
185
186gen-jacobitab: gen-jacobitab.c
187          ${HOST_CC} ${HOST_CPPFLAGS} -o ${.OBJDIR}/gen-jacobitab ${.ALLSRC} -lm
188
189jacobitab.h: gen-jacobitab
190          ${.OBJDIR}/gen-jacobitab > ${.OBJDIR}/jacobitab.h
191
192perfsqr.h: gen-psqr.c
193          ${HOST_CC} ${HOST_CPPFLAGS} -o ${.OBJDIR}/gen-psqr ${.ALLSRC}
194          ${.OBJDIR}/gen-psqr ${GMP_LIMB_BITS} 0 > ${.OBJDIR}/perfsqr.h
195
196gen-trialdivtab: gen-trialdivtab.c
197          ${HOST_CC} ${HOST_CPPFLAGS} -o ${.OBJDIR}/gen-trialdivtab ${.ALLSRC} -lm
198
199trialdiv.c: trialdivtab.h
200trialdivtab.h: gen-trialdivtab Makefile
201          ${.OBJDIR}/gen-trialdivtab $(GMP_LIMB_BITS) 8000 > ${.OBJDIR}/trialdivtab.h
202
203CLEANFILES+=        ${DPSRCS} gen-fac gen-fib gen-bases gen-jacobitab \
204                    gen-psqr gen-trialdivtab
205
206# Makefile.inc must define GMP_LIMB_BITS.
207.if !defined(GMP_LIMB_BITS)
208.BEGIN:
209          @echo "GMP_LIMB_BITS not defined!"
210          false
211.endif
212
213# XXX stuff looks for "../config.m4"
214dummy:
215          mkdir dummy
216${.OBJDIR}/config.m4: ${.CURDIR}/arch/${GMP_MACHINE_ARCH}/config.m4
217          rm -f ${.OBJDIR}/config.m4 && cp ${.CURDIR}/arch/${GMP_MACHINE_ARCH}/config.m4 ${.OBJDIR}/config.m4
218
219CLEANFILES+=        config.m4
220clean: cleandummy
221cleandummy: .PHONY
222          -if [ -d dummy ]; then rmdir dummy; fi
223
224BUILD_S_INCS=       -I${.CURDIR} -I${.OBJDIR}/dummy -I${DIST}/ -I${DIST}/mpn \
225                    -I${.OBJDIR}
226
227.for _build _src in ${ASM_SRCS_LIST}
228${_build:R}.s: Makefile dummy ${.OBJDIR}/config.m4 ${DIST}/${_src}
229          ${TOOL_M4} -DCONFIG_TOP_SRCDIR=${DIST} ${BUILD_S_INCS} \
230                    ${M4FLAGS} ${M4FLAGS.${.TARGET:R}} \
231                    -DOPERATION_${.TARGET:R} ${DIST}/${_src} > ${.TARGET}
232
233SRCS+=              ${_build:R}.s
234CLEANFILES+=        ${_build:R}.s
235.endfor
236
237.for _build _src in ${C_SRCS_LIST}
238mpn_${_build}: Makefile
239          echo '#include "${_src}"' > ${.TARGET}
240
241CPPFLAGS.mpn_${_build}+= -DOPERATION_${_build:R}
242
243SRCS+=              mpn_${_build}
244CLEANFILES+=        mpn_${_build}
245.endfor
246
247.include <bsd.lib.mk>
248
249.PATH:    ${DIST} \
250          ${DIST}/rand \
251          ${DIST}/mpn/generic \
252          ${.CURDIR}/arch/${GMP_MACHINE_ARCH} \
253          ${DIST}/mpf \
254          ${DIST}/mpz
255
256# Don't warn about functions which cannot be stack smash protected as
257# there are a lot of them.
258COPTS += -Wno-stack-protector
259.if !empty(GMP_MACHINE_ARCH:M*arm*)
260COPTS += -marm
261.endif
262
263CWARNFLAGS.clang+=  -Wno-unused-value -Wno-tautological-compare -Wno-parentheses
264
265.if !empty(CFLAGS:M-fPIE)
266M4FLAGS+=-DPIC
267.endif
268
269# gmp-impl.h(5187): warning: bitwise '>>' on signed value possibly nonportable [117]
270LINTFLAGS+=         -X 117
271# com.c(67): warning: conversion from 'long' to 'int' may lose accuracy [132]
272LINTFLAGS+=         -X 132
273# gcd.c(101): warning: argument #4 is converted from 'unsigned long' to 'unsigned int' due to prototype [259]
274LINTFLAGS+=         -X 259
275