1 # $Id: lib.mk,v 1.49 2013/07/18 05:46:24 sjg Exp $
3 .if
!target
(__
${.PARSEFILE
}__
)
8 .if
${OBJECT_FMT} == "ELF"
12 .if exists
(${.CURDIR
}/shlib_version
)
13 SHLIB_MAJOR
!= .
${.CURDIR
}/shlib_version
; echo
$$major
14 SHLIB_MINOR
!= .
${.CURDIR
}/shlib_version
; echo
$$minor
18 .if defined
(SHLIB_MAJOR
) && ${MK_PIC} != "no"
25 .if defined
(SHLIB_MINOR
) && ${MK_PIC} != "no"
32 .if defined
(SHLIB_TEENY
) && ${MK_PIC} != "no"
38 SHLIB_FULLVERSION ?
= ${${SHLIB_MAJOR} ${SHLIB_MINOR} ${SHLIB_TEENY}:L
:ts.
}
39 SHLIB_FULLVERSION
:= ${SHLIB_FULLVERSION}
41 # add additional suffixes not exported.
42 # .po is used for profiling object files.
43 # .so is used for PIC object files.
44 .SUFFIXES
: .out .a .ln .so .po .o .s .S .c .
cc .C .m .F .f .r .y .l .cl .p .h
49 # Derrived from NetBSD-1.6
51 # Set PICFLAGS to cc flags for producing position-independent code,
52 # if not already set. Includes -DPIC, if required.
54 # Data-driven table using make variables to control how shared libraries
55 # are built for different platforms and object formats.
56 # OBJECT_FMT: currently either "ELF" or "a.out", from <bsd.own.mk>
57 # SHLIB_SOVERSION: version number to be compiled into a shared library
58 # via -soname. Usualy ${SHLIB_MAJOR} on ELF.
59 # NetBSD/pmax used to use ${SHLIB_MAJOR}[.${SHLIB_MINOR}
61 # SHLIB_SHFLAGS: Flags to tell ${LD} to emit shared library.
62 # with ELF, also set shared-lib version for ld.so.
63 # SHLIB_LDSTARTFILE: support .o file, call C++ file-level constructors
64 # SHLIB_LDENDFILE: support .o file, call C++ file-level destructors
65 # FPICFLAGS: flags for ${FC} to compile .[fF] files to .so objects.
66 # CPPICFLAGS: flags for ${CPP} to preprocess .[sS] files for ${AS}
67 # CPICFLAGS: flags for ${CC} to compile .[cC] files to .so objects.
68 # CAPICFLAGS flags for {$CC} to compiling .[Ss] files
69 # (usually just ${CPPPICFLAGS} ${CPICFLAGS})
70 # APICFLAGS: flags for ${AS} to assemble .[sS] to .so objects.
72 .if
${TARGET_OSNAME} == "NetBSD"
73 .if
${MACHINE_ARCH} == "alpha"
74 # Alpha-specific shared library flags
76 CPICFLAGS ?
= -fPIC
-DPIC
78 CAPICFLAGS?
= ${CPPPICFLAGS} ${CPICFLAGS}
80 .elif
${MACHINE_ARCH} == "mipsel" ||
${MACHINE_ARCH} == "mipseb"
81 # mips-specific shared library flags
83 # On mips, all libs are compiled with ABIcalls, not just sharedlibs.
86 # so turn shlib PIC flags on for ${AS}.
91 .elif
${MACHINE_ARCH} == "vax" && ${OBJECT_FMT} == "ELF"
92 # On the VAX, all object are PIC by default, not just sharedlibs.
95 .elif
(${MACHINE_ARCH} == "sparc" ||
${MACHINE_ARCH} == "sparc64") && \
96 ${OBJECT_FMT} == "ELF"
97 # If you use -fPIC you need to define BIGPIC to turn on 32-bit
98 # relocations in asm code
100 CPICFLAGS ?
= -fPIC
-DPIC
101 CPPPICFLAGS?
= -DPIC
-DBIGPIC
102 CAPICFLAGS?
= ${CPPPICFLAGS} ${CPICFLAGS}
107 # Platform-independent flags for NetBSD a.out shared libraries
108 SHLIB_SOVERSION
=${SHLIB_FULLVERSION}
111 CPICFLAGS?
= -fPIC
-DPIC
113 CAPICFLAGS?
= ${CPPPICFLAGS} ${CPICFLAGS}
118 # Platform-independent linker flags for ELF shared libraries
119 .if
${OBJECT_FMT} == "ELF"
120 SHLIB_SOVERSION
= ${SHLIB_MAJOR}
121 SHLIB_SHFLAGS
= -soname lib
${LIB}.so.
${SHLIB_SOVERSION}
122 SHLIB_LDSTARTFILE?
= /usr
/lib
/crtbeginS.o
123 SHLIB_LDENDFILE?
= /usr
/lib
/crtendS.o
126 # for compatability with the following
127 CC_PIC?
= ${CPICFLAGS}
128 LD_shared
=${SHLIB_SHFLAGS}
132 .if
${TARGET_OSNAME} == "FreeBSD"
133 .if
${OBJECT_FMT} == "ELF"
134 SHLIB_SOVERSION
= ${SHLIB_MAJOR}
135 SHLIB_SHFLAGS
= -soname lib
${LIB}.so.
${SHLIB_SOVERSION}
137 SHLIB_SHFLAGS
= -assert pure-text
142 LD_shared
=${SHLIB_SHFLAGS}
148 # sys.mk can override these
153 # Non BSD machines will be using bmake.
154 .if
${TARGET_OSNAME} == "SunOS"
155 LD_shared
=-assert pure-text
156 .if
${OBJECT_FMT} == "ELF" ||
${MACHINE} == "solaris"
158 LD_shared
=-h lib
${LIB}.so.
${SHLIB_MAJOR} -G
160 .elif
${TARGET_OSNAME} == "HP-UX"
164 # HPsUX lorder does not grok anything but .o
165 LD_sobjs
=`${LORDER} ${OBJS} | ${TSORT} | sed 's,\.o,.so,'`
166 LD_pobjs
=`${LORDER} ${OBJS} | ${TSORT} | sed 's,\.o,.po,'`
167 .elif
${TARGET_OSNAME} == "OSF1"
168 LD_shared
= -msym
-shared
-expect_unresolved
'*'
169 LD_solib
= -all lib
${LIB}_pic.a
171 # lorder does not grok anything but .o
172 LD_sobjs
=`${LORDER} ${OBJS} | ${TSORT} | sed 's,\.o,.so,'`
173 LD_pobjs
=`${LORDER} ${OBJS} | ${TSORT} | sed 's,\.o,.po,'`
175 .elif
${TARGET_OSNAME} == "FreeBSD"
176 LD_solib
= lib
${LIB}_pic.a
177 .elif
${TARGET_OSNAME} == "Linux"
178 # this is ambiguous of course
179 LD_shared
=-shared
-h lib
${LIB}.so.
${SHLIB_MAJOR}
180 LD_solib
= --whole-archive lib
${LIB}_pic.a
181 # Linux uses GNU ld, which is a multi-pass linker
182 # so we don't need to use lorder or tsort
186 .elif
${TARGET_OSNAME} == "Darwin"
188 SHLIB_INSTALL_VERSION ?
= ${SHLIB_MAJOR}
189 SHLIB_COMPATABILITY_VERSION ?
= ${SHLIB_MAJOR}.
${SHLIB_MINOR
:U0
}
190 SHLIB_COMPATABILITY ?
= \
191 -compatibility_version
${SHLIB_COMPATABILITY_VERSION} \
192 -current_version
${SHLIB_FULLVERSION}
193 LD_shared
= -dynamiclib \
194 -flat_namespace
-undefined suppress \
195 -install_name
${LIBDIR}/lib
${LIB}.
${SHLIB_INSTALL_VERSION}.
${LD_solink} \
196 ${SHLIB_COMPATABILITY}
198 .for v in
${SHLIB_COMPATABILITY_VERSION} ${SHLIB_INSTALL_VERSION}
199 .if
"$v" != "${SHLIB_FULLVERSION}"
200 SHLIB_LINKS
+= lib
${LIB}.
$v.
${LD_solink}
203 .if
${MK_LINKLIB} != "no"
204 SHLIB_LINKS
+= lib
${LIB}.
${LD_solink}
207 LD_so
= ${SHLIB_FULLVERSION}.dylib
208 LD_sobjs
= ${SOBJS
:O
:u
}
209 LD_solib
= ${LD_sobjs}
212 .if
${MACHINE_ARCH} == "i386"
215 PICFLAG ?
= -fPIC
-fno-common
222 .if
!empty
(SHLIB_MAJOR
)
223 .if
${NEED_SOLINKS} && empty
(SHLIB_LINKS
)
224 .if
${MK_LINKLIB} != "no"
225 SHLIB_LINKS
= lib
${LIB}.
${LD_solink}
227 .if
"${SHLIB_FULLVERSION}" != "${SHLIB_MAJOR}"
228 SHLIB_LINKS
+= lib
${LIB}.
${LD_solink}.
${SHLIB_MAJOR}
234 LD_shared ?
= -Bshareable
-Bforcearchive
235 LD_so ?
= so.
${SHLIB_FULLVERSION}
242 LD_objs ?
= `${LORDER} ${OBJS} | ${TSORT}`
243 LD_sobjs ?
= `${LORDER} ${SOBJS} | ${TSORT}`
244 LD_pobjs ?
= `${LORDER} ${POBJS} | ${TSORT}`
246 LD_solib ?
= ${LD_sobjs}
248 .if exists
(/netbsd
) && exists
(${DESTDIR}/usr
/lib
/libdl.so
)
252 # some libs have lots of objects, and scanning all .o, .po and .So meta files
253 # is a waste of time, this tells meta.autodep.mk to just pick one
255 # yes, 42 is a random number.
256 .if
${MK_META_MODE} == "yes" && ${SRCS
:Uno
:[\
#]} > 42
257 OPTIMIZE_OBJECT_META_FILES ?
= yes
261 .if
${MK_LIBTOOL} == "yes"
262 # because libtool is so facist about naming the object files,
263 # we cannot (yet) build profiled libs
266 .if exists
(${.CURDIR
}/shlib_version
)
267 SHLIB_AGE
!= .
${.CURDIR
}/shlib_version
; echo
$$age
270 # for the normal .a we do not want to strip symbols
272 ${COMPILE.c
} ${.IMPSRC
}
274 # for the normal .a we do not want to strip symbols
276 ${COMPILE.
cc} ${.IMPSRC
}
279 @echo
${COMPILE.S
} ${CFLAGS
:M-
[ID
]*} ${AINC} ${.IMPSRC
}
280 @
${COMPILE.S
} ${CFLAGS
:M-
[ID
]*} ${AINC} ${.IMPSRC
}
284 ${COMPILE.c
} ${CC_PG} ${PROFFLAGS} ${.IMPSRC
} -o
${.TARGET
}
287 ${COMPILE.
cc} -pg
${.IMPSRC
} -o
${.TARGET
}
290 ${COMPILE.S
} ${PICFLAG} ${CC_PIC} ${CFLAGS
:M-
[ID
]*} ${AINC} ${.IMPSRC
} -o
${.TARGET
}
293 @echo
${COMPILE.c
} ${CC_PG} ${PROFFLAGS} ${.IMPSRC
} -o
${.TARGET
}
294 @
${COMPILE.c
} ${CC_PG} ${PROFFLAGS} ${.IMPSRC
} -o
${.TARGET
}.o
295 @
${LD} ${LD_X} ${LD_r} ${.TARGET
}.o
-o
${.TARGET
}
299 @echo
${COMPILE.
cc} ${CXX_PG} ${PROFFLAGS} ${.IMPSRC
} -o
${.TARGET
}
300 @
${COMPILE.
cc} ${CXX_PG} ${.IMPSRC
} -o
${.TARGET
}.o
301 @
${LD} ${LD_X} ${LD_r} ${.TARGET
}.o
-o
${.TARGET
}
305 @echo
${COMPILE.S
} ${PICFLAG} ${CC_PIC} ${CFLAGS
:M-
[ID
]*} ${AINC} ${.IMPSRC
} -o
${.TARGET
}
306 @
${COMPILE.S
} ${PICFLAG} ${CC_PIC} ${CFLAGS
:M-
[ID
]*} ${AINC} ${.IMPSRC
} -o
${.TARGET
}.o
307 @
${LD} ${LD_x} ${LD_r} ${.TARGET
}.o
-o
${.TARGET
}
313 ${COMPILE.c
} ${PICFLAG} ${CC_PIC} ${.IMPSRC
} -o
${.TARGET
}
316 ${COMPILE.
cc} ${PICFLAG} ${CC_PIC} ${.IMPSRC
} -o
${.TARGET
}
319 ${COMPILE.S
} ${PROFFLAGS} ${CFLAGS
:M-
[ID
]*} ${AINC} ${.IMPSRC
} -o
${.TARGET
}
323 @echo
${COMPILE.c
} ${PICFLAG} ${CC_PIC} ${.IMPSRC
} -o
${.TARGET
}
324 @
${COMPILE.c
} ${PICFLAG} ${CC_PIC} ${.IMPSRC
} -o
${.TARGET
}.o
325 @
${LD} ${LD_x} ${LD_r} ${.TARGET
}.o
-o
${.TARGET
}
329 @echo
${COMPILE.
cc} ${PICFLAG} ${CC_PIC} ${.IMPSRC
} -o
${.TARGET
}
330 @
${COMPILE.
cc} ${PICFLAG} ${CC_PIC} ${.IMPSRC
} -o
${.TARGET
}.o
331 @
${LD} ${LD_x} ${LD_r} ${.TARGET
}.o
-o
${.TARGET
}
335 @echo
${COMPILE.S
} ${PROFFLAGS} ${CFLAGS
:M-
[ID
]*} ${AINC} ${.IMPSRC
} -o
${.TARGET
}
336 @
${COMPILE.S
} ${PROFFLAGS} ${CFLAGS
:M-
[ID
]*} ${AINC} ${.IMPSRC
} -o
${.TARGET
}.o
337 @
${LD} ${LD_X} ${LD_r} ${.TARGET
}.o
-o
${.TARGET
}
344 ${LINT} ${LINTFLAGS} ${CFLAGS
:M-
[IDU
]*} -i
${.IMPSRC
}
346 .if
${MK_LIBTOOL} != "yes"
348 .if
!defined
(PICFLAG
)
354 .if
${MK_ARCHIVE} != "no"
358 .if
${MK_PROFILE} != "no"
360 POBJS
+=${OBJS
:.o
=.po
}
363 .if
${MK_PIC} != "no"
364 .if
${MK_PICLIB} == "no"
367 SOLIB
=lib
${LIB}_pic.a
370 .if
!empty
(SHLIB_FULLVERSION
)
371 _LIBS
+=lib
${LIB}.
${LD_so}
375 .if
${MK_LINT} != "no"
376 _LIBS
+=llib-l
${LIB}.ln
379 # here is where you can define what LIB* are
380 .
-include <libnames.mk
>
381 .if
${MK_DPADD_MK} == "yes"
382 # lots of cool magic, but might not suit everyone.
386 .if
!defined
(_SKIP_BUILD
)
387 all: prebuild .WAIT
${_LIBS}
388 # a hook for things that must be done early
390 .if
!defined
(.PARSEDIR
)
391 # no-op is the best we can do if not bmake.
397 .for s in
${SRCS
:N
*.h
:M
*/*}
398 ${.o .so .po .lo
:L
:@o@
${s
:T
:R
}$o@
}: $s
401 OBJS
+= ${SRCS
:T
:N
*.h
:R
:S
/$/.o
/g
}
404 .if
${MK_LIBTOOL} == "yes"
405 .if
${MK_PIC} == "no"
412 # .lo's are created as a side effect
414 ${LIBTOOL} --mode
=compile
${CC} ${LT_STATIC} ${CFLAGS} ${CPPFLAGS} ${IMPFLAGS} -c
${.IMPSRC
}
416 # can't really do profiled libs with libtool - its too facist about
417 # naming the output...
418 lib
${LIB}.a
:: ${OBJS}
420 ${LIBTOOL} --mode
=link
${CC} ${LT_STATIC} -o
${.TARGET
:.a
=.la
} ${OBJS
:.o
=.lo
} -rpath
${SHLIBDIR}:/usr
/lib
-version-info
${SHLIB_MAJOR}:${SHLIB_MINOR}:${SHLIB_AGE}
421 @ln .libs
/${.TARGET
} .
423 lib
${LIB}.
${LD_so}:: lib
${LIB}.a
424 @
[ -s
${.TARGET
}.
${SHLIB_AGE} ] ||
{ ln
-s .libs
/lib
${LIB}.
${LD_so}* .
2>/dev
/null
; : }
425 @
[ -s
${.TARGET
} ] || ln
-s
${.TARGET
}.
${SHLIB_AGE} ${.TARGET
}
427 .
else # MK_LIBTOOL=yes
429 lib
${LIB}.a
:: ${OBJS}
430 @echo building standard
${LIB} library
432 @
${AR} ${AR_cq} ${.TARGET
} ${LD_objs}
435 POBJS
+= ${OBJS
:.o
=.po
}
437 lib
${LIB}_p.a
:: ${POBJS}
438 @echo building profiled
${LIB} library
440 @
${AR} ${AR_cq} ${.TARGET
} ${LD_pobjs}
443 SOBJS
+= ${OBJS
:.o
=.so
}
445 lib
${LIB}_pic.a
:: ${SOBJS}
446 @echo building shared object
${LIB} library
448 @
${AR} ${AR_cq} ${.TARGET
} ${LD_sobjs}
451 #SHLIB_LDADD?= ${LDADD}
453 # bound to be non-portable...
454 # this is known to work for NetBSD 1.6 and FreeBSD 4.2
455 lib
${LIB}.
${LD_so}: ${SOLIB} ${DPADD}
456 @echo building shared
${LIB} library \
(version
${SHLIB_FULLVERSION}\
)
458 .if
${TARGET_OSNAME} == "NetBSD" ||
${TARGET_OSNAME} == "FreeBSD"
459 .if
${OBJECT_FMT} == "ELF"
460 ${SHLIB_LD} -x
-shared
${SHLIB_SHFLAGS} -o
${.TARGET
} \
461 ${SHLIB_LDSTARTFILE} \
462 --whole-archive
${SOLIB} --no-whole-archive
${SHLIB_LDADD} \
465 ${SHLIB_LD} ${LD_x} ${LD_shared} \
466 -o
${.TARGET
} ${SOLIB} ${SHLIB_LDADD}
469 ${SHLIB_LD} -o
${.TARGET
} ${LD_shared} ${LD_solib} ${DLLIB} ${SHLIB_LDADD}
472 .if
!empty
(SHLIB_LINKS
)
473 rm -f
${SHLIB_LINKS}; ${SHLIB_LINKS
:O
:u
:@x@ln
-s
${.TARGET
} $x;@
}
476 LOBJS
+= ${LSRCS
:.c
=.ln
} ${SRCS
:M
*.c
:.c
=.ln
}
479 llib-l
${LIB}.ln
: ${LOBJS}
480 @echo building llib-l
${LIB}.ln
481 @
rm -f llib-l
${LIB}.ln
482 @
${LINT} -C
${LIB} ${LOBJS} ${LLIBS}
486 rm -f a.out
[Ee
]rrs mklog core
*.core
${CLEANFILES}
487 rm -f lib
${LIB}.a
${OBJS}
488 rm -f lib
${LIB}_p.a
${POBJS}
489 rm -f lib
${LIB}_pic.a lib
${LIB}.so.
*.
* ${SOBJS}
490 rm -f llib-l
${LIB}.ln
${LOBJS}
491 .if
!empty
(SHLIB_LINKS
)
495 clean: _SUBDIRUSE cleanlib
496 cleandir
: _SUBDIRUSE cleanlib
498 cleandir
: _SUBDIRUSE
clean
501 .if defined
(SRCS
) && (!defined
(MKDEP
) ||
${MKDEP} != autodep
)
503 @
(TMP
=/tmp
/_depend
$$$$; \
504 sed
-e
's/^\([^\.]*\).o[ ]*:/\1.o \1.po \1.so \1.ln:/' \
510 .if
!target
(beforeinstall
)
515 LIB_INSTALL_OWN ?
= -o
${LIBOWN} -g
${LIBGRP}
520 .if
!target
(realinstall
)
521 realinstall
: libinstall
523 .if
!target
(libinstall
)
525 [ -d
${DESTDIR}/${LIBDIR} ] || \
526 ${INSTALL} -d
${LIB_INSTALL_OWN} -m
775 ${DESTDIR}${LIBDIR}
527 .if
${MK_ARCHIVE} != "no"
528 ${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m
600 lib
${LIB}.a \
530 ${RANLIB} ${DESTDIR}${LIBDIR}/lib
${LIB}.a
531 chmod
${LIBMODE} ${DESTDIR}${LIBDIR}/lib
${LIB}.a
533 .if
${MK_PROFILE} != "no"
534 ${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m
600 \
535 lib
${LIB}_p.a
${DESTDIR}${LIBDIR}
536 ${RANLIB} ${DESTDIR}${LIBDIR}/lib
${LIB}_p.a
537 chmod
${LIBMODE} ${DESTDIR}${LIBDIR}/lib
${LIB}_p.a
539 .if
${MK_PIC} != "no"
540 .if
${MK_PICLIB} != "no"
541 ${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m
600 \
542 lib
${LIB}_pic.a
${DESTDIR}${LIBDIR}
543 ${RANLIB} ${DESTDIR}${LIBDIR}/lib
${LIB}_pic.a
544 chmod
${LIBMODE} ${DESTDIR}${LIBDIR}/lib
${LIB}_pic.a
546 .if
!empty
(SHLIB_MAJOR
)
547 ${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m
${LIBMODE} \
548 lib
${LIB}.
${LD_so} ${DESTDIR}${LIBDIR}
549 .if
!empty
(SHLIB_LINKS
)
550 (cd
${DESTDIR}${LIBDIR} && { rm -f
${SHLIB_LINKS}; ${SHLIB_LINKS
:O
:u
:@x@ln
-s lib
${LIB}.
${LD_so} $x;@
} })
554 .if
${MK_LINT} != "no" && ${MK_LINKLIB} != "no" && !empty
(LOBJS
)
555 ${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m
${LIBMODE} \
556 llib-l
${LIB}.ln
${DESTDIR}${LINTLIBDIR}
558 .if defined
(LINKS
) && !empty
(LINKS
)
559 @set
${LINKS}; ${_LINKS_SCRIPT}
563 install: maninstall _SUBDIRUSE
564 maninstall
: afterinstall
565 afterinstall
: realinstall
566 realinstall
: beforeinstall
569 .if
${MK_MAN} != "no"
573 .if
${MK_NLS} != "no"
583 # during building we usually need/want to install libs somewhere central
584 # note that we do NOT ch{own,grp} as that would likely fail at this point.
585 # otherwise it is the same as realinstall
586 # Note that we don't need this when using dpadd.mk
587 .libinstall
: ${_LIBS}
588 test -d
${DESTDIR}${LIBDIR} ||
${INSTALL} -d
-m775
${DESTDIR}${LIBDIR}
589 .for _lib in
${_LIBS
:M
*.a
}
590 ${INSTALL} ${COPY} -m
644 ${_lib} ${DESTDIR}${LIBDIR}
591 ${RANLIB} ${DESTDIR}${LIBDIR}/${_lib}
593 .for _lib in
${_LIBS
:M
*.
${LD_solink}*:O
:u
}
594 ${INSTALL} ${COPY} -m
${LIBMODE} ${_lib} ${DESTDIR}${LIBDIR}
595 .if
!empty
(SHLIB_LINKS
)
596 (cd
${DESTDIR}${LIBDIR} && { ${SHLIB_LINKS
:O
:u
:@x@ln
-sf
${_lib} $x;@
}; })