| // Copyright 2015 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // package mojo_profile implements the mojo profile. |
| package mojo_profile |
| |
| import ( |
| "bytes" |
| "flag" |
| "fmt" |
| "io/ioutil" |
| "os" |
| "path/filepath" |
| "strings" |
| |
| "v.io/jiri" |
| "v.io/jiri/gitutil" |
| "v.io/jiri/profiles" |
| "v.io/jiri/profiles/profilesmanager" |
| "v.io/jiri/profiles/profilesutil" |
| "v.io/x/lib/envvar" |
| ) |
| |
| const ( |
| // On every green Mojo build (defined as compiling and passing the mojo |
| // tests) a set of build artifacts are published to publicly-readable |
| // Google cloud storage buckets. |
| mojoStorageBucket = "https://storage.googleapis.com/mojo" |
| |
| // The mojo devtools repo has tools for running, debugging and testing mojo apps. |
| mojoDevtoolsRemote = "https://github.com/domokit/devtools" |
| |
| // The mojo_sdk repo is a mirror of github.com/domokit/mojo/mojo/public. |
| // It is mirrored for easy consumption. |
| mojoSdkRemote = "https://github.com/domokit/mojo_sdk.git" |
| |
| // The main mojo repo. We should not need this, but currently the service |
| // mojom files live here and are not mirrored anywhere else. |
| // TODO(nlacasse): Once the service mojoms exist elsewhere, remove this and |
| // get the service mojoms from wherever they are. |
| mojoRemote = "https://github.com/domokit/mojo.git" |
| ) |
| |
| type versionSpec struct { |
| // Version of android platform tools. See http://tools.android.com/download. |
| androidPlatformToolsVersion string |
| |
| // The names of the mojo services to install for all targets. |
| serviceNames []string |
| |
| // The names of additional mojo services to install for android targets. |
| serviceNamesAndroid []string |
| |
| // The names of additional mojo services to install for linux targets. |
| serviceNamesLinux []string |
| |
| // The git SHA of the mojo artifacts, including the mojo shell and system |
| // thunks to install on android targets. |
| // The latest can be found in |
| // https://storage.googleapis.com/mojo/shell/android-arm/LATEST. |
| buildVersionAndroid string |
| |
| // The git SHA of the mojo artifacts, including the mojo shell and system |
| // thunks to install on linux targets. |
| // The latest can be found in |
| // https://storage.googleapis.com/mojo/shell/linux-x64/LATEST. |
| buildVersionLinux string |
| |
| // The git SHA, branch, or tag of the devtools repo to checkout. |
| devtoolsVersion string |
| |
| // The git SHA of the mojo network service. The latest can be found in |
| // https://github.com/domokit/mojo/blob/master/mojo/public/tools/NETWORK_SERVICE_VERSION |
| networkServiceVersion string |
| |
| // The git SHA, branch, or tag of the the mojo_sdk repo to checkout. |
| sdkVersion string |
| } |
| |
| func Register(installer, profile string) { |
| m := &Manager{ |
| profileInstaller: installer, |
| profileName: profile, |
| qualifiedName: profiles.QualifiedProfileName(installer, profile), |
| versionInfo: profiles.NewVersionInfo(profile, map[string]interface{}{ |
| "1": &versionSpec{ |
| serviceNames: []string{ |
| "authenticating_url_loader_interceptor.mojo", |
| "dart_content_handler.mojo", |
| "debugger.mojo", |
| "kiosk_wm.mojo", |
| "tracing.mojo", |
| }, |
| serviceNamesAndroid: []string{}, |
| serviceNamesLinux: []string{ |
| "authentication.mojo", |
| }, |
| buildVersionAndroid: "e2cd09460972dab4d1766153e108457fe5bbaed5", |
| buildVersionLinux: "e2cd09460972dab4d1766153e108457fe5bbaed5", |
| devtoolsVersion: "a264dd5ebdb5508d4e7e432b0ee3dcf6b1fb7160", |
| networkServiceVersion: "0a814ed5512598e595c0ae7975a09d90a7a54e90", |
| sdkVersion: "b3af6aeeea02c07e7ccb2c672a0ebcda0d6c42b4", |
| androidPlatformToolsVersion: "2219198", |
| }, |
| "2": &versionSpec{ |
| serviceNames: []string{ |
| "authenticating_url_loader_interceptor.mojo", |
| "dart_content_handler.mojo", |
| "debugger.mojo", |
| "kiosk_wm.mojo", |
| "tracing.mojo", |
| }, |
| serviceNamesAndroid: []string{}, |
| serviceNamesLinux: []string{ |
| "authentication.mojo", |
| }, |
| buildVersionAndroid: "8e8ac2169f29ee1349f7ada64e2d98466d5f5205", |
| buildVersionLinux: "8e8ac2169f29ee1349f7ada64e2d98466d5f5205", |
| devtoolsVersion: "a264dd5ebdb5508d4e7e432b0ee3dcf6b1fb7160", |
| networkServiceVersion: "0a814ed5512598e595c0ae7975a09d90a7a54e90", |
| sdkVersion: "8e3eb6e43c82af5b9c57870003138ea165209d81", |
| androidPlatformToolsVersion: "2219198", |
| }, |
| "3": &versionSpec{ |
| serviceNames: []string{ |
| "authenticating_url_loader_interceptor.mojo", |
| "dart_content_handler.mojo", |
| "debugger.mojo", |
| "kiosk_wm.mojo", |
| "tracing.mojo", |
| }, |
| serviceNamesAndroid: []string{}, |
| serviceNamesLinux: []string{ |
| "authentication.mojo", |
| }, |
| buildVersionAndroid: "1608780b78ac467dcbf1761ebc0359739c3c6bbd", |
| buildVersionLinux: "1608780b78ac467dcbf1761ebc0359739c3c6bbd", |
| devtoolsVersion: "a264dd5ebdb5508d4e7e432b0ee3dcf6b1fb7160", |
| networkServiceVersion: "0a814ed5512598e595c0ae7975a09d90a7a54e90", |
| sdkVersion: "8e3eb6e43c82af5b9c57870003138ea165209d81", |
| androidPlatformToolsVersion: "2219198", |
| }, |
| "4": &versionSpec{ |
| serviceNames: []string{ |
| "authenticating_url_loader_interceptor.mojo", |
| "dart_content_handler.mojo", |
| "debugger.mojo", |
| "kiosk_wm.mojo", |
| "tracing.mojo", |
| }, |
| serviceNamesAndroid: []string{ |
| "shortcut.mojo", |
| }, |
| serviceNamesLinux: []string{ |
| "authentication.mojo", |
| }, |
| buildVersionAndroid: "e93037e1a5b2d84d2df3be87579f86f73d842449", |
| buildVersionLinux: "e93037e1a5b2d84d2df3be87579f86f73d842449", |
| devtoolsVersion: "1185c2a2bb45c27cbcf281cb538bcb5ba4720fea", |
| networkServiceVersion: "0a814ed5512598e595c0ae7975a09d90a7a54e90", |
| sdkVersion: "ab83ef213a4fb310e7de5d617046e9e4120efb75", |
| androidPlatformToolsVersion: "2219198", |
| }, |
| "5": &versionSpec{ |
| serviceNames: []string{ |
| "authenticating_url_loader_interceptor.mojo", |
| "dart_content_handler.mojo", |
| "debugger.mojo", |
| "files.mojo", |
| "kiosk_wm.mojo", |
| "tracing.mojo", |
| }, |
| serviceNamesAndroid: []string{ |
| "shortcut.mojo", |
| }, |
| serviceNamesLinux: []string{ |
| "authentication.mojo", |
| }, |
| buildVersionAndroid: "25d53bf53b4040f29db984d4774483c5de9d2dc5", |
| buildVersionLinux: "a8adeba2e48f2fc5f8a89b39dc637dbab474bab7", |
| devtoolsVersion: "f71528bb1d9d9b9f874ce503b3cf3d7532283eb5", |
| networkServiceVersion: "0a814ed5512598e595c0ae7975a09d90a7a54e90", |
| sdkVersion: "832aa6a651b4468c4d0c0025bca7605bc248f82b", |
| androidPlatformToolsVersion: "2219198", |
| }, |
| "6": &versionSpec{ |
| serviceNames: []string{ |
| "authenticating_url_loader_interceptor.mojo", |
| "dart_content_handler.mojo", |
| "debugger.mojo", |
| "files.mojo", |
| "kiosk_wm.mojo", |
| "tracing.mojo", |
| }, |
| serviceNamesAndroid: []string{ |
| "shortcut.mojo", |
| }, |
| serviceNamesLinux: []string{ |
| "authentication.mojo", |
| }, |
| buildVersionAndroid: "630247e6afeaf9177ff50396988700e787c51440", |
| buildVersionLinux: "a49d2b24078041ffa78e7e8d9c72ffed213f7881", |
| devtoolsVersion: "5e3dadf261aa264d885b699cee874b3e81393ddc", |
| networkServiceVersion: "0a814ed5512598e595c0ae7975a09d90a7a54e90", |
| sdkVersion: "309af0509fb2fd824e81e2e14a63e138e2eeb30c", |
| androidPlatformToolsVersion: "2219198", |
| }, |
| "7": &versionSpec{ |
| serviceNames: []string{ |
| "authenticating_url_loader_interceptor.mojo", |
| "compositor_service.mojo", |
| "dart_content_handler.mojo", |
| "debugger.mojo", |
| "files.mojo", |
| "input_manager_service.mojo", |
| "launcher.mojo", |
| "view_manager_service.mojo", |
| "tracing.mojo", |
| }, |
| serviceNamesAndroid: []string{ |
| "shortcut.mojo", |
| }, |
| serviceNamesLinux: []string{ |
| "authentication.mojo", |
| }, |
| buildVersionAndroid: "17e3b04429ce6ad836128e1ceffefd85493ec779", |
| buildVersionLinux: "17e3b04429ce6ad836128e1ceffefd85493ec779", |
| devtoolsVersion: "5e3dadf261aa264d885b699cee874b3e81393ddc", |
| networkServiceVersion: "0a814ed5512598e595c0ae7975a09d90a7a54e90", |
| sdkVersion: "39488b961eb9dca8c6ca4a2cc0d693dd13db29e3", |
| androidPlatformToolsVersion: "2219198", |
| }, |
| "8": &versionSpec{ |
| serviceNames: []string{ |
| "authenticating_url_loader_interceptor.mojo", |
| "compositor_service.mojo", |
| "dart_content_handler.mojo", |
| "debugger.mojo", |
| "files.mojo", |
| "input_manager_service.mojo", |
| "launcher.mojo", |
| "view_manager_service.mojo", |
| "tracing.mojo", |
| }, |
| serviceNamesAndroid: []string{ |
| "shortcut.mojo", |
| }, |
| serviceNamesLinux: []string{ |
| "authentication.mojo", |
| }, |
| buildVersionAndroid: "92b330f6dedb4d880eb66e384a28b1a4de2f6ba2", |
| buildVersionLinux: "92b330f6dedb4d880eb66e384a28b1a4de2f6ba2", |
| devtoolsVersion: "6a6098eb787ea88af5ef8e2978074ad57ce6ebeb", |
| networkServiceVersion: "0a814ed5512598e595c0ae7975a09d90a7a54e90", |
| sdkVersion: "465117ff5f34a8ef48b6a94d57f081e3c8e77ca5", |
| androidPlatformToolsVersion: "2219198", |
| }, |
| "9": &versionSpec{ |
| serviceNames: []string{ |
| "authenticating_url_loader_interceptor.mojo", |
| "compositor_service.mojo", |
| "dart_content_handler.mojo", |
| "debugger.mojo", |
| "files.mojo", |
| "input_manager_service.mojo", |
| "launcher.mojo", |
| "view_manager_service.mojo", |
| "tracing.mojo", |
| }, |
| serviceNamesAndroid: []string{ |
| "java_handler.mojo", |
| "shortcut.mojo", |
| }, |
| serviceNamesLinux: []string{ |
| "authentication.mojo", |
| }, |
| buildVersionAndroid: "f559b92ae36d7c4488d238ecf9459c4b81e35029", |
| buildVersionLinux: "f559b92ae36d7c4488d238ecf9459c4b81e35029", |
| devtoolsVersion: "9c40805af6ddc9014c5215dccbabfcafaf83e0ff", |
| networkServiceVersion: "0a814ed5512598e595c0ae7975a09d90a7a54e90", |
| sdkVersion: "6ff49c5bde5c1230ca376a8f5cec035f2eba1d48", |
| androidPlatformToolsVersion: "2219198", |
| }, |
| "10": &versionSpec{ |
| serviceNames: []string{ |
| "authenticating_url_loader_interceptor.mojo", |
| "compositor_service.mojo", |
| "dart_content_handler.mojo", |
| "debugger.mojo", |
| "files.mojo", |
| "input_manager_service.mojo", |
| "launcher.mojo", |
| "view_manager_service.mojo", |
| "tracing.mojo", |
| }, |
| serviceNamesAndroid: []string{ |
| "java_handler.mojo", |
| "shortcut.mojo", |
| }, |
| serviceNamesLinux: []string{ |
| "authentication.mojo", |
| }, |
| buildVersionAndroid: "891577b0517de5aeca538d99669787c6dc72412a", |
| buildVersionLinux: "891577b0517de5aeca538d99669787c6dc72412a", |
| devtoolsVersion: "176889fd2e17f988727847a03b00c158af8a6c52", |
| networkServiceVersion: "0a814ed5512598e595c0ae7975a09d90a7a54e90", |
| sdkVersion: "8d13caec84db234e320129722d2f0d5d873def11", |
| androidPlatformToolsVersion: "2219198", |
| }, |
| "11": &versionSpec{ |
| serviceNames: []string{ |
| "authenticating_url_loader_interceptor.mojo", |
| "compositor_service.mojo", |
| "dart_content_handler.mojo", |
| "debugger.mojo", |
| "files.mojo", |
| "input_manager_service.mojo", |
| "launcher.mojo", |
| "view_manager_service.mojo", |
| "tracing.mojo", |
| }, |
| serviceNamesAndroid: []string{ |
| "java_handler.mojo", |
| "shortcut.mojo", |
| }, |
| serviceNamesLinux: []string{ |
| "authentication.mojo", |
| }, |
| buildVersionAndroid: "91a7a240f90012cbc8c527d04f6a70609769dd1e", |
| buildVersionLinux: "91a7a240f90012cbc8c527d04f6a70609769dd1e", |
| devtoolsVersion: "176889fd2e17f988727847a03b00c158af8a6c52", |
| networkServiceVersion: "0a814ed5512598e595c0ae7975a09d90a7a54e90", |
| sdkVersion: "0cd77a9a96e4b21311883b67503c5f5977fdb48d", |
| androidPlatformToolsVersion: "2219198", |
| }, |
| "12": &versionSpec{ |
| serviceNames: []string{ |
| "authenticating_url_loader_interceptor.mojo", |
| "compositor_service.mojo", |
| "dart_content_handler.mojo", |
| "debugger.mojo", |
| "files.mojo", |
| "input_manager_service.mojo", |
| "launcher.mojo", |
| "view_manager_service.mojo", |
| "tracing.mojo", |
| }, |
| serviceNamesAndroid: []string{ |
| "java_handler.mojo", |
| "shortcut.mojo", |
| }, |
| serviceNamesLinux: []string{ |
| "authentication.mojo", |
| }, |
| buildVersionAndroid: "aaeb3451ba80ead4583ee24773562aee4ef83ef5", |
| buildVersionLinux: "aaeb3451ba80ead4583ee24773562aee4ef83ef5", |
| devtoolsVersion: "7c1b8c9992f97ce3c8008d41e80589cb71d9c9f3", |
| networkServiceVersion: "33d1fbc3387e62a54acf66baa5ecc9e43bee050b", |
| sdkVersion: "4b3296629ebda2a32520351c92adf75aceb75f2c", |
| androidPlatformToolsVersion: "2219198", |
| }, |
| "13": &versionSpec{ |
| serviceNames: []string{ |
| "authenticating_url_loader_interceptor.mojo", |
| "compositor_service.mojo", |
| "dart_content_handler.mojo", |
| "debugger.mojo", |
| "files.mojo", |
| "input_manager_service.mojo", |
| "launcher.mojo", |
| "view_manager_service.mojo", |
| "tracing.mojo", |
| }, |
| serviceNamesAndroid: []string{ |
| "java_handler.mojo", |
| "shortcut.mojo", |
| }, |
| serviceNamesLinux: []string{ |
| "authentication.mojo", |
| }, |
| buildVersionAndroid: "65138ce8c234734966a4e299d8feba01d8c9ce07", |
| buildVersionLinux: "65138ce8c234734966a4e299d8feba01d8c9ce07", |
| devtoolsVersion: "d498890dc825363948a5852a2328b8ef937f5af4", |
| networkServiceVersion: "0a814ed5512598e595c0ae7975a09d90a7a54e90", |
| sdkVersion: "3ea16d966ac12fe076996becd3412a19762e66ac", |
| androidPlatformToolsVersion: "2219198", |
| }, |
| }, "13"), |
| } |
| profilesmanager.Register(m) |
| } |
| |
| type Manager struct { |
| profileInstaller, profileName, qualifiedName string |
| root, mojoRoot jiri.RelPath |
| mojoInstDir, androidPlatformToolsDir jiri.RelPath |
| devtoolsDir, sdkDir jiri.RelPath |
| shellDir, systemThunksDir jiri.RelPath |
| versionInfo *profiles.VersionInfo |
| spec versionSpec |
| buildVersion string |
| platform string |
| } |
| |
| func (m Manager) Name() string { |
| return m.profileName |
| } |
| |
| func (m Manager) Installer() string { |
| return m.profileInstaller |
| } |
| |
| func (m Manager) String() string { |
| return fmt.Sprintf("%s[%s]", m.qualifiedName, m.versionInfo.Default()) |
| } |
| |
| func (m Manager) VersionInfo() *profiles.VersionInfo { |
| return m.versionInfo |
| } |
| |
| func (m Manager) Info() string { |
| return `Downloads pre-built mojo binaries and other assets required for building mojo services.` |
| } |
| |
| func (m *Manager) AddFlags(flags *flag.FlagSet, action profiles.Action) { |
| } |
| |
| func (m *Manager) initForTarget(jirix *jiri.X, root jiri.RelPath, target *profiles.Target) error { |
| if err := m.versionInfo.Lookup(target.Version(), &m.spec); err != nil { |
| return err |
| } |
| |
| // Turn "amd64" architecture string into "x64" to match mojo's usage. |
| mojoArch := target.Arch() |
| if mojoArch == "amd64" { |
| mojoArch = "x64" |
| } |
| m.platform = target.OS() + "-" + mojoArch |
| |
| if m.platform != "linux-x64" && m.platform != "android-arm" { |
| return fmt.Errorf("only amd64-linux and arm-android targets are supported for mojo profile") |
| } |
| |
| m.buildVersion = m.spec.buildVersionLinux |
| if m.platform == "android-arm" { |
| m.buildVersion = m.spec.buildVersionAndroid |
| } |
| |
| m.root = root |
| m.mojoRoot = root.Join("mojo") |
| |
| // devtools and mojo sdk are not architecture-dependant, so they can go in |
| // mojoRoot. |
| m.devtoolsDir = m.mojoRoot.Join("devtools", m.spec.devtoolsVersion) |
| m.sdkDir = m.mojoRoot.Join("mojo_sdk", m.spec.sdkVersion) |
| |
| m.mojoInstDir = m.mojoRoot.Join(target.TargetSpecificDirname()) |
| m.androidPlatformToolsDir = m.mojoInstDir.Join("platform-tools", m.spec.androidPlatformToolsVersion) |
| m.shellDir = m.mojoInstDir.Join("mojo_shell", m.buildVersion) |
| m.systemThunksDir = m.mojoInstDir.Join("system_thunks", m.buildVersion) |
| |
| if jirix.Verbose() { |
| fmt.Fprintf(jirix.Stdout(), "Installation Directories for: %s\n", target) |
| fmt.Fprintf(jirix.Stdout(), "mojo installation dir: %s\n", m.mojoInstDir) |
| fmt.Fprintf(jirix.Stdout(), "devtools: %s\n", m.devtoolsDir) |
| fmt.Fprintf(jirix.Stdout(), "sdk: %s\n", m.sdkDir) |
| fmt.Fprintf(jirix.Stdout(), "shell: %s\n", m.shellDir) |
| fmt.Fprintf(jirix.Stdout(), "system thunks: %s\n", m.systemThunksDir) |
| fmt.Fprintf(jirix.Stdout(), "android platform tools: %s\n", m.androidPlatformToolsDir) |
| } |
| return nil |
| } |
| |
| func (m *Manager) OSPackages(jirix *jiri.X, pdb *profiles.DB, root jiri.RelPath, target profiles.Target) ([]string, error) { |
| return nil, nil |
| } |
| |
| func (m *Manager) Install(jirix *jiri.X, pdb *profiles.DB, root jiri.RelPath, target profiles.Target) error { |
| if err := m.initForTarget(jirix, root, &target); err != nil { |
| return err |
| } |
| |
| seq := jirix.NewSeq() |
| seq.MkdirAll(m.mojoInstDir.Abs(jirix), profilesutil.DefaultDirPerm). |
| Call(func() error { return m.installMojoDevtools(jirix, m.devtoolsDir.Abs(jirix)) }, "install mojo devtools"). |
| Call(func() error { return m.installMojoSdk(jirix, m.sdkDir.Abs(jirix)) }, "install mojo SDK"). |
| Call(func() error { return m.installMojoShellAndServices(jirix, m.shellDir.Abs(jirix)) }, "install mojo shell and services"). |
| Call(func() error { return m.installMojoSystemThunks(jirix, m.systemThunksDir.Abs(jirix)) }, "install mojo system thunks") |
| |
| target.Env.Vars = envvar.MergeSlices(target.Env.Vars, []string{ |
| "CGO_CFLAGS=-I" + m.sdkDir.Join("src").Symbolic(), |
| "CGO_CXXFLAGS=-I" + m.sdkDir.Join("src").Symbolic(), |
| "CGO_LDFLAGS=-L" + m.systemThunksDir.Symbolic() + " -lsystem_thunks", |
| "GOPATH=" + m.sdkDir.Symbolic() + ":" + m.sdkDir.Join("gen", "go").Symbolic(), |
| "MOJO_DEVTOOLS=" + m.devtoolsDir.Symbolic(), |
| "MOJO_SDK=" + m.sdkDir.Symbolic(), |
| "MOJO_SHELL=" + m.shellDir.Join("mojo_shell").Symbolic(), |
| "MOJO_SERVICES=" + m.shellDir.Symbolic(), |
| "MOJO_SYSTEM_THUNKS=" + m.systemThunksDir.Join("libsystem_thunks.a").Symbolic(), |
| }) |
| |
| if m.platform == "android-arm" { |
| seq.Call(func() error { return m.installAndroidPlatformTools(jirix, m.androidPlatformToolsDir.Abs(jirix)) }, "install android platform tools") |
| target.Env.Vars = envvar.MergeSlices(target.Env.Vars, []string{ |
| "ANDROID_PLATFORM_TOOLS=" + m.androidPlatformToolsDir.Symbolic(), |
| "MOJO_SHELL=" + m.shellDir.Join("MojoShell.apk").Symbolic(), |
| }) |
| } |
| |
| if err := seq.Done(); err != nil { |
| return err |
| } |
| |
| target.InstallationDir = string(m.mojoInstDir) |
| pdb.InstallProfile(m.profileInstaller, m.profileName, string(m.mojoRoot)) |
| return pdb.AddProfileTarget(m.profileInstaller, m.profileName, target) |
| } |
| |
| // installAndroidPlatformTools installs the android platform tools in outDir. |
| func (m *Manager) installAndroidPlatformTools(jirix *jiri.X, outDir string) error { |
| tmpDir, err := jirix.NewSeq().TempDir("", "") |
| if err != nil { |
| return err |
| } |
| defer jirix.NewSeq().RemoveAll(tmpDir) |
| |
| fn := func() error { |
| androidPlatformToolsZipFile := filepath.Join(tmpDir, "platform-tools.zip") |
| return jirix.NewSeq(). |
| Call(func() error { |
| return profilesutil.Fetch(jirix, androidPlatformToolsZipFile, androidPlatformToolsUrl(m.spec.androidPlatformToolsVersion)) |
| }, "fetch android platform tools"). |
| Call(func() error { return profilesutil.Unzip(jirix, androidPlatformToolsZipFile, tmpDir) }, "unzip android platform tools"). |
| MkdirAll(filepath.Dir(outDir), profilesutil.DefaultDirPerm). |
| Rename(filepath.Join(tmpDir, "platform-tools"), outDir). |
| Done() |
| } |
| return profilesutil.AtomicAction(jirix, fn, outDir, "Install Android Platform Tools") |
| } |
| |
| // installMojoNetworkService installs network_services.mojo into outDir. |
| func (m *Manager) installMojoNetworkService(jirix *jiri.X, outDir string) error { |
| tmpDir, err := jirix.NewSeq().TempDir("", "") |
| if err != nil { |
| return err |
| } |
| defer jirix.NewSeq().RemoveAll(tmpDir) |
| |
| networkServiceUrl := mojoNetworkServiceUrl(m.platform, m.spec.networkServiceVersion) |
| networkServiceZipFile := filepath.Join(tmpDir, "network_service.mojo.zip") |
| tmpFile := filepath.Join(tmpDir, "network_service.mojo") |
| outFile := filepath.Join(outDir, "network_service.mojo") |
| |
| return jirix.NewSeq(). |
| Call(func() error { return profilesutil.Fetch(jirix, networkServiceZipFile, networkServiceUrl) }, "fetch %s", networkServiceUrl). |
| Call(func() error { return profilesutil.Unzip(jirix, networkServiceZipFile, tmpDir) }, "unzip network service"). |
| MkdirAll(filepath.Dir(outDir), profilesutil.DefaultDirPerm). |
| Rename(tmpFile, outFile). |
| Done() |
| } |
| |
| // installMojoDevtools clones the mojo devtools repo into outDir. |
| func (m *Manager) installMojoDevtools(jirix *jiri.X, outDir string) error { |
| fn := func() error { |
| return jirix.NewSeq(). |
| MkdirAll(outDir, profilesutil.DefaultDirPerm). |
| Pushd(outDir). |
| Call(func() error { return gitutil.New(jirix.NewSeq()).CloneRecursive(mojoDevtoolsRemote, outDir) }, "git clone --recursive %s", mojoDevtoolsRemote). |
| Call(func() error { return gitutil.New(jirix.NewSeq()).Reset(m.spec.devtoolsVersion) }, "git reset --hard %s", m.spec.devtoolsVersion). |
| Popd(). |
| Done() |
| } |
| return profilesutil.AtomicAction(jirix, fn, outDir, "Install Mojo devtools") |
| } |
| |
| // installMojoSdk clones the mojo_sdk repo into outDir/src/mojo/public. It |
| // also generates .mojom.go files from the .mojom files. |
| func (m *Manager) installMojoSdk(jirix *jiri.X, outDir string) error { |
| fn := func() error { |
| seq := jirix.NewSeq() |
| srcDir := filepath.Join(outDir, "src") |
| // TODO(nlacasse): At some point Mojo needs to change the structure of |
| // their repo so that go packages occur with correct paths. Until then |
| // we'll clone into src/mojo/public so that go import paths work. |
| publicDir := filepath.Join(srcDir, "mojo", "public") |
| seq. |
| MkdirAll(publicDir, profilesutil.DefaultDirPerm). |
| Pushd(publicDir). |
| Call(func() error { return gitutil.New(jirix.NewSeq()).CloneRecursive(mojoSdkRemote, publicDir) }, "git clone --recursive %s", mojoSdkRemote). |
| Call(func() error { return gitutil.New(jirix.NewSeq()).Reset(m.spec.sdkVersion) }, "git reset --hard %s", m.spec.sdkVersion). |
| Popd() |
| |
| // Download the authentication and network service mojom files. |
| // TODO(nlacasse): This is a HACK. The service mojom files are not |
| // published anywhere yet, so we get them from the main mojo repo, |
| // which we should not need to do. Once they are published someplace |
| // else, get them from there. |
| tmpMojoCheckout, err := jirix.NewSeq().TempDir("", "") |
| if err != nil { |
| return err |
| } |
| defer jirix.NewSeq().RemoveAll(tmpMojoCheckout) |
| |
| seq. |
| Pushd(tmpMojoCheckout). |
| Call(func() error { return gitutil.New(jirix.NewSeq()).Clone(mojoRemote, tmpMojoCheckout) }, "git clone %s", mojoRemote). |
| Call(func() error { return gitutil.New(jirix.NewSeq()).Reset(m.buildVersion) }, "git reset --hard %s", m.buildVersion). |
| Popd() |
| |
| servicesSrc := filepath.Join(tmpMojoCheckout, "mojo", "services") |
| servicesDir := filepath.Join(srcDir, "mojo", "services") |
| seq.Rename(servicesSrc, servicesDir) |
| |
| // Generate mojom bindings. |
| seq.Pushd(srcDir) |
| |
| // Fetch the mojom compiler. |
| bindingsDir := filepath.Join(publicDir, "tools", "bindings") |
| compilerDir := filepath.Join(bindingsDir, "mojom_tool", "bin") |
| compilerName := "mojom" |
| if _, err := os.Stat(compilerDir); os.IsNotExist(err) { |
| // For an old versions < 8. |
| compilerDir = filepath.Join(bindingsDir, "mojom_parser", "bin") |
| compilerName = "mojom_parser" |
| } |
| fetchCompiler := func(arch string) error { |
| hash, err := ioutil.ReadFile(filepath.Join(compilerDir, arch, compilerName+".sha1")) |
| if err != nil { |
| return err |
| } |
| binary := mojoCompilerUrl(arch, string(hash)) |
| return profilesutil.Fetch(jirix, filepath.Join(compilerDir, arch, compilerName), binary) |
| } |
| seq. |
| Call(func() error { return fetchCompiler("linux64") }, "fetch linux64 mojom compiler"). |
| Chmod(filepath.Join(compilerDir, "linux64", compilerName), 0755). |
| Call(func() error { return fetchCompiler("mac64") }, "fetch mac64 mojom compiler"). |
| Chmod(filepath.Join(compilerDir, "mac64", compilerName), 0755) |
| |
| // Find all .mojom files excluding ones for testing. |
| var mojomFilesBuffer bytes.Buffer |
| if err := jirix.NewSeq().Capture(&mojomFilesBuffer, nil).Last("find", srcDir, "-name", "*.mojom"); err != nil { |
| return err |
| } |
| mojomFiles := strings.Split(strings.TrimSpace(mojomFilesBuffer.String()), "\n") |
| |
| genDir := filepath.Join(outDir, "gen") |
| genMojomTool := filepath.Join(bindingsDir, "mojom_bindings_generator.py") |
| for _, mojomFile := range mojomFiles { |
| seq.Run(genMojomTool, |
| "--use_bundled_pylibs", |
| "--generate-type-info", |
| "--no-gen-imports", |
| "-d", ".", |
| "-I", servicesDir, |
| "-g", "go,java", |
| "-o", genDir, |
| mojomFile) |
| } |
| seq.Popd() |
| return seq.Done() |
| } |
| |
| return profilesutil.AtomicAction(jirix, fn, outDir, "Clone Mojo SDK repository") |
| } |
| |
| // installMojoShellAndServices installs the mojo shell and all services into outDir. |
| func (m *Manager) installMojoShellAndServices(jirix *jiri.X, outDir string) error { |
| tmpDir, err := jirix.NewSeq().TempDir("", "") |
| if err != nil { |
| return err |
| } |
| defer jirix.NewSeq().RemoveAll(tmpDir) |
| |
| fn := func() error { |
| seq := jirix.NewSeq() |
| seq.MkdirAll(outDir, profilesutil.DefaultDirPerm) |
| |
| // Install mojo shell. |
| url := mojoShellUrl(m.platform, m.buildVersion) |
| mojoShellZipFile := filepath.Join(tmpDir, "mojo_shell.zip") |
| seq. |
| Call(func() error { return profilesutil.Fetch(jirix, mojoShellZipFile, url) }, "fetch %s", url). |
| Call(func() error { return profilesutil.Unzip(jirix, mojoShellZipFile, tmpDir) }, "unzip %s", mojoShellZipFile) |
| |
| files := []string{"mojo_shell", "mojo_shell_child"} |
| if m.platform == "android-arm" { |
| // On android, mojo shell is called "MojoShell.apk". |
| files = []string{"MojoShell.apk"} |
| } |
| for _, file := range files { |
| tmpFile := filepath.Join(tmpDir, file) |
| outFile := filepath.Join(outDir, file) |
| seq.Rename(tmpFile, outFile) |
| } |
| |
| // Install the network services. |
| seq.Call(func() error { |
| return m.installMojoNetworkService(jirix, outDir) |
| }, "install mojo network service") |
| |
| // Install all other services. |
| serviceNames := m.spec.serviceNames |
| if m.platform == "android-arm" { |
| serviceNames = append(serviceNames, m.spec.serviceNamesAndroid...) |
| } |
| if m.platform == "linux-x64" { |
| serviceNames = append(serviceNames, m.spec.serviceNamesLinux...) |
| } |
| for _, serviceName := range serviceNames { |
| outFile := filepath.Join(outDir, serviceName) |
| serviceUrl := mojoServiceUrl(m.platform, serviceName, m.buildVersion) |
| seq.Call(func() error { return profilesutil.Fetch(jirix, outFile, serviceUrl) }, "fetch %s", serviceUrl) |
| } |
| return seq.Done() |
| } |
| |
| return profilesutil.AtomicAction(jirix, fn, outDir, "install mojo_shell") |
| } |
| |
| // installMojoSystemThunks installs the mojo system thunks lib into outDir. |
| func (m *Manager) installMojoSystemThunks(jirix *jiri.X, outDir string) error { |
| fn := func() error { |
| outFile := filepath.Join(outDir, "libsystem_thunks.a") |
| return jirix.NewSeq().MkdirAll(outDir, profilesutil.DefaultDirPerm). |
| Call(func() error { |
| return profilesutil.Fetch(jirix, outFile, mojoSystemThunksUrl(m.platform, m.buildVersion)) |
| }, "fetch mojo system thunks").Done() |
| } |
| return profilesutil.AtomicAction(jirix, fn, outDir, "Download Mojo system thunks") |
| } |
| |
| func (m *Manager) Uninstall(jirix *jiri.X, pdb *profiles.DB, root jiri.RelPath, target profiles.Target) error { |
| // TODO(nlacasse): What should we do with all the installed artifacts? |
| // They could be used by other profile versions, so deleting them does not |
| // make sense. Should we check that they are only used by this profile |
| // before deleting? |
| pdb.RemoveProfileTarget(m.profileInstaller, m.profileName, target) |
| return nil |
| } |
| |
| // androidPlatformToolsUrl returns the url of the android platform tools zip |
| // file for the given version. |
| func androidPlatformToolsUrl(version string) string { |
| return fmt.Sprintf("http://tools.android.com/download/sdk-repo-linux-platform-tools-%s.zip", version) |
| } |
| |
| // mojoNetworkServiceUrl returns the url for the network service for the given |
| // platform and git revision. |
| func mojoNetworkServiceUrl(platform, gitRevision string) string { |
| return mojoStorageBucket + fmt.Sprintf("/network_service/%s/%s/network_service.mojo.zip", gitRevision, platform) |
| } |
| |
| // mojoServiceUrl returns the url for the service for the given platform, name, |
| // and git revision. |
| func mojoServiceUrl(platform, name, gitRevision string) string { |
| return mojoStorageBucket + fmt.Sprintf("/services/%s/%s/%s", platform, gitRevision, name) |
| } |
| |
| // mojoShellUrl returns the url for the mojo shell binary given platform and |
| // git revision. |
| func mojoShellUrl(platform, gitRevision string) string { |
| return mojoStorageBucket + fmt.Sprintf("/shell/%s/%s.zip", gitRevision, platform) |
| } |
| |
| // mojoSystemThunksUrl returns the url for the mojo system thunks binary for the |
| // given platform and git revision. |
| func mojoSystemThunksUrl(platform, gitRevision string) string { |
| return mojoStorageBucket + fmt.Sprintf("/system_thunks/%s/%s/libsystem_thunks.a", platform, gitRevision) |
| } |
| |
| func mojoCompilerUrl(platform string, sha1 string) string { |
| return mojoStorageBucket + fmt.Sprintf("/mojom_parser/%s/%s", platform, sha1) |
| } |