Favicon

BSDBuild: r732 - trunk/BSDBuild

Author: vedge
Date: 2008-10-04 22:54:06 -0300 (Sat, 04 Oct 2008)
New Revision: 732

Modified:
   trunk/BSDBuild/pthreads.pm
Log:
test for the pthreadsGC* libraries from Pthreads-w32; patch from Ryan Lindeman.

Modified: trunk/BSDBuild/pthreads.pm
===================================================================
--- trunk/BSDBuild/pthreads.pm	2008-09-28 06:05:03 UTC (rev 731)
+++ trunk/BSDBuild/pthreads.pm	2008-10-05 01:54:06 UTC (rev 732)
@@ -25,10 +25,36 @@
 # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
 # USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE..

-my $pthreads_test = << 'EOF';
+my @include_dirs = (
+	'/usr/include/pthreads',
+	'/usr/local/include',
+	'/usr/local/include/pthreads',
+);
+
+my @lib_dirs = (
+	'/usr/local/lib',
+);
+
+my @lib_files = (
+	'pthread',
+	'pthreadGC1',
+	'pthreadGC1d',
+	'pthreadGCE1',
+	'pthreadGCE1d',
+	'pthreadGC2',
+	'pthreadGC2d',
+	'pthreadGCE2',
+	'pthreadGCE2d',
+);
+
+my $test_std = << 'EOF';
 #include <pthread.h>
 #include <signal.h>
-static void *start_routine(void *arg) { return (NULL); }
+
+static void *start_routine(void *arg)
+{
+	return (NULL);
+}
 int main(int argc, char *argv[])
 {
 	pthread_mutex_t mutex;
@@ -42,23 +68,82 @@
 }
 EOF

+my $test_xopen = << 'EOF';
+#include <pthread.h>
+#include <signal.h>
+
+int main(int argc, char *argv[])
+{
+	pthread_mutex_t mutex;
+	pthread_mutexattr_t mutexattr;
+	pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_RECURSIVE);
+	pthread_mutex_init(&mutex, &mutexattr);
+	return (0);
+}
+EOF
+
+sub SearchIncludes ($)
+{
+	my $def = shift;
+
+	foreach my $dir (@include_dirs) {
+		MkIf qq{-f "$dir/pthread.h"};
+			MkDefine('PTHREADS_CFLAGS', "-I$dir");
+		MkEndif;
+	}
+}
+
+sub SearchLibs ($)
+{
+	my $def = shift;
+
+	foreach my $dir (@lib_dirs) {
+		foreach my $file (@lib_files) {
+			MkIf qq{-f "$dir/lib$file.a"};
+				MkDefine($def, "-L$dir -l$file");
+			MkEndif;
+		}
+	}
+}
+
 sub TestPthreadsStd
 {
 	MkDefine('PTHREADS_CFLAGS', '');
-	MkDefine('PTHREADS_LIBS', '-lpthread');
-	MkCompileC('HAVE_PTHREADS', '', '${PTHREADS_LIBS}', $pthreads_test);
+	MkDefine('PTHREADS_LIBS', "-lpthread");
+
+	# Try the standard -lpthread.
+	MkCompileC('HAVE_PTHREADS',
+	    '${PTHREADS_CFLAGS}', '${PTHREADS_LIBS}',
+	    $test_std);
 	MkIf('"${HAVE_PTHREADS}" = "yes"');
 		MkDefine('CFLAGS', '${CFLAGS} ${PTHREADS_CFLAGS}');
 		MkSaveMK('CFLAGS', 'PTHREADS_CFLAGS', 'PTHREADS_LIBS');
 		MkSaveDefine('PTHREADS_CFLAGS', 'PTHREADS_LIBS');
 	MkElse();
+		# Fallback to -pthread.
 		MkPrintN('checking for -pthread...');
 		MkDefine('PTHREADS_LIBS', '-pthread');
-		MkCompileC('HAVE_PTHREADS', '', '${PTHREADS_LIBS}', $pthreads_test);
+		MkCompileC('HAVE_PTHREADS',
+		    '${PTHREADS_CFLAGS}', '${PTHREADS_LIBS}',
+			$test_std);
 		MkIf('"${HAVE_PTHREADS}" = "yes"');
 			MkDefine('CFLAGS', '${CFLAGS} ${PTHREADS_CFLAGS}');
 			MkSaveMK('CFLAGS', 'PTHREADS_CFLAGS','PTHREADS_LIBS');
 			MkSaveDefine('PTHREADS_CFLAGS','PTHREADS_LIBS');
+		MkElse();
+			# Fallback to scanning libs and include files.
+			MkDefine('PTHREADS_CFLAGS', '');
+			MkDefine('PTHREADS_LIBS', '');
+			SearchIncludes('PTHREADS_CFLAGS');
+			SearchLibs('PTHREADS_LIBS');
+			MkCompileC('HAVE_PTHREADS',
+			    '${PTHREADS_CFLAGS}', '${PTHREADS_LIBS}',
+				$test_std);
+			MkIf('"${HAVE_PTHREADS}" = "yes"');
+				MkDefine('CFLAGS', '${CFLAGS} ${PTHREADS_CFLAGS}');
+				MkSaveMK('CFLAGS', 'PTHREADS_CFLAGS', 'PTHREADS_LIBS');
+				MkSaveDefine('PTHREADS_CFLAGS', 'PTHREADS_LIBS');
+			MkEndif();
 		MkEndif();
 	MkEndif();
 	return (0);
@@ -119,33 +204,39 @@
 sub TestPthreadsXOpenExt
 {
 	MkPrintN('checking for the X/Open Threads Extension...');
+
+	# Define _XOPEN_SOURCE=600 except under FreeBSD.
 	MkIf('"${SYSTEM}" = "FreeBSD"');
-		MkDefine('PTHREADS_XOPEN_CFLAGS', '');				# Not needed
+		MkDefine('PTHREADS_XOPEN_CFLAGS', '');
 	MkElse;
 		MkDefine('PTHREADS_XOPEN_CFLAGS',
 		         '-U_XOPEN_SOURCE -D_XOPEN_SOURCE=600');
 	MkEndif;
-	MkDefine('PTHREADS_XOPEN_LIBS', '-lpthread');
+
+	# Try the standard -lpthread
+	MkDefine('PTHREADS_XOPEN_LIBS', "-lpthread");
 	MkCompileC('HAVE_PTHREADS_XOPEN',
-	    '${PTHREADS_XOPEN_CFLAGS}', '${PTHREADS_XOPEN_LIBS}', << 'EOF');
-#include <pthread.h>
-#include <signal.h>
-
-int main(int argc, char *argv[])
-{
-	pthread_mutex_t mutex;
-	pthread_mutexattr_t mutexattr;
-	pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_RECURSIVE);
-	pthread_mutex_init(&mutex, &mutexattr);
-	return (0);
-}
-EOF
+	    '${PTHREADS_XOPEN_CFLAGS}', '${PTHREADS_XOPEN_LIBS}',
+		$test_xopen);
 	MkIf('"${HAVE_PTHREADS_XOPEN}" = "yes"');
 		MkSaveMK('PTHREADS_XOPEN_CFLAGS', 'PTHREADS_XOPEN_LIBS');
-		MkSaveDefine('HAVE_PTHREADS_XOPEN', 'PTHREADS_XOPEN_CFLAGS',
-		             'PTHREADS_XOPEN_LIBS');
+		MkSaveDefine('HAVE_PTHREADS_XOPEN');
+		MkSaveDefine('PTHREADS_XOPEN_CFLAGS', 'PTHREADS_XOPEN_LIBS');
 	MkElse;
-		MkSaveUndef('HAVE_PTHREADS_XOPEN');
+		# Fallback to scanning libraries and includes.
+		MkDefine('PTHREADS_XOPEN_LIBS', '');
+		SearchLibs('PTHREADS_XOPEN_LIBS');
+		SearchIncludes('PTHREADS_XOPEN_CFLAGS');
+		MkCompileC('HAVE_PTHREADS_XOPEN',
+		    '${PTHREADS_XOPEN_CFLAGS}', '${PTHREADS_XOPEN_LIBS}',
+			$test_xopen);
+		MkIf('"${HAVE_PTHREADS_XOPEN}" = "yes"');
+			MkSaveMK('PTHREADS_XOPEN_CFLAGS', 'PTHREADS_XOPEN_LIBS');
+			MkSaveDefine('HAVE_PTHREADS_XOPEN');
+			MkSaveDefine('PTHREADS_XOPEN_CFLAGS', 'PTHREADS_XOPEN_LIBS');
+		MkElse;
+			MkSaveUndef('HAVE_PTHREADS_XOPEN');
+		MkEndif;
 	MkEndif;
 	return (0);
 }

Gmane