чт, 11 апр. 2024 г. в 19:18, Willy Tarreau <w...@1wt.eu>: > Hi all, > > after all the time where we've all been complaining about the difficulty > to adjust CFLAGS during the build, I could tackle the problem for a first > step in the right direction. > > First, let's start with a bit of history to explain the situation and why > it was bad. Originally, a trivial makefile with very simple rules and a > single object to build (haproxy.o) had just CFLAGS set to "-O2 -g" or > something like that, and that was perfect. It was possible to just pass a > different CFLAGS value on the "make" command line and be done with it. > > Options started to pile up, but in a way that remained manageable for a > long time (e.g. add PCRE support, later dlmalloc), so CFLAGS was still the > only thing to override if needed. With 32/64 bit variants and so on, we > started to feel the need to split those CFLAGS into multiple pieces for > more flexibility. But these pieces were still aggregated into CFLAGS so > that those used to overriding it were still happy. This situation forced > us not to break these precious CFLAGS that some users were relying on. > > And that went like this for a long time, though the definition of this > CFLAGS variable became more and more complicated by inheriting from some > automatic options. For example, in 3.0-dev7, CFLAGS is initialized to > "$(ARCH_FLAGS) $(CPU_CFLAGS) $(DEBUG_CFLAGS) $(SPEC_CFLAGS)", i.e. it > concatenates 4 variables (in apparence). The 4th one (SPEC_CFLAGS) is > already a concatenation of a fixed one (WARN_CFLAGS) and a series of > automatically detected ones (the rest of it). ARCH_FLAGS is set from a > a fixed list of presets depending on the ARCH variable, and CPU_CFLAGS > is set from a list of presets depending on the CPU variable. And the > most beautiful is that CFLAGS alone is no longer sufficient since some > of the USE_* options append their own values behind it, and we complete > with $(TARGET_CFLAGS) $(SMALL_OPTS) $(DEFINE). > > Yeah I know that's ugly. We all know it. Whenever someone asks me "how can > I enable -fsanitize=address because I'd like to run ASAN", I respond "hmmm > it depends what options you already use and which ones area easiest to > hack". > > Some distros simply found that stuffing their regular CFLAGS into > DEBUG_CFLAGS or CPU_CFLAGS does the trick most of the time. Others use > other combinations depending on the tricks they figured. > > After this analysis, I figured that we needed to simplify all this, get > back to what is more natural to use or more commonly found, without > breaking everything for everyone. What is certain however in the current > situation, is that nobody is overriding CFLAGS since it's too rich, too > complex and too unpredictable. So it was really time to reset it. > > Thus here's what was done: > - CFLAGS is now empty by default and can be passed some build options > that are appended at the end of the automatic flags. This means that > -Os, -ggdb3, -Wfoobar, -Wno-foobar, -I../secret-place/include etc > will properly be honored without having to trick anything anymore. > Thus for package maintainers, building with CFLAGS="$DISTRO_CFLAGS" > should just get the work done. > > - LDFLAGS is now empty by default and can be passed some build options > that are prepended to the list of linker options. > > - ARCH_FLAGS now defaults to -g and is passed to both the compiler and > the linker. It may be overridden to change the word size (-m32/-m64), > enable alternate debugging formats (-ggdb3), enable LTO (-flto), > ASAN (-fsanitize=address) etc. It's in fact for flags that must be > consistent between the compiler and the linker. It was not renamed > since it was already there and used quite a bit already. > > - CPU_CFLAGS was preserved for ease of porting but is empty by default. > Some may find it convenient to pass their -march, -mtune etc there. > > - CPU and ARCH are gone. Let's face it, only 2 of them were usable and > no single maintainer will be crazy enough to use these options here > and resort to another approach for other archs. However the previous > values are mentioned in the doc as a hint about what's known to work > well. > > - OPT_CFLAGS was created with "-O2" and nothing else. As developers, > we spend our time juggling between -O2 and -O0 depending on whether > we're testing or debugging. Some embedded distros also have options > to pass -O2 or -Os to choose between fast and small, and that may > fit very well there. > > - STD_CFLAGS contains a few flags related to standards compliance. > It is currently set to -fwrapv, -fno-strict-overflow and/or empty > depending on what the compiler prefers. It's important not to touch > it unless you know exactly what you're doing, and previously these > options used to be lost by accident when overriding other ones. > > - WARN_CFLAGS is now set to the list of warnings to be enabled. It's > discovered automatically but may be overridden without breaking the > rest. > > - NOWARN_CFLAGS is now set to the list of warnings to be disabled. It's > discovered automatically byt may also be overridden. > > - DEBUG_CFLAGS is gone. It used to only contain -g by default and was > often abused as a way to pass CFLAGS. > > - ERROR_CFLAGS contains a synthetic list of -Werror and -Wfatal-errors > depending on ERR and FAILFAST. It may easily be overridden if desired > though I don't see much value in doing this. > > - the rest is unchanged for now. > > This means that now one can simply produce a smaller build this way: > > $ make -j$(nproc) TARGET=linux-glibc CFLAGS=-Os > > In practice it will emit "-O2 ... -Os" but that's fine and very common. > A cleaner method if your build system already has this option alone is: > > $ make -j$(nproc) TARGET=linux-glibc OPT_CFLAGS=-Os > > Those who have a collection of flags to pass to gcc both at the compilation > and linking stages can use ARCH_FLAGS: > > $ distro_flags="-Og -ggdb3 -flto" > $ make -j$(nproc) TARGET=linux-glibc ARCH_FLAGS="$distro_flags" > > Those who build with an antique compiler and need to shut up some > warnings will now have a better experience: > > $ make TARGET=linux-glibc CC=gcc-4.4 CFLAGS=-fno-strict-aliasing > $ make TARGET=linux-glibc CC=gcc-4.2 WARN_CFLAGS= NOWARN_CFLAGS= > > The rest continues to work as previously (e.g. ADDINC and ADDLIB). When > the removed variables are set, the makefile automatically detects it and > emits a warning indicating where it's now recommended to set these values, > so the porting effort should remain very very low. My local scripts even > continue to work! > > There are still a few entries I'm not much decided upon at this point: > > - DEBUG continues to support passing -DDEBUG_foo and so on, but it's > technically a list of CFLAGS. Many of the developers and probably > prod users who build themselves use it. I'd be tempted to kill it > "just because I can" but I think it would be more annoying to all of > us than helpful, so I tend to think it could stay. > > - DEFINE is exactly the same, but it's used for general defines (e.g. > change some internal defaults). Technically both are interchangable. > It could be thought that DEBUG would be moved into DEFINE but again, > I sense it would cause more grief than it could help, and frankly, > overall these are not the parts that raised any complaints, so as > we use to say "if it ain't broke don't fix it". > > - CPU_CFLAGS could possibly go if everyone wants to concatenate all > their arch-specific flags into CFLAGS, but I tend to find this more > readable in build scripts, especially when cross-compiling. > > I took care of updating the CI matrix BTW and the changes were really > tiny. > > On a related topic, after a discussion with William I also performed three > minor changes: > - support USE_FOO=0 : previously, USE_FOO had to be either empty (off) > or filled with whatever to be turned on. I agree that it's sometimes > confusing and not always convenient when it gets the output from a > command (e.g. USE_FOO=$? after a test). Now the value 0 will work as > the empty string and will disable the feature. If you think that you > might have left some USE_FOO=0 to enable FOO in your scripts, please > double-check them. > > - emit a warning when writing USE_FOOBRA=1 while it was supposed to be > USE_FOOBAR=1. It happened to all of us quite a few times already, > particularly with USE_QUIC_OPENSSL_COMPAT which has enough words to > permit a reversal. Now if a USE_something variable is passed and is > not known, a warning will just mention that it is ignored. This is > really helpful IMHO as it saves debugging time. > > - the warning options are no longer reported in "haproxy -vv". That was > totally pointless (since automatically detected, and not affecting > the resulting code) and it was polluting the output making it more > difficult to spot the important options. However, they're reported > on their own lines in the output of the less known "make opts". > > William suggested that the warning on the misspelled USE_foo could be > backported since it's not much intrusive and helps spot manipulation > problems. I'm definitely open to this. > > I'm interested in hearing about comments, questions or even complaints > from package maintainers, developers, and generally speaking all those > who build a lot from sources. We can still adjust certain things if there > are good ideas or if I suppressed something that was important for someone. > Please let me know. >
do you know maybe how this was supposed to work ? haproxy/Makefile at master · haproxy/haproxy (github.com) <https://github.com/haproxy/haproxy/blob/master/Makefile#L499> I had to enable atomic explicitly despite it was supposed to be detected on the fly (I haven't had a deeper look yet) haproxy/.github/workflows/fedora-rawhide.yml at master · haproxy/haproxy <https://github.com/haproxy/haproxy/blob/master/.github/workflows/fedora-rawhide.yml#L17-L18> > > Thanks, > Willy > >