From f991308e3ead38e6f23628b8dacc20cd3cf8530e Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Mon, 18 May 2020 09:25:28 -0700 Subject: [PATCH] Fix CMake invocation for 3.10 compat (#57415) The -S/-B format of specifying source and build directories wasn't added until 3.13. For 3.10 compatibility, use the older form of having the working directory as the build directory, and the last argument as the source directory. Fixes #57409 --- .../lib/src/linux/build_linux.dart | 8 +- .../hermetic/build_linux_test.dart | 89 ++++++++++--------- 2 files changed, 53 insertions(+), 44 deletions(-) diff --git a/packages/flutter_tools/lib/src/linux/build_linux.dart b/packages/flutter_tools/lib/src/linux/build_linux.dart index a82399945a2..d24c4fd82c9 100644 --- a/packages/flutter_tools/lib/src/linux/build_linux.dart +++ b/packages/flutter_tools/lib/src/linux/build_linux.dart @@ -81,20 +81,20 @@ Future buildLinux( Future _runCmake(String buildModeName, Directory sourceDir, Directory buildDir) async { final Stopwatch sw = Stopwatch()..start(); + await buildDir.create(recursive: true); + final String buildFlag = toTitleCase(buildModeName); int result; try { result = await processUtils.stream( [ 'cmake', - '-S', - sourceDir.path, - '-B', - buildDir.path, '-G', 'Ninja', '-DCMAKE_BUILD_TYPE=$buildFlag', + sourceDir.path, ], + workingDirectory: buildDir.path, environment: { 'CC': 'clang', 'CXX': 'clang++' diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_linux_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_linux_test.dart index dd22f155e9f..9ad5e11815f 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_linux_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_linux_test.dart @@ -82,28 +82,38 @@ void main() { projectTemplateVersionFile.writeAsStringSync(templateVersion.toString()); } - // Returns the command list matching the build_linux call to cmake. - List cmakeCommand(String buildMode) { - return [ - 'cmake', - '-S', - '/linux', - '-B', - 'build/linux/$buildMode', - '-G', - 'Ninja', - '-DCMAKE_BUILD_TYPE=${toTitleCase(buildMode)}', - ]; + // Returns the command matching the build_linux call to cmake. + FakeCommand cmakeCommand(String buildMode, {void Function() onRun}) { + return FakeCommand( + command: [ + 'cmake', + '-G', + 'Ninja', + '-DCMAKE_BUILD_TYPE=${toTitleCase(buildMode)}', + '/linux', + ], + workingDirectory: 'build/linux/$buildMode', + onRun: onRun, + ); } - // Returns the command list matching the build_linux call to ninja. - List ninjaCommand(String buildMode) { - return [ - 'ninja', - '-C', - 'build/linux/$buildMode', - 'install', - ]; + // Returns the command matching the build_linux call to ninja. + FakeCommand ninjaCommand(String buildMode, { + Map environment, + void Function() onRun, + String stdout = '', + }) { + return FakeCommand( + command: [ + 'ninja', + '-C', + 'build/linux/$buildMode', + 'install', + ], + environment: environment, + onRun: onRun, + stdout: stdout, + ); } testUsingContext('Linux build fails when there is no linux project', () async { @@ -165,8 +175,8 @@ void main() { testUsingContext('Linux build invokes CMake and ninja, and writes temporary files', () async { final BuildCommand command = BuildCommand(); processManager = FakeProcessManager.list([ - FakeCommand(command: cmakeCommand('release')), - FakeCommand(command: ninjaCommand('release')), + cmakeCommand('release'), + ninjaCommand('release'), ]); setUpMockProjectFilesForBuild(); @@ -186,7 +196,7 @@ void main() { final BuildCommand command = BuildCommand(); setUpMockProjectFilesForBuild(); processManager = FakeProcessManager.list([ - FakeCommand(command: cmakeCommand('release'), onRun: () { + cmakeCommand('release', onRun: () { throw ArgumentError(); }), ]); @@ -205,8 +215,8 @@ void main() { final BuildCommand command = BuildCommand(); setUpMockProjectFilesForBuild(); processManager = FakeProcessManager.list([ - FakeCommand(command: cmakeCommand('release')), - FakeCommand(command: ninjaCommand('release'), onRun: () { + cmakeCommand('release'), + ninjaCommand('release', onRun: () { throw ArgumentError(); }), ]); @@ -225,10 +235,10 @@ void main() { final BuildCommand command = BuildCommand(); setUpMockProjectFilesForBuild(); processManager = FakeProcessManager.list([ - FakeCommand(command: cmakeCommand('debug')), - FakeCommand( - command: ninjaCommand('debug'), - stdout: 'STDOUT STUFF',), + cmakeCommand('debug'), + ninjaCommand('debug', + stdout: 'STDOUT STUFF', + ), ]); await createTestCommandRunner(command).run( @@ -247,9 +257,8 @@ void main() { final BuildCommand command = BuildCommand(); setUpMockProjectFilesForBuild(); processManager = FakeProcessManager.list([ - FakeCommand(command: cmakeCommand('debug')), - FakeCommand( - command: ninjaCommand('debug'), + cmakeCommand('debug'), + ninjaCommand('debug', environment: const { 'VERBOSE_SCRIPT_LOGGING': 'true' }, @@ -273,8 +282,8 @@ void main() { final BuildCommand command = BuildCommand(); setUpMockProjectFilesForBuild(); processManager = FakeProcessManager.list([ - FakeCommand(command: cmakeCommand('debug')), - FakeCommand(command: ninjaCommand('debug')), + cmakeCommand('debug'), + ninjaCommand('debug'), ]); @@ -292,8 +301,8 @@ void main() { final BuildCommand command = BuildCommand(); setUpMockProjectFilesForBuild(); processManager = FakeProcessManager.list([ - FakeCommand(command: cmakeCommand('profile')), - FakeCommand(command: ninjaCommand('profile')), + cmakeCommand('profile'), + ninjaCommand('profile'), ]); await createTestCommandRunner(command).run( @@ -310,8 +319,8 @@ void main() { final BuildCommand command = BuildCommand(); setUpMockProjectFilesForBuild(); processManager = FakeProcessManager.list([ - FakeCommand(command: cmakeCommand('release')), - FakeCommand(command: ninjaCommand('release')), + cmakeCommand('release'), + ninjaCommand('release'), ]); fileSystem.file('lib/other.dart') .createSync(recursive: true); @@ -396,8 +405,8 @@ set(BINARY_NAME "fizz_bar") final BuildCommand command = BuildCommand(); setUpMockProjectFilesForBuild(); processManager = FakeProcessManager.list([ - FakeCommand(command: cmakeCommand('release')), - FakeCommand(command: ninjaCommand('release')), + cmakeCommand('release'), + ninjaCommand('release'), ]); await createTestCommandRunner(command).run(