/// <inheritdoc /> protected override void SetupLinkFilesArgs(TaskGraph graph, BuildOptions options, List <string> args, string outputFilePath) { base.SetupLinkFilesArgs(graph, options, args, outputFilePath); // Speed up build //args.Add("-Wl,--as-needed"); args.Add("-Wl,--hash-style=gnu"); //args.Add("-Wl,--build-id"); if (options.LinkEnv.Output == LinkerOutput.SharedLibrary) { args.Add("-shared"); args.Add(string.Format("-soname=\"{0}\"", Path.GetFileNameWithoutExtension(outputFilePath))); } args.Add(string.Format("-target {0}", ArchitectureName)); args.Add(string.Format("--sysroot=\"{0}\"", ToolsetRoot.Replace('\\', '/'))); // Link core libraries args.Add("-pthread"); args.Add("-ldl"); args.Add("-lrt"); // Link X11 args.Add("-L/usr/X11R6/lib"); args.Add("-lX11"); args.Add("-lXcursor"); args.Add("-lXinerama"); }
/// <inheritdoc /> protected override void SetupCompileCppFilesArgs(TaskGraph graph, BuildOptions options, List <string> args, string outputPath) { base.SetupCompileCppFilesArgs(graph, options, args, outputPath); args.Add(string.Format("-target {0}", ArchitectureName)); args.Add(string.Format("--sysroot=\"{0}\"", ToolsetRoot.Replace('\\', '/'))); }
/// <inheritdoc /> protected override void SetupCompileCppFilesArgs(TaskGraph graph, BuildOptions options, List <string> args, string outputPath) { base.SetupCompileCppFilesArgs(graph, options, args, outputPath); var toolchain = ToolsetRoot.Replace('\\', '/'); args.Add(string.Format("--target={0}", ArchitectureName)); args.Add(string.Format("--gcc-toolchain=\"{0}\"", toolchain)); args.Add(string.Format("--sysroot=\"{0}/sysroot\"", toolchain)); args.Add("-fpic"); args.Add("-funwind-tables"); args.Add("-no-canonical-prefixes"); if (options.Configuration != TargetConfiguration.Release) { args.Add("-fstack-protector-strong"); args.Add("-D_FORTIFY_SOURCE=2"); } else { args.Add("-D_FORTIFY_SOURCE=1"); } if (options.CompileEnv.DebugInformation) { args.Add("-g2 -gdwarf-4"); args.Add("-fno-omit-frame-pointer"); args.Add("-fno-function-sections"); } switch (Architecture) { case TargetArchitecture.x86: args.Add("-march=atom"); if (Configuration.AndroidPlatformApi < 24) { args.Add("-mstackrealign"); } break; case TargetArchitecture.x64: args.Add("-march=atom"); break; case TargetArchitecture.ARM: args.Add("-march=armv7-a"); args.Add("-mfloat-abi=softfp"); args.Add("-mfpu=vfpv3-d16"); break; case TargetArchitecture.ARM64: args.Add("-march=armv8-a"); break; default: throw new InvalidArchitectureException(Architecture); } }
/// <summary> /// Initializes a new instance of the <see cref="AndroidToolchain"/> class. /// </summary> /// <param name="platform">The platform.</param> /// <param name="architecture">The target architecture.</param> /// <param name="toolchainRoot">The toolchain root path.</param> public AndroidToolchain(AndroidPlatform platform, TargetArchitecture architecture, string toolchainRoot) : base(platform, architecture, toolchainRoot, false, string.Empty) { var toolchain = ToolsetRoot.Replace('\\', '/'); SystemIncludePaths.Add(Path.Combine(toolchain, "sources/usr/include/c++/v1").Replace('\\', '/')); SystemIncludePaths.Add(Path.Combine(toolchain, "sysroot/usr/include").Replace('\\', '/')); SystemIncludePaths.Add(Path.Combine(toolchain, "sysroot/usr/local/include").Replace('\\', '/')); SystemIncludePaths.Add(Path.Combine(toolchain, "lib64/clang/9.0.8/include").Replace('\\', '/')); }
/// <inheritdoc /> protected override void SetupLinkFilesArgs(TaskGraph graph, BuildOptions options, List <string> args, string outputFilePath) { base.SetupLinkFilesArgs(graph, options, args, outputFilePath); args.Add("-shared"); args.Add("-no-canonical-prefixes"); args.Add("-Wl,-Bsymbolic"); args.Add("-Wl,--build-id=sha1"); args.Add("-Wl,-gc-sections"); if (options.LinkEnv.Output == LinkerOutput.Executable) { args.Add("-u ANativeActivity_onCreate"); } string target; switch (Architecture) { case TargetArchitecture.x86: target = "i686-none-linux-android"; break; case TargetArchitecture.x64: target = "x86_64-none-linux-android"; break; case TargetArchitecture.ARM: target = "armv7-none-linux-androideabi"; break; case TargetArchitecture.ARM64: target = "aarch64-none-linux-android"; break; default: throw new InvalidArchitectureException(Architecture); } var toolchain = ToolsetRoot.Replace('\\', '/'); args.Add(string.Format("--sysroot=\"{0}/sysroot\"", toolchain)); args.Add(string.Format("--gcc-toolchain=\"{0}\"", toolchain)); args.Add("--target=" + target + Configuration.AndroidPlatformApi); }
/// <inheritdoc /> protected override void SetupCompileCppFilesArgs(TaskGraph graph, BuildOptions options, List <string> args, string outputPath) { base.SetupCompileCppFilesArgs(graph, options, args, outputPath); // Hide all symbols by default args.Add("-fvisibility-inlines-hidden"); args.Add("-fvisibility-ms-compat"); args.Add(string.Format("-target {0}", ArchitectureName)); args.Add(string.Format("--sysroot=\"{0}\"", ToolsetRoot.Replace('\\', '/'))); if (Architecture == TargetArchitecture.x64) { args.Add("-mssse3"); } if (options.LinkEnv.Output == LinkerOutput.SharedLibrary) { args.Add("-fPIC"); } }