コード例 #1
0
        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");
        }