/**************************************************************************** ** ** ??? ** ** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. ** ** This file is part of qmake. ** ** 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 <ntqnamespace.h> #include <ntqregexp.h> #include <ntqdir.h> #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> // for Borland, main is defined to qMain which breaks qmake #undef main #ifdef Q_OS_MAC // for qurl bool tqt_resolve_symlinks = FALSE; #endif #if defined(Q_WS_WIN) extern Q_EXPORT int qt_ntfs_permission_lookup; #endif int main(int argc, char **argv) { #if defined(Q_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 Q_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::qmake_mode == Option::QMAKE_QUERY_PROPERTY || Option::qmake_mode == Option::QMAKE_SET_PROPERTY) return prop.exec() ? 0 : 101; TQMakeProject proj(&prop); int exit_val = 0; TQStringList files; if(Option::qmake_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::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE || Option::qmake_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::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE || Option::qmake_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::qmake_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::qmake_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; }