utils: Implement -j properly.
authorRichard W.M. Jones <rjones@redhat.com>
Sun, 12 Jan 2020 17:54:08 +0000 (17:54 +0000)
committerRichard W.M. Jones <rjones@redhat.com>
Sun, 12 Jan 2020 18:29:04 +0000 (18:29 +0000)
It now picks the default value from the number of cores.

Goalfile.in
Makefile.in
TODO
configure.ac
src/cmdline.ml
src/utils-c.c [new file with mode: 0644]
src/utils.ml
src/utils.mli

index 623a09d..d38e70f 100644 (file)
@@ -51,11 +51,15 @@ goal maintainer-clean = : clean {
 #----------------------------------------------------------------------
 # Build the goals tool itself.
 
+let CC = "@CC@"
+let OCAMLLIB = "@OCAMLLIB@"
 let MENHIR = "@MENHIR@"
 let OCAMLDEP = "@OCAMLDEP@"
 let OCAMLFIND = "@OCAMLFIND@"
 let OCAMLLEX = "@OCAMLLEX@"
 # XXX
+let CFLAGS = [ "-g", "-O2", "-I%OCAMLLIB", "-I." ]
+#let CFLAGS = "@CFLAGS@ -I%OCAMLLIB -I."
 let OCAMLFLAGS = [ "-g", "-safe-string", "-warn-error", "CDEFLMPSUVYZX+52-3" ]
 let OCAMLPACKAGES = [ "-package", "str,unix,threads", "-I", "src", "-thread" ]
 #let OCAMLFLAGS = "@OCAMLFLAGS@"
@@ -64,6 +68,7 @@ let OCAMLPACKAGES = [ "-package", "str,unix,threads", "-I", "src", "-thread" ]
 let objects = [
     # These must be in dependency order.
     "src/config.cmx",
+    "src/utils-c.o",
     "src/utils.cmx",
     "src/cmdline.cmx",
     "src/jobs.cmx",
@@ -79,6 +84,11 @@ let objects = [
 
 goal tool = : ocaml_link ("src/goals", objects) ;
 
+# C code.
+"src/utils-c.o" : "src/utils-c.c" {
+    %CC %CFLAGS -c %< -o %@
+}
+
 # Parser.
 "src/parser.mli", "src/parser.ml" : "src/parser.mly" {
     %MENHIR --explain %<
index 20d0a49..7fbf0de 100644 (file)
@@ -38,7 +38,8 @@ src/goals:
        echo 'val lexer_read : (Lexing.lexbuf -> token) option ref' >> src/parser.mli
        echo 'val eval_substitute : (Ast.env -> Ast.loc -> Ast.substs -> string) option ref' >> src/parser.mli
        $(OCAMLLEX) src/lexer.mll
-       $(OCAMLFIND) opt $(OCAMLFLAGS) $(OCAMLPACKAGES) -I src \
+       $(OCAMLFIND) opt $(OCAMLFLAGS) $(OCAMLPACKAGES) -I . -I src \
+           src/utils-c.c \
            $$($(OCAMLDEP) -sort src/*.mli src/*.ml) \
            -linkpkg -o $@
 
diff --git a/TODO b/TODO
index 51bd05a..992f8e3 100644 (file)
--- a/TODO
+++ b/TODO
@@ -24,6 +24,9 @@ Unclear if this would be helpful or not.
 Implement more make functions, see:
 https://www.gnu.org/software/make/manual/html_node/Functions.html#Functions
 
+Split "flags" strings.  eg. Currently there is no way to pass
+$CFLAGS from autoconf into a goalfile.
+
 Make re-execs itself if the Makefile (or any include) changes, and
 goals should do something similar.  See:
 https://www.gnu.org/software/make/manual/html_node/Remaking-Makefiles.html
index e8fd7e5..51ea721 100644 (file)
@@ -29,6 +29,10 @@ AC_PROG_CPP
 AC_C_PROTOTYPES
 test "x$U" != "x" && AC_MSG_ERROR([Compiler not ANSI compliant])
 
+dnl C headers and functions.
+AC_CHECK_HEADERS([sys/sysinfo.h])
+AC_CHECK_FUNCS([get_nprocs])
+
 dnl Check for basic OCaml environment and findlib.
 AC_PROG_OCAML
 if test "x$OCAMLC" = "xno"; then
index 0ac1ad5..f83d5eb 100644 (file)
@@ -51,7 +51,7 @@ let directory = ref "."
 let input_file = ref "Goalfile"
 let includes = ref [stdlibdir]
 let add_include dir = includes := dir :: !includes
-let nr_jobs = ref 4 (* XXX use nproc *)
+let nr_jobs = ref (nprocs ())
 let use_prelude = ref true
 
 let parse () =
@@ -59,6 +59,8 @@ let parse () =
     failwithf "%s: cannot find the standard library directory, expected %s.  If the standard library directory is in a non-standard location then set GOALS_DATADIR.  If you can trying to run goals from the build directory then use ‘./run goals ...’"
       Sys.executable_name stdlibdir;
 
+  let jobshelp =
+    sprintf "jobs Set number of parallel jobs (default: %d)" !nr_jobs in
   let argspec = [
     "-C",          Arg.Set_string directory,
                    "directory Change to directory before running";
@@ -75,9 +77,9 @@ let parse () =
     "--include",   Arg.String add_include,
                    "dir Add include directory";
     "-j",          Arg.Set_int nr_jobs,
-                   "jobs Set number of parallel jobs";
+                   jobshelp;
     "--jobs",      Arg.Set_int nr_jobs,
-                   "jobs Set number of parallel jobs";
+                   jobshelp;
     "--no-prelude",Arg.Clear use_prelude,
                    " Do not automatically use prelude.gl from stdlib";
     "-v",          Arg.Unit print_version,
diff --git a/src/utils-c.c b/src/utils-c.c
new file mode 100644 (file)
index 0000000..3c6554f
--- /dev/null
@@ -0,0 +1,45 @@
+/* Goalfile utilities
+ * Copyright (C) 2020 Richard W.M. Jones
+ * Copyright (C) 2020 Red Hat Inc.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <caml/memory.h>
+#include <caml/mlvalues.h>
+
+#ifdef HAVE_SYS_SYSINFO_H
+#include <sys/sysinfo.h>
+#endif
+
+value
+nprocs (value unitv)
+{
+  CAMLparam1 (unitv);
+  int n;
+
+#ifdef HAVE_GET_NPROCS
+  n = get_nprocs ();
+#else
+  n = 1;
+#endif
+
+  CAMLreturn (Val_int (n));
+}
index 3d1b0c5..c4722a8 100644 (file)
@@ -19,6 +19,8 @@
 
 open Printf
 
+external nprocs : unit -> int = "nprocs"
+
 let failwithf fs = ksprintf failwith fs
 
 let (//) = Filename.concat
index 1979a34..c63db29 100644 (file)
@@ -17,6 +17,9 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  *)
 
+val nprocs : unit -> int
+(** Return the number of processors on the system. *)
+
 val failwithf : ('a, unit, string, 'b) format4 -> 'a
 (** Like [failwith] but supports printf-like arguments. *)