private void CompileMakefile(GenerateInlinesPass.InlinesCodeEventArgs e) { var pro = $"{e.Module.InlinesLibraryName}.pro"; var path = Path.Combine(e.OutputDir, pro); var proBuilder = new StringBuilder(); var qtModules = string.Join(" ", from header in e.Module.Headers where !header.EndsWith(".h", StringComparison.Ordinal) select header.Substring("Qt".Length).ToLowerInvariant()); // QtTest is only library which has a "lib" suffix to its module alias for qmake if (qtModules == "test") { qtModules += "lib"; } proBuilder.Append($"QT += {qtModules}\n"); proBuilder.Append("CONFIG += c++11\n"); proBuilder.Append($"TARGET = {e.Module.InlinesLibraryName}\n"); proBuilder.Append("TEMPLATE = lib\n"); proBuilder.Append($"SOURCES += {Path.ChangeExtension(pro, "cpp")}\n"); if (Environment.OSVersion.Platform == PlatformID.Win32NT) { proBuilder.Append("LIBS += -loleaut32 -lole32"); } File.WriteAllText(path, proBuilder.ToString()); // HACK: work around https://bugreports.qt.io/browse/QTBUG-55952 if (e.Module.LibraryName == "Qt3DRender.Sharp") { var cpp = Path.ChangeExtension(pro, "cpp"); var unlinkable = new[] { "&Qt3DRender::QSortCriterion::tr;", "&Qt3DRender::QSortCriterion::trUtf8;", "&Qt3DRender::qt_getEnumMetaObject;" }; var linkable = (from line in File.ReadLines(cpp) where unlinkable.All(ul => !line.EndsWith(ul, StringComparison.Ordinal)) select line).ToList(); File.WriteAllLines(cpp, linkable); } if (e.Module.LibraryName == "QtGui.Sharp") { var cpp = Path.ChangeExtension(pro, "cpp"); var unlinkable = new[] { "_CoreBackend", "_DeprecatedBackend", }; var linkable = (from line in File.ReadLines(cpp) where unlinkable.All(ul => !line.Contains(ul)) select line).ToList(); File.WriteAllLines(cpp, linkable); } int error; string errorMessage; ProcessHelper.Run(this.qtInfo.QMake, $"\"{path}\"", out error, out errorMessage); if (!string.IsNullOrEmpty(errorMessage)) { Console.WriteLine(errorMessage); return; } var makefile = File.Exists(Path.Combine(e.OutputDir, "Makefile.Release")) ? "Makefile.Release" : "Makefile"; e.CustomCompiler = this.qtInfo.Make; e.CompilerArguments = $"-f {makefile}"; e.OutputDir = Platform.IsMacOS ? e.OutputDir : Path.Combine(e.OutputDir, "release"); }