make method

  1. @override
Future<MakeResult> make(
  1. Directory appDirectory, {
  2. required Directory outputDirectory,
  3. Map<String, dynamic>? makeArguments,
  4. void onProcessStdOut(
    1. List<int> data
    )?,
  5. void onProcessStdErr(
    1. List<int> data
    )?,
})

Implementation

@override
Future<MakeResult> make(
  Directory appDirectory, {
  required Directory outputDirectory,
  Map<String, dynamic>? makeArguments,
  void Function(List<int> data)? onProcessStdOut,
  void Function(List<int> data)? onProcessStdErr,
}) async {
  MakeDebConfig makeConfig = await loadMakeConfig(
    outputDirectory,
    makeArguments,
  ) as MakeDebConfig;

  final files = makeConfig.toFilesString();

  Directory packagingDirectory = makeConfig.packagingDirectory;

  /// Need to create following directories
  /// /DEBIAN
  /// /usr/share/$appName
  /// /usr/share/applications
  /// /usr/share/icons/hicolor/128x128/apps
  /// /usr/share/icons/hicolor/256x256/apps

  final debianDir = path.join(packagingDirectory.path, "DEBIAN");
  final applicationsDir =
      path.join(packagingDirectory.path, "usr/share/applications");
  final icon128Dir = path.join(
    packagingDirectory.path,
    "usr/share/icons/hicolor/128x128/apps",
  );
  final icon256Dir = path.join(
    packagingDirectory.path,
    "usr/share/icons/hicolor/256x256/apps",
  );
  final mkdirProcess = Process.runSync("mkdir", [
    "-p",
    debianDir,
    path.join(packagingDirectory.path, "usr/share", makeConfig.appName),
    applicationsDir,
    if (makeConfig.icon != null) ...[icon128Dir, icon256Dir],
  ]);

  if (mkdirProcess.exitCode != 0) throw MakeError();

  if (makeConfig.icon != null) {
    final iconFile = File(makeConfig.icon!);
    if (!iconFile.existsSync())
      throw MakeError("provided icon ${makeConfig.icon} path wasn't found");

    await iconFile
        .copy(path.join(icon128Dir, path.basename(makeConfig.icon!)));
    await iconFile
        .copy(path.join(icon256Dir, path.basename(makeConfig.icon!)));
  }

  // create & write the files got from makeConfig
  final controlFile = File(path.join(debianDir, "control"));
  final postinstFile = File(path.join(debianDir, "postinst"));
  final postrmFile = File(path.join(debianDir, "postrm"));
  final desktopEntryFile =
      File(path.join(applicationsDir, "${makeConfig.appName}.desktop"));

  if (!controlFile.existsSync()) controlFile.createSync();
  if (!postinstFile.existsSync()) postinstFile.createSync();
  if (!postrmFile.existsSync()) postrmFile.createSync();
  if (!desktopEntryFile.existsSync()) desktopEntryFile.createSync();

  await controlFile.writeAsString(files["CONTROL"]!);
  await desktopEntryFile.writeAsString(files["DESKTOP"]!);
  await postinstFile.writeAsString(files["postinst"]!);
  await postrmFile.writeAsString(files["postrm"]!);

  // give execution permission to shell scripts
  Process.runSync('chmod', ["+x", postinstFile.path, postrmFile.path]);

  // copy the application binary to /usr/share/$appName
  Process.runSync('cp', [
    '-fr',
    '${appDirectory.path}/.',
    '${packagingDirectory.path}/usr/share/${makeConfig.appName}/',
  ]);

  Process process = await Process.start('dpkg-deb', [
    '--build',
    '--root-owner-group',
    packagingDirectory.path,
    makeConfig.outputFile.path
  ]);

  process.stdout.listen(onProcessStdOut);
  process.stderr.listen(onProcessStdErr);

  int exitCode = await process.exitCode;
  if (exitCode != 0) {
    throw MakeError();
  }

  packagingDirectory.deleteSync(recursive: true);
  return MakeResult(makeConfig);
}