More work on bringing jpm port to functional levels.

Can now compiler jaylib quickly and bootstrap.
This commit is contained in:
Calvin Rose 2021-06-14 14:49:14 -05:00
parent f198071964
commit baf7be1e52
10 changed files with 126 additions and 63 deletions

4
jpm
View File

@ -1065,7 +1065,7 @@ int main(int argc, const char **argv) {
:prefix can optionally be given to modify the destination path to be :prefix can optionally be given to modify the destination path to be
(string JANET_PATH prefix source)." (string JANET_PATH prefix source)."
[&keys {:source sources :prefix prefix}] [&keys {:source sources :prefix prefix}]
(def path (string (dyn :modpath JANET_MODPATH) (or prefix ""))) (def path (string (dyn :modpath JANET_MODPATH) "/" (or prefix "")))
(if (bytes? sources) (if (bytes? sources)
(install-rule sources path) (install-rule sources path)
(each s sources (each s sources
@ -1075,7 +1075,7 @@ int main(int argc, const char **argv) {
"Declare headers for a library installation. Installed headers can be used by other native "Declare headers for a library installation. Installed headers can be used by other native
libraries." libraries."
[&keys {:headers headers :prefix prefix}] [&keys {:headers headers :prefix prefix}]
(def path (string (dyn :modpath JANET_MODPATH) (or prefix ""))) (def path (string (dyn :modpath JANET_MODPATH) "/" (or prefix "")))
(if (bytes? headers) (if (bytes? headers)
(install-rule headers path) (install-rule headers path)
(each h headers (each h headers

View File

@ -70,7 +70,7 @@
(def defines [;(make-defines (opt opts :defines {})) ;entry-defines]) (def defines [;(make-defines (opt opts :defines {})) ;entry-defines])
(def headers (or (opts :headers) [])) (def headers (or (opts :headers) []))
(rule dest [src ;headers] (rule dest [src ;headers]
(print "compiling " src " to " dest "...") (unless (dyn:verbose) (print "compiling " src " to " dest "..."))
(create-dirs dest) (create-dirs dest)
(if (dyn :is-msvc) (if (dyn :is-msvc)
(shell cc ;defines "/c" ;cflags (string "/Fo" dest) src) (shell cc ;defines "/c" ;cflags (string "/Fo" dest) src)
@ -89,7 +89,7 @@
(def dep-importlibs (seq [x :in deplibs] (string (dyn:modpath) "/" x ".lib"))) (def dep-importlibs (seq [x :in deplibs] (string (dyn:modpath) "/" x ".lib")))
(def ldflags [;(opt opts :ldflags []) ;dep-ldflags]) (def ldflags [;(opt opts :ldflags []) ;dep-ldflags])
(rule target objects (rule target objects
(print "linking " target "...") (unless (dyn:verbose) (print "linking " target "..."))
(create-dirs target) (create-dirs target)
(if (dyn :is-msvc) (if (dyn :is-msvc)
(shell linker ;ldflags (string "/OUT:" target) ;objects (shell linker ;ldflags (string "/OUT:" target) ;objects
@ -101,7 +101,7 @@
[opts target & objects] [opts target & objects]
(def ar (opt opts :ar)) (def ar (opt opts :ar))
(rule target objects (rule target objects
(print "creating static library " target "...") (unless (dyn:verbose) (print "creating static library " target "..."))
(create-dirs target) (create-dirs target)
(if (dyn :is-msvc) (if (dyn :is-msvc)
(shell ar "/nologo" (string "/out:" target) ;objects) (shell ar "/nologo" (string "/out:" target) ;objects)

View File

@ -55,9 +55,9 @@
(setdyn :lflags @[]) (setdyn :lflags @[])
(setdyn :ldflags @[]) (setdyn :ldflags @[])
(setdyn :cflags @["-std=c99" "-Wall" "-Wextra"]) (setdyn :cflags @["-std=c99" "-Wall" "-Wextra"])
(setdyn :cppflags @["-std=c99" "-Wall" "-Wextra"]) (setdyn :cppflags @["-std=c++11" "-Wall" "-Wextra"])
(setdyn :dynamic-lflags @["-shared" "-lpthread"]) (setdyn :dynamic-lflags @["-shared" "-lpthread"])
(setdyn :dynamic-cflags @[]) (setdyn :dynamic-cflags @["-fPIC"])
(setdyn :optimize 2) (setdyn :optimize 2)
(setdyn :modext ".so") (setdyn :modext ".so")
(setdyn :statext ".a") (setdyn :statext ".a")
@ -69,23 +69,38 @@
(setdyn :jpm-env _env) (setdyn :jpm-env _env)
(setdyn :janet (dyn :executable)) (setdyn :janet (dyn :executable))
(setdyn :auto-shebang true) (setdyn :auto-shebang true)
(setdyn :workers nil)
(setdyn :verbose false)
# Get flags # Get flags
(while (< i len) (def cmdbuf @[])
(if-let [m (peg/match argpeg (args i))] (var flags-done false)
(if (= 2 (length m)) (each a args
(let [[key value] m] (cond
(setdyn (keyword key) value)) (= a "--")
(setdyn (keyword (m 0)) true)) (set flags-done true)
(break))
(++ i)) flags-done
(array/push cmdbuf a)
(if-let [m (peg/match argpeg a)]
(do
(def key (keyword (get m 0)))
(def value-parser (get config-dyns key))
(unless value-parser
(error (string "unknown cli option " key)))
(if (= 2 (length m))
(do
(def v (value-parser key (get m 1)))
(setdyn key v))
(setdyn key true)))
(array/push cmdbuf a))))
# Run subcommand # Run subcommand
(if (= i len) (if (empty? cmdbuf)
(commands/help) (commands/help)
(do (if-let [com (get commands/subcommands (first cmdbuf))]
(if-let [com (get commands/subcommands (args i))] (com ;(slice cmdbuf 1))
(com ;(tuple/slice args (+ i 1)))
(do (do
(print "invalid command " (args i)) (print "invalid command " (first cmdbuf))
(commands/help)))))) (commands/help)))))

View File

@ -9,7 +9,7 @@
(use ./cc) (use ./cc)
(use ./pm) (use ./pm)
(defn- help (defn help
[] []
(print ` (print `
usage: jpm [--key=value, --flag] ... [subcommand] [args] ... usage: jpm [--key=value, --flag] ... [subcommand] [args] ...
@ -87,10 +87,6 @@ Flags are:
(import-rules "./project.janet" no-deps) (import-rules "./project.janet" no-deps)
(do-rule rule)) (do-rule rule))
(defn show-help
[]
(print help))
(defn show-paths (defn show-paths
[] []
(print "binpath: " (dyn:binpath)) (print "binpath: " (dyn:binpath))
@ -213,7 +209,7 @@ Flags are:
(def subcommands (def subcommands
{"build" build {"build" build
"clean" clean "clean" clean
"help" show-help "help" help
"install" install "install" install
"test" test "test" test
"help" help "help" help

View File

@ -7,11 +7,44 @@
"A table of all of the dynamic config bindings." "A table of all of the dynamic config bindings."
@{}) @{})
(defn- parse-boolean
[kw x]
(case (string/ascii-lower x)
"f" false
"0" false
"false" false
"off" false
"no" false
"t" true
"1" true
"on" true
"yes" true
"true" true
(errorf "option :%s, unknown boolean option %s" kw x)))
(defn- parse-integer
[kw x]
(if-let [n (scan-number x)]
(if (not= n (math/floor n))
(errorf "option :%s, expected integer, got %v" kw x)
n)
(errorf "option :%s, expected integer, got %v" kw x)))
(defn- parse-string
[kw x]
x)
(def- config-parsers
"A table of all of the option parsers."
@{:int parse-integer
:string parse-string
:boolean parse-boolean})
(defmacro defdyn (defmacro defdyn
"Define a function that wraps (dyn :keyword). This will "Define a function that wraps (dyn :keyword). This will
allow use of dynamic bindings with static runtime checks." allow use of dynamic bindings with static runtime checks."
[kw & meta] [kw parser & meta]
(put config-dyns kw true) (put config-dyns kw (get config-parsers parser))
(let [s (symbol "dyn:" kw)] (let [s (symbol "dyn:" kw)]
~(defn ,s ,;meta [&opt dflt] ~(defn ,s ,;meta [&opt dflt]
(def x (,dyn ,kw dflt)) (def x (,dyn ,kw dflt))
@ -29,33 +62,36 @@
ret) ret)
# All jpm settings. # All jpm settings.
(defdyn :ar) (defdyn :ar :string)
(defdyn :auto-shebang) (defdyn :auto-shebang :string)
(defdyn :binpath) (defdyn :binpath :string)
(defdyn :c++) (defdyn :c++ :string)
(defdyn :c++-link) (defdyn :c++-link :string)
(defdyn :cc) (defdyn :cc :string)
(defdyn :cc-link) (defdyn :cc-link :string)
(defdyn :cflags) (defdyn :cflags nil)
(defdyn :cppflags) (defdyn :cppflags nil)
(defdyn :dynamic-cflags) (defdyn :dynamic-cflags nil)
(defdyn :dynamic-lflags) (defdyn :dynamic-lflags nil)
(defdyn :gitpath) (defdyn :gitpath :string)
(defdyn :headerpath) (defdyn :headerpath :string)
(defdyn :is-msvc) (defdyn :is-msvc :boolean)
(defdyn :janet) (defdyn :janet :string)
(defdyn :janet-cflags) (defdyn :janet-cflags nil)
(defdyn :janet-ldflags) (defdyn :janet-ldflags nil)
(defdyn :janet-lflags) (defdyn :janet-lflags nil)
(defdyn :ldflags) (defdyn :ldflags nil)
(defdyn :lflags) (defdyn :lflags nil)
(defdyn :libjanet) (defdyn :libjanet :string)
(defdyn :libpath) (defdyn :libpath :string)
(defdyn :modext) (defdyn :modext nil)
(defdyn :modpath) (defdyn :modpath :string)
(defdyn :offline) (defdyn :offline :boolean)
(defdyn :optimize) (defdyn :optimize :int)
(defdyn :pkglist) (defdyn :pkglist :string)
(defdyn :statext) (defdyn :silent :boolean)
(defdyn :syspath) (defdyn :statext nil)
(defdyn :use-batch-shell) (defdyn :syspath nil)
(defdyn :use-batch-shell :boolean)
(defdyn :verbose :boolean)
(defdyn :workers :int)

View File

@ -45,6 +45,7 @@
(if (seen node) (break)) (if (seen node) (break))
(put seen node true) (put seen node true)
(def depends-on (get dag node [])) (def depends-on (get dag node []))
(put dep-counts node (length depends-on))
(if (empty? depends-on) (if (empty? depends-on)
(ev/give q node)) (ev/give q node))
(each r depends-on (each r depends-on

View File

@ -94,6 +94,7 @@
(array/push sobjects o-src) (array/push sobjects o-src)
# Buffer c-src is already declared by dynamic module # Buffer c-src is already declared by dynamic module
(compile-c :cc opts c-src o-src true))) (compile-c :cc opts c-src o-src true)))
(archive-c opts sname ;sobjects) (archive-c opts sname ;sobjects)
(add-dep "build" sname) (add-dep "build" sname)
(install-rule sname path))) (install-rule sname path)))
@ -236,7 +237,7 @@
(task "build" []) (task "build" [])
(task "manifest" [manifest]) (task "manifest" [manifest])
(rule manifest [] (rule manifest ["uninstall"]
(print "generating " manifest "...") (print "generating " manifest "...")
(os/mkdir manifests) (os/mkdir manifests)
(def sha (pslurp (string "\"" (dyn:gitpath) "\" rev-parse HEAD"))) (def sha (pslurp (string "\"" (dyn:gitpath) "\" rev-parse HEAD")))

View File

@ -24,6 +24,11 @@
(def currenv (proto-flatten @{} (curenv))) (def currenv (proto-flatten @{} (curenv)))
(loop [k :keys currenv :when (keyword? k)] (loop [k :keys currenv :when (keyword? k)]
(put env k (currenv k))) (put env k (currenv k)))
# For compatibility reasons
(put env 'default-cflags @{:value (dyn:cflags)})
(put env 'default-lflags @{:value (dyn:lflags)})
(put env 'default-ldflags @{:value (dyn:ldflags)})
(put env 'default-cppflags @{:value (dyn:cppflags)})
env) env)
(defn require-jpm (defn require-jpm
@ -204,4 +209,4 @@
(defn do-rule (defn do-rule
"Evaluate a given rule in a one-off manner." "Evaluate a given rule in a one-off manner."
[target] [target]
(build-rules (dyn :rules) [target])) (build-rules (dyn :rules) [target] (dyn :workers)))

View File

@ -15,5 +15,6 @@
(declare-binscript (declare-binscript
:main "jpm" :main "jpm"
:hardcode-syspath false :hardcode-syspath true
:auto-shebang true
:is-janet true) :is-janet true)

View File

@ -79,12 +79,20 @@
(def path (string/join (slice segs 0 i) "/")) (def path (string/join (slice segs 0 i) "/"))
(unless (empty? path) (os/mkdir path)))) (unless (empty? path) (os/mkdir path))))
(defn devnull
[]
(os/open (if (= :windows (os/which)) "NUL" "/dev/null") :rw))
(defn shell (defn shell
"Do a shell command" "Do a shell command"
[& args] [& args]
(def args (map string args))
(if (dyn :verbose) (if (dyn :verbose)
(print ;(interpose " " args))) (print ;(interpose " " args)))
(os/execute args :px)) (if (dyn :silent)
(with [dn (devnull)]
(os/execute args :px {:out dn :err dn}))
(os/execute args :px)))
(defn copy (defn copy
"Copy a file or directory recursively from one location to another." "Copy a file or directory recursively from one location to another."