コード例 #1
0
        public void BuildNativeReferenceFlags(TaskLoggingHelper Log, ITaskItem[] NativeReferences)
        {
            if (NativeReferences == null)
            {
                return;
            }

            foreach (var item in NativeReferences)
            {
                var value = item.GetMetadata("Kind");
                NativeReferenceKind kind;
                bool boolean;

                if (string.IsNullOrEmpty(value) || !Enum.TryParse(value, out kind))
                {
                    Log.LogWarning(MSBStrings.W0051, item.ItemSpec);
                    continue;
                }

                if (kind == NativeReferenceKind.Static)
                {
                    value = item.GetMetadata("ForceLoad");

                    if (!string.IsNullOrEmpty(value) && bool.TryParse(value, out boolean) && boolean)
                    {
                        Arguments.Add("-force_load");
                    }

                    Arguments.AddQuoted(item.ItemSpec);

                    value = item.GetMetadata("IsCxx");

                    if (!string.IsNullOrEmpty(value) && bool.TryParse(value, out boolean) && boolean)
                    {
                        Cxx = true;
                    }
                }
                else if (kind == NativeReferenceKind.Framework)
                {
                    var path = item.ItemSpec;
                    // in case the full path to the library is given (msbuild)
                    if (Path.GetExtension(path) != ".framework")
                    {
                        path = Path.GetDirectoryName(path);
                    }
                    Frameworks.Add(path);
                }
                else
                {
                    Log.LogWarning(MSBStrings.W0052, item.ItemSpec);
                    continue;
                }

                value = item.GetMetadata("NeedsGccExceptionHandling");
                if (!string.IsNullOrEmpty(value) && bool.TryParse(value, out boolean) && boolean)
                {
                    if (!Arguments.Contains("-lgcc_eh"))
                    {
                        Arguments.Add("-lgcc_eh");
                    }
                }

                value = item.GetMetadata("WeakFrameworks");
                if (!string.IsNullOrEmpty(value))
                {
                    foreach (var framework in value.Split(' ', '\t'))
                    {
                        WeakFrameworks.Add(framework);
                    }
                }

                value = item.GetMetadata("Frameworks");
                if (!string.IsNullOrEmpty(value))
                {
                    foreach (var framework in value.Split(' ', '\t'))
                    {
                        Frameworks.Add(framework);
                    }
                }

                // Note: these get merged into gccArgs by our caller
                value = item.GetMetadata("LinkerFlags");
                if (!string.IsNullOrEmpty(value))
                {
                    var linkerFlags = CommandLineArgumentBuilder.Parse(value);

                    foreach (var flag in linkerFlags)
                    {
                        Arguments.AddQuoted(flag);
                    }
                }
            }
        }