QtBase  v6.3.1
makefile.h
Go to the documentation of this file.
1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the qmake application of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:GPL-EXCEPT$
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 The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
21 ** included in the packaging of this file. Please review the following
22 ** information to ensure the GNU General Public License requirements will
23 ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
24 **
25 ** $QT_END_LICENSE$
26 **
27 ****************************************************************************/
28 
29 #ifndef MAKEFILE_H
30 #define MAKEFILE_H
31 
32 #include "option.h"
33 #include "project.h"
34 #include "makefiledeps.h"
35 #include <qtextstream.h>
36 #include <qlist.h>
37 #include <qhash.h>
38 #include <qfileinfo.h>
39 #include <functional>
40 
42 
43 #ifdef Q_OS_WIN32
44 #define QT_POPEN _popen
45 #define QT_POPEN_READ "rb"
46 #define QT_PCLOSE _pclose
47 #else
48 #define QT_POPEN popen
49 #define QT_POPEN_READ "r"
50 #define QT_PCLOSE pclose
51 #endif
52 
54 
56 {
57  QString spec;
58  bool no_io = false;
59  bool resolveDependenciesInFrameworks = false;
60  QHash<QString, bool> init_compiler_already;
61  QString makedir, chkexists;
62  QString fullBuildArgs();
63 
64  //internal caches
65  mutable QHash<QString, QMakeLocalFileName> depHeuristicsCache;
66  mutable QHash<QString, QStringList> dependsCache;
67  mutable QHash<ReplaceExtraCompilerCacheKey, QString> extraCompilerVariablesCache;
68 
69 public:
70  // We can't make it visible to VCFilter in VS2008 except by making it public or directly friending it.
72 
73 protected:
75 
77 
78  //makefile style generator functions
79  void writeObj(QTextStream &, const char *src);
80  void writeInstalls(QTextStream &t, bool noBuild=false);
81  void writeHeader(QTextStream &t);
82  void writeSubDirs(QTextStream &t);
83  void writeMakeQmake(QTextStream &t, bool noDummyQmakeAll = false);
87  QString resolveDependency(const QDir &outDir, const QString &file);
88  void callExtraCompilerDependCommand(const ProString &extraCompiler,
89  const QString &tmp_dep_cmd, const QString &inpf,
90  const QString &tmp_out, bool dep_lines, QStringList *deps,
91  bool existingDepsOnly,
92  bool checkCommandAvailability = false);
96  virtual bool writeMakefile(QTextStream &t);
97  virtual void writeDefaultVariables(QTextStream &t);
98 
99  QString pkgConfigPrefix() const;
100  QString pkgConfigFileName(bool fixify=true);
102  void writePkgConfigFile(); // for pkg-config
103 
104  //generating subtarget makefiles
105  struct SubTarget
106  {
111  };
117 
118  SubTargetsNoFlags=0x00
119  };
122  const QString &in_directory, const QString &in, const QString &out_directory, const QString &out,
123  const QString &out_directory_cdin, const QString &makefilein);
124  virtual void writeSubMakeCall(QTextStream &t, const QString &outDirectory_cdin,
125  const QString &makeFileIn);
126  virtual void writeSubTargets(QTextStream &t, QList<SubTarget*> subtargets, int flags);
127  virtual ProStringList extraSubTargetDependencies() { return {}; }
128 
129  //extra compiler interface
130  bool verifyExtraCompiler(const ProString &c, const QString &f);
131  virtual QString replaceExtraCompilerVariables(const QString &, const QStringList &, const QStringList &, ReplaceFor forShell);
134 
135  //interface to the source file info
136  QMakeLocalFileName fixPathForFile(const QMakeLocalFileName &, bool) override;
138  QFileInfo findFileInfo(const QMakeLocalFileName &) override;
139  QMakeProject *project = nullptr;
140 
141  //escape
142  virtual QString escapeFilePath(const QString &path) const = 0;
143  ProString escapeFilePath(const ProString &path) const;
144  template<typename A, typename B>
146  { return escapeFilePath(QString(path)); }
149  virtual QString escapeDependencyPath(const QString &path) const;
151  template<typename A, typename B>
153  { return escapeDependencyPath(QString(path)); }
156 
158 
159  //initialization
160  void verifyCompilers();
161  virtual void init();
162  void initOutPaths();
163  virtual bool inhibitMakeDirOutPath(const ProKey &path) const;
164  struct Compiler
165  {
173  };
175  };
176  friend class QTypeInfo<Compiler>;
177 
178  void initCompiler(const Compiler &comp);
179  enum VPATHFlag {
180  VPATH_NoFlag = 0x00,
183  VPATH_NoFixify = 0x04
184  };
186 
187  inline int findExecutable(const QStringList &cmdline)
188  { int ret; canExecute(cmdline, &ret); return ret; }
189  bool canExecute(const QStringList &cmdline, int *argv0) const;
190  inline bool canExecute(const QString &cmdline) const
191  { return canExecute(cmdline.split(' '), nullptr); }
192 
193  bool mkdir(const QString &dir) const;
194  QString mkdir_p_asstring(const QString &dir, bool escape=true) const;
195 
196  QString specdir();
197 
198  //subclasses can use these to query information about how the generator was "run"
199  QString buildArgs(bool withExtra);
200 
201  virtual QStringList &findDependencies(const QString &file);
202  virtual bool doDepends() const { return Option::mkfile::do_deps; }
203 
204  void filterIncludedFiles(const char *);
205  void processSources();
206 
207  //for installs
208  virtual QString defaultInstall(const QString &);
209  virtual QString installRoot() const;
210 
211  //for prl
212  QString prlFileName(bool fixify=true);
213  void writePrlFile();
214  bool processPrlFile(QString &, bool baseOnly);
215  virtual void writePrlFile(QTextStream &);
216 
217  //make sure libraries are found
218  virtual bool findLibraries(bool linkPrl, bool mergeLflags);
219 
220  //for retrieving values and lists of values
221  virtual QString var(const ProKey &var) const;
222  QString varGlue(const ProKey &var, const QString &before, const QString &glue, const QString &after) const;
223  QString varList(const ProKey &var) const;
224  QString fixFileVarGlue(const ProKey &var, const QString &before, const QString &glue, const QString &after) const;
225  QString fileVarList(const ProKey &var) const;
226  QString fileVarGlue(const ProKey &var, const QString &before, const QString &glue, const QString &after) const;
227  QString fileVar(const ProKey &var) const;
228  QString depVar(const ProKey &var) const;
229  QString val(const ProStringList &varList) const;
230  QString val(const QStringList &varList) const;
231  QString valGlue(const QStringList &varList, const QString &before, const QString &glue, const QString &after) const;
232  QString valGlue(const ProStringList &varList, const QString &before, const QString &glue, const QString &after) const;
233  QString valList(const QStringList &varList) const;
234  QString valList(const ProStringList &varList) const;
235 
236  QString filePrefixRoot(const QString &, const QString &);
237 
239  virtual LibFlagType parseLibFlag(const ProString &flag, ProString *arg);
241  virtual ProString fixLibFlag(const ProString &lib);
242 
243 public:
244  //file fixification to unify all file names into a single pattern
254  };
255  Q_DECLARE_FLAGS(FileFixifyTypes, FileFixifyType)
256 protected:
257  QString fileFixify(const QString &file, FileFixifyTypes fix = FileFixifyDefault, bool canon = true) const;
258  QStringList fileFixify(const QStringList &files, FileFixifyTypes fix = FileFixifyDefault, bool canon = true) const;
259  QString createSedArgs(const ProKey &replace_rule, const QString &file_type = QString()) const;
260  QString installMetaFile(const ProKey &replace_rule, const QString &src,
261  const QString &dst) const;
262 
263  virtual bool processPrlFileBase(QString &origFile, QStringView origName,
264  QStringView fixedBase, int slashOff);
265  bool processPrlFileCore(QString &origFile, QStringView origName,
266  const QString &fixedFile);
267  QString createResponseFile(const QString &baseName,
268  const ProStringList &objList,
269  const QString &prefix = QString()) const;
270 
272  {
275 
276  bool isValid() const { return !filePath.isEmpty(); }
277  };
278 
279  LinkerResponseFileInfo maybeCreateLinkerResponseFile() const;
280 
281 public:
282  QMakeProject *projectFile() const;
284 
285  void setNoIO(bool o);
286  bool noIO() const;
287 
288  inline bool exists(QString file) const { return fileInfo(file).exists(); }
290 
292  virtual bool write();
293  virtual bool writeProjectMakefile();
294  virtual bool supportsMetaBuild() { return true; }
295  virtual bool supportsMergedBuilds() { return false; }
296  virtual bool mergeBuildProject(MakefileGenerator * /*other*/) { return false; }
297  virtual bool openOutput(QFile &, const QString &build) const;
298  bool isWindowsShell() const { return Option::dir_sep == QLatin1String("\\"); }
299  QString shellQuote(const QString &str) const;
300  virtual ProKey fullTargetVariable() const;
301 };
303 Q_DECLARE_OPERATORS_FOR_FLAGS(MakefileGenerator::FileFixifyTypes)
304 
305 inline void MakefileGenerator::setNoIO(bool o)
306 { no_io = o; }
307 
308 inline bool MakefileGenerator::noIO() const
309 { return no_io; }
310 
312 { return QString(""); }
313 
315 { return QStringLiteral("$(INSTALL_ROOT)"); }
316 
317 inline bool MakefileGenerator::findLibraries(bool, bool)
318 { return true; }
319 
321 {
322  mutable size_t hash;
326  bool operator==(const ReplaceExtraCompilerCacheKey &f) const;
327  inline size_t hashCode() const {
328  if (!hash)
329  hash = (size_t)forShell ^ qHash(var) ^ qHash(in) ^ qHash(out) /*^ qHash(pwd)*/;
330  return hash;
331  }
332 };
333 inline size_t qHash(const ReplaceExtraCompilerCacheKey &f) { return f.hashCode(); }
334 
336 
337 #endif // MAKEFILE_H
small capitals from c petite p scientific i
[1]
Definition: afcover.h:80
QString fileVarList(const ProKey &var) const
Definition: makefile.cpp:1429
bool exists(QString file) const
Definition: makefile.h:288
QString prlFileName(bool fixify=true)
Definition: makefile.cpp:1106
QString installMetaFile(const ProKey &replace_rule, const QString &src, const QString &dst) const
Definition: makefile.cpp:3468
virtual ProStringList extraSubTargetDependencies()
Definition: makefile.h:127
QStringList escapeFilePaths(const QStringList &paths) const
Definition: makefile.cpp:2887
virtual QStringList & findDependencies(const QString &file)
Definition: makefile.cpp:3189
virtual bool write()
Definition: makefile.cpp:1084
void processSources()
Definition: makefile.cpp:961
QString pkgConfigPrefix() const
Definition: makefile.cpp:3275
QString valList(const QStringList &varList) const
Definition: makefile.cpp:1517
void callExtraCompilerDependCommand(const ProString &extraCompiler, const QString &tmp_dep_cmd, const QString &inpf, const QString &tmp_out, bool dep_lines, QStringList *deps, bool existingDepsOnly, bool checkCommandAvailability=false)
Definition: makefile.cpp:1883
QStringList escapeDependencyPaths(const QStringList &paths) const
Definition: makefile.cpp:2936
virtual void writeDefaultVariables(QTextStream &t)
Definition: makefile.cpp:2264
QMakeLocalFileName fixPathForFile(const QMakeLocalFileName &, bool) override
Definition: makefile.cpp:3081
QString shellQuote(const QString &str) const
Definition: makefile.cpp:3481
void writeSubDirs(QTextStream &t)
Definition: makefile.cpp:2458
virtual QString var(const ProKey &var) const
Definition: makefile.cpp:1417
bool writeDummyMakefile(QTextStream &t)
Definition: makefile.cpp:2232
virtual bool processPrlFileBase(QString &origFile, QStringView origName, QStringView fixedBase, int slashOff)
Definition: makefile.cpp:889
void writeSubTargetCall(QTextStream &t, const QString &in_directory, const QString &in, const QString &out_directory, const QString &out, const QString &out_directory_cdin, const QString &makefilein)
Definition: makefile.cpp:2476
bool processPrlFileCore(QString &origFile, QStringView origName, const QString &fixedFile)
Definition: makefile.cpp:896
@ VPATH_RemoveMissingFiles
Definition: makefile.h:182
virtual bool writeProjectMakefile()
Definition: makefile.cpp:1032
QString mkdir_p_asstring(const QString &dir, bool escape=true) const
Definition: makefile.cpp:82
void writeExportedVariables(QTextStream &t)
Definition: makefile.cpp:2215
QString fixFileVarGlue(const ProKey &var, const QString &before, const QString &glue, const QString &after) const
Definition: makefile.cpp:1465
QString specdir()
Definition: makefile.cpp:3206
void writeExtraCompilerVariables(QTextStream &t)
Definition: makefile.cpp:2172
bool mkdir(const QString &dir) const
Definition: makefile.cpp:88
QString filePrefixRoot(const QString &, const QString &)
Definition: makefile.cpp:1197
QString depVar(const ProKey &var) const
Definition: makefile.cpp:1435
ProStringList createObjectList(const ProStringList &sources)
Definition: makefile.cpp:1523
virtual bool inhibitMakeDirOutPath(const ProKey &path) const
Definition: makefile.cpp:227
QString varList(const ProKey &var) const
Definition: makefile.cpp:1505
bool processPrlFile(QString &, bool baseOnly)
Definition: makefile.cpp:869
ProStringList findFilesInVPATH(ProStringList l, uchar flags, const QString &var="")
Definition: makefile.cpp:261
QFileInfo fileInfo(QString file) const
Definition: makefile.cpp:2827
virtual QString installRoot() const
Definition: makefile.h:314
virtual bool doDepends() const
Definition: makefile.h:202
bool canExecute(const QStringList &cmdline, int *argv0) const
Definition: makefile.cpp:63
void setNoIO(bool o)
Definition: makefile.h:305
QString replaceExtraCompilerVariables(const QString &val, const QString &in, const QString &out, ReplaceFor forShell)
Definition: makefile.h:132
void writeExtraVariables(QTextStream &t)
Definition: makefile.cpp:2192
void writeInstalls(QTextStream &t, bool noBuild=false)
Definition: makefile.cpp:1210
QString pkgConfigFileName(bool fixify=true)
Definition: makefile.cpp:3244
QString pkgConfigFixPath(QString) const
Definition: makefile.cpp:3283
QString varGlue(const ProKey &var, const QString &before, const QString &glue, const QString &after) const
Definition: makefile.cpp:1453
QString valGlue(const QStringList &varList, const QString &before, const QString &glue, const QString &after) const
Definition: makefile.cpp:1490
virtual bool mergeBuildProject(MakefileGenerator *)
Definition: makefile.h:296
void writeExtraCompilerTargets(QTextStream &t)
Definition: makefile.cpp:1941
QString buildArgs(bool withExtra)
Definition: makefile.cpp:2284
QMakeLocalFileName findFileForDep(const QMakeLocalFileName &, const QMakeLocalFileName &) override
Definition: makefile.cpp:3095
void filterIncludedFiles(const char *)
Definition: makefile.cpp:952
static MakefileGenerator * create(QMakeProject *)
QString fileVarGlue(const ProKey &var, const QString &before, const QString &glue, const QString &after) const
Definition: makefile.cpp:1459
virtual QString escapeFilePath(const QString &path) const =0
virtual QString defaultInstall(const QString &)
Definition: makefile.h:311
void writeExtraTargets(QTextStream &t)
Definition: makefile.cpp:1815
void setProjectFile(QMakeProject *p)
Definition: makefile.cpp:241
void writeObj(QTextStream &, const char *src)
Definition: makefile.cpp:1143
void writeHeader(QTextStream &t)
Definition: makefile.cpp:2319
virtual bool writeMakefile(QTextStream &t)
Definition: makefile.cpp:2250
bool canExecute(const QString &cmdline) const
Definition: makefile.h:190
void verifyCompilers()
Definition: makefile.cpp:98
ProStringList fixLibFlags(const ProKey &var)
Definition: makefile.cpp:2863
QString createSedArgs(const ProKey &replace_rule, const QString &file_type=QString()) const
Definition: makefile.cpp:3445
QString resolveDependency(const QDir &outDir, const QString &file)
Definition: makefile.cpp:1856
QString escapeFilePath(const QStringBuilder< A, B > &path) const
Definition: makefile.h:145
virtual QString replaceExtraCompilerVariables(const QString &, const QStringList &, const QStringList &, ReplaceFor forShell)
Definition: makefile.cpp:1596
enum MakefileGenerator::TARG_MODE target_mode
QString createResponseFile(const QString &baseName, const ProStringList &objList, const QString &prefix=QString()) const
Definition: makefile.cpp:3498
virtual void writeSubTargets(QTextStream &t, QList< SubTarget * > subtargets, int flags)
Definition: makefile.cpp:2502
virtual void init()
Definition: makefile.cpp:372
virtual bool findLibraries(bool linkPrl, bool mergeLflags)
Definition: makefile.h:317
bool verifyExtraCompiler(const ProString &c, const QString &f)
Definition: makefile.cpp:1721
QStringList finalizeDependencyPaths(const QStringList &paths) const
Definition: makefile.cpp:2958
QFileInfo findFileInfo(const QMakeLocalFileName &) override
Definition: makefile.cpp:3089
bool noIO() const
Definition: makefile.h:308
QString val(const ProStringList &varList) const
Definition: makefile.cpp:1441
QString escapeDependencyPath(const QStringBuilder< A, B > &path) const
Definition: makefile.h:152
void writeMakeQmake(QTextStream &t, bool noDummyQmakeAll=false)
Definition: makefile.cpp:2784
void writePkgConfigFile()
Definition: makefile.cpp:3292
virtual bool supportsMetaBuild()
Definition: makefile.h:294
virtual ProString fixLibFlag(const ProString &lib)
Definition: makefile.cpp:2874
virtual QString escapeDependencyPath(const QString &path) const
Definition: makefile.cpp:2907
virtual void writeSubMakeCall(QTextStream &t, const QString &outDirectory_cdin, const QString &makeFileIn)
Definition: makefile.cpp:2469
QString fileFixify(const QString &file, FileFixifyTypes fix=FileFixifyDefault, bool canon=true) const
Definition: makefile.cpp:2982
virtual bool openOutput(QFile &, const QString &build) const
Definition: makefile.cpp:3214
LinkerResponseFileInfo maybeCreateLinkerResponseFile() const
Definition: makefile.cpp:3538
bool isWindowsShell() const
Definition: makefile.h:298
virtual bool supportsMergedBuilds()
Definition: makefile.h:295
int findExecutable(const QStringList &cmdline)
Definition: makefile.h:187
virtual ProKey fullTargetVariable() const
Definition: makefile.cpp:3490
virtual LibFlagType parseLibFlag(const ProString &flag, ProString *arg)
Definition: makefile.cpp:2847
QList< MakefileGenerator::SubTarget * > findSubDirsSubTargets() const
Definition: makefile.cpp:2338
QMakeProject * projectFile() const
Definition: makefile.cpp:235
QMakeProject * project
Definition: makefile.h:139
QString fileVar(const ProKey &var) const
Definition: makefile.cpp:1423
@ SubTargetSkipDefaultTargets
Definition: makefile.h:116
@ SubTargetSkipDefaultVariables
Definition: makefile.h:115
void initCompiler(const Compiler &comp)
Definition: makefile.cpp:358
The QDir class provides access to directory structures and their contents.
Definition: qdir.h:55
The QFile class provides an interface for reading from and writing to files.
Definition: qfile.h:94
The QFileInfo class provides system-independent file information.
Definition: qfileinfo.h:57
bool exists() const
Definition: qfileinfo.cpp:697
template< typename Enum > size_t qHash(QFlags< Enum > flags, size_t seed=0) noexcept
The QLatin1String class provides a thin wrapper around an US-ASCII/Latin-1 encoded string literal.
Definition: qstring.h:84
Definition: qlist.h:108
The QString class provides a Unicode character string.
Definition: qstring.h:388
QStringList split(const QString &sep, Qt::SplitBehavior behavior=Qt::KeepEmptyParts, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Definition: qstring.cpp:7672
bool isEmpty() const
Definition: qstring.h:1216
The QStringList class provides a list of strings.
The QStringView class provides a unified view on UTF-16 strings with a read-only subset of the QStrin...
Definition: qstringview.h:122
The QTextStream class provides a convenient interface for reading and writing text.
Definition: qtextstream.h:62
QString str
[2]
Q_DECLARE_TYPEINFO(MakefileGenerator::Compiler, Q_RELOCATABLE_TYPE)
size_t qHash(const ReplaceExtraCompilerCacheKey &f)
Definition: makefile.h:333
#define inline
Definition: md4c.c:45
#define QString()
Definition: parse-defines.h:51
QList< QString > QStringList
Definition: qcontainerfwd.h:64
#define Q_DECLARE_FLAGS(Flags, Enum)
Definition: qflags.h:210
#define Q_DECLARE_OPERATORS_FOR_FLAGS(Flags)
Definition: qflags.h:227
QT_BEGIN_INCLUDE_NAMESPACE typedef unsigned char uchar
Definition: qglobal.h:332
unsigned int uint
Definition: qglobal.h:334
GLsizei const GLfloat * v
[13]
GLfloat GLfloat f
GLenum src
GLsizei const GLuint * paths
GLenum GLenum dst
GLbitfield flags
GLsizei GLenum * sources
const GLubyte * c
Definition: qopenglext.h:12701
GLuint GLfloat * val
Definition: qopenglext.h:1513
GLdouble GLdouble t
[9]
Definition: qopenglext.h:243
GLuint in
Definition: qopenglext.h:8870
GLsizei const GLchar *const * path
Definition: qopenglext.h:4283
GLdouble s
[6]
Definition: qopenglext.h:235
GLfloat GLfloat p
[1]
Definition: qopenglext.h:12698
SSL_CTX int(*) void arg)
#define QStringLiteral(str)
@ Q_RELOCATABLE_TYPE
Definition: qtypeinfo.h:156
QFile file
[0]
QTextStream out(stdout)
[7]
QString dir
[11]
QStringList files
[8]
static bool do_deps
Definition: option.h:186
static QString dir_sep
Definition: option.h:96
size_t hashCode() const
Definition: makefile.h:327
MakefileGenerator::ReplaceFor forShell
Definition: makefile.h:324
bool operator==(const ReplaceExtraCompilerCacheKey &f) const
Definition: makefile.cpp:1584
ReplaceExtraCompilerCacheKey(const QString &v, const QStringList &i, const QStringList &o, MakefileGenerator::ReplaceFor s)
Definition: makefile.cpp:1563
QString escape(const QString &s)
void build(const QString &name)