soong_config_module_type_conversion_test.go 37 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361
  1. // Copyright 2021 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. package bp2build
  15. import (
  16. "android/soong/android"
  17. "android/soong/cc"
  18. "fmt"
  19. "testing"
  20. )
  21. func runSoongConfigModuleTypeTest(t *testing.T, tc Bp2buildTestCase) {
  22. t.Helper()
  23. RunBp2BuildTestCase(t, registerSoongConfigModuleTypes, tc)
  24. }
  25. func registerSoongConfigModuleTypes(ctx android.RegistrationContext) {
  26. cc.RegisterCCBuildComponents(ctx)
  27. android.RegisterSoongConfigModuleBuildComponents(ctx)
  28. ctx.RegisterModuleType("cc_library", cc.LibraryFactory)
  29. ctx.RegisterModuleType("custom", customModuleFactoryHostAndDevice)
  30. }
  31. func TestErrorInBpFileDoesNotPanic(t *testing.T) {
  32. bp := `
  33. soong_config_module_type {
  34. name: "library_linking_strategy_cc_defaults",
  35. module_type: "cc_defaults",
  36. config_namespace: "ANDROID",
  37. variables: ["library_linking_strategy"],
  38. properties: [
  39. "shared_libs",
  40. "static_libs",
  41. ],
  42. }
  43. `
  44. runSoongConfigModuleTypeTest(t, Bp2buildTestCase{
  45. Description: "soong config variables - generates selects for library_linking_strategy",
  46. ModuleTypeUnderTest: "cc_binary",
  47. ModuleTypeUnderTestFactory: cc.BinaryFactory,
  48. Blueprint: bp,
  49. ExpectedErr: fmt.Errorf(`unknown variable "library_linking_strategy" in module type "library_linking_strategy_cc_defaults`),
  50. })
  51. }
  52. func TestSoongConfigModuleType(t *testing.T) {
  53. bp := `
  54. soong_config_module_type {
  55. name: "custom_cc_library_static",
  56. module_type: "cc_library_static",
  57. config_namespace: "acme",
  58. bool_variables: ["feature1"],
  59. properties: ["cflags"],
  60. }
  61. custom_cc_library_static {
  62. name: "foo",
  63. bazel_module: { bp2build_available: true },
  64. host_supported: true,
  65. soong_config_variables: {
  66. feature1: {
  67. conditions_default: {
  68. cflags: ["-DDEFAULT1"],
  69. },
  70. cflags: ["-DFEATURE1"],
  71. },
  72. },
  73. }
  74. `
  75. runSoongConfigModuleTypeTest(t, Bp2buildTestCase{
  76. Description: "soong config variables - soong_config_module_type is supported in bp2build",
  77. ModuleTypeUnderTest: "cc_library_static",
  78. ModuleTypeUnderTestFactory: cc.LibraryStaticFactory,
  79. Blueprint: bp,
  80. ExpectedBazelTargets: []string{`cc_library_static(
  81. name = "foo",
  82. copts = select({
  83. "//build/bazel/product_variables:acme__feature1": ["-DFEATURE1"],
  84. "//conditions:default": ["-DDEFAULT1"],
  85. }),
  86. local_includes = ["."],
  87. )`}})
  88. }
  89. func TestSoongConfigModuleTypeImport(t *testing.T) {
  90. configBp := `
  91. soong_config_module_type {
  92. name: "custom_cc_library_static",
  93. module_type: "cc_library_static",
  94. config_namespace: "acme",
  95. bool_variables: ["feature1"],
  96. properties: ["cflags"],
  97. }
  98. `
  99. bp := `
  100. soong_config_module_type_import {
  101. from: "foo/bar/SoongConfig.bp",
  102. module_types: ["custom_cc_library_static"],
  103. }
  104. custom_cc_library_static {
  105. name: "foo",
  106. bazel_module: { bp2build_available: true },
  107. host_supported: true,
  108. soong_config_variables: {
  109. feature1: {
  110. conditions_default: {
  111. cflags: ["-DDEFAULT1"],
  112. },
  113. cflags: ["-DFEATURE1"],
  114. },
  115. },
  116. }
  117. `
  118. runSoongConfigModuleTypeTest(t, Bp2buildTestCase{
  119. Description: "soong config variables - soong_config_module_type_import is supported in bp2build",
  120. ModuleTypeUnderTest: "cc_library_static",
  121. ModuleTypeUnderTestFactory: cc.LibraryStaticFactory,
  122. Filesystem: map[string]string{
  123. "foo/bar/SoongConfig.bp": configBp,
  124. },
  125. Blueprint: bp,
  126. ExpectedBazelTargets: []string{`cc_library_static(
  127. name = "foo",
  128. copts = select({
  129. "//build/bazel/product_variables:acme__feature1": ["-DFEATURE1"],
  130. "//conditions:default": ["-DDEFAULT1"],
  131. }),
  132. local_includes = ["."],
  133. )`}})
  134. }
  135. func TestSoongConfigModuleType_StringVar(t *testing.T) {
  136. bp := `
  137. soong_config_string_variable {
  138. name: "board",
  139. values: ["soc_a", "soc_b", "soc_c"],
  140. }
  141. soong_config_module_type {
  142. name: "custom_cc_library_static",
  143. module_type: "cc_library_static",
  144. config_namespace: "acme",
  145. variables: ["board"],
  146. properties: ["cflags"],
  147. }
  148. custom_cc_library_static {
  149. name: "foo",
  150. bazel_module: { bp2build_available: true },
  151. host_supported: true,
  152. soong_config_variables: {
  153. board: {
  154. soc_a: {
  155. cflags: ["-DSOC_A"],
  156. },
  157. soc_b: {
  158. cflags: ["-DSOC_B"],
  159. },
  160. soc_c: {},
  161. conditions_default: {
  162. cflags: ["-DSOC_DEFAULT"]
  163. },
  164. },
  165. },
  166. }
  167. `
  168. runSoongConfigModuleTypeTest(t, Bp2buildTestCase{
  169. Description: "soong config variables - generates selects for string vars",
  170. ModuleTypeUnderTest: "cc_library_static",
  171. ModuleTypeUnderTestFactory: cc.LibraryStaticFactory,
  172. Blueprint: bp,
  173. ExpectedBazelTargets: []string{`cc_library_static(
  174. name = "foo",
  175. copts = select({
  176. "//build/bazel/product_variables:acme__board__soc_a": ["-DSOC_A"],
  177. "//build/bazel/product_variables:acme__board__soc_b": ["-DSOC_B"],
  178. "//build/bazel/product_variables:acme__board__soc_c": [],
  179. "//conditions:default": ["-DSOC_DEFAULT"],
  180. }),
  181. local_includes = ["."],
  182. )`}})
  183. }
  184. func TestSoongConfigModuleType_StringAndBoolVar(t *testing.T) {
  185. bp := `
  186. soong_config_bool_variable {
  187. name: "feature1",
  188. }
  189. soong_config_bool_variable {
  190. name: "feature2",
  191. }
  192. soong_config_string_variable {
  193. name: "board",
  194. values: ["soc_a", "soc_b", "soc_c", "soc_d"],
  195. }
  196. soong_config_module_type {
  197. name: "custom_cc_library_static",
  198. module_type: "cc_library_static",
  199. config_namespace: "acme",
  200. variables: ["feature1", "feature2", "board"],
  201. properties: ["cflags"],
  202. }
  203. custom_cc_library_static {
  204. name: "foo",
  205. bazel_module: { bp2build_available: true },
  206. host_supported: true,
  207. soong_config_variables: {
  208. feature1: {
  209. conditions_default: {
  210. cflags: ["-DDEFAULT1"],
  211. },
  212. cflags: ["-DFEATURE1"],
  213. },
  214. feature2: {
  215. cflags: ["-DFEATURE2"],
  216. conditions_default: {
  217. cflags: ["-DDEFAULT2"],
  218. },
  219. },
  220. board: {
  221. soc_a: {
  222. cflags: ["-DSOC_A"],
  223. },
  224. soc_b: {
  225. cflags: ["-DSOC_B"],
  226. },
  227. soc_c: {},
  228. conditions_default: {
  229. cflags: ["-DSOC_DEFAULT"]
  230. },
  231. },
  232. },
  233. }`
  234. runSoongConfigModuleTypeTest(t, Bp2buildTestCase{
  235. Description: "soong config variables - generates selects for multiple variable types",
  236. ModuleTypeUnderTest: "cc_library_static",
  237. ModuleTypeUnderTestFactory: cc.LibraryStaticFactory,
  238. Blueprint: bp,
  239. ExpectedBazelTargets: []string{`cc_library_static(
  240. name = "foo",
  241. copts = select({
  242. "//build/bazel/product_variables:acme__board__soc_a": ["-DSOC_A"],
  243. "//build/bazel/product_variables:acme__board__soc_b": ["-DSOC_B"],
  244. "//build/bazel/product_variables:acme__board__soc_c": [],
  245. "//conditions:default": ["-DSOC_DEFAULT"],
  246. }) + select({
  247. "//build/bazel/product_variables:acme__feature1": ["-DFEATURE1"],
  248. "//conditions:default": ["-DDEFAULT1"],
  249. }) + select({
  250. "//build/bazel/product_variables:acme__feature2": ["-DFEATURE2"],
  251. "//conditions:default": ["-DDEFAULT2"],
  252. }),
  253. local_includes = ["."],
  254. )`}})
  255. }
  256. func TestSoongConfigModuleType_StringVar_LabelListDeps(t *testing.T) {
  257. bp := `
  258. soong_config_string_variable {
  259. name: "board",
  260. values: ["soc_a", "soc_b", "soc_c", "soc_d"],
  261. }
  262. soong_config_module_type {
  263. name: "custom_cc_library_static",
  264. module_type: "cc_library_static",
  265. config_namespace: "acme",
  266. variables: ["board"],
  267. properties: ["cflags", "static_libs"],
  268. }
  269. custom_cc_library_static {
  270. name: "foo",
  271. bazel_module: { bp2build_available: true },
  272. host_supported: true,
  273. soong_config_variables: {
  274. board: {
  275. soc_a: {
  276. cflags: ["-DSOC_A"],
  277. static_libs: ["soc_a_dep"],
  278. },
  279. soc_b: {
  280. cflags: ["-DSOC_B"],
  281. static_libs: ["soc_b_dep"],
  282. },
  283. soc_c: {},
  284. conditions_default: {
  285. cflags: ["-DSOC_DEFAULT"],
  286. static_libs: ["soc_default_static_dep"],
  287. },
  288. },
  289. },
  290. }`
  291. otherDeps := `
  292. cc_library_static { name: "soc_a_dep", bazel_module: { bp2build_available: false } }
  293. cc_library_static { name: "soc_b_dep", bazel_module: { bp2build_available: false } }
  294. cc_library_static { name: "soc_default_static_dep", bazel_module: { bp2build_available: false } }
  295. `
  296. runSoongConfigModuleTypeTest(t, Bp2buildTestCase{
  297. Description: "soong config variables - generates selects for label list attributes",
  298. ModuleTypeUnderTest: "cc_library_static",
  299. ModuleTypeUnderTestFactory: cc.LibraryStaticFactory,
  300. Blueprint: bp,
  301. Filesystem: map[string]string{
  302. "foo/bar/Android.bp": otherDeps,
  303. },
  304. ExpectedBazelTargets: []string{`cc_library_static(
  305. name = "foo",
  306. copts = select({
  307. "//build/bazel/product_variables:acme__board__soc_a": ["-DSOC_A"],
  308. "//build/bazel/product_variables:acme__board__soc_b": ["-DSOC_B"],
  309. "//build/bazel/product_variables:acme__board__soc_c": [],
  310. "//conditions:default": ["-DSOC_DEFAULT"],
  311. }),
  312. implementation_deps = select({
  313. "//build/bazel/product_variables:acme__board__soc_a": ["//foo/bar:soc_a_dep"],
  314. "//build/bazel/product_variables:acme__board__soc_b": ["//foo/bar:soc_b_dep"],
  315. "//build/bazel/product_variables:acme__board__soc_c": [],
  316. "//conditions:default": ["//foo/bar:soc_default_static_dep"],
  317. }),
  318. local_includes = ["."],
  319. )`}})
  320. }
  321. func TestSoongConfigModuleType_Defaults_SingleNamespace(t *testing.T) {
  322. bp := `
  323. soong_config_module_type {
  324. name: "vendor_foo_cc_defaults",
  325. module_type: "cc_defaults",
  326. config_namespace: "vendor_foo",
  327. bool_variables: ["feature"],
  328. properties: ["cflags", "cppflags"],
  329. }
  330. vendor_foo_cc_defaults {
  331. name: "foo_defaults_1",
  332. soong_config_variables: {
  333. feature: {
  334. cflags: ["-cflag_feature_1"],
  335. conditions_default: {
  336. cflags: ["-cflag_default_1"],
  337. },
  338. },
  339. },
  340. }
  341. vendor_foo_cc_defaults {
  342. name: "foo_defaults_2",
  343. defaults: ["foo_defaults_1"],
  344. soong_config_variables: {
  345. feature: {
  346. cflags: ["-cflag_feature_2"],
  347. conditions_default: {
  348. cflags: ["-cflag_default_2"],
  349. },
  350. },
  351. },
  352. }
  353. cc_library_static {
  354. name: "lib",
  355. defaults: ["foo_defaults_2"],
  356. bazel_module: { bp2build_available: true },
  357. host_supported: true,
  358. }
  359. `
  360. runSoongConfigModuleTypeTest(t, Bp2buildTestCase{
  361. Description: "soong config variables - defaults with a single namespace",
  362. ModuleTypeUnderTest: "cc_library_static",
  363. ModuleTypeUnderTestFactory: cc.LibraryStaticFactory,
  364. Blueprint: bp,
  365. ExpectedBazelTargets: []string{`cc_library_static(
  366. name = "lib",
  367. copts = select({
  368. "//build/bazel/product_variables:vendor_foo__feature": [
  369. "-cflag_feature_2",
  370. "-cflag_feature_1",
  371. ],
  372. "//conditions:default": [
  373. "-cflag_default_2",
  374. "-cflag_default_1",
  375. ],
  376. }),
  377. local_includes = ["."],
  378. )`}})
  379. }
  380. func TestSoongConfigModuleType_MultipleDefaults_SingleNamespace(t *testing.T) {
  381. bp := `
  382. soong_config_module_type {
  383. name: "foo_cc_defaults",
  384. module_type: "cc_defaults",
  385. config_namespace: "acme",
  386. bool_variables: ["feature"],
  387. properties: ["cflags"],
  388. }
  389. soong_config_module_type {
  390. name: "bar_cc_defaults",
  391. module_type: "cc_defaults",
  392. config_namespace: "acme",
  393. bool_variables: ["feature"],
  394. properties: ["cflags", "asflags"],
  395. }
  396. foo_cc_defaults {
  397. name: "foo_defaults",
  398. soong_config_variables: {
  399. feature: {
  400. cflags: ["-cflag_foo"],
  401. conditions_default: {
  402. cflags: ["-cflag_default_foo"],
  403. },
  404. },
  405. },
  406. }
  407. bar_cc_defaults {
  408. name: "bar_defaults",
  409. srcs: ["file.S"],
  410. soong_config_variables: {
  411. feature: {
  412. cflags: ["-cflag_bar"],
  413. asflags: ["-asflag_bar"],
  414. conditions_default: {
  415. asflags: ["-asflag_default_bar"],
  416. cflags: ["-cflag_default_bar"],
  417. },
  418. },
  419. },
  420. }
  421. cc_library_static {
  422. name: "lib",
  423. defaults: ["foo_defaults", "bar_defaults"],
  424. bazel_module: { bp2build_available: true },
  425. host_supported: true,
  426. }
  427. cc_library_static {
  428. name: "lib2",
  429. defaults: ["bar_defaults", "foo_defaults"],
  430. bazel_module: { bp2build_available: true },
  431. host_supported: true,
  432. }
  433. `
  434. runSoongConfigModuleTypeTest(t, Bp2buildTestCase{
  435. Description: "soong config variables - multiple defaults with a single namespace",
  436. ModuleTypeUnderTest: "cc_library_static",
  437. ModuleTypeUnderTestFactory: cc.LibraryStaticFactory,
  438. Blueprint: bp,
  439. ExpectedBazelTargets: []string{`cc_library_static(
  440. name = "lib",
  441. asflags = select({
  442. "//build/bazel/product_variables:acme__feature": ["-asflag_bar"],
  443. "//conditions:default": ["-asflag_default_bar"],
  444. }),
  445. copts = select({
  446. "//build/bazel/product_variables:acme__feature": [
  447. "-cflag_foo",
  448. "-cflag_bar",
  449. ],
  450. "//conditions:default": [
  451. "-cflag_default_foo",
  452. "-cflag_default_bar",
  453. ],
  454. }),
  455. local_includes = ["."],
  456. srcs_as = ["file.S"],
  457. )`,
  458. `cc_library_static(
  459. name = "lib2",
  460. asflags = select({
  461. "//build/bazel/product_variables:acme__feature": ["-asflag_bar"],
  462. "//conditions:default": ["-asflag_default_bar"],
  463. }),
  464. copts = select({
  465. "//build/bazel/product_variables:acme__feature": [
  466. "-cflag_bar",
  467. "-cflag_foo",
  468. ],
  469. "//conditions:default": [
  470. "-cflag_default_bar",
  471. "-cflag_default_foo",
  472. ],
  473. }),
  474. local_includes = ["."],
  475. srcs_as = ["file.S"],
  476. )`}})
  477. }
  478. func TestSoongConfigModuleType_Defaults_MultipleNamespaces(t *testing.T) {
  479. bp := `
  480. soong_config_module_type {
  481. name: "vendor_foo_cc_defaults",
  482. module_type: "cc_defaults",
  483. config_namespace: "vendor_foo",
  484. bool_variables: ["feature"],
  485. properties: ["cflags"],
  486. }
  487. soong_config_module_type {
  488. name: "vendor_bar_cc_defaults",
  489. module_type: "cc_defaults",
  490. config_namespace: "vendor_bar",
  491. bool_variables: ["feature"],
  492. properties: ["cflags"],
  493. }
  494. soong_config_module_type {
  495. name: "vendor_qux_cc_defaults",
  496. module_type: "cc_defaults",
  497. config_namespace: "vendor_qux",
  498. bool_variables: ["feature"],
  499. properties: ["cflags"],
  500. }
  501. vendor_foo_cc_defaults {
  502. name: "foo_defaults",
  503. soong_config_variables: {
  504. feature: {
  505. cflags: ["-DVENDOR_FOO_FEATURE"],
  506. conditions_default: {
  507. cflags: ["-DVENDOR_FOO_DEFAULT"],
  508. },
  509. },
  510. },
  511. }
  512. vendor_bar_cc_defaults {
  513. name: "bar_defaults",
  514. soong_config_variables: {
  515. feature: {
  516. cflags: ["-DVENDOR_BAR_FEATURE"],
  517. conditions_default: {
  518. cflags: ["-DVENDOR_BAR_DEFAULT"],
  519. },
  520. },
  521. },
  522. }
  523. vendor_qux_cc_defaults {
  524. name: "qux_defaults",
  525. defaults: ["bar_defaults"],
  526. soong_config_variables: {
  527. feature: {
  528. cflags: ["-DVENDOR_QUX_FEATURE"],
  529. conditions_default: {
  530. cflags: ["-DVENDOR_QUX_DEFAULT"],
  531. },
  532. },
  533. },
  534. }
  535. cc_library_static {
  536. name: "lib",
  537. defaults: ["foo_defaults", "qux_defaults"],
  538. bazel_module: { bp2build_available: true },
  539. host_supported: true,
  540. }
  541. `
  542. runSoongConfigModuleTypeTest(t, Bp2buildTestCase{
  543. Description: "soong config variables - defaults with multiple namespaces",
  544. ModuleTypeUnderTest: "cc_library_static",
  545. ModuleTypeUnderTestFactory: cc.LibraryStaticFactory,
  546. Blueprint: bp,
  547. ExpectedBazelTargets: []string{`cc_library_static(
  548. name = "lib",
  549. copts = select({
  550. "//build/bazel/product_variables:vendor_bar__feature": ["-DVENDOR_BAR_FEATURE"],
  551. "//conditions:default": ["-DVENDOR_BAR_DEFAULT"],
  552. }) + select({
  553. "//build/bazel/product_variables:vendor_foo__feature": ["-DVENDOR_FOO_FEATURE"],
  554. "//conditions:default": ["-DVENDOR_FOO_DEFAULT"],
  555. }) + select({
  556. "//build/bazel/product_variables:vendor_qux__feature": ["-DVENDOR_QUX_FEATURE"],
  557. "//conditions:default": ["-DVENDOR_QUX_DEFAULT"],
  558. }),
  559. local_includes = ["."],
  560. )`}})
  561. }
  562. func TestSoongConfigModuleType_Defaults_UseBaselineValueForStringProp(t *testing.T) {
  563. bp := `
  564. soong_config_string_variable {
  565. name: "library_linking_strategy",
  566. values: [
  567. "prefer_static",
  568. ],
  569. }
  570. soong_config_module_type {
  571. name: "library_linking_strategy_custom",
  572. module_type: "custom",
  573. config_namespace: "ANDROID",
  574. variables: ["library_linking_strategy"],
  575. properties: [
  576. "string_literal_prop",
  577. ],
  578. }
  579. library_linking_strategy_custom {
  580. name: "foo",
  581. string_literal_prop: "29",
  582. soong_config_variables: {
  583. library_linking_strategy: {
  584. prefer_static: {},
  585. conditions_default: {
  586. string_literal_prop: "30",
  587. },
  588. },
  589. },
  590. }`
  591. runSoongConfigModuleTypeTest(t, Bp2buildTestCase{
  592. Description: "soong config variables - generates selects for library_linking_strategy",
  593. ModuleTypeUnderTest: "cc_binary",
  594. ModuleTypeUnderTestFactory: cc.BinaryFactory,
  595. Blueprint: bp,
  596. Filesystem: map[string]string{},
  597. ExpectedBazelTargets: []string{
  598. MakeBazelTarget("custom", "foo", AttrNameToString{
  599. "string_literal_prop": `select({
  600. "//build/bazel/product_variables:android__library_linking_strategy__prefer_static": "29",
  601. "//conditions:default": "30",
  602. })`,
  603. }),
  604. },
  605. })
  606. }
  607. func TestSoongConfigModuleType_UnsetConditions(t *testing.T) {
  608. bp := `
  609. soong_config_string_variable {
  610. name: "library_linking_strategy",
  611. values: [
  612. "prefer_static",
  613. ],
  614. }
  615. soong_config_module_type {
  616. name: "library_linking_strategy_cc_defaults",
  617. module_type: "cc_defaults",
  618. config_namespace: "ANDROID",
  619. variables: ["library_linking_strategy"],
  620. properties: [
  621. "shared_libs",
  622. "static_libs",
  623. ],
  624. }
  625. library_linking_strategy_cc_defaults {
  626. name: "library_linking_strategy_lib_a_defaults",
  627. soong_config_variables: {
  628. library_linking_strategy: {
  629. prefer_static: {},
  630. conditions_default: {
  631. shared_libs: [
  632. "lib_a",
  633. ],
  634. },
  635. },
  636. },
  637. }
  638. library_linking_strategy_cc_defaults {
  639. name: "library_linking_strategy_merged_defaults",
  640. defaults: ["library_linking_strategy_lib_a_defaults"],
  641. host_supported: true,
  642. soong_config_variables: {
  643. library_linking_strategy: {
  644. prefer_static: {},
  645. conditions_default: {
  646. shared_libs: [
  647. "lib_b",
  648. ],
  649. },
  650. },
  651. },
  652. }
  653. cc_binary {
  654. name: "library_linking_strategy_sample_binary",
  655. srcs: ["library_linking_strategy.cc"],
  656. defaults: ["library_linking_strategy_merged_defaults"],
  657. include_build_directory: false,
  658. }`
  659. otherDeps := `
  660. cc_library { name: "lib_a", bazel_module: { bp2build_available: false } }
  661. cc_library { name: "lib_b", bazel_module: { bp2build_available: false } }
  662. cc_library { name: "lib_default", bazel_module: { bp2build_available: false } }
  663. `
  664. runSoongConfigModuleTypeTest(t, Bp2buildTestCase{
  665. Description: "soong config variables - generates selects for library_linking_strategy",
  666. ModuleTypeUnderTest: "cc_binary",
  667. ModuleTypeUnderTestFactory: cc.BinaryFactory,
  668. Blueprint: bp,
  669. Filesystem: map[string]string{
  670. "foo/bar/Android.bp": otherDeps,
  671. },
  672. ExpectedBazelTargets: []string{`cc_binary(
  673. name = "library_linking_strategy_sample_binary",
  674. dynamic_deps = select({
  675. "//build/bazel/product_variables:android__library_linking_strategy__prefer_static": [],
  676. "//conditions:default": [
  677. "//foo/bar:lib_b",
  678. "//foo/bar:lib_a",
  679. ],
  680. }),
  681. srcs = ["library_linking_strategy.cc"],
  682. )`}})
  683. }
  684. func TestSoongConfigModuleType_UnsetConditionsExcludeLibs(t *testing.T) {
  685. bp := `
  686. soong_config_string_variable {
  687. name: "library_linking_strategy",
  688. values: [
  689. "prefer_static",
  690. ],
  691. }
  692. soong_config_module_type {
  693. name: "library_linking_strategy_cc_defaults",
  694. module_type: "cc_defaults",
  695. config_namespace: "ANDROID",
  696. variables: ["library_linking_strategy"],
  697. properties: ["shared_libs"],
  698. }
  699. library_linking_strategy_cc_defaults {
  700. name: "library_linking_strategy_lib_a_defaults",
  701. soong_config_variables: {
  702. library_linking_strategy: {
  703. prefer_static: {},
  704. conditions_default: {
  705. shared_libs: [
  706. "lib_a",
  707. ],
  708. },
  709. },
  710. },
  711. }
  712. library_linking_strategy_cc_defaults {
  713. name: "library_linking_strategy_merged_defaults",
  714. defaults: ["library_linking_strategy_lib_a_defaults"],
  715. host_supported: true,
  716. soong_config_variables: {
  717. library_linking_strategy: {
  718. prefer_static: {},
  719. conditions_default: {
  720. shared_libs: [
  721. "lib_b",
  722. "lib_c",
  723. ],
  724. },
  725. },
  726. },
  727. exclude_shared_libs: ["lib_a"],
  728. }
  729. cc_binary {
  730. name: "library_linking_strategy_sample_binary",
  731. defaults: ["library_linking_strategy_merged_defaults"],
  732. include_build_directory: false,
  733. }
  734. cc_binary {
  735. name: "library_linking_strategy_sample_binary_with_excludes",
  736. defaults: ["library_linking_strategy_merged_defaults"],
  737. exclude_shared_libs: ["lib_c"],
  738. include_build_directory: false,
  739. }`
  740. otherDeps := `
  741. cc_library { name: "lib_a", bazel_module: { bp2build_available: false } }
  742. cc_library { name: "lib_b", bazel_module: { bp2build_available: false } }
  743. cc_library { name: "lib_c", bazel_module: { bp2build_available: false } }
  744. `
  745. runSoongConfigModuleTypeTest(t, Bp2buildTestCase{
  746. Description: "soong config variables - generates selects for library_linking_strategy",
  747. ModuleTypeUnderTest: "cc_binary",
  748. ModuleTypeUnderTestFactory: cc.BinaryFactory,
  749. Blueprint: bp,
  750. Filesystem: map[string]string{
  751. "foo/bar/Android.bp": otherDeps,
  752. },
  753. ExpectedBazelTargets: []string{
  754. MakeBazelTargetNoRestrictions("cc_binary", "library_linking_strategy_sample_binary", AttrNameToString{
  755. "dynamic_deps": `select({
  756. "//build/bazel/product_variables:android__library_linking_strategy__prefer_static": [],
  757. "//conditions:default": [
  758. "//foo/bar:lib_b",
  759. "//foo/bar:lib_c",
  760. ],
  761. })`,
  762. }),
  763. MakeBazelTargetNoRestrictions("cc_binary", "library_linking_strategy_sample_binary_with_excludes", AttrNameToString{
  764. "dynamic_deps": `select({
  765. "//build/bazel/product_variables:android__library_linking_strategy__prefer_static": [],
  766. "//conditions:default": ["//foo/bar:lib_b"],
  767. })`,
  768. }),
  769. }})
  770. }
  771. func TestSoongConfigModuleType_Defaults(t *testing.T) {
  772. bp := `
  773. soong_config_string_variable {
  774. name: "library_linking_strategy",
  775. values: [
  776. "prefer_static",
  777. ],
  778. }
  779. soong_config_module_type {
  780. name: "library_linking_strategy_cc_defaults",
  781. module_type: "cc_defaults",
  782. config_namespace: "ANDROID",
  783. variables: ["library_linking_strategy"],
  784. properties: [
  785. "shared_libs",
  786. "static_libs",
  787. ],
  788. }
  789. library_linking_strategy_cc_defaults {
  790. name: "library_linking_strategy_lib_a_defaults",
  791. soong_config_variables: {
  792. library_linking_strategy: {
  793. prefer_static: {
  794. static_libs: [
  795. "lib_a",
  796. ],
  797. },
  798. conditions_default: {
  799. shared_libs: [
  800. "lib_a",
  801. ],
  802. },
  803. },
  804. },
  805. }
  806. library_linking_strategy_cc_defaults {
  807. name: "library_linking_strategy_merged_defaults",
  808. defaults: ["library_linking_strategy_lib_a_defaults"],
  809. host_supported: true,
  810. soong_config_variables: {
  811. library_linking_strategy: {
  812. prefer_static: {
  813. static_libs: [
  814. "lib_b",
  815. ],
  816. },
  817. conditions_default: {
  818. shared_libs: [
  819. "lib_b",
  820. ],
  821. },
  822. },
  823. },
  824. }
  825. cc_binary {
  826. name: "library_linking_strategy_sample_binary",
  827. srcs: ["library_linking_strategy.cc"],
  828. defaults: ["library_linking_strategy_merged_defaults"],
  829. }`
  830. otherDeps := `
  831. cc_library { name: "lib_a", bazel_module: { bp2build_available: false } }
  832. cc_library { name: "lib_b", bazel_module: { bp2build_available: false } }
  833. cc_library { name: "lib_default", bazel_module: { bp2build_available: false } }
  834. `
  835. runSoongConfigModuleTypeTest(t, Bp2buildTestCase{
  836. Description: "soong config variables - generates selects for library_linking_strategy",
  837. ModuleTypeUnderTest: "cc_binary",
  838. ModuleTypeUnderTestFactory: cc.BinaryFactory,
  839. Blueprint: bp,
  840. Filesystem: map[string]string{
  841. "foo/bar/Android.bp": otherDeps,
  842. },
  843. ExpectedBazelTargets: []string{`cc_binary(
  844. name = "library_linking_strategy_sample_binary",
  845. deps = select({
  846. "//build/bazel/product_variables:android__library_linking_strategy__prefer_static": [
  847. "//foo/bar:lib_b_bp2build_cc_library_static",
  848. "//foo/bar:lib_a_bp2build_cc_library_static",
  849. ],
  850. "//conditions:default": [],
  851. }),
  852. dynamic_deps = select({
  853. "//build/bazel/product_variables:android__library_linking_strategy__prefer_static": [],
  854. "//conditions:default": [
  855. "//foo/bar:lib_b",
  856. "//foo/bar:lib_a",
  857. ],
  858. }),
  859. local_includes = ["."],
  860. srcs = ["library_linking_strategy.cc"],
  861. )`}})
  862. }
  863. func TestSoongConfigModuleType_Defaults_Another(t *testing.T) {
  864. bp := `
  865. soong_config_string_variable {
  866. name: "library_linking_strategy",
  867. values: [
  868. "prefer_static",
  869. ],
  870. }
  871. soong_config_module_type {
  872. name: "library_linking_strategy_cc_defaults",
  873. module_type: "cc_defaults",
  874. config_namespace: "ANDROID",
  875. variables: ["library_linking_strategy"],
  876. properties: [
  877. "shared_libs",
  878. "static_libs",
  879. ],
  880. }
  881. library_linking_strategy_cc_defaults {
  882. name: "library_linking_strategy_sample_defaults",
  883. soong_config_variables: {
  884. library_linking_strategy: {
  885. prefer_static: {
  886. static_libs: [
  887. "lib_a",
  888. "lib_b",
  889. ],
  890. },
  891. conditions_default: {
  892. shared_libs: [
  893. "lib_a",
  894. "lib_b",
  895. ],
  896. },
  897. },
  898. },
  899. }
  900. cc_binary {
  901. name: "library_linking_strategy_sample_binary",
  902. host_supported: true,
  903. srcs: ["library_linking_strategy.cc"],
  904. defaults: ["library_linking_strategy_sample_defaults"],
  905. }`
  906. otherDeps := `
  907. cc_library { name: "lib_a", bazel_module: { bp2build_available: false } }
  908. cc_library { name: "lib_b", bazel_module: { bp2build_available: false } }
  909. `
  910. runSoongConfigModuleTypeTest(t, Bp2buildTestCase{
  911. Description: "soong config variables - generates selects for library_linking_strategy",
  912. ModuleTypeUnderTest: "cc_binary",
  913. ModuleTypeUnderTestFactory: cc.BinaryFactory,
  914. Blueprint: bp,
  915. Filesystem: map[string]string{
  916. "foo/bar/Android.bp": otherDeps,
  917. },
  918. ExpectedBazelTargets: []string{`cc_binary(
  919. name = "library_linking_strategy_sample_binary",
  920. deps = select({
  921. "//build/bazel/product_variables:android__library_linking_strategy__prefer_static": [
  922. "//foo/bar:lib_a_bp2build_cc_library_static",
  923. "//foo/bar:lib_b_bp2build_cc_library_static",
  924. ],
  925. "//conditions:default": [],
  926. }),
  927. dynamic_deps = select({
  928. "//build/bazel/product_variables:android__library_linking_strategy__prefer_static": [],
  929. "//conditions:default": [
  930. "//foo/bar:lib_a",
  931. "//foo/bar:lib_b",
  932. ],
  933. }),
  934. local_includes = ["."],
  935. srcs = ["library_linking_strategy.cc"],
  936. )`}})
  937. }
  938. func TestSoongConfigModuleType_Defaults_UnusedProps(t *testing.T) {
  939. bp := `
  940. soong_config_string_variable {
  941. name: "alphabet",
  942. values: [
  943. "a",
  944. "b",
  945. "c", // unused
  946. ],
  947. }
  948. soong_config_module_type {
  949. name: "alphabet_cc_defaults",
  950. module_type: "cc_defaults",
  951. config_namespace: "ANDROID",
  952. variables: ["alphabet"],
  953. properties: [
  954. "cflags", // unused
  955. "shared_libs",
  956. "static_libs",
  957. ],
  958. }
  959. alphabet_cc_defaults {
  960. name: "alphabet_sample_cc_defaults",
  961. soong_config_variables: {
  962. alphabet: {
  963. a: {
  964. shared_libs: [
  965. "lib_a",
  966. ],
  967. },
  968. b: {
  969. shared_libs: [
  970. "lib_b",
  971. ],
  972. },
  973. conditions_default: {
  974. static_libs: [
  975. "lib_default",
  976. ],
  977. },
  978. },
  979. },
  980. }
  981. cc_binary {
  982. name: "alphabet_binary",
  983. host_supported: true,
  984. srcs: ["main.cc"],
  985. defaults: ["alphabet_sample_cc_defaults"],
  986. }`
  987. otherDeps := `
  988. cc_library { name: "lib_a", bazel_module: { bp2build_available: false } }
  989. cc_library { name: "lib_b", bazel_module: { bp2build_available: false } }
  990. cc_library { name: "lib_default", bazel_module: { bp2build_available: false } }
  991. `
  992. runSoongConfigModuleTypeTest(t, Bp2buildTestCase{
  993. Description: "soong config variables - generates selects for library_linking_strategy",
  994. ModuleTypeUnderTest: "cc_binary",
  995. ModuleTypeUnderTestFactory: cc.BinaryFactory,
  996. Blueprint: bp,
  997. Filesystem: map[string]string{
  998. "foo/bar/Android.bp": otherDeps,
  999. },
  1000. ExpectedBazelTargets: []string{`cc_binary(
  1001. name = "alphabet_binary",
  1002. deps = select({
  1003. "//build/bazel/product_variables:android__alphabet__a": [],
  1004. "//build/bazel/product_variables:android__alphabet__b": [],
  1005. "//conditions:default": ["//foo/bar:lib_default_bp2build_cc_library_static"],
  1006. }),
  1007. dynamic_deps = select({
  1008. "//build/bazel/product_variables:android__alphabet__a": ["//foo/bar:lib_a"],
  1009. "//build/bazel/product_variables:android__alphabet__b": ["//foo/bar:lib_b"],
  1010. "//conditions:default": [],
  1011. }),
  1012. local_includes = ["."],
  1013. srcs = ["main.cc"],
  1014. )`}})
  1015. }
  1016. func TestSoongConfigModuleType_ProductVariableConfigWithPlatformConfig(t *testing.T) {
  1017. bp := `
  1018. soong_config_bool_variable {
  1019. name: "special_build",
  1020. }
  1021. soong_config_module_type {
  1022. name: "alphabet_cc_defaults",
  1023. module_type: "cc_defaults",
  1024. config_namespace: "alphabet_module",
  1025. bool_variables: ["special_build"],
  1026. properties: ["enabled"],
  1027. }
  1028. alphabet_cc_defaults {
  1029. name: "alphabet_sample_cc_defaults",
  1030. soong_config_variables: {
  1031. special_build: {
  1032. enabled: true,
  1033. },
  1034. },
  1035. }
  1036. cc_binary {
  1037. name: "alphabet_binary",
  1038. srcs: ["main.cc"],
  1039. host_supported: true,
  1040. defaults: ["alphabet_sample_cc_defaults"],
  1041. enabled: false,
  1042. arch: {
  1043. x86_64: {
  1044. enabled: false,
  1045. },
  1046. },
  1047. target: {
  1048. darwin: {
  1049. enabled: false,
  1050. },
  1051. },
  1052. }`
  1053. runSoongConfigModuleTypeTest(t, Bp2buildTestCase{
  1054. Description: "soong config variables - generates selects for library_linking_strategy",
  1055. ModuleTypeUnderTest: "cc_binary",
  1056. ModuleTypeUnderTestFactory: cc.BinaryFactory,
  1057. Blueprint: bp,
  1058. Filesystem: map[string]string{},
  1059. ExpectedBazelTargets: []string{`cc_binary(
  1060. name = "alphabet_binary",
  1061. local_includes = ["."],
  1062. srcs = ["main.cc"],
  1063. target_compatible_with = ["//build/bazel/product_variables:alphabet_module__special_build"] + select({
  1064. "//build/bazel/platforms/os_arch:android_x86_64": ["@platforms//:incompatible"],
  1065. "//build/bazel/platforms/os_arch:darwin_arm64": ["@platforms//:incompatible"],
  1066. "//build/bazel/platforms/os_arch:darwin_x86_64": ["@platforms//:incompatible"],
  1067. "//build/bazel/platforms/os_arch:linux_bionic_x86_64": ["@platforms//:incompatible"],
  1068. "//build/bazel/platforms/os_arch:linux_glibc_x86_64": ["@platforms//:incompatible"],
  1069. "//build/bazel/platforms/os_arch:linux_musl_x86_64": ["@platforms//:incompatible"],
  1070. "//build/bazel/platforms/os_arch:windows_x86_64": ["@platforms//:incompatible"],
  1071. "//conditions:default": [],
  1072. }),
  1073. )`}})
  1074. }
  1075. func TestSoongConfigModuleType_ProductVariableConfigOverridesEnable(t *testing.T) {
  1076. bp := `
  1077. soong_config_bool_variable {
  1078. name: "special_build",
  1079. }
  1080. soong_config_module_type {
  1081. name: "alphabet_cc_defaults",
  1082. module_type: "cc_defaults",
  1083. config_namespace: "alphabet_module",
  1084. bool_variables: ["special_build"],
  1085. properties: ["enabled"],
  1086. }
  1087. alphabet_cc_defaults {
  1088. name: "alphabet_sample_cc_defaults",
  1089. soong_config_variables: {
  1090. special_build: {
  1091. enabled: true,
  1092. },
  1093. },
  1094. }
  1095. cc_binary {
  1096. name: "alphabet_binary",
  1097. srcs: ["main.cc"],
  1098. defaults: ["alphabet_sample_cc_defaults"],
  1099. enabled: false,
  1100. }`
  1101. runSoongConfigModuleTypeTest(t, Bp2buildTestCase{
  1102. Description: "soong config variables - generates selects for library_linking_strategy",
  1103. ModuleTypeUnderTest: "cc_binary",
  1104. ModuleTypeUnderTestFactory: cc.BinaryFactory,
  1105. Blueprint: bp,
  1106. Filesystem: map[string]string{},
  1107. ExpectedBazelTargets: []string{`cc_binary(
  1108. name = "alphabet_binary",
  1109. local_includes = ["."],
  1110. srcs = ["main.cc"],
  1111. target_compatible_with = ["//build/bazel/product_variables:alphabet_module__special_build"],
  1112. )`}})
  1113. }
  1114. func TestSoongConfigModuleType_ProductVariableIgnoredIfEnabledByDefault(t *testing.T) {
  1115. bp := `
  1116. soong_config_bool_variable {
  1117. name: "special_build",
  1118. }
  1119. soong_config_module_type {
  1120. name: "alphabet_cc_defaults",
  1121. module_type: "cc_defaults",
  1122. config_namespace: "alphabet_module",
  1123. bool_variables: ["special_build"],
  1124. properties: ["enabled"],
  1125. }
  1126. alphabet_cc_defaults {
  1127. name: "alphabet_sample_cc_defaults",
  1128. host_supported: true,
  1129. soong_config_variables: {
  1130. special_build: {
  1131. enabled: true,
  1132. },
  1133. },
  1134. }
  1135. cc_binary {
  1136. name: "alphabet_binary",
  1137. srcs: ["main.cc"],
  1138. defaults: ["alphabet_sample_cc_defaults"],
  1139. }`
  1140. runSoongConfigModuleTypeTest(t, Bp2buildTestCase{
  1141. Description: "soong config variables - generates selects for library_linking_strategy",
  1142. ModuleTypeUnderTest: "cc_binary",
  1143. ModuleTypeUnderTestFactory: cc.BinaryFactory,
  1144. Blueprint: bp,
  1145. Filesystem: map[string]string{},
  1146. ExpectedBazelTargets: []string{`cc_binary(
  1147. name = "alphabet_binary",
  1148. local_includes = ["."],
  1149. srcs = ["main.cc"],
  1150. )`}})
  1151. }
  1152. func TestSoongConfigModuleType_CombinedWithArchVariantProperties(t *testing.T) {
  1153. bp := `
  1154. soong_config_bool_variable {
  1155. name: "my_bool_variable",
  1156. }
  1157. soong_config_string_variable {
  1158. name: "my_string_variable",
  1159. values: [
  1160. "value1",
  1161. "value2",
  1162. ],
  1163. }
  1164. soong_config_module_type {
  1165. name: "special_build_cc_defaults",
  1166. module_type: "cc_defaults",
  1167. config_namespace: "my_namespace",
  1168. bool_variables: ["my_bool_variable"],
  1169. variables: ["my_string_variable"],
  1170. properties: ["target.android.cflags", "cflags"],
  1171. }
  1172. special_build_cc_defaults {
  1173. name: "sample_cc_defaults",
  1174. target: {
  1175. android: {
  1176. cflags: ["-DFOO"],
  1177. },
  1178. },
  1179. soong_config_variables: {
  1180. my_bool_variable: {
  1181. target: {
  1182. android: {
  1183. cflags: ["-DBAR"],
  1184. },
  1185. },
  1186. conditions_default: {
  1187. target: {
  1188. android: {
  1189. cflags: ["-DBAZ"],
  1190. },
  1191. },
  1192. },
  1193. },
  1194. my_string_variable: {
  1195. value1: {
  1196. cflags: ["-DVALUE1_NOT_ANDROID"],
  1197. target: {
  1198. android: {
  1199. cflags: ["-DVALUE1"],
  1200. },
  1201. },
  1202. },
  1203. value2: {
  1204. target: {
  1205. android: {
  1206. cflags: ["-DVALUE2"],
  1207. },
  1208. },
  1209. },
  1210. conditions_default: {
  1211. target: {
  1212. android: {
  1213. cflags: ["-DSTRING_VAR_CONDITIONS_DEFAULT"],
  1214. },
  1215. },
  1216. },
  1217. },
  1218. },
  1219. }
  1220. cc_binary {
  1221. name: "my_binary",
  1222. srcs: ["main.cc"],
  1223. defaults: ["sample_cc_defaults"],
  1224. }`
  1225. runSoongConfigModuleTypeTest(t, Bp2buildTestCase{
  1226. Description: "soong config variables - generates selects for library_linking_strategy",
  1227. ModuleTypeUnderTest: "cc_binary",
  1228. ModuleTypeUnderTestFactory: cc.BinaryFactory,
  1229. Blueprint: bp,
  1230. Filesystem: map[string]string{},
  1231. ExpectedBazelTargets: []string{`cc_binary(
  1232. name = "my_binary",
  1233. copts = select({
  1234. "//build/bazel/platforms/os:android": ["-DFOO"],
  1235. "//conditions:default": [],
  1236. }) + select({
  1237. "//build/bazel/product_variables:my_namespace__my_bool_variable__android": ["-DBAR"],
  1238. "//build/bazel/product_variables:my_namespace__my_bool_variable__conditions_default__android": ["-DBAZ"],
  1239. "//conditions:default": [],
  1240. }) + select({
  1241. "//build/bazel/product_variables:my_namespace__my_string_variable__value1": ["-DVALUE1_NOT_ANDROID"],
  1242. "//conditions:default": [],
  1243. }) + select({
  1244. "//build/bazel/product_variables:my_namespace__my_string_variable__conditions_default__android": ["-DSTRING_VAR_CONDITIONS_DEFAULT"],
  1245. "//build/bazel/product_variables:my_namespace__my_string_variable__value1__android": ["-DVALUE1"],
  1246. "//build/bazel/product_variables:my_namespace__my_string_variable__value2__android": ["-DVALUE2"],
  1247. "//conditions:default": [],
  1248. }),
  1249. local_includes = ["."],
  1250. srcs = ["main.cc"],
  1251. target_compatible_with = ["//build/bazel/platforms/os:android"],
  1252. )`}})
  1253. }