Fixed instances of "to to" in qtbase.
[profile/ivi/qtbase.git] / qmake / main.cpp
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/legal
5 **
6 ** This file is part of the qmake application of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.  For licensing terms and
14 ** conditions see http://qt.digia.com/licensing.  For further information
15 ** use the contact form at http://qt.digia.com/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file.  Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24 **
25 ** In addition, as a special exception, Digia gives you certain additional
26 ** rights.  These rights are described in the Digia Qt LGPL Exception
27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28 **
29 ** GNU General Public License Usage
30 ** Alternatively, this file may be used under the terms of the GNU
31 ** General Public License version 3.0 as published by the Free Software
32 ** Foundation and appearing in the file LICENSE.GPL included in the
33 ** packaging of this file.  Please review the following information to
34 ** ensure the GNU General Public License version 3.0 requirements will be
35 ** met: http://www.gnu.org/copyleft/gpl.html.
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #include "project.h"
43 #include "property.h"
44 #include "option.h"
45 #include "cachekeys.h"
46 #include "metamakefile.h"
47 #include <qnamespace.h>
48 #include <qdebug.h>
49 #include <qregexp.h>
50 #include <qdir.h>
51 #include <stdio.h>
52 #include <stdlib.h>
53 #include <ctype.h>
54 #include <fcntl.h>
55 #include <sys/types.h>
56 #include <sys/stat.h>
57
58 QT_BEGIN_NAMESPACE
59
60 /* This is to work around lame implementation on Darwin. It has been noted that the getpwd(3) function
61    is much too slow, and called much too often inside of Qt (every fileFixify). With this we use a locally
62    cached copy because I can control all the times it is set (because Qt never sets the pwd under me).
63 */
64 static QString pwd;
65 QString qmake_getpwd()
66 {
67     if(pwd.isNull())
68         pwd = QDir::currentPath();
69     return pwd;
70 }
71 bool qmake_setpwd(const QString &p)
72 {
73     if(QDir::setCurrent(p)) {
74         pwd = QDir::currentPath();
75         return true;
76     }
77     return false;
78 }
79
80 int runQMake(int argc, char **argv)
81 {
82     // stderr is unbuffered by default, but stdout buffering depends on whether
83     // there is a terminal attached. Buffering can make output from stderr and stdout
84     // appear out of sync, so force stdout to be unbuffered as well.
85     // This is particularly important for things like QtCreator and scripted builds.
86     setvbuf(stdout, (char *)NULL, _IONBF, 0);
87
88     QMakeGlobals globals;
89     Option::globals = &globals;
90
91     // parse command line
92     int ret = Option::init(argc, argv);
93     if(ret != Option::QMAKE_CMDLINE_SUCCESS) {
94         if ((ret & Option::QMAKE_CMDLINE_ERROR) != 0)
95             return 1;
96         return 0;
97     }
98
99     QString oldpwd = qmake_getpwd();
100 #ifdef Q_OS_WIN
101     if(!(oldpwd.length() == 3 && oldpwd[0].isLetter() && oldpwd.endsWith(":/")))
102 #endif
103     {
104         if(!oldpwd.endsWith(QLatin1Char('/')))
105             oldpwd += QLatin1Char('/');
106     }
107     Option::output_dir = oldpwd; //for now this is the output dir
108
109     if(Option::output.fileName() != "-") {
110         QFileInfo fi(Option::output);
111         QString dir;
112         if(fi.isDir()) {
113             dir = fi.filePath();
114         } else {
115             QString tmp_dir = fi.path();
116             if(!tmp_dir.isEmpty() && QFile::exists(tmp_dir))
117                 dir = tmp_dir;
118         }
119         if(!dir.isNull() && dir != ".")
120             Option::output_dir = dir;
121         if(QDir::isRelativePath(Option::output_dir))
122             Option::output_dir.prepend(oldpwd);
123         Option::output_dir = QDir::cleanPath(Option::output_dir);
124     }
125
126     QMakeProperty prop;
127     if(Option::qmake_mode == Option::QMAKE_QUERY_PROPERTY ||
128        Option::qmake_mode == Option::QMAKE_SET_PROPERTY ||
129        Option::qmake_mode == Option::QMAKE_UNSET_PROPERTY)
130         return prop.exec() ? 0 : 101;
131     globals.setQMakeProperty(&prop);
132
133     ProFileCache proFileCache;
134     Option::proFileCache = &proFileCache;
135     QMakeParser parser(&proFileCache, &Option::evalHandler);
136     Option::parser = &parser;
137
138     QMakeProject project;
139     int exit_val = 0;
140     QStringList files;
141     if(Option::qmake_mode == Option::QMAKE_GENERATE_PROJECT)
142         files << "(*hack*)"; //we don't even use files, but we do the for() body once
143     else
144         files = Option::mkfile::project_files;
145     for(QStringList::Iterator pfile = files.begin(); pfile != files.end(); pfile++) {
146         if(Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE ||
147            Option::qmake_mode == Option::QMAKE_GENERATE_PRL) {
148             QString fn = Option::normalizePath(*pfile);
149             if(!QFile::exists(fn)) {
150                 fprintf(stderr, "Cannot find file: %s.\n",
151                         QDir::toNativeSeparators(fn).toLatin1().constData());
152                 exit_val = 2;
153                 continue;
154             }
155
156             //setup pwd properly
157             debug_msg(1, "Resetting dir to: %s",
158                       QDir::toNativeSeparators(oldpwd).toLatin1().constData());
159             qmake_setpwd(oldpwd); //reset the old pwd
160             int di = fn.lastIndexOf(QLatin1Char('/'));
161             if(di != -1) {
162                 debug_msg(1, "Changing dir to: %s",
163                           QDir::toNativeSeparators(fn.left(di)).toLatin1().constData());
164                 if(!qmake_setpwd(fn.left(di)))
165                     fprintf(stderr, "Cannot find directory: %s\n",
166                             QDir::toNativeSeparators(fn.left(di)).toLatin1().constData());
167                 fn = fn.right(fn.length() - di - 1);
168             }
169
170             Option::prepareProject(fn);
171
172             // read project..
173             if(!project.read(fn)) {
174                 fprintf(stderr, "Error processing project file: %s\n",
175                         QDir::toNativeSeparators(*pfile).toLatin1().constData());
176                 exit_val = 3;
177                 continue;
178             }
179             if (Option::mkfile::do_preprocess) {
180                 project.dump();
181                 continue; //no need to create makefile
182             }
183         }
184
185         bool success = true;
186         MetaMakefileGenerator *mkfile = MetaMakefileGenerator::createMetaGenerator(&project, QString(), false, &success);
187         if (!success)
188             exit_val = 3;
189
190         if(mkfile && !mkfile->write(oldpwd)) {
191             if(Option::qmake_mode == Option::QMAKE_GENERATE_PROJECT)
192                 fprintf(stderr, "Unable to generate project file.\n");
193             else
194                 fprintf(stderr, "Unable to generate makefile for: %s\n",
195                         QDir::toNativeSeparators(*pfile).toLatin1().constData());
196             exit_val = 5;
197         }
198         delete mkfile;
199         mkfile = NULL;
200     }
201     qmakeClearCaches();
202     return exit_val;
203 }
204
205 QT_END_NAMESPACE
206
207 int main(int argc, char **argv)
208 {
209     return QT_PREPEND_NAMESPACE(runQMake)(argc, argv);
210 }