On Thu, Jul 25, 2024 at 1:36 AM Dmitry Goncharov <dgoncha...@users.sf.net> wrote: > > On Wed, Jul 24, 2024 at 5:46 AM Masahiro Yamada <masahi...@kernel.org> wrote: > > > Of course, it does not work since MAKECMDGOALS is read-only. > Well, it is possible to assign a new value to makecmdgoals. i guess, > you mean that make proceeds to build the target specified on the > command line, regardless.
Right. The manual says the following: MAKECMDGOALS The targets given to make on the command line. Setting this variable has no effect on the operation of make. > > > If recursion is allowed, the following might work, but > > i agree with "but". Make has a certain user interface and when the > user specified x.a, i prefer a makefile that builds x.a. Attempts to > override users choice are misleading. > Somebody else reads the build log and cannot figure out why x.b was > build, even though x.a was specified. And then another user inherits > this env var accidentally and cannot figure out why x.b is getting > build when they say x.a. And most users don't know the clever trick > that turns x.a to x.b. Etc. > > Why don't you have the user specify x.b when they need x.b? > If a shell program calls make, then the same logic applies, the shell > program can look at the env variable and specify x.a or x.b. > > regards, Dmitry My motivation is to improve the kernel build system (Kbuild). I had this commit in my mind: https://github.com/torvalds/linux/commit/d7c6ea024c08bbdb799768f51ffd9fdd6236d190 Kbuild is somewhat complex. So, let me explain a slightly simplified version. A device tree binary (%.dtb) is compiled from a device tree source (%.dts). When the CHECK_DTB flag is set, some additional test (schema check) must be executed. A straightforward rule to achieve this will look like this: %.dtb: %.dts [ compile the device tree ] ifdef CHECK_DTB [ check the schema ] endif However, when the schema check command is changed, we need to re-run the schema check. (this is what commit d7c6ea024c08 achieved) I do not want to re-compile %.dtb when the schema check command is changed because "compiling %.dtb" and "testing %.dtb" are two different things. Decoupling them works well: %.dtb: %.dts [ compile the device tree ] .%.dtb.checked: %.dtb [ check the schema ] touch $@ A new timestamp file, .%.dtb.checked has been introduced here because I want to run the schema check just once, unless the schema check command is changed. You could do "make .foo.dtb.check" to compile foo.dtb, followed by the schema checking. I do not want to expose the presence of the timestamp file, as it is an internal implementation detail (and that is why I added '.' prefix to make it a hidden file). The behavior I would hope to see is: "make foo.dtb bar.dtb" -> Generate foo.dtb and bar.dtb "make foo.dtb bar.dtb CHECK_DTB=y" -> Generate foo.dtb and bar.dtb Their schema is also checked. However, as I said in the initial email, the following code does not work. ifdef CHECK_DTB MAKECMDGOALS := $(patsubst %.dtb, .%.dtb.checked, $(MAKECMDGOALS)) endif I think the above description answered others. .%.dtb.checked must be executed after %.dtb, not before. It is not so simple as adding $(a_prereq). Anyway, I understand there is no simple solution for this. Thank you. -- Best Regards Masahiro Yamada