blob: 026052c4093dacd76d93beef2c1ac3e5f3869243 [file] [log] [blame]
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:meta/meta.dart';
import 'package:process/process.dart';
import '../base/io.dart';
import '../base/version.dart';
import '../doctor.dart';
/// A validator that checks for Clang and Make build dependencies
class LinuxDoctorValidator extends DoctorValidator {
LinuxDoctorValidator({
@required ProcessManager processManager,
}) : _processManager = processManager,
super('Linux toolchain - develop for Linux desktop');
final ProcessManager _processManager;
/// The minimum version of clang supported.
final Version minimumClangVersion = Version(3, 4, 0);
@override
Future<ValidationResult> validate() async {
ValidationType validationType = ValidationType.installed;
final List<ValidationMessage> messages = <ValidationMessage>[];
/// Check for a minimum version of Clang.
ProcessResult clangResult;
try {
clangResult = await _processManager.run(const <String>[
'clang++',
'--version',
]);
} on ArgumentError {
// ignore error.
}
if (clangResult == null || clangResult.exitCode != 0) {
validationType = ValidationType.missing;
messages.add(const ValidationMessage.error('clang++ is not installed'));
} else {
final String firstLine = (clangResult.stdout as String).split('\n').first.trim();
final String versionString = RegExp(r'[0-9]+\.[0-9]+\.[0-9]+').firstMatch(firstLine).group(0);
final Version version = Version.parse(versionString);
if (version >= minimumClangVersion) {
messages.add(ValidationMessage('clang++ $version'));
} else {
validationType = ValidationType.partial;
messages.add(ValidationMessage.error('clang++ $version is below minimum version of $minimumClangVersion'));
}
}
/// Check for make.
// TODO(jonahwilliams): tighten this check to include a version when we have
// a better idea about what is supported.
ProcessResult makeResult;
try {
makeResult = await _processManager.run(const <String>[
'make',
'--version',
]);
} on ArgumentError {
// ignore error.
}
if (makeResult == null || makeResult.exitCode != 0) {
validationType = ValidationType.missing;
messages.add(const ValidationMessage.error('make is not installed'));
} else {
final String firstLine = (makeResult.stdout as String).split('\n').first.trim();
messages.add(ValidationMessage(firstLine));
}
return ValidationResult(validationType, messages);
}
}