Branch: master

b716176c 2014-09-12 13:01:39 Francois Andriot
Fix qmake shared library naming
Add long long int support to TQTextStream
Fix potential segmentation fault in QValueList
Fix library naming in TQT Plugins
This relates to Bug 2107
M qmake/generators/unix/unixmake.cpp
M qmake/generators/unix/unixmake2.cpp
M src/tools/qgpluginmanager.cpp
M src/tools/qtextstream.cpp
M src/tools/qtextstream.h
M src/tools/qvaluelist.h
diff --git a/qmake/generators/unix/unixmake.cpp b/qmake/generators/unix/unixmake.cpp
index e863495..865c84a 100644
--- a/qmake/generators/unix/unixmake.cpp
+++ b/qmake/generators/unix/unixmake.cpp
@@ -806,7 +806,7 @@
 		uninst.append("\n\t");
 	    uninst.append("-$(DEL_FILE) \"" + dst_pc + "\"");
 	}
-	if ( project->isEmpty("QMAKE_CYGWIN_SHLIB") ) {
+	if ( project->isEmpty("QMAKE_CYGWIN_SHLIB") && project->isEmpty("QMAKE_OPENBSD_SHLIBS") ) {
 	    if ( !project->isActiveConfig("staticlib") && !project->isActiveConfig("plugin") ) {
 		if ( project->isEmpty("QMAKE_HPUX_SHLIB") ) {
 		    links << "$(TARGET0)" << "$(TARGET1)" << "$(TARGET2)";
diff --git a/qmake/generators/unix/unixmake2.cpp b/qmake/generators/unix/unixmake2.cpp
index 354bcf6..d1ed572 100644
--- a/qmake/generators/unix/unixmake2.cpp
+++ b/qmake/generators/unix/unixmake2.cpp
@@ -132,6 +132,8 @@
 	 src_incremental=FALSE, moc_incremental=FALSE;
 
     t << "####### Compiler, tools and options" << endl << endl;
+    if (varGlue("INCLUDEPATH", " -I", " -I", "").find("$(LOCALBASE)") != -1)
+    	t << "LOCALBASE?= /usr/local" << endl;
     t << "CC       = ";
     if (project->isActiveConfig("thread") &&
 	! project->variables()["QMAKE_CC_THREAD"].isEmpty())
@@ -298,10 +300,15 @@
     } else if (!project->isActiveConfig("staticlib") && project->variables()["QMAKE_APP_FLAG"].isEmpty()) {
 	t << "TARGETA	= " << var("TARGETA") << endl;
 	if (project->isEmpty("QMAKE_HPUX_SHLIB")) {
-	    t << "TARGETD	= " << var("TARGET_x.y.z") << endl;
-	    t << "TARGET0	= " << var("TARGET_") << endl;
-	    t << "TARGET1	= " << var("TARGET_x") << endl;
-	    t << "TARGET2	= " << var("TARGET_x.y") << endl;
+  	    if (!project->isEmpty("QMAKE_OPENBSD_SHLIBS")) {
+		t << "LIB"+var("OBSD_TARGET_NAME")+"_VERSION = " << var("OBSD_TARGET_VERSION") << endl;
+  		t << "TARGETD	= " << var("TARGET_x.y") << endl;
+ 	    } else {
+		t << "TARGETD	= " << var("TARGET_x.y.z") << endl;
+		t << "TARGET0	= " << var("TARGET_") << endl;
+		t << "TARGET1	= " << var("TARGET_x") << endl;
+		t << "TARGET2	= " << var("TARGET_x.y") << endl;
+	    }
 	} else {
 	    t << "TARGETD	= " << var("TARGET_x") << endl;
 	    t << "TARGET0	= " << var("TARGET_") << endl;
@@ -378,6 +385,7 @@
     }
 
     t << "####### Build rules" << endl << endl;
+    t << "$(OBJECTS): $(UICDECLS)" << endl << endl;
     if(!project->variables()["SUBLIBS"].isEmpty()) {
 	QString libdir = "tmp/";
 	if(!project->isEmpty("SUBLIBS_DIR"))
@@ -1296,10 +1304,20 @@
 		project->variables()["TARGET_x"].append("lib" + project->first("TARGET") + "." +
 							project->first("QMAKE_EXTENSION_SHLIB") +
 							"." + project->first("VER_MAJ"));
-		project->variables()["TARGET_x.y"].append("lib" + project->first("TARGET") + "." +
-						      project->first("QMAKE_EXTENSION_SHLIB")
-						      + "." + project->first("VER_MAJ") +
-						      "." + project->first("VER_MIN"));
+		if ( !project->variables()["QMAKE_OPENBSD_SHLIBS"].isEmpty() ) {
+		    QString s;
+		    s.setNum(project->first("VER_MIN").toInt()*10+ project->first("VER_PAT").toInt());
+		    project->variables()["OBSD_TARGET_VERSION"].append(project->first("VER_MAJ") + "." + s);
+		    project->variables()["OBSD_TARGET_NAME"].append(project->first("TARGET"));
+		    project->variables()["TARGET_x.y"].append("lib" + project->first("TARGET") + "." +
+							  project->first("QMAKE_EXTENSION_SHLIB")
+							  + ".$(LIB"+ project->first("TARGET") + "_VERSION)");
+		} else {
+		    project->variables()["TARGET_x.y"].append("lib" + project->first("TARGET") + "." +
+							  project->first("QMAKE_EXTENSION_SHLIB")
+							  + "." + project->first("VER_MAJ") +
+							  "." + project->first("VER_MIN"));
+		}
 		project->variables()["TARGET_x.y.z"].append("lib" + project->first("TARGET") +
 							    "." +
 							    project->variables()[
@@ -1308,7 +1326,10 @@
 							    project->first("VER_MIN") +  "." +
 							    project->first("VER_PAT"));
 	    }
-	    project->variables()["TARGET"] = project->variables()["TARGET_x.y.z"];
+	    if ( !project->variables()["QMAKE_OPENBSD_SHLIBS"].isEmpty() )
+		project->variables()["TARGET"] = project->variables()["TARGET_x.y"];
+	    else
+		project->variables()["TARGET"] = project->variables()["TARGET_x.y.z"];
 	}
 	if(project->isEmpty("QMAKE_LN_SHLIB"))
 	    project->variables()["QMAKE_LN_SHLIB"].append("ln -s");
diff --git a/src/tools/qgpluginmanager.cpp b/src/tools/qgpluginmanager.cpp
index 56b12cd..520e16d 100644
--- a/src/tools/qgpluginmanager.cpp
+++ b/src/tools/qgpluginmanager.cpp
@@ -323,6 +323,8 @@
     QString filter = "*.dylib; *.so; *.bundle";
 #elif defined(Q_OS_HPUX)
     QString filter = "*.sl";
+#elif defined(Q_OS_OPENBSD)
+    QString filter = "*.so; *.so.*";
 #elif defined(Q_OS_UNIX)
     QString filter = "*.so";
 #endif
diff --git a/src/tools/qtextstream.cpp b/src/tools/qtextstream.cpp
index 63f9625..eb56eec 100644
--- a/src/tools/qtextstream.cpp
+++ b/src/tools/qtextstream.cpp
@@ -195,6 +195,7 @@
 #define I_SHORT		0x0010
 #define I_INT		0x0020
 #define I_LONG		0x0030
+#define I_LONGLONG	0x0040
 #define I_TYPE_MASK	0x00f0
 
 #define I_BASE_2	QTS::bin
@@ -1862,7 +1863,7 @@
     return *this;
 }
 
-QTextStream &QTextStream::output_int( int format, ulong n, bool neg )
+QTextStream &QTextStream::output_int( int format, unsigned long long n, bool neg )
 {
     static const char hexdigits_lower[] = "0123456789abcdef";
     static const char hexdigits_upper[] = "0123456789ABCDEF";
@@ -1879,6 +1880,7 @@
 		case I_SHORT: len=16; break;
 		case I_INT:   len=sizeof(int)*8; break;
 		case I_LONG:  len=32; break;
+		case I_LONGLONG: len=64; break;
 		default:      len = 0;
 	    }
 	    p = &buf[74];			// go reverse order
@@ -1925,7 +1927,7 @@
 	    p = &buf[74];
 	    *p = '\0';
 	    if ( neg )
-		n = (ulong)(-(long)n);
+		n = (unsigned long long)(-(long long)n);
 	    do {
 		*--p = ((int)(n%10)) + '0';
 		n /= 10;
@@ -2041,6 +2043,31 @@
     return output_int( I_LONG | I_UNSIGNED, i, FALSE );
 }
 
+/*!
+    \overload
+
+    Writes a \c long long \c int \a i to the stream and returns a reference
+    to the stream.
+*/
+
+QTextStream &QTextStream::operator<<( signed long long i )
+{
+    return output_int( I_LONGLONG | I_SIGNED, i, i < 0 );
+}
+
+
+/*!
+    \overload
+
+    Writes an \c unsigned \c long \c int \a i to the stream and
+    returns a reference to the stream.
+*/
+
+QTextStream &QTextStream::operator<<( unsigned long long i )
+{
+    return output_int( I_LONGLONG | I_UNSIGNED, i, FALSE );
+}
+
 
 /*!
     \overload
diff --git a/src/tools/qtextstream.h b/src/tools/qtextstream.h
index 337cc3b..fb494f0 100644
--- a/src/tools/qtextstream.h
+++ b/src/tools/qtextstream.h
@@ -102,6 +102,8 @@
     QTextStream &operator<<( unsigned int );
     QTextStream &operator<<( signed long );
     QTextStream &operator<<( unsigned long );
+    QTextStream &operator<<( signed long long );
+    QTextStream &operator<<( unsigned long long );
     QTextStream &operator<<( float );
     QTextStream &operator<<( double );
     QTextStream &operator<<( const char* );
@@ -155,7 +157,8 @@
 private:
     long	input_int();
     void	init();
-    QTextStream &output_int( int, ulong, bool );
+    QTextStream &output_int( int, unsigned long long, bool );
+ 
     QIODevice	*dev;
 
     int		fflags;
diff --git a/src/tools/qvaluelist.h b/src/tools/qvaluelist.h
index 2976214..8c57e54 100644
--- a/src/tools/qvaluelist.h
+++ b/src/tools/qvaluelist.h
@@ -655,13 +655,11 @@
     l.clear();
     Q_UINT32 c;
     s >> c;
-    for( Q_UINT32 i = 0; i < c; ++i )
+    for( Q_UINT32 i = 0; i < c && !s.atEnd(); ++i )
     {
 	T t;
 	s >> t;
 	l.append( t );
-	if ( s.atEnd() )
-	    break;
     }
     return s;
 }