Home | History | Annotate | Download | only in cc
      1 // Copyright 2015 Google Inc. All rights reserved.
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 //     http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 
     15 package cc
     16 
     17 import (
     18 	"fmt"
     19 
     20 	"android/soong/common"
     21 )
     22 
     23 type toolchainFactory func(arch common.Arch) Toolchain
     24 
     25 var toolchainFactories = map[common.HostOrDevice]map[common.HostType]map[common.ArchType]toolchainFactory{
     26 	common.Host: map[common.HostType]map[common.ArchType]toolchainFactory{
     27 		common.Linux:   make(map[common.ArchType]toolchainFactory),
     28 		common.Darwin:  make(map[common.ArchType]toolchainFactory),
     29 		common.Windows: make(map[common.ArchType]toolchainFactory),
     30 	},
     31 	common.Device: map[common.HostType]map[common.ArchType]toolchainFactory{
     32 		common.NoHostType: make(map[common.ArchType]toolchainFactory),
     33 	},
     34 }
     35 
     36 func registerDeviceToolchainFactory(arch common.ArchType, factory toolchainFactory) {
     37 	toolchainFactories[common.Device][common.NoHostType][arch] = factory
     38 }
     39 
     40 func registerHostToolchainFactory(ht common.HostType, arch common.ArchType, factory toolchainFactory) {
     41 	toolchainFactories[common.Host][ht][arch] = factory
     42 }
     43 
     44 type Toolchain interface {
     45 	Name() string
     46 
     47 	GccRoot() string
     48 	GccTriple() string
     49 	// GccVersion should return a real value, not a ninja reference
     50 	GccVersion() string
     51 
     52 	ToolchainCflags() string
     53 	ToolchainLdflags() string
     54 	Cflags() string
     55 	Cppflags() string
     56 	Ldflags() string
     57 	IncludeFlags() string
     58 	InstructionSetFlags(string) (string, error)
     59 
     60 	ClangSupported() bool
     61 	ClangTriple() string
     62 	ToolchainClangCflags() string
     63 	ClangAsflags() string
     64 	ClangCflags() string
     65 	ClangCppflags() string
     66 	ClangLdflags() string
     67 	ClangInstructionSetFlags(string) (string, error)
     68 
     69 	Is64Bit() bool
     70 
     71 	ShlibSuffix() string
     72 	ExecutableSuffix() string
     73 
     74 	SystemCppCppflags() string
     75 	SystemCppLdflags() string
     76 }
     77 
     78 type toolchainBase struct {
     79 }
     80 
     81 func (toolchainBase) InstructionSetFlags(s string) (string, error) {
     82 	if s != "" {
     83 		return "", fmt.Errorf("instruction_set: %s is not a supported instruction set", s)
     84 	}
     85 	return "", nil
     86 }
     87 
     88 func (toolchainBase) ClangInstructionSetFlags(s string) (string, error) {
     89 	if s != "" {
     90 		return "", fmt.Errorf("instruction_set: %s is not a supported instruction set", s)
     91 	}
     92 	return "", nil
     93 }
     94 
     95 func (toolchainBase) ToolchainCflags() string {
     96 	return ""
     97 }
     98 
     99 func (toolchainBase) ToolchainLdflags() string {
    100 	return ""
    101 }
    102 
    103 func (toolchainBase) ToolchainClangCflags() string {
    104 	return ""
    105 }
    106 
    107 func (toolchainBase) ClangSupported() bool {
    108 	return true
    109 }
    110 
    111 func (toolchainBase) ShlibSuffix() string {
    112 	return ".so"
    113 }
    114 
    115 func (toolchainBase) ExecutableSuffix() string {
    116 	return ""
    117 }
    118 
    119 func (toolchainBase) ClangAsflags() string {
    120 	return ""
    121 }
    122 
    123 func (toolchainBase) SystemCppCppflags() string {
    124 	return ""
    125 }
    126 
    127 func (toolchainBase) SystemCppLdflags() string {
    128 	return ""
    129 }
    130 
    131 type toolchain64Bit struct {
    132 	toolchainBase
    133 }
    134 
    135 func (toolchain64Bit) Is64Bit() bool {
    136 	return true
    137 }
    138 
    139 type toolchain32Bit struct {
    140 	toolchainBase
    141 }
    142 
    143 func (toolchain32Bit) Is64Bit() bool {
    144 	return false
    145 }
    146