# 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/' \ .