Skip to content

Commit d085697

Browse files
committed
[libc++] Add a new concept of ConfigAction, and use it in the DSL
This will allow adding bare compiler flags through the new configuration DSL. Previously, this would have required adding a Lit feature for each such flag. Differential Revision: https://reviews.llvm.org/D90429
1 parent 2bfaf19 commit d085697

File tree

5 files changed

+303
-186
lines changed

5 files changed

+303
-186
lines changed

libcxx/test/libcxx/selftest/dsl/dsl.sh.py

Lines changed: 62 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -275,136 +275,110 @@ class TestFeature(SetupConfigs):
275275
def test_trivial(self):
276276
feature = dsl.Feature(name='name')
277277
origSubstitutions = copy.deepcopy(self.config.substitutions)
278-
self.assertTrue(feature.isSupported(self.config))
279-
feature.enableIn(self.config)
278+
actions = feature.getActions(self.config)
279+
self.assertTrue(len(actions) == 1)
280+
for a in actions:
281+
a.applyTo(self.config)
280282
self.assertEqual(origSubstitutions, self.config.substitutions)
281283
self.assertIn('name', self.config.available_features)
282284

283285
def test_name_can_be_a_callable(self):
284286
feature = dsl.Feature(name=lambda cfg: 'name')
285-
assert feature.isSupported(self.config)
286-
self.assertEqual('name', feature.getName(self.config))
287-
feature.enableIn(self.config)
287+
for a in feature.getActions(self.config):
288+
a.applyTo(self.config)
288289
self.assertIn('name', self.config.available_features)
289290

290291
def test_name_is_not_a_string_1(self):
291292
feature = dsl.Feature(name=None)
292-
assert feature.isSupported(self.config)
293-
self.assertRaises(ValueError, lambda: feature.getName(self.config))
294-
self.assertRaises(ValueError, lambda: feature.enableIn(self.config))
293+
self.assertRaises(ValueError, lambda: feature.getActions(self.config))
294+
self.assertRaises(ValueError, lambda: feature.pretty(self.config))
295295

296296
def test_name_is_not_a_string_2(self):
297297
feature = dsl.Feature(name=lambda cfg: None)
298-
assert feature.isSupported(self.config)
299-
self.assertRaises(ValueError, lambda: feature.getName(self.config))
300-
self.assertRaises(ValueError, lambda: feature.enableIn(self.config))
298+
self.assertRaises(ValueError, lambda: feature.getActions(self.config))
299+
self.assertRaises(ValueError, lambda: feature.pretty(self.config))
301300

302-
def test_getName_when_unsupported(self):
303-
feature = dsl.Feature(name='name', when=lambda _: False)
304-
assert not feature.isSupported(self.config)
305-
self.assertRaises(AssertionError, lambda: feature.getName(self.config))
306-
307-
def test_adding_compile_flag(self):
308-
feature = dsl.Feature(name='name', compileFlag='-foo')
301+
def test_adding_action(self):
302+
feature = dsl.Feature(name='name', actions=[dsl.AddCompileFlag('-std=c++03')])
309303
origLinkFlags = copy.deepcopy(self.getSubstitution('%{link_flags}'))
310-
assert feature.isSupported(self.config)
311-
feature.enableIn(self.config)
304+
for a in feature.getActions(self.config):
305+
a.applyTo(self.config)
312306
self.assertIn('name', self.config.available_features)
313-
self.assertIn('-foo', self.getSubstitution('%{compile_flags}'))
307+
self.assertIn('-std=c++03', self.getSubstitution('%{compile_flags}'))
314308
self.assertEqual(origLinkFlags, self.getSubstitution('%{link_flags}'))
315309

316-
def test_compile_flag_can_be_a_callable(self):
310+
def test_actions_can_be_a_callable(self):
317311
feature = dsl.Feature(name='name',
318-
compileFlag=lambda cfg: (self.assertIs(self.config, cfg), '-foo')[1])
319-
assert feature.isSupported(self.config)
320-
feature.enableIn(self.config)
321-
self.assertIn('-foo', self.getSubstitution('%{compile_flags}'))
322-
323-
def test_adding_link_flag(self):
324-
feature = dsl.Feature(name='name', linkFlag='-foo')
325-
origCompileFlags = copy.deepcopy(self.getSubstitution('%{compile_flags}'))
326-
assert feature.isSupported(self.config)
327-
feature.enableIn(self.config)
328-
self.assertIn('name', self.config.available_features)
329-
self.assertIn('-foo', self.getSubstitution('%{link_flags}'))
330-
self.assertEqual(origCompileFlags, self.getSubstitution('%{compile_flags}'))
331-
332-
def test_link_flag_can_be_a_callable(self):
333-
feature = dsl.Feature(name='name',
334-
linkFlag=lambda cfg: (self.assertIs(self.config, cfg), '-foo')[1])
335-
assert feature.isSupported(self.config)
336-
feature.enableIn(self.config)
337-
self.assertIn('-foo', self.getSubstitution('%{link_flags}'))
338-
339-
def test_adding_both_flags(self):
340-
feature = dsl.Feature(name='name', compileFlag='-hello', linkFlag='-world')
341-
assert feature.isSupported(self.config)
342-
feature.enableIn(self.config)
343-
self.assertIn('name', self.config.available_features)
344-
345-
self.assertIn('-hello', self.getSubstitution('%{compile_flags}'))
346-
self.assertNotIn('-world', self.getSubstitution('%{compile_flags}'))
347-
348-
self.assertIn('-world', self.getSubstitution('%{link_flags}'))
349-
self.assertNotIn('-hello', self.getSubstitution('%{link_flags}'))
312+
actions=lambda cfg: (
313+
self.assertIs(self.config, cfg),
314+
[dsl.AddCompileFlag('-std=c++03')]
315+
)[1])
316+
for a in feature.getActions(self.config):
317+
a.applyTo(self.config)
318+
self.assertIn('-std=c++03', self.getSubstitution('%{compile_flags}'))
350319

351320
def test_unsupported_feature(self):
352321
feature = dsl.Feature(name='name', when=lambda _: False)
353-
self.assertFalse(feature.isSupported(self.config))
354-
# Also make sure we assert if we ever try to add it to a config
355-
self.assertRaises(AssertionError, lambda: feature.enableIn(self.config))
322+
self.assertEqual(feature.getActions(self.config), [])
356323

357324
def test_is_supported_gets_passed_the_config(self):
358325
feature = dsl.Feature(name='name', when=lambda cfg: (self.assertIs(self.config, cfg), True)[1])
359-
self.assertTrue(feature.isSupported(self.config))
326+
self.assertEqual(len(feature.getActions(self.config)), 1)
327+
360328

329+
def _throw():
330+
raise ValueError()
361331

362332
class TestParameter(SetupConfigs):
363333
"""
364334
Tests for libcxx.test.dsl.Parameter
365335
"""
366336
def test_empty_name_should_blow_up(self):
367-
self.assertRaises(ValueError, lambda: dsl.Parameter(name='', choices=['c++03'], type=str, help='', feature=lambda _: None))
337+
self.assertRaises(ValueError, lambda: dsl.Parameter(name='', choices=['c++03'], type=str, help='', actions=lambda _: []))
368338

369339
def test_empty_choices_should_blow_up(self):
370-
self.assertRaises(ValueError, lambda: dsl.Parameter(name='std', choices=[], type=str, help='', feature=lambda _: None))
340+
self.assertRaises(ValueError, lambda: dsl.Parameter(name='std', choices=[], type=str, help='', actions=lambda _: []))
371341

372342
def test_name_is_set_correctly(self):
373-
param = dsl.Parameter(name='std', choices=['c++03'], type=str, help='', feature=lambda _: None)
343+
param = dsl.Parameter(name='std', choices=['c++03'], type=str, help='', actions=lambda _: [])
374344
self.assertEqual(param.name, 'std')
375345

376346
def test_no_value_provided_and_no_default_value(self):
377-
param = dsl.Parameter(name='std', choices=['c++03'], type=str, help='', feature=lambda _: None)
378-
self.assertRaises(ValueError, lambda: param.getFeature(self.config, self.litConfig.params))
347+
param = dsl.Parameter(name='std', choices=['c++03'], type=str, help='', actions=lambda _: [])
348+
self.assertRaises(ValueError, lambda: param.getActions(self.config, self.litConfig.params))
379349

380350
def test_no_value_provided_and_default_value(self):
381351
param = dsl.Parameter(name='std', choices=['c++03'], type=str, help='', default='c++03',
382-
feature=lambda std: dsl.Feature(name=std))
383-
param.getFeature(self.config, self.litConfig.params).enableIn(self.config)
352+
actions=lambda std: [dsl.AddFeature(std)])
353+
for a in param.getActions(self.config, self.litConfig.params):
354+
a.applyTo(self.config)
384355
self.assertIn('c++03', self.config.available_features)
385356

386357
def test_value_provided_on_command_line_and_no_default_value(self):
387358
self.litConfig.params['std'] = 'c++03'
388359
param = dsl.Parameter(name='std', choices=['c++03'], type=str, help='',
389-
feature=lambda std: dsl.Feature(name=std))
390-
param.getFeature(self.config, self.litConfig.params).enableIn(self.config)
360+
actions=lambda std: [dsl.AddFeature(std)])
361+
for a in param.getActions(self.config, self.litConfig.params):
362+
a.applyTo(self.config)
391363
self.assertIn('c++03', self.config.available_features)
392364

393365
def test_value_provided_on_command_line_and_default_value(self):
394366
"""The value provided on the command line should override the default value"""
395367
self.litConfig.params['std'] = 'c++11'
396368
param = dsl.Parameter(name='std', choices=['c++03', 'c++11'], type=str, default='c++03', help='',
397-
feature=lambda std: dsl.Feature(name=std))
398-
param.getFeature(self.config, self.litConfig.params).enableIn(self.config)
369+
actions=lambda std: [dsl.AddFeature(std)])
370+
for a in param.getActions(self.config, self.litConfig.params):
371+
a.applyTo(self.config)
399372
self.assertIn('c++11', self.config.available_features)
400373
self.assertNotIn('c++03', self.config.available_features)
401374

402375
def test_value_provided_in_config_and_default_value(self):
403376
"""The value provided in the config should override the default value"""
404377
self.config.std ='c++11'
405378
param = dsl.Parameter(name='std', choices=['c++03', 'c++11'], type=str, default='c++03', help='',
406-
feature=lambda std: dsl.Feature(name=std))
407-
param.getFeature(self.config, self.litConfig.params).enableIn(self.config)
379+
actions=lambda std: [dsl.AddFeature(std)])
380+
for a in param.getActions(self.config, self.litConfig.params):
381+
a.applyTo(self.config)
408382
self.assertIn('c++11', self.config.available_features)
409383
self.assertNotIn('c++03', self.config.available_features)
410384

@@ -413,42 +387,45 @@ def test_value_provided_in_config_and_on_command_line(self):
413387
self.config.std = 'c++11'
414388
self.litConfig.params['std'] = 'c++03'
415389
param = dsl.Parameter(name='std', choices=['c++03', 'c++11'], type=str, help='',
416-
feature=lambda std: dsl.Feature(name=std))
417-
param.getFeature(self.config, self.litConfig.params).enableIn(self.config)
390+
actions=lambda std: [dsl.AddFeature(std)])
391+
for a in param.getActions(self.config, self.litConfig.params):
392+
a.applyTo(self.config)
418393
self.assertIn('c++03', self.config.available_features)
419394
self.assertNotIn('c++11', self.config.available_features)
420395

421-
def test_feature_is_None(self):
396+
def test_no_actions(self):
422397
self.litConfig.params['std'] = 'c++03'
423398
param = dsl.Parameter(name='std', choices=['c++03'], type=str, help='',
424-
feature=lambda _: None)
425-
feature = param.getFeature(self.config, self.litConfig.params)
426-
self.assertIsNone(feature)
399+
actions=lambda _: [])
400+
actions = param.getActions(self.config, self.litConfig.params)
401+
self.assertEqual(actions, [])
427402

428403
def test_boolean_value_parsed_from_trueish_string_parameter(self):
429404
self.litConfig.params['enable_exceptions'] = "True"
430405
param = dsl.Parameter(name='enable_exceptions', choices=[True, False], type=bool, help='',
431-
feature=lambda exceptions: None if exceptions else ValueError())
432-
self.assertIsNone(param.getFeature(self.config, self.litConfig.params))
406+
actions=lambda exceptions: [] if exceptions else _throw())
407+
self.assertEqual(param.getActions(self.config, self.litConfig.params), [])
433408

434409
def test_boolean_value_from_true_boolean_parameter(self):
435410
self.litConfig.params['enable_exceptions'] = True
436411
param = dsl.Parameter(name='enable_exceptions', choices=[True, False], type=bool, help='',
437-
feature=lambda exceptions: None if exceptions else ValueError())
438-
self.assertIsNone(param.getFeature(self.config, self.litConfig.params))
412+
actions=lambda exceptions: [] if exceptions else _throw())
413+
self.assertEqual(param.getActions(self.config, self.litConfig.params), [])
439414

440415
def test_boolean_value_parsed_from_falseish_string_parameter(self):
441416
self.litConfig.params['enable_exceptions'] = "False"
442417
param = dsl.Parameter(name='enable_exceptions', choices=[True, False], type=bool, help='',
443-
feature=lambda exceptions: None if exceptions else dsl.Feature(name="-fno-exceptions"))
444-
param.getFeature(self.config, self.litConfig.params).enableIn(self.config)
418+
actions=lambda exceptions: [] if exceptions else [dsl.AddFeature("-fno-exceptions")])
419+
for a in param.getActions(self.config, self.litConfig.params):
420+
a.applyTo(self.config)
445421
self.assertIn('-fno-exceptions', self.config.available_features)
446422

447423
def test_boolean_value_from_false_boolean_parameter(self):
448424
self.litConfig.params['enable_exceptions'] = False
449425
param = dsl.Parameter(name='enable_exceptions', choices=[True, False], type=bool, help='',
450-
feature=lambda exceptions: None if exceptions else dsl.Feature(name="-fno-exceptions"))
451-
param.getFeature(self.config, self.litConfig.params).enableIn(self.config)
426+
actions=lambda exceptions: [] if exceptions else [dsl.AddFeature("-fno-exceptions")])
427+
for a in param.getActions(self.config, self.litConfig.params):
428+
a.applyTo(self.config)
452429
self.assertIn('-fno-exceptions', self.config.available_features)
453430

454431

0 commit comments

Comments
 (0)