-
Notifications
You must be signed in to change notification settings - Fork 570
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
build: deduplicate makefiles #5478
Conversation
Added on commit a627071 ("intrusion detection system", 2021-07-28).
It is unclear what its intended purpose would be. Example: $ cat Makefile OBJS = a b c BINOBJS = $(foreach file, $(OBJS), $file) all: printf '"%s"\n' "$(BINOBJS)" $ make printf '"%s"\n' " ile ile ile" " ile ile ile" Added on commit 1379851 ("Baseline firejail 0.9.28", 2015-08-08).
The "all" target is usually intended to be the default one and when running make, the first target on a makefile is the one that gets built if no target is specified (such as when running `make` with no arguments). Also, note that unlike config.mk, src/common.mk may define its own targets, so move the "all" target to before the include of src/common.mk, to ensure that "all" keeps being the default target regardless of what is defined in src/common.mk. Note: If the "all" target is defined as depending directly on `$(OBJS)` while it is empty (that is, before src/common.mk is included), running `make` (or `make all`) will result in make always concluding that there is nothing to be done and exiting. So make "all" depend on an intermediary phony "lib" target instead, which in turn depends on `$(OBJS)` (and is declared after `$(OBJS)` is populated).
This should make it more consistent with the other makefiles (especially considering the subsequent deduplication commits on this branch) and enables it to depend on the variables in question (as variables in dependencies are immediately expanded, at least by default).
Instead of including it through src/common.mk. This allows each makefile to directly override any value defined in config.mk.
Compared to the objects that are actually used in a given recipe, some program targets are missing object dependencies, while others appear to have unused object dependencies. Make each of those targets depend on the objects that are actually used when linking. Note: No check was done for extraneous/missing objects when linking; this commit only makes the object dependencies equal to the objects that are linked.
To HDRS and SRCS, respectively. To be more consistent with the OBJS variable. Misc: These names also appear to be more common from the makefiles that I've seen. Commands used to search and replace: git grep -IFlz -e H_FILE_LIST -e C_FILE_LIST -- src | xargs -0 -I '{}' sh -c "printf '%s\n' \"\$(sed \ -e 's/^H_FILE_LIST *=/HDRS =/' \ -e 's/\$(H_FILE_LIST)/\$(HDRS)/g' \ -e 's/^C_FILE_LIST *=/SRCS =/' \ -e 's/\$(C_FILE_LIST:/\$(SRCS:/g' \ '{}')\" >'{}'"
Use immediate expansion of the right-hand side (with `:=`) to set the variables to the output of the commands rather than to the (text of the) commands themselves. This should prevent deferred/lazy evaluation, which is something that might potentially result in the relevant files being looked up each time that HDRS and SRCS are evaluated. Commands used to search and replace: git grep -Ilz '^SRCS' -- src | xargs -0 -I '{}' \ sh -c "printf '%s\n' \"\$(sed \ -e 's/^HDRS =/HDRS :=/' \ -e 's/^SRCS =/SRCS :=/' \ -e 's/^OBJS =/OBJS :=/' '{}')\" >'{}'"
To make the makefiles more similar. That is, add the following new variables: * MOD_HDRS * MOD_SRCS * MOD_OBJS And move existing module-specific header and object dependencies into `MOD_HDRS` and `MOD_OBJS`, respectively. `MOD_SRCS` is added mostly for symmetry/consistency. Note: Use `MOD_` as a prefix instead of `EXTRA_` to avoid confusion, as the latter is currently used for global variables (such as `EXTRA_CFLAGS`), as opposed to module-specific variables. Note2: Add them directly into the HDRS/SRCS/OBJS variables to avoid cluttering the existing recipes with an extra variables unnecessarily. This also allows, for example, referencing all of the object dependencies with `$<` if `$(OBJS)` is the first dependency (at least in GNU make). Note3: Since HDRS/SRCS/OBJS use simple assignment (through `:=`), the MOD variables should appear before including src/common.mk (or src/so.mk).
For increased readability, list one item per line on lines that are currently longer than 80 characters.
Put the main target name into a new PROG variable, put PROG into a new TARGET variable, make "all" depend on `$(TARGET)` and replace every other occurrence of the main target name with `$(PROG)`. On the makefiles that build non-shared objects, to make them more similar. With this commit, all of their targets are identical (except for the extra "lib" target on src/lib/Makefile).
The makefiles that both build C programs and include src/common.mk are nearly identical, save for the main target name and for any extra headers and objects that they might use. So move all of their (duplicated) code into src/common.mk, which (other than the "lib" target on src/lib/Makefile) leaves only variables and the includes of config.mk and src/common.mk in place.
Put the main target name into a new SO variable, put SO into a new TARGET variable, make "all" depend on `$(TARGET)` and replace every other occurrence of the main target name with `$(SO)`. On the makefiles that build shared objects, to make them more similar. With this commit, all of their targets are identical.
The following makefiles are nearly identical, except for the main target name and for any extra headers that they might use: * src/libpostexecseccomp/Makefile * src/libtrace/Makefile * src/libtracelog/Makefile So move all of their (duplicated) code into a new src/so.mk file, and add an include of src/so.mk, which leaves only variables, and the includes of config.mk and src/so.mk in place. With this commit, CFLAGS and LDFLAGS are only defined/changed in the following files: * config.mk.in * src/common.mk * src/so.mk
For clarity, as it is included by the Makefiles that create programs and non-shared-objects, but not by the ones that create shared objects (see src/so.mk). Commands used to move and search and replace: $ git mv src/common.mk src/prog.mk $ git grep -IFlz 'common.mk' -- src | xargs -0 -I '{}' sh -c \ "printf '%s\n' \"\$(sed 's/common.mk/prog.mk/' '{}')\" >'{}'"
So that includers of src/prog.mk or src/so.mk can just define anything extra that needs to be cleaned without having to override the "clean" target (or having to declare a "distclean" target). Example usage: TOCLEAN += foo TODISTCLEAN += bar
On src/prog.mk and src/so.mk.
Line-wrap them and make the order of the flags more similar across src/prog.mk and src/so.mk. This should make it easier to see the differences in CFLAGS between both files.
@reinerh commented on Nov 2, 2021:
This PR should help with that. Note: Some other planned improvements will probably depend on adding some Note2: There is more that can be done with regards to deduplication, but this |
@reinerh commented on Nov 2, 2021:
After this PR, the idea is to do things like that. For example:
For details on the latter item, see the description of CFLAGS (the relevant
|
Notes regarding extensibility/flexibility in the makefiles with this PR: Any variable used on config.mk can be extended/overridden by the includer. Any variable used on src/prog.mk or src/so.mk can be extended by the includer. Any variable used on src/prog.mk or src/so.mk other than the following
Note: I think that it would be unlikely for this to be an issue, but it should For example, if a module in src/foo needs to define extra src/foo/Makefile: ROOT = ../..
-include $(ROOT)/config.mk
PROG = foo
TARGET = $(PROG)
EXTRA_CFLAGS += -O1
EXTRA_LDFLAGS += -lm
TOCLEAN += foo.foo
TODISTCLEAN += foo.bar
include $(ROOT)/src/prog.mk Also, if a module differs too much from what is used on src/prog.mk and |
merged, thanks! |
It is unused and is unlikely to be used. Added on commit f5b1cca ("makefiles: move extra deps into new MOD vars", 2022-05-07) / PR netblue30#5478.
To make them less confusing, as they are extra dependencies, not files that are specific to the module. Commands used to search and replace: $ git grep -IFlz -e 'MOD_HDRS' -e 'MOD_OBJS' -- src | xargs -0 -I '{}' sh -c "printf '%s\n' \"\$(sed \ -e 's/MOD_HDRS/EXTRA_HDRS/g' \ -e 's/MOD_OBJS/EXTRA_OBJS/g' '{}')\" >'{}'" Added on commit f5b1cca ("makefiles: move extra deps into new MOD vars", 2022-05-07) / PR netblue30#5478.
To CLEANFILES and DISTCLEANFILES, respectively. This matches what GNU automake uses. Commands used to search and replace: $ git grep -IFlz -e TOCLEAN -e TODISTCLEAN | xargs -0 -I '{}' sh -c "printf '%s\n' \"\$(sed \ -e 's/TOCLEAN/CLEANFILES/g' \ -e 's/TODISTCLEAN/DISTCLEANFILES/g' '{}')\" >'{}'" Added on commit cbdee65 ("makefiles: add TOCLEAN and TODISTCLEAN variables", 2022-07-15) / PR netblue30#5478.
Main commits:
This is kind of a continuation of #5140 and #5219.