]> sourceware.org Git - glibc.git/blobdiff - nptl/Makefile
Update.
[glibc.git] / nptl / Makefile
index c3b824a4e96b0cef84383e33e67a4ea8dee1b176..d592137caf94cb775126ccf05a410fa777bdb031 100644 (file)
 #
 subdir := nptl
 
-nptl-version := $(shell sed -n 's/^.*$(subdir) \([0-9.]*\).*$$/\1/p' Banner)
+nptl-version := $(shell sed -n 's/^[^0-9]* \([0-9.]*\).*$$/\1/p' Banner)
 
 headers := pthread.h semaphore.h bits/semaphore.h
 
 extra-libs := libpthread
 extra-libs-others := $(extra-libs)
+install-lib-ldscripts := libpthread.so
 
-routines = alloca_cutoff forward libc-lowlevellock libc-lowlevelmutex \
-          libc-cancellation
+routines = alloca_cutoff forward libc-lowlevellock libc-cancellation
 shared-only-routines = forward
 
 libpthread-routines = init events version \
@@ -75,6 +75,7 @@ libpthread-routines = init events version \
                      old_pthread_cond_signal old_pthread_cond_broadcast \
                      pthread_condattr_init pthread_condattr_destroy \
                      pthread_condattr_getpshared pthread_condattr_setpshared \
+                     pthread_condattr_getclock pthread_condattr_setclock \
                      pthread_spin_init pthread_spin_destroy \
                      pthread_spin_lock pthread_spin_trylock \
                      pthread_spin_unlock \
@@ -89,17 +90,18 @@ libpthread-routines = init events version \
                      pthread_cancel pthread_testcancel \
                      pthread_setcancelstate pthread_setcanceltype \
                      pthread_once \
-                     old_pthread_atfork\
+                     old_pthread_atfork pthread_atfork \
                      pthread_getcpuclockid \
                      pthread_clock_gettime pthread_clock_settime \
                      sem_init sem_destroy \
                      sem_open sem_close sem_unlink \
                      sem_getvalue \
                      sem_wait sem_trywait sem_timedwait sem_post \
-                     cleanup cleanup_defer \
+                     cleanup cleanup_defer cleanup_compat \
+                     cleanup_defer_compat unwind \
                      pt-longjmp \
                      cancellation \
-                     lowlevellock lowlevelmutex \
+                     lowlevellock \
                      pt-vfork \
                      ptw-write ptw-read ptw-close ptw-fcntl ptw-accept \
                      ptw-connect ptw-recv ptw-recvfrom ptw-recvmsg ptw-send \
@@ -112,69 +114,172 @@ libpthread-routines = init events version \
                      flockfile ftrylockfile funlockfile \
                      sigaction \
                      herrno res pt-allocrtsig \
-                     pthread_kill_other_threads
+                     pthread_kill_other_threads \
+                     pthread_getaffinity pthread_setaffinity \
+                     pthread_attr_getaffinity pthread_attr_setaffinity \
+                     cleanup_routine unwind-forcedunwind
 
-libpthread-shared-only-routines = version pt-allocrtsig
+libpthread-shared-only-routines = version pt-allocrtsig unwind-forcedunwind
+libpthread-static-only-routines = pthread_atfork
 
 libpthread-nonshared = pthread_atfork
 
 CFLAGS-pthread_atfork.c = -DNOT_IN_libc
 
+# Since cancellation handling is in large parts handled using exceptions
+# we have to compile some files with exception handling enabled, some
+# even with asynchronous unwind tables.
+
+# init.c contains sigcancel_handler().
+CFLAGS-init.c = -fexceptions -fasynchronous-unwind-tables
+# The unwind code itself,
+CFLAGS-unwind.c = -fexceptions
+CFLAGS-unwind-forcedunwind.c = -fexceptions -fasynchronous-unwind-tables
+
+# The following three functions must be async-cancel safe.
+CFLAGS-pthread_cancel.c = -fexceptions -fasynchronous-unwind-tables
+CFLAGS-pthread_setcancelstate.c = -fexceptions -fasynchronous-unwind-tables
+CFLAGS-pthread_setcanceltype.c = -fexceptions -fasynchronous-unwind-tables
+
+# These are internal functions which similar functionality as setcancelstate
+# and setcanceltype.
+CFLAGS-cancellation.c = -fasynchronous-unwind-tables
+CFLAGS-libc-cancellation.c = -fasynchronous-unwind-tables
+
+# Calling pthread_exit() must cause the registered cancel handlers to
+# be executed.  Therefore exceptions have to be thrown through this
+# function.
+CFLAGS-pthread_exit.c = -fexceptions
+
+# Among others, __pthread_unwind is forwarded.  This function must handle
+# exceptions.
+CFLAGS-forward.c = -fexceptions
+
+# The following are cancellation points.  Some of the functions can
+# block and therefore temporarily enable asynchronous cancellation.
+# Those must be compiled asynchronous unwind tables.
+CFLAGS-pthread_testcancel.c = -fexceptions
+CFLAGS-pthread_join.c = -fexceptions -fasynchronous-unwind-tables
+CFLAGS-pthread_timedjoin.c = -fexceptions -fasynchronous-unwind-tables
+CFLAGS-pthread_once.c = $(uses-callbacks) -fexceptions \
+                       -fasynchronous-unwind-tables
+CFLAGS-pthread_cond_wait.c = -fexceptions -fasynchronous-unwind-tables
+CFLAGS-pthread_cond_timedwait.c = -fexceptions -fasynchronous-unwind-tables
+CFLAGS-sem_wait.c = -fexceptions -fasynchronous-unwind-tables
+CFLAGS-sem_timedwait.c = -fexceptions -fasynchronous-unwind-tables
+
+# These are the function wrappers we have to duplicate here.
+CFLAGS-fcntl.c = -fexceptions -fasynchronous-unwind-tables
+CFLAGS-lockf.c = -fexceptions
+CFLAGS-pread.c = -fexceptions -fasynchronous-unwind-tables
+CFLAGS-pread64.c = -fexceptions -fasynchronous-unwind-tables
+CFLAGS-pwrite.c = -fexceptions -fasynchronous-unwind-tables
+CFLAGS-pwrite64.c = -fexceptions -fasynchronous-unwind-tables
+CFLAGS-wait.c = -fexceptions -fasynchronous-unwind-tables
+CFLAGS-waitpid.c = -fexceptions -fasynchronous-unwind-tables
+CFLAGS-sigwait.c = -fexceptions -fasynchronous-unwind-tables
+CFLAGS-msgrcv.c = -fexceptions -fasynchronous-unwind-tables
+CFLAGS-msgsnd.c = -fexceptions -fasynchronous-unwind-tables
+CFLAGS-tcdrain.c = -fexceptions -fasynchronous-unwind-tables
+
+CFLAGS-pt-system.c = -fexceptions
+
 # Don't generate deps for calls with no sources.  See sysdeps/unix/Makefile.
 omit-deps = $(unix-syscalls:%=ptw-%)
 
 
-tests = tst-attr1 tst-attr2 \
+tests = tst-attr1 tst-attr2 tst-attr3 \
        tst-mutex1 tst-mutex2 tst-mutex3 tst-mutex4 tst-mutex5 tst-mutex6 \
-       tst-mutex7 \
+       tst-mutex7 tst-mutex8 tst-mutex9 \
        tst-spin1 tst-spin2 tst-spin3 \
        tst-cond1 tst-cond2 tst-cond3 tst-cond4 tst-cond5 tst-cond6 tst-cond7 \
-       tst-cond8 tst-cond9 \
+       tst-cond8 tst-cond9 tst-cond10 tst-cond11 \
        tst-rwlock1 tst-rwlock2 tst-rwlock3 tst-rwlock4 tst-rwlock5 \
-       tst-rwlock6 tst-rwlock7 \
+       tst-rwlock6 tst-rwlock7 tst-rwlock8 tst-rwlock9 tst-rwlock10 \
+       tst-rwlock11 tst-rwlock12 \
        tst-once1 tst-once2 tst-once3 tst-once4 \
-       tst-key1 tst-key2 tst-key3 \
-       tst-sem1 tst-sem2 tst-sem3 tst-sem4 tst-sem5 \
+       tst-key1 tst-key2 tst-key3 tst-key4 \
+       tst-sem1 tst-sem2 tst-sem3 tst-sem4 tst-sem5 tst-sem6 tst-sem7 \
+       tst-sem8 tst-sem9 \
        tst-barrier1 tst-barrier2 tst-barrier3 \
+       tst-align \
        tst-basic1 tst-basic2 tst-basic3 tst-basic4 tst-basic5 tst-basic6 \
+       tst-kill1 tst-kill2 tst-kill3 tst-kill4 tst-kill5 tst-kill6 \
        tst-join1 tst-join2 tst-join3 tst-join4 tst-join5 \
-       tst-tsd1 tst-tsd2 \
-       tst-fork1 tst-fork2 tst-fork3 \
+       tst-detach1 \
+       tst-eintr1 \
+       tst-tsd1 tst-tsd2 tst-tsd3 tst-tsd4 \
+       tst-tls1 tst-tls2 \
+       tst-fork1 tst-fork2 tst-fork3 tst-fork4 \
        tst-atfork1 \
        tst-cancel1 tst-cancel2 tst-cancel3 tst-cancel4 tst-cancel5 \
        tst-cancel6 tst-cancel7 tst-cancel8 tst-cancel9 tst-cancel10 \
-       tst-cleanup1 tst-cleanup2 tst-cleanup3 \
+       tst-cancel11 tst-cancel12 tst-cancel13 tst-cancel14 tst-cancel15 \
+       tst-cancel16 tst-cancel17 tst-cancel18 \
+       tst-cleanup0 tst-cleanup1 tst-cleanup2 tst-cleanup3 \
        tst-flock1 tst-flock2 \
        tst-signal1 tst-signal2 tst-signal3 tst-signal4 tst-signal5 \
-       tst-exec1 tst-exec2 tst-exec3 \
+       tst-signal6 \
+       tst-exec1 tst-exec2 tst-exec3 tst-exec4 \
        tst-exit1 \
        tst-stdio1 tst-stdio2 \
-       tst-stack1 \
+       tst-stack1 tst-stack2 \
        tst-unload \
+       tst-dlsym1 \
        tst-sysconf \
        tst-locale1 tst-locale2 \
        tst-umask1 \
        tst-popen1 \
-       tst-clock1
+       tst-clock1 tst-clock2 \
+       tst-context1 \
+       tst-sched1
+
+distribute = eintr.c
+
+gen-as-const-headers = pthread-errnos.sym
 
 LDFLAGS-pthread.so = -Wl,--enable-new-dtags,-z,nodelete,-z,initfirst
 
 
 include ../Makeconfig
 
+ifeq ($(have-forced-unwind),yes)
+tests += tst-cancelx2 tst-cancelx3 tst-cancelx4 tst-cancelx5 \
+        tst-cancelx6 tst-cancelx7 tst-cancelx8 tst-cancelx9 tst-cancelx10 \
+        tst-cancelx11 tst-cancelx12 tst-cancelx13 tst-cancelx14 tst-cancelx15\
+        tst-cancelx16 tst-cancelx17 tst-cancelx18 \
+        tst-cleanupx0 tst-cleanupx1 tst-cleanupx2 tst-cleanupx3 \
+        tst-oncex3 tst-oncex4
+endif
 ifeq ($(build-shared),yes)
-tests += tst-atfork2
+tests += tst-atfork2 tst-tls3 tst-tls4 tst-tls5 tst-_res1
 endif
 
-modules-names = tst-atfork2mod
+modules-names = tst-atfork2mod tst-tls3mod tst-tls4moda tst-tls4modb \
+               tst-tls5mod tst-tls5moda tst-tls5modb tst-tls5modc \
+               tst-tls5modd tst-tls5mode tst-tls5modf \
+               tst-_res1mod1 tst-_res1mod2
 extra-objs += $(addsuffix .os,$(strip $(modules-names)))
 test-extras += $(modules-names)
 test-modules = $(addprefix $(objpfx),$(addsuffix .so,$(modules-names)))
 
-$(test-modules): $(objpfx)%.so: $(objpfx)%.os
+tst-atfork2mod.so-no-z-defs = yes
+tst-tls3mod.so-no-z-defs = yes
+tst-tls5mod.so-no-z-defs = yes
+tst-tls5moda.so-no-z-defs = yes
+tst-tls5modb.so-no-z-defs = yes
+tst-tls5modc.so-no-z-defs = yes
+tst-tls5modd.so-no-z-defs = yes
+tst-tls5mode.so-no-z-defs = yes
+tst-tls5modf.so-no-z-defs = yes
+
+$(test-modules): $(objpfx)%.so: $(objpfx)%.os $(common-objpfx)shlib.lds
        $(build-module)
 
 ifeq ($(build-shared),yes)
+# Build all the modules even when not actually running test programs.
+tests: $(test-modules)
+
 others: $(objpfx)libpthread_nonshared.a
 endif
 
@@ -182,8 +287,27 @@ $(objpfx)libpthread_nonshared.a: $(addprefix $(objpfx),$(addsuffix .os,$(libpthr
        $(AR) $(ARFLAGS) $@ $^
 
 ifeq ($(build-shared),yes)
-extra-objs += crti.o
-omit-deps += crti
+
+# Set the `multidir' variable by grabbing the variable from the compiler.
+# We do it once and save the result in a generated makefile.
+-include $(objpfx)multidir.mk
+$(objpfx)multidir.mk: $(common-objpfx)config.make
+       dir=`$(CC) $(CFLAGS) $(CPPFLAGS) -print-multi-directory`; \
+       echo "multidir := $$dir" > $@T
+       mv -f $@T $@
+
+crti-objs := crti.o
+crtn-objs := crtn.o
+ifneq (,$(patsubst .,,$(multidir)))
+generated-dirs := $(firstword $(subst /, , $(multidir)))
+crti-objs += $(multidir)/crti.o
+crtn-objs += $(multidir)/crtn.o
+omit-deps += $(multidir)/crti $(multidir)/crtn
+$(objpfx)$(multidir):
+       mkdir $@
+endif
+extra-objs += $(crti-objs) $(crtn-objs)
+omit-deps += crti crtn
 
 CFLAGS-pt-initfini.s = -g0 -fPIC -fno-inline-functions
 endif
@@ -192,6 +316,9 @@ CFLAGS-flockfile.c = -D_IO_MTSAFE_IO
 CFLAGS-ftrylockfile.c = -D_IO_MTSAFE_IO
 CFLAGS-funlockfile.c = -D_IO_MTSAFE_IO
 
+# Ugly, ugly.  We have to link with libgcc_eh but how?
+link-libc-static := $(common-objpfx)libc.a $(gnulib) -lgcc_eh $(common-objpfx)libc.a
+
 ifeq ($(build-static),yes)
 tests-static += tst-locale1 tst-locale2
 endif
@@ -204,7 +331,6 @@ ifeq (yes,$(build-shared))
 # Make sure these things are built in the `make lib' pass so they can be used
 # to run programs during the `make others' pass.
 lib-noranlib: $(addprefix $(objpfx),$(extra-objs))
-endif
 
 # What we install as libpthread.so for programs to link against is in fact a
 # link script.  It contains references for the various libraries we need.
@@ -213,6 +339,7 @@ endif
 # We need to use absolute paths since otherwise local copies (if they exist)
 # of the files are taken by the linker.
 install: $(inst_libdir)/libpthread.so
+
 $(inst_libdir)/libpthread.so: $(common-objpfx)format.lds \
                              $(objpfx)libpthread.so$(libpthread.so-version) \
                              $(inst_libdir)/$(patsubst %,$(libtype.oS),\
@@ -229,6 +356,8 @@ $(inst_libdir)/libpthread.so: $(common-objpfx)format.lds \
        mv -f $@.new $@
 $(inst_libdir)/libpthread_nonshared.a: $(objpfx)libpthread_nonshared.a
        $(do-install)
+endif
+
 
 # 'pthread_self' is a simple memory or register load.  Setting up the
 # stack frame is more work than the actual operation.  Disable the
@@ -238,6 +367,33 @@ CFLAGS-pthread_self.os += -fomit-frame-pointer
 
 CFLAGS-tst-unload.c += -DPREFIX=\"$(objpfx)\"
 
+# Run the cancellation and cleanup tests also for the modern, exception-based
+# implementation.  For this we have to pass the -fexceptions parameter.
+CFLAGS-tst-cancelx2.c += -fexceptions
+CFLAGS-tst-cancelx3.c += -fexceptions
+CFLAGS-tst-cancelx4.c += -fexceptions
+CFLAGS-tst-cancelx5.c += -fexceptions
+CFLAGS-tst-cancelx6.c += -fexceptions
+CFLAGS-tst-cancelx7.c += -fexceptions
+CFLAGS-tst-cancelx8.c += -fexceptions
+CFLAGS-tst-cancelx9.c += -fexceptions
+CFLAGS-tst-cancelx10.c += -fexceptions
+CFLAGS-tst-cancelx11.c += -fexceptions
+CFLAGS-tst-cancelx12.c += -fexceptions
+CFLAGS-tst-cancelx13.c += -fexceptions
+CFLAGS-tst-cancelx14.c += -fexceptions
+CFLAGS-tst-cancelx15.c += -fexceptions
+CFLAGS-tst-cancelx16.c += -fexceptions
+CFLAGS-tst-cancelx17.c += -fexceptions
+CFLAGS-tst-cancelx18.c += -fexceptions
+CFLAGS-tst-cleanupx0.c += -fexceptions -fasynchronous-unwind-tables
+CFLAGS-tst-cleanupx1.c += -fexceptions -fasynchronous-unwind-tables
+CFLAGS-tst-cleanupx2.c += -fexceptions
+CFLAGS-tst-cleanupx3.c += -fexceptions
+CFLAGS-tst-oncex3.c += -fexceptions
+CFLAGS-tst-oncex4.c += -fexceptions
+CFLAGS-tst-align.c += $(stack-align-test-flags)
+
 tst-cancel7-ARGS = --command "$(built-program-cmd)"
 tst-umask1-ARGS = $(objpfx)tst-umask1.temp
 
@@ -246,9 +402,50 @@ LDFLAGS-tst-atfork2 = -rdynamic
 tst-atfork2-ENV = MALLOC_TRACE=$(objpfx)tst-atfork2.mtrace
 $(objpfx)tst-atfork2mod.so: $(shared-thread-library)
 
+$(objpfx)tst-tls3: $(libdl) $(shared-thread-library)
+LDFLAGS-tst-tls3 = -rdynamic
+$(objpfx)tst-tls3.out: $(objpfx)tst-tls3mod.so
+$(objpfx)tst-tls3mod.so: $(shared-thread-library)
+
+$(objpfx)tst-tls4: $(libdl) $(shared-thread-library)
+$(objpfx)tst-tls4.out: $(objpfx)tst-tls4moda.so $(objpfx)tst-tls4modb.so
+
+$(objpfx)tst-tls5: $(objpfx)tst-tls5mod.so $(shared-thread-library)
+
+ifeq ($(build-shared),yes)
+tests: $(objpfx)tst-tls6.out
+$(objpfx)tst-tls6.out: tst-tls6.sh $(objpfx)tst-tls5 \
+                      $(objpfx)tst-tls5moda.so $(objpfx)tst-tls5modb.so \
+                      $(objpfx)tst-tls5modc.so $(objpfx)tst-tls5modd.so \
+                      $(objpfx)tst-tls5mode.so $(objpfx)tst-tls5modf.so
+       $(SHELL) -e tst-tls6.sh $(common-objpfx) $(elf-objpfx) \
+                   $(rtld-installed-name)
+endif
+
+$(objpfx)tst-dlsym1: $(libdl) $(shared-thread-library)
+
+ifeq (yes,$(build-shared))
+$(objpfx)tst-cond11: $(common-objpfx)rt/librt.so
+$(objpfx)tst-cancel17: $(common-objpfx)rt/librt.so
+$(objpfx)tst-cancelx17: $(common-objpfx)rt/librt.so
+$(objpfx)tst-cancel18: $(common-objpfx)rt/librt.so
+$(objpfx)tst-cancelx18: $(common-objpfx)rt/librt.so
+$(objpfx)tst-clock2: $(common-objpfx)rt/librt.so
+$(objpfx)tst-_res1mod2.so: $(objpfx)tst-_res1mod1.so
+$(objpfx)tst-_res1: $(objpfx)tst-_res1mod2.so $(shared-thread-library)
+else
+$(objpfx)tst-cond11: $(common-objpfx)rt/librt.a
+$(objpfx)tst-cancel17: $(common-objpfx)rt/librt.a
+$(objpfx)tst-cancelx17: $(common-objpfx)rt/librt.a
+$(objpfx)tst-cancel18: $(common-objpfx)rt/librt.a
+$(objpfx)tst-cancelx18: $(common-objpfx)rt/librt.a
+$(objpfx)tst-clock2: $(common-objpfx)rt/librt.a
+endif
+
 extra-B-pthread.so = -B$(common-objpfx)nptl/
-$(objpfx)libpthread.so: $(objpfx)crti.o
-$(objpfx)libpthread.so: +preinit += $(objpfx)crti.o
+$(objpfx)libpthread.so: $(addprefix $(objpfx),$(crti-objs) $(crtn-objs))
+$(objpfx)libpthread.so: +preinit += $(addprefix $(objpfx),$(crti-objs))
+$(objpfx)libpthread.so: +postinit += $(addprefix $(objpfx),$(crtn-objs))
 
 # Depend on libc.so so a DT_NEEDED is generated in the shared objects.
 # This ensures they will load libc.so for needed symbols if loaded by
@@ -270,6 +467,7 @@ $(objpfx)tst-unload: $(common-objpfx)dlfcn/libdl.so
 $(addprefix $(objpfx), $(tests-reverse)): \
   $(objpfx)../libc.so $(objpfx)libpthread.so \
   $(objpfx)libpthread_nonshared.a
+$(objpfx)../libc.so: $(common-objpfx)libc.so ;
 $(addprefix $(objpfx),$(tests-static)): $(objpfx)libpthread.a
 
 $(objpfx)tst-atfork2.out: $(objpfx)tst-atfork2mod.so
@@ -284,12 +482,19 @@ $(objpfx)pt-initfini.s: pt-initfini.c
        $(compile.c) -S $(CFLAGS-pt-initfini.s) -finhibit-size-directive \
                $(patsubst -f%,-fno-%,$(exceptions)) -o $@
 
+$(objpfx)tst-cleanup0.out: /dev/null $(objpfx)tst-cleanup0
+       $(make-test-out) 2>&1 | cmp - tst-cleanup0.expect >& $@
+
 # We only have one kind of startup code files.  Static binaries and
 # shared libraries are build using the PIC version.
 $(objpfx)crti.S: $(objpfx)pt-initfini.s
        sed -n -e '1,/@HEADER_ENDS/p' \
               -e '/@_.*_PROLOG_BEGINS/,/@_.*_PROLOG_ENDS/p' \
               -e '/@TRAILER_BEGINS/,$$p' $< > $@
+$(objpfx)crtn.S: $(objpfx)pt-initfini.s
+       sed -n -e '1,/@HEADER_ENDS/p' \
+              -e '/@_.*_EPILOG_BEGINS/,/@_.*_EPILOG_ENDS/p' \
+              -e '/@TRAILER_BEGINS/,$$p' $< > $@
 
 $(objpfx)defs.h: $(objpfx)pt-initfini.s
        sed -n -e '/@TESTS_BEGIN/,/@TESTS_END/p' $< | \
@@ -298,9 +503,23 @@ $(objpfx)defs.h: $(objpfx)pt-initfini.s
 $(objpfx)crti.o: $(objpfx)crti.S $(objpfx)defs.h
        $(compile.S) -g0 $(ASFLAGS-.os) -o $@
 
-generated += crti.S defs.h pt-initfini.s $(objpfx)tst-atfork2.mtrace \
+$(objpfx)crtn.o: $(objpfx)crtn.S $(objpfx)defs.h
+       $(compile.S) -g0 $(ASFLAGS-.os) -o $@
+
+ifneq ($(multidir),.)
+$(objpfx)$(multidir)/crti.o: $(objpfx)crti.o $(objpfx)$(multidir)/
+       ln -f $< $@
+
+$(objpfx)$(multidir)/crtn.o: $(objpfx)crtn.o $(objpfx)$(multidir)/
+       ln -f $< $@
+endif
+
+generated += crti.S crtn.S defs.h pt-initfini.s
+
+generated += $(objpfx)tst-atfork2.mtrace \
             $(addsuffix .so,$(strip $(modules-names)))
 
+$(objpfx)version.d: $(objpfx)banner.h
 $(objpfx)version.os: $(objpfx)banner.h
 $(objpfx)banner.h: Banner
        sed 's/\(.*\)/"\1\\n"/' $< > $@
@@ -319,3 +538,5 @@ $(objpfx)tst-cancel-wrappers.out: tst-cancel-wrappers.sh
                    $(objpfx)libpthread.a > $@
 endif
 endif
+
+tst-exec4-ARGS = $(built-program-cmd)
This page took 0.69914 seconds and 5 git commands to generate.