Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions src/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -526,17 +526,24 @@ endif

# These rules clean things up. 'modclean' cleans files generated by 'modules'
# (except that it doesn't remove the modules that were copied to rtlib)
# 'clean' cleans everything but dependency files, and 'depclean' cleans them
# too.
# 'clean' removes the build products (including, via 'objects', the userspace
# dependency files), and 'depclean' removes the dependency files alone.
Comment on lines +529 to +530

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"userspace" undersells it: under BUILD_SYS=uspace, which is the default, objects/ holds the realtime dependency files as well (see the inline comment below). Dropping the word would keep this sentence true for both build systems.

modclean:
find -name '.*.cmd' -or -name '*.ko' -or -name '*.mod.c' -or -name '*.mod.o' | xargs rm -f
-rm -rf .tmp_versions
find . -name .tmp_versions |xargs rm -rf
-rm -f ../rtlib/*.ko
-rm -f ../rtlib/*.so

# Realtime dependency files live in 'depends'; userspace ones sit next to
# their objects as objects/**/*.d, so both have to go. Dropping them forces
Comment on lines +538 to +539

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is only true for BUILD_SYS=normal. Under uspace the realtime dependency files land under objects/ too:

# Makefile:1292, BUILD_SYS=uspace
RTDEPS := $(sort $(RTOBJS:.o=.d))
# Makefile:1330, BUILD_SYS=normal
RTDEPS := $(sort $(patsubst objects/%.o,depends/%.d, $(RTOBJS)))

On my uspace run-in-place tree there is no depends/ directory at all, and 310 of the 533 objects/**/*.d are objects/rt*. So on the default build depclean is not partially ineffective, it is a complete no-op: it removes a directory that was never created. That is a stronger case for the patch than the description makes, and since the point of the patch is to correct a comment that was wrong, this one should be right. Suggested wording:

Suggested change
# Realtime dependency files live in 'depends'; userspace ones sit next to
# their objects as objects/**/*.d, so both have to go. Dropping them forces
# Dependency files land in two places: 'depends' for realtime under
# BUILD_SYS=normal, and beside their objects as objects/**/*.d for
# everything else, realtime included under BUILD_SYS=uspace, where
# 'depends' is never created at all. Both have to go.

The description splits the same way, counting all 535 as userspace.

# no recompilation (nothing depends on a .d existing), but it does clear
# stale prerequisites -- a dependency file naming a source that has since
# been renamed or moved otherwise aborts the build with "No rule to make
# target", and there is no way out of that short of a full 'make clean'.
depclean:
-rm -rf depends
-find objects -name '*.d' -print0 2>/dev/null | xargs -0 -r rm -f

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Worth saying in the comment why this is a find and not $(RM) $(DEPS) $(RTDEPS), because the pure-make form is the obvious suggestion and it would not fix the bug: the files that break the build are exactly the ones whose source no longer exists, so they are absent from $(DEPS). DEPS is also only defined when TRIVIAL_BUILD=no. One clause here saves a review round.


clean: genclean depclean modclean
genclean:
Expand Down