brave-browser/lib/config.js
Ryan Gerstenkorn c261a1cb84 Features and fixes for create_dist
* Add mac signing id and keychain parameters
* Add gclient_verbose option to sync
* Allow util.js func options to be set with out explicit cwd
* Use git -C option to specify repos

  Switching directories on windows can cause strange issues in
  the case of depot_tools assumingly because the shell will see
  the git in the current directory and run that instead of what is
  run elsewhere.

* Fix setting references on the command line with yarn sync.

  Commander camelcases options with dashs which breaks when used with
  '--brave-core_ref'. This also renames the option to --brave_core_ref
2018-06-05 23:11:38 -05:00

300 lines
9.7 KiB
JavaScript

'use strict'
const path = require('path')
const fs = require('fs')
const packages = require('../package')
const getNPMConfig = (path) => {
const key = path.join('_').replace('-', '_')
const npm_prefix = 'npm_config_'
const package_prefix = 'npm_package_config_'
return process.env[npm_prefix + key] || process.env[package_prefix + key]
}
const Config = function () {
this.defaultBuildConfig = 'Debug'
this.buildConfig = this.defaultBuildConfig
this.projectNames = []
this.projects = {}
this.rootDir = path.join(path.dirname(__filename), '..')
this.scriptDir = path.join(this.rootDir, 'scripts')
this.depotToolsDir = path.join(this.rootDir, 'vendor', 'depot_tools')
this.srcDir = path.join(this.rootDir, getNPMConfig(['projects', 'chrome', 'dir']))
this.buildToolsDir = path.join(this.srcDir, 'build')
this.resourcesDir = path.join(this.rootDir, 'resources')
this.defaultGClientFile = path.join(this.rootDir, '.gclient')
this.gClientFile = process.env.BRAVE_GCLIENT_FILE || this.defaultGClientFile
this.gClientVerbose = getNPMConfig(['gclient_verbose']) || false
this.targetArch = 'x64'
this.gypTargetArch = 'x64'
this.officialBuild = true
this.debugBuild = JSON.parse(getNPMConfig(['brave_debug_build']) || false)
this.googleApiKey = getNPMConfig(['brave_google_api_key']) || 'AIzaSyAQfxPJiounkhOjODEO5ZieffeBv6yft2Q'
this.googleApiEndpoint = getNPMConfig(['brave_google_api_endpoint']) || 'https://www.googleapis.com/geolocation/v1/geolocate?key='
this.buildProjects()
const braveCoreDirPackage = path.join(this.projects['brave-core'].dir, 'package')
this.braveCoreVersion = getNPMConfig(['brave_version']) || (fs.existsSync(braveCoreDirPackage + '.json') && require(braveCoreDirPackage)['version']) || ''
this.releaseTag = this.braveCoreVersion.split('+')[0]
this.mac_signing_identifier = getNPMConfig(['mac_signing_identifier']) || ''
this.mac_signing_keychain = getNPMConfig(['mac_signing_keychain']) || 'login'
this.channel = ''
}
Config.prototype.buildArgs = function () {
const version = this.braveCoreVersion
let version_parts = version.split('+')[0]
version_parts = version_parts.split('.')
let args = {
root_extra_deps: [ "//brave" ],
is_component_build: this.buildConfig !== 'Release',
proprietary_codecs: true,
ffmpeg_branding: "Chrome",
enable_nacl: false,
// branding_path_component: "brave",
enable_widevine: process.platform !== 'linux',
target_cpu: this.targetArch,
is_official_build: this.officialBuild,
is_debug: this.buildConfig !== 'Release',
dcheck_always_on: this.buildConfig !== 'Release',
brave_channel: this.channel,
brave_google_api_key: this.googleApiKey,
brave_google_api_endpoint: this.googleApiEndpoint,
brave_product_name: getNPMConfig(['brave_product_name']) || "brave-core",
brave_project_name: getNPMConfig(['brave_project_name']) || "brave-core",
brave_version_major: version_parts[0],
brave_version_minor: version_parts[1],
brave_version_build: version_parts[2],
}
if (process.platform === 'darwin') {
args.mac_signing_identifier = this.mac_signing_identifier
args.mac_signing_keychain = this.mac_signing_keychain
}
if (this.debugBuild) {
if (process.platform === 'darwin') {
args.enable_stripping = false
}
args.symbol_level = 2
args.enable_profiling = true
args.is_win_fastlink = true
}
if (this.targetArch === 'x86' && process.platform === 'linux') {
// Minimal symbols for target Linux x86, because ELF32 cannot be > 4GiB
args.symbol_level = 1
}
// TODO: Build redirect-cc.cmd in such a way that it still works with ccache if configured
/*
let sccache = getNPMConfig(['sccache'])
if (sccache) {
args.cc_wrapper = sccache
}
*/
if (process.platform === 'win32') {
args.cc_wrapper = path.join(this.srcDir, 'brave', 'script' ,'redirect-cc.cmd')
} else {
args.cc_wrapper = path.join(this.srcDir, 'brave', 'script', 'redirect-cc.py')
}
return args
}
Config.prototype.prependPath = function (oldPath, addPath) {
let newPath = oldPath.split(path.delimiter)
newPath.unshift(addPath)
newPath = newPath.join(path.delimiter)
return newPath
}
Config.prototype.appendPath = function (oldPath, addPath) {
let newPath = oldPath.split(path.delimiter)
newPath.push(addPath)
newPath = newPath.join(path.delimiter)
return newPath
}
Config.prototype.addPathToEnv = function (env, addPath, prepend = false) {
// cmd.exe uses Path instead of PATH so just set both
const addToPath = prepend ? this.prependPath : this.appendPath
env.Path && (env.Path = addToPath(env.Path, addPath))
env.PATH && (env.PATH = addToPath(env.PATH, addPath))
return env
}
Config.prototype.addPythonPathToEnv = function (env, addPath) {
env.PYTHONPATH = this.appendPath(env.PYTHONPATH || '', addPath)
return env
}
const getProjectVersion = function (projectName) {
return getNPMConfig(['projects', projectName, 'tag']) || getNPMConfig(['projects', projectName, 'branch'])
}
Config.prototype.getProjectRef = function (projectName) {
const ref = getNPMConfig(['projects', projectName, 'repository', 'ref'])
if (ref) {
return ref
}
const tag = getNPMConfig(['projects', projectName, 'tag'])
if (tag) {
return 'refs/tags/' + tag
}
let version = getNPMConfig(['projects', projectName, 'version'])
let branch = getNPMConfig(['projects', projectName, 'branch'])
if (!branch && !version) {
return 'origin/master'
}
if (!version) {
return `origin/${branch}`
}
branch = `origin/${version}`
if (projectName === 'brave-core') {
const chromeVersion = getProjectVersion('chrome')
if (chromeVersion) {
branch = `${branch}+${chromeVersion}`
}
}
return branch
}
Config.prototype.buildProjects = function () {
for (let name in packages.config.projects) {
this.projectNames.push(name)
}
this.projectNames.forEach((projectName) => {
this.projects[projectName] = {
ref: this.getProjectRef(projectName),
url: getNPMConfig(['projects', projectName, 'repository', 'url']),
gclientName: getNPMConfig(['projects', projectName, 'dir']),
dir: path.join(this.rootDir, getNPMConfig(['projects', projectName, 'dir'])),
custom_deps: packages.config.projects[projectName].custom_deps
}
})
}
Config.prototype.update = function (options) {
if (options.C) {
this.buildConfig = path.basename(options.C)
this.__outputDir = options.C
}
if (options.target_arch === 'x86') {
this.targetArch = options.target_arch
this.gypTargetArch = 'ia32'
}
if (options.target_arch === 'ia32') {
this.targetArch = 'x86'
this.gypTargetArch = options.target_arch
}
if (options.gclient_file && options.gclient_file !== 'default') {
this.gClientFile = options.gclient_file
}
if (options.brave_google_api_key) {
this.googleApiKey = options.brave_google_api_key
}
if (options.brave_google_api_endpoint) {
this.googleApiEndpoint = options.brave_google_api_endpoint
}
if (options.debug_build !== null && options.debug_build !== undefined) {
this.debugBuild = JSON.parse(options.debug_build)
} else {
this.debugBuild = this.buildConfig !== 'Release'
}
if (options.official_build !== null && options.official_build !== undefined) {
this.officialBuild = JSON.parse(options.official_build)
if (this.officialBuild) {
this.debugBuild = false
}
} else {
this.officialBuild = this.buildConfig === 'Release'
}
// In chromium src, empty string represents stable channel.
if (options.channel !== 'release')
this.channel = options.channel
if (options.mac_signing_identifier)
this.mac_signing_identifier = options.mac_signing_identifier
if (options.mac_signing_keychain)
this.mac_signing_keychain = options.mac_signing_keychain
if (options.gclient_verbose)
this.gClientVerbose = options.gclient_verbose
this.projectNames.forEach((projectName) => {
// don't update refs for projects that have them
if (!this.projects[projectName].ref)
return
let ref = options[projectName + '_ref']
if (ref && ref !== 'default' && ref !== '') {
this.projects[projectName].ref = ref
}
})
}
Object.defineProperty(Config.prototype, 'defaultOptions', {
get: function () {
let env = Object.assign({}, process.env)
env = this.addPathToEnv(env, this.depotToolsDir, true)
env = this.addPythonPathToEnv(env, path.join(this.srcDir, 'brave', 'chromium_src', 'python_modules'))
env = this.addPythonPathToEnv(env, path.join(this.srcDir, 'brave', 'script'))
env = this.addPythonPathToEnv(env, path.join(this.srcDir, 'tools', 'grit', 'grit', 'extern'))
env.GCLIENT_FILE = this.gClientFile
env.DEPOT_TOOLS_WIN_TOOLCHAIN = '0'
env.PYTHONUNBUFFERED = '1'
env.TARGET_ARCH = this.gypTargetArch // for brave scripts
env.GYP_MSVS_VERSION = env.GYP_MSVS_VERSION || '2017' // enable 2017
let sccache = getNPMConfig(['sccache'])
if (sccache) {
env.CC_WRAPPER = sccache
}
if (process.platform === 'linux') {
env.LLVM_DOWNLOAD_GOLD_PLUGIN = '1'
}
return {
env,
stdio: 'inherit',
cwd: this.srcDir,
shell: true,
git_cwd: '.',
}
},
})
Object.defineProperty(Config.prototype, 'component', {
get: function () { return this.__component || (this.buildConfig === 'Release' ? 'static_library' : 'shared_library') },
set: function (component) { return this.__component = component },
})
Object.defineProperty(Config.prototype, 'outputDir', {
get: function () {
if (this.__outputDir)
return this.__outputDir
let baseDir = path.join(this.srcDir, 'out')
baseDir = this.targetArch == 'x86' ? baseDir + '_x86' : baseDir
return path.join(baseDir, this.buildConfig)
},
set: function (outputDir) { return this.__outputDir = outputDir },
})
module.exports = new Config