Hello,

This patch adds an option --build-depend that, when called; installs the
packages listed in the build-depends property of setup.ini. It is for
someone who wants to build the binaries of a package themselves, enabling
them to pass one stringed package in lieu of a vector of packages.

Right now this is more or less a rough draft as feedback requested i.e.
what's the best way to implement this, and to get specific detailed
hand-holding help on two things (unless better approach):
 1. Using the correct setup.ini file (debugged using copy of setup.ini) and
    passing it as a string to the "stream" parameter of build_depend(), which
    is declared as:
    - std::string build_depend(std::string pkg_search, std::string stream)
    in build_depends.h.

 2. Convert and handle successful output of build_depend(), passing it to
    "PackageOption" in package_meta.cc (unless better way) as a vector as
    if the output from build_depend() was passed to -P, --packages.

Currently only the results are output to the Cygwin terminal, but from
the several
commands I've tested (see bottom); the output seems good. The process I have
in mind is:
   I. --build-depend <package> == true
  II. <package> is searched in setup.ini
 III. if <package> found and has "build-depends" property, then send an array
      of packages to be used by -P, --packages, else some not found message.

So essentially if, e.g.
`setup -q --build-depend cxsparse-debuginfo`,
then the process will run as if,
`setup -q -P 
cmake,cygport,gcc-fortran,liblapack-devel,libmetis-devel,libopenblas,libsuitesparseconfig-devel,pkg-config`
were called. But I'm not sure if this is the best approach.

If it is, though; then what remains:
 1. Correct use of setup.ini, converting identified file to string so
it can be passed
     to build_depend().
 2. Convert build_depend() output to vector and use that to create
    "PackageOption" class.

Additional Quasi-JSON Info:
{
  syntax: setup [-q] --build-depend <package>,
  example:
 """"""""""""""""""""""""
 * # PASS or has build-depend property
 * ######
 * $ ./setup -q --build-depend cxsparse-debuginfo
 * build-depends:
cmake,cygport,gcc-fortran,liblapack-devel,libmetis-devel,libopenblas,libsuitesparseconfig-devel,pkg-config
 * Starting cygwin install, version 2.934-4-g9f595e-dirty
 * User has backup/restore rights
 * User has symlink creation right
 * Current Directory: C:\Users\name
 * root: C:\cygwin64 user
 * Changing gid back to original
 * Selected local directory: C:\Users\name
 * net: Preconfig
 * Segmentation fault
 *
 * # FAIL or does not have build-depend property
 * ######
 * $ ./setup -q --build-depend autossh
 * build-depends: no
 * Starting cygwin install, ...
 * ...
 * Segmentation fault
 """"""""""""""""""""""""
 """"""""""""""""""""""""
  terminals: {
   // NOTE - outputs    = build-depends: package1,package2,.. was
parsed by terminal.
  //               no output = nothing broke, but build-depends did not output.
   cygwin: outputs,
   Windows: no output,
   wsl(Ubuntu): no output
  }
  packages-tested: {
   pass: [ automake, automake1.13, autoconf, curl, cxsparse-debuginfo, cygwin,
           gawk, gvim, make, nano, vim, vim-cmake ],
   // NOTE - fail = no build-depends property, returning "build-depends: no".
   fail: [ autossh, awk, cat, cvs, cxsparse, fzf-vim, ls,
           (an assorment of special characters i.e. cxsparse-de*),
           (an assortment of misspellings i.e. nanoo) ],
  },
  optional-parameter: false, so:
  > setup --build-depend
  > Error during option processing
  > # then command help() outputs.
}

---
>From 3ad9c8d346f90ce22408b97c2effb4cb5225e1bd Mon Sep 17 00:00:00 2001
From: John Haugabook <[email protected]>
Date: Wed, 16 Jul 2025 22:51:09 +0100
Subject: [PATCH setup] add --build-depend option

add --build-depend option initial debugging

add --build-depend option
---
 Makefile.am      |  2 ++
 build_depends.cc | 92 ++++++++++++++++++++++++++++++++++++++++++++++++
 build_depends.h  | 24 +++++++++++++
 main.cc          |  8 ++++-
 res/en/res.rc    |  1 +
 resource.h       |  1 +
 6 files changed, 127 insertions(+), 1 deletion(-)
 create mode 100644 build_depends.cc
 create mode 100644 build_depends.h

diff --git a/Makefile.am b/Makefile.am
index 4046d37..daf1609 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -136,6 +136,8 @@ endif
  archive_tar.cc \
  archive_tar.h \
  archive_tar_file.cc \
+ build_depends.h \
+ build_depends.cc \
  choose.cc \
  choose.h \
  compactos.cc \
diff --git a/build_depends.cc b/build_depends.cc
new file mode 100644
index 0000000..6829f2c
--- /dev/null
+++ b/build_depends.cc
@@ -0,0 +1,92 @@
+/*
+ *     This program is free software; you can redistribute it and/or modify
+ *     it under the terms of the GNU General Public License as published by
+ *     the Free Software Foundation; either version 2 of the License, or
+ *     (at your option) any later version.
+ *
+ *     A copy of the GNU General Public License can be found at
+ *     http://www.gnu.org/
+ *
+ */
+
+
+#include <fstream>
+#include <algorithm>
+#include <iostream>
+#include <string>
+#include <sstream>
+#include <cstdio>
+
+#include "io_stream.h"
+#include "ini.h"
+#include "resource.h"
+
+
+std::string
+build_depend(std::string pkg_search, std::string stream)
+{
+  // Use option passed as argument.
+  std::string target_pkg = pkg_search;
+
+  // Mark and property for identifying package and extracting value.
+  std::string pkg_marker = "@";
+  std::string key = "build-depends:";
+
+  std::string depend_packages; // for final output
+  // NEXT
+  //std::ifstream infile("setup.ini");
+  std::ifstream infile(stream);
+
+  // Ensure setup.ini was identified
+  if (!infile) {
+    depend_packages = "Error opening setup.ini";
+  }
+
+  // Start process of reading setup.
+  std::string line;
+  bool inPkg = false;
+  //io_stream *infile = stream;
+  while (std::getline(infile, line)) {
+    std::istringstream iss(line);
+    std::string first, second;
+    iss >> first >> second;
+
+    // For each pkg_marker check if name matches option.
+    if (first == pkg_marker)
+    {
+      if (second == target_pkg)
+      {
+        // Package found, handle next lines accordingly.
+        inPkg = true;
+        continue;
+      }
+      else
+      {
+        inPkg = false;
+        continue;
+      }
+    }
+
+    // If package found and hsa property build-depends.
+    if (inPkg && line.find(key) == 0) {
+      /* Extract by property length, then remove space character
+      using ASCII encoding. */
+      std::string depend_packages = line.substr(key.size());
+      replace(depend_packages.begin(), depend_packages.end(), 32, 00);
+
+      // NEXT
+      // Output to PackageOption.
+      return "build-depends: " + depend_packages;
+      break;
+    } else {
+     continue;
+    }
+  }
+
+  // Output if no package.
+  if (inPkg == false)
+  {
+    return "build-depends: no";
+  }
+  return 0;
+}
diff --git a/build_depends.h b/build_depends.h
new file mode 100644
index 0000000..eec9921
--- /dev/null
+++ b/build_depends.h
@@ -0,0 +1,24 @@
+/*
+ *     This program is free software; you can redistribute it and/or modify
+ *     it under the terms of the GNU General Public License as published by
+ *     the Free Software Foundation; either version 2 of the License, or
+ *     (at your option) any later version.
+ *
+ *     A copy of the GNU General Public License can be found at
+ *     http://www.gnu.org/
+ *
+ */
+
+#ifndef USE_BUILD_DEPENDS_H
+#define USE_BUILD_DEPENDS_H
+
+#include "getopt++/StringOption.h"
+#include "resource.h"
+
+// Create option class.
+StringOption BuildDependsOption ("", '\0', "build-depend",
IDS_HELPTEXT_BUILD_DEPENDS, false);
+
+// Forward declare function for use.
+std::string build_depend(std::string pkg_search, std::string stream);
+
+#endif /* USE_BUILD_DEPENDS_H */
diff --git a/main.cc b/main.cc
index 91d0eca..45e456f 100644
--- a/main.cc
+++ b/main.cc
@@ -42,6 +42,7 @@
 #include "mount.h"
 #include "LogFile.h"
 #include "setup_version.h"
+#include "build_depends.h"

 #include "proppage.h"
 #include "propsheet.h"
@@ -300,7 +301,12 @@ WinMain (HINSTANCE h,
     std::string elevate_extra_args;

     if (unattended_mode || output_only || !elevate)
-      set_cout ();
+    {
+      std::string build_depends_options = BuildDependsOption;
+       if (build_depends_options.length() > 1)
+           std::cout << build_depend(build_depends_options,
"setup.ini") << std::endl;
+      set_cout();
+    }

     /* Start logging only if we don't elevate.  Same for setting default
        security settings. */
diff --git a/res/en/res.rc b/res/en/res.rc
index 0bdd4c7..d8b2298 100644
--- a/res/en/res.rc
+++ b/res/en/res.rc
@@ -656,6 +656,7 @@ BEGIN
     IDS_HELPTEXT_ALLOW_UNSUPPORTED_WINDOWS "Allow old, unsupported
Windows versions"
     IDS_HELPTEXT_ARCH "Architecture to install (x86_64 or x86)"
     IDS_HELPTEXT_CATEGORIES "Specify categories to install"
+    IDS_HELPTEXT_BUILD_DEPENDS "Install the build requirements of a package"
     IDS_HELPTEXT_COMPACTOS "Compress installed files with Compact OS
(xpress4k, xpress8k, xpress16k, lzx)"
     IDS_HELPTEXT_DELETE_ORPHANS "Remove orphaned packages"
     IDS_HELPTEXT_DISABLE_ANTIVIRUS "Disable known or suspected buggy
anti virus software packages during execution"
diff --git a/resource.h b/resource.h
index a08489c..11fef73 100644
--- a/resource.h
+++ b/resource.h
@@ -158,6 +158,7 @@
 #define IDS_HELPTEXT_HEADER              1546
 #define IDS_HELPTEXT_FOOTER              1547
 #define IDS_HELPTEXT_NO_WRITE_REGISTRY   1548
+#define IDS_HELPTEXT_BUILD_DEPENDS       1549

 // Dialogs

-- 
2.49.0.windows.1


Take Care,

John Haugabook

Attachment: add-build-depend-option.patch
Description: Binary data

Reply via email to