newlib-cygwin/winsup/cygwin/Makefile.am

748 lines
16 KiB
Makefile

# Makefile.am for Cygwin.
#
# This file is part of Cygwin.
#
# This software is a copyrighted work licensed under the terms of the
# Cygwin license. Please consult the file "CYGWIN_LICENSE" for
# details.
# This makefile requires GNU make.
AUTOMAKE_OPTIONS=-Wno-override
include $(top_srcdir)/Makefile.am.common
COMMON_CFLAGS=-Wimplicit-fallthrough=5 -Werror -fmerge-constants -ftracer
if TARGET_X86_64
COMMON_CFLAGS+=-mcmodel=small
endif
AM_CFLAGS=$(cflags_common) $(COMMON_CFLAGS)
AM_CXXFLAGS=$(cxxflags_common) $(COMMON_CFLAGS) -fno-threadsafe-statics
if TARGET_X86_64
# Needed by mcountFunc.S to choose the right code path and symbol names
AM_CCASFLAGS=-D_WIN64
endif
target_builddir=@target_builddir@
newlib_build=$(target_builddir)/newlib
#
# Specialize libdir and includedir to use tooldir prefixed paths (containing
# target_alias) as used by newlib, because we overwrite library and header files
# installed there by newlib.
#
toollibdir=$(tooldir)/lib
toolincludedir=$(tooldir)/include
# Parameters used in building the cygwin.dll.
DLL_NAME=cygwin1.dll
NEW_DLL_NAME=new-cygwin1.dll
DEF_FILE=cygwin.def
LIB_NAME=libcygwin.a
#
# sources
#
# These objects are included directly into the import library
if TARGET_X86_64
TARGET_FILES= \
x86_64/bcopy.S \
x86_64/memchr.S \
x86_64/memcpy.S \
x86_64/memmove.S \
x86_64/mempcpy.S \
x86_64/memset.S \
x86_64/swab.S \
x86_64/wmemcpy.S \
x86_64/wmemmove.S \
x86_64/wmempcpy.S
endif
LIB_FILES= \
lib/_cygwin_crt0_common.cc \
lib/atexit.c \
lib/cygwin_attach_dll.c \
lib/cygwin_crt0.c \
lib/dll_entry.c \
lib/dll_main.cc \
lib/dso_handle.c \
lib/libcmain.c \
lib/premain0.c \
lib/premain1.c \
lib/premain2.c \
lib/premain3.c \
lib/pseudo-reloc-dummy.c
FHANDLER_FILES= \
fhandler/base.cc \
fhandler/clipboard.cc \
fhandler/console.cc \
fhandler/cygdrive.cc \
fhandler/dev.cc \
fhandler/dev_disk.cc \
fhandler/dev_fd.cc \
fhandler/disk_file.cc \
fhandler/dsp.cc \
fhandler/fifo.cc \
fhandler/floppy.cc \
fhandler/mixer.cc \
fhandler/mqueue.cc \
fhandler/netdrive.cc \
fhandler/nodevice.cc \
fhandler/null.cc \
fhandler/pipe.cc \
fhandler/proc.cc \
fhandler/process.cc \
fhandler/process_fd.cc \
fhandler/procnet.cc \
fhandler/procsys.cc \
fhandler/procsysvipc.cc \
fhandler/random.cc \
fhandler/raw.cc \
fhandler/registry.cc \
fhandler/serial.cc \
fhandler/signalfd.cc \
fhandler/socket.cc \
fhandler/socket_inet.cc \
fhandler/socket_local.cc \
fhandler/socket_unix.cc \
fhandler/tape.cc \
fhandler/termios.cc \
fhandler/timerfd.cc \
fhandler/pty.cc \
fhandler/virtual.cc \
fhandler/windows.cc \
fhandler/zero.cc
LIBC_FILES= \
libc/arc4random_stir.c \
libc/base64.c \
libc/bsdlib.cc \
libc/call_once.c \
libc/cnd.c \
libc/fnmatch.c \
libc/fts.c \
libc/ftw.c \
libc/getentropy.cc \
libc/getopt.c \
libc/inet_addr.c \
libc/inet_network.c \
libc/minires-os-if.c \
libc/minires.c \
libc/msgcat.c \
libc/mtx.c \
libc/nftw.c \
libc/rcmd.cc \
libc/rexec.cc \
libc/strfmon.c \
libc/strptime.cc \
libc/thrd.c \
libc/tss.c \
libc/xsique.cc
MATH_FILES= \
math/acoshl.c \
math/acosl.c \
math/asinhl.c \
math/asinl.c \
math/atan2l.c \
math/atanhl.c \
math/atanl.c \
math/cabsl.c \
math/cacosl.c \
math/cargl.c \
math/casinl.c \
math/catanl.c \
math/cbrtl.c \
math/ccosl.c \
math/ceill.S \
math/cephes_emath.c \
math/cexpl.c \
math/cimagl.c \
math/clog10l.c \
math/clogl.c \
math/conjl.c \
math/copysignl.S \
math/coshl.c \
math/cosl.c \
math/cosl_internal.S \
math/cossin.c \
math/cpowl.c \
math/cprojl.c \
math/creall.c \
math/csinl.c \
math/csqrtl.c \
math/ctanl.c \
math/erfl.c \
math/exp10l.c \
math/exp2l.S \
math/expl.c \
math/expm1l.c \
math/fabsl.c \
math/fdiml.c \
math/finite.c \
math/floorl.S \
math/fmal.c \
math/fmaxl.c \
math/fminl.c \
math/fmodl.c \
math/frexpl.S \
math/hypotl.c \
math/ilogbl.S \
math/internal_logl.S \
math/isinf.c \
math/isnan.c \
math/ldexpl.c \
math/lgammal.c \
math/llrint.c \
math/llrintf.c \
math/llrintl.c \
math/llroundl.c \
math/log10l.S \
math/log1pl.S \
math/log2l.S \
math/logbl.c \
math/logl.c \
math/lrint.c \
math/lrintf.c \
math/lrintl.c \
math/lroundl.c \
math/modfl.c \
math/nearbyint.S \
math/nearbyintf.S \
math/nearbyintl.S \
math/nextafterl.c \
math/nexttoward.c \
math/nexttowardf.c \
math/pow10l.c \
math/powil.c \
math/powl.c \
math/remainder.S \
math/remainderf.S \
math/remainderl.S \
math/remquol.S \
math/rint.c \
math/rintf.c \
math/rintl.c \
math/roundl.c \
math/scalbl.S \
math/scalbnl.S \
math/sinhl.c \
math/sinl.c \
math/sinl_internal.S \
math/sqrtl.c \
math/tanhl.c \
math/tanl.S \
math/tgammal.c \
math/truncl.c
MM_FILES = \
mm/cygheap.cc \
mm/heap.cc \
mm/malloc.cc \
mm/malloc_wrapper.cc \
mm/mmap.cc \
mm/mmap_alloc.cc \
mm/shared.cc
REGEX_FILES = \
regex/regcomp.c \
regex/regerror.c \
regex/regexec.c \
regex/regfree.c
SEC_FILES= \
sec/acl.cc \
sec/auth.cc \
sec/base.cc \
sec/helper.cc \
sec/posixacl.cc
TZCODE_FILES= \
tzcode/localtime_wrapper.c
DLL_FILES= \
advapi32.cc \
aio.cc \
assert.cc \
autoload.cc \
clock.cc \
create_posix_thread.cc \
ctype.cc \
cxx.cc \
cygthread.cc \
cygtls.cc \
cygwait.cc \
cygxdr.cc \
dcrt0.cc \
debug.cc \
devices.cc \
dir.cc \
dlfcn.cc \
dll_init.cc \
dtable.cc \
environ.cc \
errno.cc \
exceptions.cc \
exec.cc \
external.cc \
fcntl.cc \
fenv.c \
flock.cc \
fork.cc \
forkable.cc \
glob.cc \
glob_pattern_p.cc \
globals.cc \
grp.cc \
hookapi.cc \
init.cc \
ioctl.cc \
ipc.cc \
kernel32.cc \
ldap.cc \
libstdcxx_wrapper.cc \
loadavg.cc \
lsearch.cc \
miscfuncs.cc \
mktemp.cc \
msg.cc \
mount.cc \
net.cc \
netdb.cc \
nfs.cc \
nlsfuncs.cc \
ntea.cc \
passwd.cc \
path.cc \
pinfo.cc \
poll.cc \
posix_ipc.cc \
posix_timer.cc \
pseudo-reloc.cc \
thread.cc \
quotactl.cc \
random.cc \
registry.cc \
resource.cc \
scandir.cc \
sched.cc \
select.cc \
sem.cc \
setlsapwd.cc \
shm.cc \
signal.cc \
sigproc.cc \
smallprint.cc \
spawn.cc \
strace.cc \
strfuncs.cc \
strsep.cc \
strsig.cc \
sync.cc \
syscalls.cc \
sysconf.cc \
syslog.cc \
termios.cc \
timerfd.cc \
times.cc \
tls_pbuf.cc \
tty.cc \
uinfo.cc \
uname.cc \
wait.cc \
wincap.cc \
window.cc \
winf.cc
if TARGET_X86_64
GMON_TARGET_FILES = \
x86_64/mcountFunc.S
endif
GMON_FILES= \
$(GMON_TARGET_FILES) \
gmon.c \
mcount.c \
profil.c
GENERATED_FILES= \
sigfe.s \
uname_version.c
liblib_a_SOURCES= \
$(LIB_FILES)
libdll_a_SOURCES= \
$(TARGET_FILES) \
$(DLL_FILES) \
$(REGEX_FILES) \
$(FHANDLER_FILES) \
$(LIBC_FILES) \
$(MATH_FILES) \
$(MM_FILES) \
$(SEC_FILES) \
$(TZCODE_FILES) \
$(GENERATED_FILES)
#
# generated sources
#
shared_info_magic.h: scripts/cygmagic local_includes/shared_info.h
$(AM_V_GEN)$(srcdir)/scripts/cygmagic $@ "$(CC) $(INCLUDES) $(CPPFLAGS) -E -x c++" $(word 2,$^) SHARED_MAGIC 'class shared_info' USER_MAGIC 'class user_info'
child_info_magic.h: scripts/cygmagic local_includes/child_info.h
$(AM_V_GEN)$(srcdir)/scripts/cygmagic $@ "$(CC) $(INCLUDES) $(CPPFLAGS) -E -x c++" $(word 2,$^) CHILD_INFO_MAGIC 'class child_info'
globals.h: scripts/mkglobals_h globals.cc
$(AM_V_GEN)$^ > $@
localtime.patched.c: tzcode/localtime.c tzcode/localtime.c.patch
$(AM_V_GEN)patch -u -o localtime.patched.c \
$(srcdir)/tzcode/localtime.c \
$(srcdir)/tzcode/localtime.c.patch
$(srcdir)/devices.cc: scripts/gendevices devices.in local_includes/devices.h
$(wordlist 1,2,$^) $@
tlsoffsets: scripts/gentls_offsets local_includes/cygtls.h
$(AM_V_GEN)CXXCOMPILE="$(CXXCOMPILE)" $^ $@
BUILT_SOURCES = \
child_info_magic.h \
shared_info_magic.h \
globals.h \
localtime.patched.c
# Every time we touch a source file, the version info has to be rebuilt
# to maintain a correct build date, especially in uname release output
dirs = $(srcdir) $(srcdir)/fhandler $(srcdir)/lib $(srcdir)/libc $(srcdir)/math $(srcdir)/mm $(srcdir)/regex $(srcdir)/sec $(srcdir)/tzcode
find_src_files = $(wildcard $(dir)/*.[chS]) $(wildcard $(dir)/*.cc)
src_files := $(foreach dir,$(dirs),$(find_src_files))
# Regenerate uname_version.c only if it doesn't exist or if it differs
# from the former uname_version.c
uname_version.c: .FORCE
$(AM_V_GEN)cd $(srcdir) && \
echo "const char *uname_dev_version = \
\"$$(git rev-parse --git-dir >/dev/null 2>&1 && \
git describe --abbrev=12 --long --match 'cygwin*' --dirty | \
sed -e 's/cygwin-//')\";" \
> $(abs_builddir)/uname_version-pre.c && \
if [ -f $(abs_builddir)/uname_version.c ] && \
cmp $(abs_builddir)/uname_version.c \
$(abs_builddir)/uname_version-pre.c >/dev/null 2>&1 ; \
then :; else \
mv $(abs_builddir)/uname_version-pre.c \
$(abs_builddir)/uname_version.c; fi
.FORCE:
# mkvers.sh creates version.cc in the first place, winver.o always
# second, so version.cc is always older than winver.o
version.cc: scripts/mkvers.sh include/cygwin/version.h winver.rc $(src_files)
@echo "Making version.cc and winver.o";\
export CC="$(CC)";\
/bin/sh $(word 1,$^) $(word 2,$^) $(word 3,$^) $(WINDRES) $(CFLAGS)
winver.o: version.cc
VERSION_OFILES = version.o winver.o
#
# export renames for mkimport
#
NEW_FUNCTIONS=$(addprefix --replace=,\
atexit= \
timezone= \
uname=uname_x \
__xdrrec_getrec= \
__xdrrec_setnonblock= \
xdr_array= \
xdr_bool= \
xdr_bytes= \
xdr_char= \
xdr_double= \
xdr_enum= \
xdr_float= \
xdr_free= \
xdr_hyper= \
xdr_int= \
xdr_int16_t= \
xdr_int32_t= \
xdr_int64_t= \
xdr_int8_t= \
xdr_long= \
xdr_longlong_t= \
xdr_netobj= \
xdr_opaque= \
xdr_pointer= \
xdr_reference= \
xdr_short= \
xdr_sizeof= \
xdr_string= \
xdr_u_char= \
xdr_u_hyper= \
xdr_u_int= \
xdr_u_int16_t= \
xdr_u_int32_t= \
xdr_u_int64_t= \
xdr_u_int8_t= \
xdr_u_long= \
xdr_u_longlong_t= \
xdr_u_short= \
xdr_uint16_t= \
xdr_uint32_t= \
xdr_uint64_t= \
xdr_uint8_t= \
xdr_union= \
xdr_vector= \
xdr_void= \
xdr_wrapstring= \
xdrmem_create= \
xdrrec_create= \
xdrrec_endofrecord= \
xdrrec_eof= \
xdrrec_skiprecord= \
xdrstdio_create= \
)
#
# per-file compilation flags
#
# (these come after, and thus override, the user-supplied CXXFLAGS, as they need
# to be able to fiddle with the optimization level)
#
override CFLAGS += $($(*F)_CFLAGS)
override CXXFLAGS += $($(*F)_CFLAGS)
AM_CXXFLAGS += $(CFLAGS)
localtime_wrapper_CFLAGS=-I$(srcdir)/tzcode -fwrapv
# required since gcc 9.x
exec_CFLAGS=-fno-builtin-execve
proc_CFLAGS=-DUSERNAME="\"$(USER)\"" -DHOSTNAME="\"$(HOSTNAME)\"" \
-DGCC_VERSION="\"`$(CC) -v 2>&1 | tail -n 1`\""
dtable_CFLAGS=-fcheck-new
#
# libraries and installed objects
#
# (Don't ever try to use automake's shared library support via libtool to build
# Cygwin. Instead we have explicit rules to build it.)
#
SUBLIBS = \
libpthread.a \
libutil.a \
libm.a \
libc.a \
libdl.a \
libresolv.a \
librt.a \
libacl.a \
libssp.a
noinst_LIBRARIES = \
libdll.a \
liblib.a
toollib_LIBRARIES = \
libgmon.a
CYGWIN_START=crt0.o
GMON_START=gcrt0.o
INSTOBJS=automode.o binmode.o textmode.o textreadmode.o
toollib_DATA = \
$(CYGWIN_START) \
$(GMON_START) \
$(INSTOBJS) \
$(LIB_NAME) \
$(SUBLIBS)
libgmon_a_SOURCES = $(GMON_FILES)
libgmon_a_LIBADD =
# Enable deterministic archives for reproducible builds.
ARFLAGS = cr$${SOURCE_DATE_EPOCH:+D}
override RANLIB := $(RANLIB)$${SOURCE_DATE_EPOCH:+ -D}
# cygserver library
cygserver_blddir = ${target_builddir}/winsup/cygserver
LIBSERVER = $(cygserver_blddir)/libcygserver.a
$(LIBSERVER):
$(MAKE) -C $(cygserver_blddir) libcygserver.a
# We build as new-cygwin1.dll and rename at install time to overcome native
# rebuilding issues (we don't want the build tools to see a partially built
# cygwin1.dll and attempt to use it instead of the old one).
# linker script
LDSCRIPT=cygwin.sc
$(LDSCRIPT): $(LDSCRIPT).in
$(AM_V_GEN)$(CC) -E - -P < $^ -o $@
# cygwin dll
# Set PE and export table header timestamps to zero for reproducible builds.
$(NEW_DLL_NAME): $(LDSCRIPT) libdll.a $(VERSION_OFILES) $(LIBSERVER)\
$(newlib_build)/libm.a $(newlib_build)/libc.a
$(AM_V_CXXLD)$(CXX) $(CXXFLAGS) \
-mno-use-libstdc-wrappers \
-Wl,--gc-sections -nostdlib -Wl,-T$(LDSCRIPT) \
-Wl,--dynamicbase -static \
$${SOURCE_DATE_EPOCH:+-Wl,--no-insert-timestamp} \
-Wl,--heap=0 -Wl,--out-implib,cygdll.a -shared -o $@ \
-e @DLL_ENTRY@ $(DEF_FILE) \
-Wl,-whole-archive libdll.a -Wl,-no-whole-archive \
$(VERSION_OFILES) \
$(LIBSERVER) \
$(newlib_build)/libm.a \
$(newlib_build)/libc.a \
-lgcc -lkernel32 -lntdll -Wl,-Map,cygwin.map
@$(MKDIR_P) ${target_builddir}/winsup/testsuite/testinst/bin/
$(AM_V_at)$(INSTALL_PROGRAM) $(NEW_DLL_NAME) ${target_builddir}/winsup/testsuite/testinst/bin/$(DLL_NAME)
# cygwin import library
toolopts=--cpu=@target_cpu@ --ar=@AR@ --as=@AS@ --nm=@NM@ --objcopy=@OBJCOPY@
$(DEF_FILE): scripts/gendef cygwin.din
$(AM_V_GEN)$(srcdir)/scripts/gendef --cpu=@target_cpu@ --output-def=$(DEF_FILE) $(srcdir)/cygwin.din
sigfe.s: $(DEF_FILE) tlsoffsets
@[ -s $@ ] || \
{ rm -f $(DEF_FILE); $(MAKE) -s -j1 $(DEF_FILE); }; \
[ -s $@ ] && touch $@
LIBCOS=$(addsuffix .o,$(basename $(LIB_FILES)))
$(LIB_NAME): $(DEF_FILE) $(LIBCOS) | $(NEW_DLL_NAME)
$(AM_V_GEN)$(srcdir)/scripts/mkimport $(toolopts) $(NEW_FUNCTIONS) $@ cygdll.a $(wordlist 2,99,$^)
# sublibs
# import libraries for some subset of symbols indicated by given objects
speclib=\
$(srcdir)/scripts/speclib $(toolopts) \
--exclude='cygwin' \
--exclude='(?i:dll)' \
--exclude='reloc' \
--exclude='^main$$' \
--exclude='^_main$$'
libc.a: $(LIB_NAME) libm.a libpthread.a libutil.a
$(AM_V_GEN)$(speclib) $^ -v $(@F)
libm.a: $(LIB_NAME) $(newlib_build)/libm.a $(addsuffix .o,$(basename $(MATH_FILES)))
$(AM_V_GEN)$(speclib) $^ $(@F)
libpthread.a: $(LIB_NAME) thread.o libc/call_once.o libc/cnd.o \
libc/mtx.o libc/thrd.o libc/tss.o
$(AM_V_GEN)$(speclib) $^ $(@F)
libutil.a: $(LIB_NAME) libc/bsdlib.o
$(AM_V_GEN)$(speclib) $^ $(@F)
libdl.a: $(LIB_NAME) dlfcn.o
$(AM_V_GEN)$(speclib) $^ $(@F)
libresolv.a: $(LIB_NAME) libc/minires.o
$(AM_V_GEN)$(speclib) $^ $(@F)
librt.a: $(LIB_NAME) posix_ipc.o
$(AM_V_GEN)$(speclib) $^ $(@F)
libacl.a: $(LIB_NAME) sec/posixacl.o
$(AM_V_GEN)$(speclib) $^ $(@F)
libssp.a: $(LIB_NAME) $(wildcard $(newlib_build)/libc/ssp/*.o)
$(AM_V_GEN)$(speclib) $^ $(@F)
#
# all
#
all-local: $(LIB_NAME) $(SUBLIBS)
#
# clean
#
clean-local:
-rm -f $(BUILT_SOURCES)
-rm -f $(DEF_FILE) sigfe.s
-rm -f cygwin.sc cygdll.a cygwin.map
-rm -f $(NEW_DLL_NAME)
-rm -f $(LIB_NAME) $(SUBLIBS)
-rm -f version.cc
-rm -f tlsoffsets
maintainer-clean-local:
-rm -f $(srcdir)/devices.cc
#
# install
#
man_MANS = regex/regex.3 regex/regex.7
install-exec-hook: install-libs
install-data-local: install-headers install-ldif
install-libs:
@$(MKDIR_P) $(DESTDIR)$(bindir)
$(INSTALL_PROGRAM) $(NEW_DLL_NAME) $(DESTDIR)$(bindir)/$(DLL_NAME)
@$(MKDIR_P) $(DESTDIR)$(toollibdir)
(cd $(DESTDIR)$(toollibdir) && ln -sf $(LIB_NAME) libg.a)
install-headers:
cd $(srcdir)/include; \
for sub in `find . -type d -print | sort`; do \
$(MKDIR_P) $(DESTDIR)$(toolincludedir)/$$sub; \
for i in $$sub/*.h ; do \
$(INSTALL_DATA) $$i $(DESTDIR)$(toolincludedir)/$$sub/`basename $$i` ; \
done ; \
done ;
install-ldif:
@$(MKDIR_P) $(DESTDIR)$(datarootdir)/cygwin
$(INSTALL_DATA) $(srcdir)/cygwin.ldif $(DESTDIR)$(datarootdir)/cygwin
#
# uninstall
#
uninstall-hook: uninstall-headers uninstall-ldif uninstall-libs
uninstall-libs:
rm -f $(DESTDIR)$(bindir)/$(DLL_NAME)
rm -f $(DESTDIR)$(toollibdir)/libg.a
uninstall-headers:
cd $(srcdir)/include; \
for sub in `find . -type d -print | sort`; do \
for i in $$sub/*.h ; do \
rm -f $(DESTDIR)$(toolincludedir)/$$sub/`basename $$i` ; \
done ; \
done ;
uninstall-ldif:
rm -f $(DESTDIR)$(datarootdir)/cygwin/cygwin.ldif
ctags: CTAGS
tags: CTAGS
CTAGS:
-cd $(srcdir) && \
ctags -R --c++-kinds=+p --fields=+iaS --extras=+q \
--regex-C++='/EXPORT_ALIAS *\([a-zA-Z0-9_]*, *([a-zA-Z0-9_]*)\)/\1/' \
--regex-C++='/__ASMNAME *\("([a-zA-Z0-9_]+)"\)/\1/' \
.