From 3e68db234a0259b5510687df5d5ad756d5928c67 Mon Sep 17 00:00:00 2001 From: Michall Kottman Date: Sun, 20 Nov 2011 21:38:22 +0100 Subject: [PATCH] Fix compilation on Mac OS X with Qt in custom directory --- CMakeLists.txt | 41 ++++-------------------------------- cpptoxml/main.cpp | 63 +++++++++++++++++++++++-------------------------------- 2 files changed, 30 insertions(+), 74 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a05d45e..08b7160 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,7 +52,7 @@ if(noqt) endif() find_package(Lua51 REQUIRED) -find_program(LUA_CMD NAMES lua lua5.1 lua51) +find_program(LUA_CMD NAMES luajit lua lua5.1 lua51) if(MSVC) set(CMAKE_SUPPRESS_REGENERATION TRUE) @@ -62,43 +62,10 @@ endif() if(MINGW) set(CMAKE_SHARED_LINKER_FLAGS "-Wl,-add-stdcall-alias") - SET(CMAKE_VERBOSE_MAKEFILE ON) endif() - -macro(lqt_files name folder) - file(GLOB ${name}_sources ${folder}/*.cpp) - file(GLOB ${name}_headers ${folder}/*.hpp) - qt4_wrap_cpp(${name}_moc ${${name}_headers}) - qt4_automoc(${${name}_sources}) - set(${name}_src ${${name}_sources} ${${name}_moc}) - set(${name}_h ${${name}_headers}) - source_group(generated FILES ${${name}_moc}) - project_source_group("${GROUP_CODE}" ${name}_sources ${name}_headers) -endmacro() - - -# folders in the msvc projects -# mode==flat : headers and sources not in folders -# mode==split : standard behavior of cmake, split headers and sources -# mode== : code is in this folder -macro(project_source_group mode sources headers) - if(${mode} MATCHES "flat") - source_group("Source Files" Files) - source_group("Header Files" Files) - source_group("cmake" FILES CMakeLists.txt) - else() - if(NOT ${mode} MATCHES "split") - source_group("${mode}" FILES ${${sources}} ${${headers}}) - endif() - endif() -endmacro() -set(GROUP_CODE "Source Files") - - add_subdirectory(cpptoxml) - function(build_qt_lib_binding BINDING_HEADER) string(TOLOWER ${BINDING_HEADER} BINDING_NAME) @@ -118,15 +85,15 @@ function(build_qt_lib_binding BINDING_HEADER) if(NOT REUSE_FILES) set (GEN_XML ${LQT_GEN_DIR}/${BINDING_NAME}.xml) - add_custom_target(generate_${BINDING_NAME}_xml COMMAND cpptoxml - ${BINDING_HEADER} + add_custom_target(generate_${BINDING_NAME}_xml + COMMAND cpptoxml + ${BINDING_HEADER} -C ${PP_CONFIG} -Q ${QT_INCLUDE_DIR} -o ${GEN_XML} COMMENT "Generating XML: running cpptoxml on ${BINDING_NAME} " VERBATIM) - math(EXPR MAX ${ARGC}-1) if(MAX) foreach(I RANGE 1 ${MAX}) diff --git a/cpptoxml/main.cpp b/cpptoxml/main.cpp index e6de950..e48d5ca 100644 --- a/cpptoxml/main.cpp +++ b/cpptoxml/main.cpp @@ -420,6 +420,25 @@ void printHelp() } + +QString findIncludeFile(const QString& sourceName, const QString& qtdir) +{ + QStringList tries; + +#define TRY_DIRECTORY(dir) \ + do { QString tmp = dir; \ + if (QFileInfo(tmp).exists()) return dir; else tries.append(tmp); \ + } while (0) + + TRY_DIRECTORY(qtdir+'/'+sourceName+'/'+sourceName); + TRY_DIRECTORY(qtdir+"/Headers/"+sourceName); + TRY_DIRECTORY(QString("/Library/Frameworks/%1.framework/Headers/%1").arg(sourceName)); + + cerr << "Could not find include file, tried here: " << qPrintable(tries.join(" ")); + exit(1); +} + + int main (int argc, char **argv) { bool onlyPreprocess = false; bool dontResolve = false; @@ -489,48 +508,24 @@ int main (int argc, char **argv) { if (separed) i++; } else { -#ifdef Q_OS_MAC if (sourceName.isEmpty()) sourceName = QString::fromLatin1(argv[i]); - else - qtdir = QString::fromLatin1(argv[i]); -#else - sourceName = QString::fromLatin1(argv[i]); -#endif } } - + if (qtdir.isEmpty()) qtdir = QDir::fromNativeSeparators(getenv("QT_INCLUDE")); if (qtdir.isEmpty()) { fprintf(stderr, "Generator requires Qt include dir as option -Q or QT_INCLUDE to be set\n"); return 1; } + + if (!QFileInfo(sourceName).exists() || QFileInfo(sourceName).isDir()) + sourceName = findIncludeFile(sourceName, qtdir); - QString frameworkDir = "/Library/Frameworks"; - if (!QFileInfo(sourceName).exists() || QFileInfo(sourceName).isDir()) { - QString qtincludefile = QDir::fromNativeSeparators(qtdir+'/'+sourceName+'/'+sourceName); - QString macincludefile = QString("%1/%2.framework/Headers/%2").arg(frameworkDir).arg(sourceName); - if (QFileInfo(qtincludefile).exists()) { - sourceName = qtincludefile; - } else if (QFileInfo(macincludefile).exists()) { - sourceName = macincludefile; - } else { - QString msg = "Error: wether '" + sourceName + "' nor '" + qtincludefile; -#if defined(Q_OS_MAC) - msg += "' or '" + macincludefile; -#endif - msg += "' found"; - fprintf(stderr, "%s\n", msg.toLatin1().constData()); - return 1; - } - } - - if(verbose) fprintf(stderr, "Used file: %s", qPrintable(sourceName)); + if (verbose) fprintf(stderr, "Used file: %s\n", qPrintable(sourceName)); - QString currentDir = QDir::current().absolutePath(); QFileInfo sourceInfo(sourceName); - //QDir::setCurrent(sourceInfo.absolutePath()); inclist << (sourceInfo.absolutePath()); inclist << (QDir::convertSeparators(qtdir)); @@ -540,16 +535,10 @@ int main (int argc, char **argv) { <<"QtOpenGL" << "QtWebKit"<< "QtScript" << "QtSvg"; Q_FOREACH(const QString& lib, qts) { - if (sourceName.contains(frameworkDir)) { - // TODO does not work with framework because there are no QtCore, QtGui, ... folders - inclist << QString("%1/%2.framework/Headers").arg(frameworkDir).arg(lib); - } else { - inclist << QDir::convertSeparators(qtdir + "/" + lib); - } + inclist << QDir::convertSeparators(qtdir + "/" + lib); } - if(debug) qDebug() << "atdir: " << qtdir << "sourceName: " << sourceName << inclist; - + if(debug) qDebug() << "atdir: " << qtdir << "\nsourceName: " << sourceName << "\nincludes" << inclist; Preprocessor pp; pp.addIncludePaths(inclist); -- 2.11.4.GIT