Home | History | Annotate | Download | only in soong
      1 // Copyright (C) 2016 The Android Open Source Project
      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 llvm
     16 
     17 import (
     18 	"android/soong/android"
     19 	"android/soong/cc"
     20 
     21 	"github.com/google/blueprint/proptools"
     22 )
     23 
     24 func globalFlags(ctx android.BaseContext) []string {
     25 	var cflags []string
     26 
     27 	if ctx.AConfig().IsEnvTrue("FORCE_BUILD_LLVM_DISABLE_NDEBUG") {
     28 		cflags = append(cflags, "-D_DEBUG", "-UNDEBUG")
     29 	}
     30 
     31 	return cflags
     32 }
     33 
     34 func deviceFlags(ctx android.BaseContext) []string {
     35 	var cflags []string
     36 
     37 	return cflags
     38 }
     39 
     40 func hostFlags(ctx android.BaseContext) []string {
     41 	var cflags []string
     42 
     43 	if ctx.AConfig().IsEnvTrue("FORCE_BUILD_LLVM_DEBUG") {
     44 		cflags = append(cflags, "-O0", "-g")
     45 	}
     46 
     47 	return cflags
     48 }
     49 
     50 func llvmDefaults(ctx android.LoadHookContext) {
     51 	type props struct {
     52 		Target struct {
     53 			Android struct {
     54 				Cflags  []string
     55 				Enabled *bool
     56 			}
     57 			Host struct {
     58 				Enabled *bool
     59 			}
     60 			Not_windows struct {
     61 				Cflags []string
     62 			}
     63 		}
     64 		Cflags []string
     65 	}
     66 
     67 	p := &props{}
     68 	p.Cflags = globalFlags(ctx)
     69 	p.Target.Android.Cflags = deviceFlags(ctx)
     70 	// Mingw fails to link binaries with lots of debug information
     71 	p.Target.Not_windows.Cflags = hostFlags(ctx)
     72 
     73 	if ctx.AConfig().IsEnvTrue("DISABLE_LLVM_DEVICE_BUILDS") {
     74 		p.Target.Android.Enabled = proptools.BoolPtr(false)
     75 	}
     76 
     77 	ctx.AppendProperties(p)
     78 }
     79 
     80 func forceBuildLlvmComponents(ctx android.LoadHookContext) {
     81 	forceBuild := false
     82 	if ctx.AConfig().IsEnvTrue("FORCE_BUILD_LLVM_COMPONENTS") {
     83 		forceBuild = true
     84 	}
     85 	if len(ctx.AConfig().SanitizeHost()) > 0 {
     86 		forceBuild = true
     87 	}
     88 
     89 	if !forceBuild {
     90 		type props struct {
     91 			Target struct {
     92 				Host struct {
     93 					Enabled *bool
     94 				}
     95 			}
     96 		}
     97 		p := &props{}
     98 		p.Target.Host.Enabled = proptools.BoolPtr(false)
     99 		ctx.AppendProperties(p)
    100 	}
    101 }
    102 
    103 func init() {
    104 	android.RegisterModuleType("llvm_defaults", llvmDefaultsFactory)
    105 	android.RegisterModuleType("force_build_llvm_components_defaults", forceBuildLlvmComponentsDefaultsFactory)
    106 }
    107 
    108 func llvmDefaultsFactory() android.Module {
    109 	module := cc.DefaultsFactory()
    110 	android.AddLoadHook(module, llvmDefaults)
    111 
    112 	return module
    113 }
    114 
    115 func forceBuildLlvmComponentsDefaultsFactory() android.Module {
    116 	module := cc.DefaultsFactory()
    117 	android.AddLoadHook(module, forceBuildLlvmComponents)
    118 	return module
    119 }
    120