/* This file is part of KDDockWidgets. SPDX-FileCopyrightText: 2020-2021 Klarälvdalens Datakonsult AB, a KDAB Group company Author: Sérgio Martins SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only Contact KDAB at for commercial licensing options. */ /** * This is an helper script which simply reads CMakePresets.json and builds those * presets. It's just for quickly checking that every supported setup builds * without having to wait for CI (or in case you don't have access to KDAB CI) * * Usage: * $ dart build-all.dart [--unity] [--tests] */ import 'dart:io'; import 'dart:convert'; String s_sourceDirectory = ""; bool s_testUnityVariations = false; bool s_runTests = true; class Preset { final String name; final String buildDir; Preset.fromJson(var jsonData) : name = jsonData['name'], buildDir = jsonData['binaryDir'] { } String buildDirectory() { return buildDir.replaceAll("\${sourceDir}", s_sourceDirectory); } List cmakeConfigArguments(bool isUnityBuild) { return [ "-G", "Ninja", "-B", buildDirectory(), "-S", s_sourceDirectory, "--preset=" + name, '-DKDDockWidgets_UNITY_BUILD=${isUnityBuild ? "ON" : "OFF"}' ]; } List cmakeBuildArguments() { return ["--build", buildDirectory()]; } // Builds twice. One with unity build and one without. Future build() async { if (!await buildSingle(true)) return false; if (s_testUnityVariations) if (!await buildSingle(false)) return false; if (s_runTests && !await runTests()) { return false; } return true; } Future buildSingle(bool isUnityBuild) async { if (!await runCMake(cmakeConfigArguments(isUnityBuild))) { return false; } if (!await runCMake(cmakeBuildArguments())) { return false; } return true; } Future runTests() async { print("Running: ctest"); final savedCwd = Directory.current; Directory.current = buildDirectory(); ProcessResult result = await Process.run('ctest', ["-j8"]); Directory.current = savedCwd; if (result.exitCode != 0) { print(result.stdout); print(result.stderr); return false; } return true; } } /// Returns the contents of the CMakePresets.json file String cmakePresetsJson(presetsFile) { var file = File(presetsFile); if (!file.existsSync()) { throw Exception('Not existent file'); } return file.readAsStringSync(); } List readPresets(var presetsFile) { var presets = List(); final jsonData = jsonDecode(cmakePresetsJson(presetsFile)); for (var presetData in jsonData['configurePresets']) { presets.add(Preset.fromJson(presetData)); } return presets; } Future runCMake(var cmd) async { print("Running: cmake " + cmd.join(' ')); ProcessResult result = await Process.run('cmake', cmd); if (result.exitCode != 0) { print(result.stdout); print(result.stderr); return false; } return true; } Future main(List arguments) async { if (arguments.length == 0) { print("Usage: build-all.dart [--unity] [--tests]"); return 1; } s_sourceDirectory = arguments[0]; s_testUnityVariations = arguments.contains("--unity"); s_runTests = arguments.contains("--tests"); final presetsFile = s_sourceDirectory + '/CMakePresets.json'; if (FileSystemEntity.typeSync(presetsFile) == FileSystemEntityType.notFound) { print('ERROR: CMakePresets.json file not found in the source directory'); return 1; } var presets = readPresets(presetsFile); for (var preset in presets) { if (preset.name == 'python') continue; // TODO: blacklisted as it's not building on my setup yet if (!await preset.build()) { return 1; } } print("Success!!"); return 0; }