diff options
Diffstat (limited to 'tqmake/main.cpp')
-rw-r--r-- | tqmake/main.cpp | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/tqmake/main.cpp b/tqmake/main.cpp new file mode 100644 index 000000000..6d261b87d --- /dev/null +++ b/tqmake/main.cpp @@ -0,0 +1,193 @@ +/**************************************************************************** +** +** ??? +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of tqmake. +** +** This file may be used under the terms of the GNU General +** Public License versions 2.0 or 3.0 as published by the Free +** Software Foundation and appearing in the files LICENSE.GPL2 +** and LICENSE.GPL3 included in the packaging of this file. +** Alternatively you may (at your option) use any later version +** of the GNU General Public License if such license has been +** publicly approved by Trolltech ASA (or its successors, if any) +** and the KDE Free TQt Foundation. +** +** Please review the following information to ensure GNU General +** Public Licensing requirements will be met: +** http://trolltech.com/products/qt/licenses/licensing/opensource/. +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://trolltech.com/products/qt/licenses/licensing/licensingoverview +** or contact the sales department at sales@trolltech.com. +** +** This file may be used under the terms of the Q Public License as +** defined by Trolltech ASA and appearing in the file LICENSE.TQPL +** included in the packaging of this file. Licensees holding valid TQt +** Commercial licenses may use this file in accordance with the TQt +** Commercial License Agreement provided with the Software. +** +** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, +** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted +** herein. +** +**********************************************************************/ + +#include "project.h" +#include "property.h" +#include "option.h" +#include "makefile.h" +#include <tqnamespace.h> +#include <tqregexp.h> +#include <tqdir.h> +#include <stdio.h> +#include <stdlib.h> +#include <ctype.h> +#include <fcntl.h> +#include <sys/types.h> +#include <sys/stat.h> + +#ifdef Q_OS_MAC +// for tqurl +bool tqt_resolve_symlinks = FALSE; +#endif + +#if defined(TQ_WS_WIN) +extern TQ_EXPORT int qt_ntfs_permission_lookup; +#endif + +int main(int argc, char **argv) +{ +#if defined(TQ_WS_WIN) + // Workaround for TQFileInfo::isReadable() failing for certain users. See task: 54320 + qt_ntfs_permission_lookup = 0; +#endif + + /* parse command line */ + if(!Option::parseCommandLine(argc, argv)) + return 666; + + TQDir sunworkshop42workaround = TQDir::current(); + TQString oldpwd = sunworkshop42workaround.currentDirPath(); +#ifdef TQ_WS_WIN + if(!(oldpwd.length() == 3 && oldpwd[0].isLetter() && oldpwd.endsWith(":/") ) ) +#endif + { + if(oldpwd.right(1) != TQString(TQChar(TQDir::separator()))) + oldpwd += TQDir::separator(); + } + Option::output_dir = oldpwd; //for now this is the output dir + + if(Option::output.name() != "-") { + TQFileInfo fi(Option::output); + TQString dir; + if(fi.isDir()) { + dir = fi.filePath(); + } else { + TQString tmp_dir = fi.dirPath(); + if(!tmp_dir.isEmpty() && TQFile::exists(tmp_dir)) + dir = tmp_dir; + } + if(!dir.isNull() && dir != ".") + Option::output_dir = dir; + if(TQDir::isRelativePath(Option::output_dir)) + Option::output_dir.prepend(oldpwd); + } + + TQMakeProperty prop; + if(Option::tqmake_mode == Option::QMAKE_QUERY_PROPERTY || Option::tqmake_mode == Option::QMAKE_SET_PROPERTY) + return prop.exec() ? 0 : 101; + + TQMakeProject proj(&prop); + int exit_val = 0; + TQStringList files; + if(Option::tqmake_mode == Option::QMAKE_GENERATE_PROJECT) + files << "(*hack*)"; //we don't even use files, but we do the for() body once + else + files = Option::mkfile::project_files; + for(TQStringList::Iterator pfile = files.begin(); pfile != files.end(); pfile++) { + if(Option::tqmake_mode == Option::QMAKE_GENERATE_MAKEFILE || + Option::tqmake_mode == Option::QMAKE_GENERATE_PRL) { + TQString fn = Option::fixPathToLocalOS((*pfile)); + + //setup pwd properly + debug_msg(1, "Resetting dir to: %s", oldpwd.latin1()); + TQDir::setCurrent(oldpwd); //reset the old pwd + int di = fn.findRev(Option::dir_sep); + if(di != -1) { + debug_msg(1, "Changing dir to: %s", fn.left(di).latin1()); + if(!TQDir::setCurrent(fn.left(di))) + fprintf(stderr, "Cannot find directory: %s\n", fn.left(di).latin1()); + fn = fn.right(fn.length() - di - 1); + } + + /* read project.. */ + if(!proj.read(fn, oldpwd)) { + fprintf(stderr, "Error processing project file: %s\n", + fn == "-" ? "(stdin)" : (*pfile).latin1()); + exit_val = 2; + continue; + } + if(Option::mkfile::do_preprocess) //no need to create makefile + continue; + + /* let Option post-process */ + if(!Option::postProcessProject(&proj)) { + fprintf(stderr, "Error post-processing project file: %s", + fn == "-" ? "(stdin)" : (*pfile).latin1()); + exit_val = 8; + continue; + } + } + + bool using_stdout = FALSE; + MakefileGenerator *mkfile = MakefileGenerator::create(&proj); //figure out generator + if(mkfile && (Option::tqmake_mode == Option::QMAKE_GENERATE_MAKEFILE || + Option::tqmake_mode == Option::QMAKE_GENERATE_PROJECT)) { + //open output + if(!(Option::output.state() & IO_Open)) { + if(Option::output.name() == "-") { + Option::output.setName(""); + Option::output_dir = TQDir::currentDirPath(); + Option::output.open(IO_WriteOnly | IO_Translate, stdout); + using_stdout = TRUE; + } else { + if(Option::output.name().isEmpty() && Option::tqmake_mode == Option::QMAKE_GENERATE_MAKEFILE) + Option::output.setName(proj.first("QMAKE_MAKEFILE")); + Option::output_dir = oldpwd; + if(!mkfile->openOutput(Option::output)) { + fprintf(stderr, "Failure to open file: %s\n", + Option::output.name().isEmpty() ? "(stdout)" : Option::output.name().latin1()); + return 5; + } + } + } + } else { + using_stdout = TRUE; //kind of.. + } + if(mkfile && !mkfile->write()) { + if(Option::tqmake_mode == Option::QMAKE_GENERATE_PROJECT) + fprintf(stderr, "Unable to generate project file.\n"); + else + fprintf(stderr, "Unable to generate makefile for: %s\n", (*pfile).latin1()); + if(!using_stdout) + TQFile::remove(Option::output.name()); + exit_val = 6; + } + delete mkfile; + mkfile = NULL; + + /* debugging */ + if(Option::debug_level) { + TQMap<TQString, TQStringList> &vars = proj.variables(); + for(TQMap<TQString, TQStringList>::Iterator it = vars.begin(); it != vars.end(); ++it) { + if(!it.key().startsWith(".") && !it.data().isEmpty()) + debug_msg(1, "%s === %s", it.key().latin1(), it.data().join(" :: ").latin1()); + } + } + } + return exit_val; +} |