Source: clucene-core
Version: 2.3.3.4+dfsg-1
Tags: patch upstream
User: debian-cr...@lists.debian.org
Usertags: ftcbfs

clucene-core fails to cross build from source, because it uses
CHECK_CXX_SOURCE_RUNS in a number of places. In some cases, it is used
for checking whether a particular syntax is supported by the compiler.
There, we can simply use CHECK_CXX_SOURCE_COMPILES at no loss. In some
cases, runtime bugs are checked. The best course of action here is to
assume that there are no runtime bugs (but only for cross compilation).
The attached patch implements that for all relevant checks. Please
consider applying it to make clucene-core cross buildable.

Helmut
--- clucene-core-2.3.3.4+dfsg.orig/src/shared/cmake/CheckNamespace.cmake
+++ clucene-core-2.3.3.4+dfsg/src/shared/cmake/CheckNamespace.cmake
@@ -1,8 +1,8 @@
 #check if we support namespaces
 MACRO ( CHECK_NAMESPACE haveNamespace )
     #Check if namespaces work in the compiler
-    CHECK_CXX_SOURCE_RUNS("
+    CHECK_CXX_SOURCE_COMPILES("
     	namespace Outer { namespace Inner { int i = 0; }}
     	int main(){ using namespace Outer::Inner; return i; }" 
     	${haveNamespace} )
-ENDMACRO ( CHECK_NAMESPACE haveNamespace )
\ No newline at end of file
+ENDMACRO ( CHECK_NAMESPACE haveNamespace )
--- clucene-core-2.3.3.4+dfsg.orig/src/shared/cmake/CheckSnprintf.cmake
+++ clucene-core-2.3.3.4+dfsg/src/shared/cmake/CheckSnprintf.cmake
@@ -1,42 +1,46 @@
 #checks if snprintf have bugs
 
 MACRO ( CHECK_SNPRINTF )
-    #check that our snprintf works correctly...
-    IF ( _CL_HAVE_FUNCTION_SNPRINTF )
-    CHECK_CXX_SOURCE_RUNS("
-    	#include <stdio.h>
-    	int main(){
-    		char ovbuf[7];
-    		int i;
-    		for (i=0; i<7; i++) ovbuf[i]='x';
-    		snprintf(ovbuf, 4,\"foo%s\", \"bar\");
-    		if (ovbuf[5]!='x') return 1;
-    		snprintf(ovbuf, 4,\"foo%d\", 666);
-    		if (ovbuf[5]!='x') return 1;
-    		return 0;
-    	}" _CL_HAVE_NO_SNPRINTF_BUG) 
-    	IF ( NOT _CL_HAVE_NO_SNPRINTF_BUG )
-    		SET ( _CL_HAVE_SNPRINTF_BUG 1 )
-    		MESSAGE ( FATAL_ERROR "snprintf has a bug, and we don't have a replacement!" )
-    	ENDIF ( NOT _CL_HAVE_NO_SNPRINTF_BUG )
-    ENDIF ( _CL_HAVE_FUNCTION_SNPRINTF )
-    
-    #check that our swnprintf works correctly...
-    IF ( _CL_HAVE_FUNCTION_SNWPRINTF )
-    CHECK_CXX_SOURCE_RUNS("
-    	#include <stdio.h>
-    	#include <wchar.h>
-    	
-    	int main(void)
-    	{
-        	wchar_t buf[5];
-        	snwprintf(buf,5,L\"%s\",L\"foo\");
-        	if ( wcslen(buf) != 3 )
-        		return 1;
-        	return 0;
-    	}" _CL_HAVE_NO_SNWPRINTF_BUG) 
-    	IF ( NOT _CL_HAVE_NO_SNWPRINTF_BUG )
-    		SET ( _CL_HAVE_SNWPRINTF_BUG 1 )
-    	ENDIF ( NOT _CL_HAVE_NO_SNWPRINTF_BUG )
-    ENDIF ( _CL_HAVE_FUNCTION_SNWPRINTF )
+    IF ( CMAKE_CROSSCOMPILING )
+        MESSAGE ( WARNING "cannot check for snprintf bugs during cross compilation")
+    ELSE ( CMAKE_CROSSCOMPILING )
+        #check that our snprintf works correctly...
+        IF ( _CL_HAVE_FUNCTION_SNPRINTF )
+        CHECK_CXX_SOURCE_RUNS("
+        	#include <stdio.h>
+        	int main(){
+        		char ovbuf[7];
+        		int i;
+        		for (i=0; i<7; i++) ovbuf[i]='x';
+        		snprintf(ovbuf, 4,\"foo%s\", \"bar\");
+        		if (ovbuf[5]!='x') return 1;
+        		snprintf(ovbuf, 4,\"foo%d\", 666);
+        		if (ovbuf[5]!='x') return 1;
+        		return 0;
+        	}" _CL_HAVE_NO_SNPRINTF_BUG)
+        	IF ( NOT _CL_HAVE_NO_SNPRINTF_BUG )
+        		SET ( _CL_HAVE_SNPRINTF_BUG 1 )
+        		MESSAGE ( FATAL_ERROR "snprintf has a bug, and we don't have a replacement!" )
+        	ENDIF ( NOT _CL_HAVE_NO_SNPRINTF_BUG )
+        ENDIF ( _CL_HAVE_FUNCTION_SNPRINTF )
+
+        #check that our swnprintf works correctly...
+        IF ( _CL_HAVE_FUNCTION_SNWPRINTF )
+        CHECK_CXX_SOURCE_RUNS("
+        	#include <stdio.h>
+        	#include <wchar.h>
+
+        	int main(void)
+        	{
+            	wchar_t buf[5];
+            	snwprintf(buf,5,L\"%s\",L\"foo\");
+            	if ( wcslen(buf) != 3 )
+            		return 1;
+            	return 0;
+        	}" _CL_HAVE_NO_SNWPRINTF_BUG)
+        	IF ( NOT _CL_HAVE_NO_SNWPRINTF_BUG )
+        		SET ( _CL_HAVE_SNWPRINTF_BUG 1 )
+        	ENDIF ( NOT _CL_HAVE_NO_SNWPRINTF_BUG )
+        ENDIF ( _CL_HAVE_FUNCTION_SNWPRINTF )
+    ENDIF ( CMAKE_CROSSCOMPILING )
 ENDMACRO ( CHECK_SNPRINTF )
--- clucene-core-2.3.3.4+dfsg.orig/src/shared/cmake/CheckAtomicFunctions.cmake
+++ clucene-core-2.3.3.4+dfsg/src/shared/cmake/CheckAtomicFunctions.cmake
@@ -3,7 +3,7 @@
 MACRO ( CHECK_HAVE_GCC_ATOMIC_FUNCTIONS result )
 
 # Do step by step checking,
-CHECK_CXX_SOURCE_RUNS("
+SET( CHECK_HAVE_GCC_ATOMIC_FUNCTIONS_SOURCE "
 #include <cstdlib>
 int main()
 {
@@ -20,6 +20,13 @@
 
    return EXIT_SUCCESS;
 }
-" ${result} )
+")
+
+IF ( CMAKE_CROSSCOMPILING )
+    CHECK_CXX_SOURCE_COMPILES("${CHECK_HAVE_GCC_ATOMIC_FUNCTIONS_SOURCE}" ${result} )
+    MESSAGE ( WARNING "cannot check atomics during cross compilation, assuming that they work" )
+ELSE ( CMAKE_CROSSCOMPILING )
+    CHECK_CXX_SOURCE_RUNS("${CHECK_HAVE_GCC_ATOMIC_FUNCTIONS_SOURCE}" ${result} )
+ENDIF ( CMAKE_CROSSCOMPILING )
 
 ENDMACRO ( CHECK_HAVE_GCC_ATOMIC_FUNCTIONS result )
--- clucene-core-2.3.3.4+dfsg.orig/src/shared/cmake/CheckErrorHandling.cmake
+++ clucene-core-2.3.3.4+dfsg/src/shared/cmake/CheckErrorHandling.cmake
@@ -3,7 +3,7 @@
 
 MACRO ( CHECK_HAVE_FUNCTION_TRY_BLOCKS result )
     #check for try/catch blocks
-    CHECK_CXX_SOURCE_RUNS("
+    CHECK_CXX_SOURCE_COMPILES("
     	void foo() { try{ return; } catch( ... ){} }
     	int main(){ foo(); return 0; }" ${result})
     IF ( NOT ${result} )
--- clucene-core-2.3.3.4+dfsg.orig/src/shared/cmake/DefineStaticSyntax.cmake
+++ clucene-core-2.3.3.4+dfsg/src/shared/cmake/DefineStaticSyntax.cmake
@@ -3,11 +3,17 @@
 MACRO ( DEFINE_STATIC_SYNTAX ) 
 
     #check which syntax of static const to use
-    CHECK_CXX_SOURCE_RUNS("class x{public: static const int SCI=55; }; int main(){ x a; if ( a.SCI!=55 ) throw \"err\"; return 0; }" LUCENE_STATIC_CONSTANT_SYNTAX)
+    SET ( DEFINE_STATIC_SYNTAX_SOURCE "class x{public: static const int SCI=55; }; int main(){ x a; if ( a.SCI!=55 ) throw \"err\"; return 0; }")
+    IF ( CMAKE_CROSSCOMPILING )
+        MESSAGE ( WARNING "testing for \"static const\" using a compile-only test")
+        CHECK_CXX_SOURCE_COMPILES ( "${DEFINE_STATIC_SYNTAX_SOURCE}" LUCENE_STATIC_CONSTANT_SYNTAX)
+    ELSE ( CMAKE_CROSSCOMPILING )
+        CHECK_CXX_SOURCE_RUNS ( "${DEFINE_STATIC_SYNTAX_SOURCE}" LUCENE_STATIC_CONSTANT_SYNTAX)
+    endif ( CMAKE_CROSSCOMPILING )
     IF ( LUCENE_STATIC_CONSTANT_SYNTAX )
         SET ( LUCENE_STATIC_CONSTANT_SYNTAX "static const type assignment")
     ELSE ( LUCENE_STATIC_CONSTANT_SYNTAX )
         SET ( LUCENE_STATIC_CONSTANT_SYNTAX "enum { assignment }")
     ENDIF ( LUCENE_STATIC_CONSTANT_SYNTAX )
 
-ENDMACRO ( DEFINE_STATIC_SYNTAX ) 
\ No newline at end of file
+ENDMACRO ( DEFINE_STATIC_SYNTAX ) 

Reply via email to