Closed JasonGross closed 11 months ago
I'm trying to understand why these 4 dependencies of the test
target are always run:
For typecheckExprToCString
, testStackLoop
, testStackNondet
, I think one reason is that they don't create a file with that name, so running these tests does not leave any trace of when it has been run last, so make
has to rerun it each time. An easy fix for these would probably be to have the tests create a .ok
file.
So I tried the following patch in bedrock2/Makefile
:
$(BYTEDUMP) bedrock2.ToCStringStackallocLoopTest.main_cbytes > special/stackloop.c
special/stackloop: special/stackloop.c
$(CC) -O0 special/stackloop.c -o special/stackloop
-testStackLoop: special/stackloop
- special/stackloop
+special/stackloop.ok: special/stackloop
+ special/stackloop > $@
+testStackLoop: special/stackloop.ok
special/stacknondet.c: ex
$(BYTEDUMP) bedrock2Examples.stackalloc.stacknondet_c > special/stacknondet.c
But it seems that stackloop is still rerun each time.
And I also don't understand why this code, creating special/BytedumpTest.out
, is rerun each time:
Do you understand this @JasonGross ?
ex and noex are declared PHONY, so they are considered out of date on every run. Since they are remade, all targets that list them as prerequisites are also considered out of date (much like how force is used). The solution is to make them order-only dependencies, as in special/BytedumpTest.out: special/BytedumpTest.golden.bin | noex
and special/stacknondet.c: | ex
, etc. An order only dependency is a prerequisite that does not cause a recipe to be re-run if it is out of date.
(I guess you want something like
special/stacknondet.c: bedrock2Examples.stackalloc.stacknondet_c $(BYTEDUMP) | ex
$(BYTEDUMP): | ex
to ensure that special/stacknondet.c
is remade when BYTEDUMP changes? Or you make it depend (not order-only) on whatever files it actually uses
Aah thanks for explaining me order-only prerequisites :+1:
But I'm still a bit confused, and can't resolve it using google. Let's say I have
mytarget: fileProducedBy_ex | ex
myrecipe
and running ex
might modify fileProducedBy_ex
. Now, when does make
determine whether mytarget
is out of date? I guess before running ex
? That would be unfortunate, because if ex
updates fileProducedBy_ex
, I would like mytarget
to be rebuilt -- is there a way to achieve that?
You can make ex
an order-only dependency of fileProducedBy_ex
without a recipe.
Details:
I'm not sure, but I think:
fileProducedBy_ex
does not exist and there's no explicit mention of it, make will error before trying exfileProducedBy_ex
either already exists or has a(n order-only) dependency on some other target, make mytarget
will first invoke all dependencies and order-only dependencies of mytarget
and only after completing these dependencies will it determine whether or not the rule for mytarget
should be run.That is, my mental model is:
make
walks the entire dependency chain of targets that need to be refreshed to build the dependency tree. In this step there is no difference between normal dependency and order-only dependency
make install
should not be invoking bytedump test, or at the very least the bytedump test should respect COQBINhttps://github.com/mit-plv/fiat-crypto/actions/runs/6921348406/job/18826839337?pr=1733#step:18:3326