Paul Smith wrote in <898afb17671ea69f18ae7a4ed22a57aa35eb87e0.ca...@gnu.org>: |On Sat, 2020-12-19 at 00:04 +0100, Steffen Nurpmeso wrote: |> While finding a way to truly detect whether being run by BSD make |> (which cannot supervise a shell script that turns on "set -m" to |> monitors its childs) i stumbled upon the fact that |> |> $ make -p |> |> exits 2. | |Yes. The manual says specifically: | |> Print the data base (rules and variable values) that results from |> reading the makefiles; then EXECUTE AS USUAL OR AS OTHERWISE |> SPECIFIED. | |(emphasis added). If you examine the output you'll see that you got an |error: | | make: *** No targets specified and no makefile found. Stop. | |and the manual says: | |> 2 |> The exit status is two if make encounters any errors. It will print |> messages describing the particular errors. | |so this is as expected.
Oh. I see, sorry for the noise then! |I guess there is some issue with the documentation here since the error |message is actually shown before the database is printed while the |documentation implies that the database will be printed first. | |> Even if i follow the manual advice |> |> $ make -p -f /dev/null |> |> i get complains (bad manual advice!), | |I don't see why it's bad advice. The advice doesn't say that it will |run with a 0 exit code, it just says that if you want to see the |default targets, without any targets defined by your makefile, you can |try using "-f /dev/null". | |> $ echo all: > y.mk; make -p -f y.mk | |You don't need to make a file: you can do something like this: | | $ echo 'all:;' | make -p -f- Yes, thanks. But no, the test is solely to find out whether we run running BSD make, which has no -p (yet, but he sounds as if that remains), but he says i should watch out for .PARSEDIR, so i end up doing case "${JOBMON}" in [yY]*) # BSD make cannot monitor shells which monitor i= ( ${MAKE} -p ) >/dev/null 2>&1 if [ ${?} -ne 0 ]; then ${cat} > .t.mk.mon <<'_EOT' all: @printf '' ifdef .PARSEDIR .if defined(.PARSEDIR) @echo yes .endif endif _EOT i=`${MAKE} -f .t.mk.mon 2>/dev/null` if [ ${?} -ne 0 ] || [ -n "${i}" ]; then i="${MAKE} cannot supervise sh(1)ells with" fi fi if [ -z "${i}" ] && (set -m >/dev/null 2>&1); then JOBMON=y else [ -z "${i}" ] && i="${SHELL} does not support" echo >&2 ${i}" \"set -m[onitor]\"!" echo >&2 'Failing (hanging) tests could leave stale processes around!' JOBMON= fi ;; *) JOBMON= ;; esac Maybe i am too tired and fail to see a better way, the above works as desired for GNU make, Schily make, SunOS 5.9 and 5.10 make, and BSD make fails for -p and the ifdef, and shall it ever support the compatibility for ifdef then it will still work (until anyone implements .PARSEDIR). Thank you! And a nice weekend i wish from Germany, --steffen | |Der Kragenbaer, The moon bear, |der holt sich munter he cheerfully and one by one |einen nach dem anderen runter wa.ks himself off |(By Robert Gernhardt)