Information for GNU Gnulib maintainers and contributors ******************************************************* Using git ========= * We don't use topic branches. Changes are usually small enough that they can be committed directly to the master branch, after appropriate testing. * We maintain stable branches, though, as described in the documentation: https://www.gnu.org/software/gnulib/manual/html_node/Stable-Branches.html When backporting a commit to a stable branch of the last year, be sure to update the copyright year of each modified file (since we don't run "make update-copyright" on the stable branches). * We update the ChangeLog by hand. The commit message is usually identical to the ChangeLog entry, with the date and author line removed, with the leading tabs removed, and with a blank line after the commit's summary line. * When you commit a contributor's patch, please - add a reasonable ChangeLog entry in the usual style (meaningful summary line and detailed change list), - if the contribution is so small that it does not require a copyright assignment (cf. https://www.gnu.org/prep/maintain/html_node/Legally-Significant.html ) add a line: Copyright-paperwork-exempt: Yes - use the 'git commit' option --author="Contributor Name " License Notices =============== In *.m4 files, use a notice like this: dnl Copyright (C) YEARS Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. In lib/, tests/, build-aux/ files, except those that are shared with glibc, use the license notices from etc/license-notices/ . This avoids gratuitous differences in wording, as well misunderstandings when a license notice would say "This program ...". Test Suite ========== When adding a module, add a unit test module as well. This is our best chance to catch portability problems. Warning Options =============== For packages that use Gnulib, we recommend to use the 'warnings' or 'manywarnings' module, as documented in https://www.gnu.org/software/gnulib/manual/html_node/warnings.html https://www.gnu.org/software/gnulib/manual/html_node/manywarnings.html When building Gnulib testdirs, e.g. when preparing a Gnulib patch, there are three possible approaches: * The simplest approach, which warns about the most common mistakes, is to use GCC's -Wall option, both for C and C++ compilation units. Just set $ ./configure CPPFLAGS="-Wall" $ make You should generally fix all compiler warnings that you see from this approach. * If you are developing on a glibc system and have GCC version 13 binaries available, here's a recipe that will find more mistakes, but is nearly as easy to use. Here, different warning options are needed for C and for C++: $ WARN_GCC13=`echo ' -fanalyzer -Wall -Warith-conversion -Wcast-align=strict -Wdate-time -Wdisabled-optimization -Wduplicated-cond -Wextra -Wformat-signedness -Winit-self -Winvalid-pch -Wlogical-op -Wmissing-include-dirs -Wopenmp-simd -Woverlength-strings -Wpacked -Wpointer-arith -Wstrict-overflow -Wsuggest-final-methods -Wsuggest-final-types -Wsync-nand -Wsystem-headers -Wtrampolines -Wuninitialized -Wunknown-pragmas -Wunsafe-loop-optimizations -Wvariadic-macros -Wvector-operation-performance -Wwrite-strings -Warray-bounds=2 -Wattribute-alias=2 -Wformat-overflow=2 -Wformat-truncation=2 -Wshift-overflow=2 -Wunused-const-variable=2 -Wvla-larger-than=4031 -Wno-empty-body -Wno-analyzer-allocation-size -Wno-analyzer-fd-double-close -Wno-analyzer-double-fclose -Wno-analyzer-double-free -Wno-analyzer-fd-leak -Wno-analyzer-fd-use-after-close -Wno-analyzer-fd-use-without-check -Wno-analyzer-free-of-non-heap -Wno-analyzer-malloc-leak -Wno-analyzer-mismatching-deallocation -Wno-analyzer-null-argument -Wno-analyzer-null-dereference -Wno-analyzer-out-of-bounds -Wno-analyzer-possible-null-argument -Wno-analyzer-possible-null-dereference -Wno-analyzer-use-after-free -Wno-analyzer-use-of-pointer-in-stale-stack-frame -Wno-analyzer-use-of-uninitialized-value -Wno-analyzer-va-arg-type-mismatch -Wno-attribute-warning -Wno-cast-align -Wno-clobbered -Wno-dangling-pointer -Wno-format -Wno-implicit-fallthrough -Wno-maybe-uninitialized -Wno-missing-field-initializers -Wno-restrict -Wno-sign-compare -Wno-switch -Wno-type-limits -Wno-unused-parameter ' | tr -d '\n' | sed -e 's/ */ /g'` $ WARN_CFLAGS_GCC13="$WARN_GCC13 -Wnested-externs -Wshadow=local -Wno-discarded-qualifiers" $ WARN_CXXFLAGS_GCC13="$WARN_GCC13 -Wno-cpp" $ ./configure CFLAGS="-O2 -g $WARN_CFLAGS_GCC13" CXXFLAGS="-O2 -g $WARN_CXXFLAGS_GCC13" $ make You should generally fix all compiler warnings that you see from this approach, or report when this approach produced a pointless warning (so that we can fix the value of WARN_GCC13 above). * If you are developing on a glibc system and have GCC version 13 binaries available: Here's a recipe that will find even more mistakes, but it requires that you are willing to filter out and ignore pointless warnings. $ WARN_GCC13=`echo ' -fanalyzer -Wall -Warith-conversion -Wcast-align=strict -Wdate-time -Wdisabled-optimization -Wduplicated-cond -Wextra -Wformat-signedness -Winit-self -Winvalid-pch -Wlogical-op -Wmissing-include-dirs -Wnull-dereference -Wopenmp-simd -Woverlength-strings -Wpacked -Wpointer-arith -Wstrict-overflow -Wsuggest-attribute=format -Wsuggest-final-methods -Wsuggest-final-types -Wsync-nand -Wsystem-headers -Wtrampolines -Wuninitialized -Wunknown-pragmas -Wunsafe-loop-optimizations -Wvariadic-macros -Wvector-operation-performance -Wwrite-strings -Warray-bounds=2 -Wattribute-alias=2 -Wformat-overflow=2 -Wformat=2 -Wformat-truncation=2 -Wimplicit-fallthrough=5 -Wshift-overflow=2 -Wunused-const-variable=2 -Wvla-larger-than=4031 -Wno-empty-body -Wno-analyzer-double-fclose -Wno-analyzer-double-free -Wno-analyzer-free-of-non-heap -Wno-analyzer-malloc-leak -Wno-analyzer-null-argument -Wno-analyzer-null-dereference -Wno-analyzer-use-after-free -Wno-attribute-warning -Wno-cast-align -Wno-clobbered -Wno-format-nonliteral -Wno-sign-compare -Wno-type-limits -Wno-unused-parameter ' | tr -d '\n' | sed -e 's/ */ /g'` $ WARN_CFLAGS_GCC13="$WARN_GCC13 -Wnested-externs -Wshadow=local" $ WARN_CXXFLAGS_GCC13="$WARN_GCC13 -Wno-cpp" $ ./configure CFLAGS="-O2 -g $WARN_CFLAGS_GCC13" CXXFLAGS="-O2 -g $WARN_CXXFLAGS_GCC13" $ make With this approach, use your own judgement whether to fix warnings arising from your new code or not. Do *not* submit patches to silence warnings from existing code: - For these warnings, often the cure will be worse than the disease. - Some of the warnings are false positives. Rather than silencing these warnings, we prefer to report them in the GCC bug tracker and wait until they are fixed in a future GCC release. Similarly, for clang version 16 you can use the following recipe, that uses selected warning options from https://releases.llvm.org/16.0.0/tools/clang/docs/DiagnosticsReference.html : $ WARN_CLANG16=`echo ' -Wall -Wanon-enum-enum-conversion -Warc-repeated-use-of-weak -Warray-bounds-pointer-arithmetic -Warray-parameter -Watomic-properties -Wbinary-literal -Wbit-int-extension -Wbitfield-enum-conversion -Wbitwise-op-parentheses -Wbool-operation -Wc++-compat -Wc2x-compat -Wc2x-extensions -Wc99-compat -Wc99-designator -Wc99-extensions -Wcalled-once-parameter -Wcast-function-type -Wchar-subscripts -Wcomment -Wcompletion-handler -Wcomplex-component-init -Wcompound-token-split -Wconsumed -Wconversion -Wcstring-format-directive -Wcuda-compat -Wdate-time -Wdelimited-escape-sequence-extension -Wdeprecated -Wdeprecated-dynamic-exception-spec -Wdeprecated-implementations -Wdeprecated-this-capture -Wdeprecated-writable-strings -Wdirect-ivar-access -Wdocumentation -Wdocumentation-deprecated-sync -Wdocumentation-html -Wdocumentation-pedantic -Wdocumentation-unknown-command -Wdollar-in-identifier-extension -Wduplicate-decl-specifier -Wduplicate-enum -Wduplicate-method-arg -Wduplicate-method-match -Wdynamic-exception-spec -Wembedded-directive -Wempty-init-stmt -Wempty-translation-unit -Wenum-compare-conditional -Wenum-conversion -Wenum-enum-conversion -Wenum-float-conversion -Wexit-time-destructors -Wexpansion-to-defined -Wexplicit-ownership-type -Wextra -Wextra-semi -Wfixed-enum-extension -Wflexible-array-extensions -Wfloat-overflow-conversion -Wfloat-zero-conversion -Wfor-loop-analysis -Wformat -Wformat-pedantic -Wformat-type-confusion -Wformat=2 -Wfour-char-constants -Wframe-address -Wfuse-ld-path -Wfuture-attribute-extensions -Wgcc-compat -Wgnu -Wgnu-anonymous-struct -Wgnu-auto-type -Wgnu-case-range -Wgnu-complex-integer -Wgnu-compound-literal-initializer -Wgnu-conditional-omitted-operand -Wgnu-designator -Wgnu-empty-initializer -Wgnu-empty-struct -Wgnu-flexible-array-initializer -Wgnu-flexible-array-union-member -Wgnu-folding-constant -Wgnu-imaginary-constant -Wgnu-label-as-value -Wgnu-line-marker -Wgnu-null-pointer-arithmetic -Wgnu-offsetof-extensions -Wgnu-pointer-arith -Wgnu-redeclared-enum -Wgnu-statement-expression -Wgnu-statement-expression-from-macro-expansion -Wgnu-union-cast -Wgnu-zero-line-directive -Wgnu-zero-variadic-macro-arguments -Wheader-hygiene -Widiomatic-parentheses -Wignored-qualifiers -Wimplicit -Wimplicit-fallthrough -Wimplicit-fallthrough-per-function -Wimplicit-function-declaration -Wimplicit-int -Wimplicit-retain-self -Wimport-preprocessor-directive-pedantic -Wincomplete-module -Winconsistent-missing-destructor-override -Winfinite-recursion -Wint-in-bool-context -Winvalid-or-nonexistent-directory -Winvalid-utf8 -Wkeyword-macro -Wlanguage-extension-token -Wlocal-type-template-args -Wlogical-op-parentheses -Wlong-long -Wloop-analysis -Wmain -Wmax-tokens -Wmethod-signatures -Wmicrosoft -Wmicrosoft-anon-tag -Wmicrosoft-charize -Wmicrosoft-comment-paste -Wmicrosoft-cpp-macro -Wmicrosoft-end-of-file -Wmicrosoft-enum-value -Wmicrosoft-exception-spec -Wmicrosoft-fixed-enum -Wmicrosoft-flexible-array -Wmicrosoft-redeclare-static -Wmisleading-indentation -Wmismatched-tags -Wmissing-braces -Wmissing-method-return-type -Wmost -Wmove -Wnested-anon-types -Wnewline-eof -Wnon-gcc -Wnon-modular-include-in-framework-module -Wnon-modular-include-in-module -Wnon-virtual-dtor -Wnonportable-system-include-path -Wnull-pointer-arithmetic -Wnull-pointer-subtraction -Wnullability-extension -Wnullable-to-nonnull-conversion -Wopenmp -Wover-aligned -Woverlength-strings -Woverloaded-virtual -Woverriding-method-mismatch -Wpacked -Wpacked-non-pod -Wparentheses -Wpedantic -Wpedantic-core-features -Wpessimizing-move -Wpointer-arith -Wpoison-system-directories -Wpragma-pack -Wpragma-pack-suspicious-include -Wpragmas -Wpre-c2x-compat -Wpre-openmp-51-compat -Wprofile-instr-missing -Wquoted-include-in-framework-header -Wrange-loop-analysis -Wrange-loop-bind-reference -Wrange-loop-construct -Wreceiver-forward-class -Wredundant-move -Wredundant-parens -Wreorder -Wreorder-ctor -Wreserved-user-defined-literal -Wretained-language-linkage -Wselector -Wselector-type-mismatch -Wself-assign -Wself-assign-overloaded -Wself-move -Wsemicolon-before-method-body -Wshadow-all -Wshadow-field -Wshadow-field-in-constructor -Wshadow-field-in-constructor-modified -Wshadow-uncaptured-local -Wshift-sign-overflow -Wsigned-enum-bitfield -Wsometimes-uninitialized -Wsource-uses-openmp -Wspir-compat -Wstatic-in-inline -Wstrict-potentially-direct-selector -Wstrict-selector-match -Wstring-concatenation -Wstring-conversion -Wsuggest-destructor-override -Wsuggest-override -Wsuper-class-method-mismatch -Wtautological-bitwise-compare -Wtautological-compare -Wtautological-constant-in-range-compare -Wtautological-overlap-compare -Wtautological-type-limit-compare -Wtautological-unsigned-char-zero-compare -Wtautological-unsigned-enum-zero-compare -Wtautological-unsigned-zero-compare -Wtautological-value-range-compare -Wthread-safety -Wthread-safety-analysis -Wthread-safety-attributes -Wthread-safety-beta -Wthread-safety-negative -Wthread-safety-precise -Wthread-safety-reference -Wthread-safety-verbose -Wtype-limits -Wunaligned-access -Wundeclared-selector -Wundef-prefix -Wundefined-func-template -Wundefined-internal-type -Wundefined-reinterpret-cast -Wunguarded-availability -Wuninitialized -Wuninitialized-const-reference -Wunknown-pragmas -Wunnamed-type-template-args -Wunneeded-internal-declaration -Wunneeded-member-function -Wunreachable-code-fallthrough -Wunreachable-code-loop-increment -Wunsupported-dll-base-class-template -Wunused -Wunused-but-set-parameter -Wunused-but-set-variable -Wunused-const-variable -Wunused-exception-parameter -Wunused-function -Wunused-label -Wunused-lambda-capture -Wunused-local-typedef -Wunused-member-function -Wunused-private-field -Wunused-property-ivar -Wunused-template -Wunused-variable -Wvariadic-macros -Wvector-conversion -Wweak-template-vtables -Wweak-vtables -Wzero-length-array -Wno-bitwise-instead-of-logical -Wno-c11-extensions -Wno-cast-function-type-strict -Wno-float-conversion -Wno-format-nonliteral -Wno-gnu-include-next -Wno-implicit-float-conversion -Wno-implicit-int-conversion -Wno-implicit-int-float-conversion -Wno-include-next-absolute-path -Wno-missing-field-initializers -Wno-reserved-macro-identifier -Wno-shadow -Wno-shorten-64-to-32 -Wno-sign-compare -Wno-sign-conversion -Wno-strict-prototypes -Wno-switch -Wno-unused-parameter -Wno-tautological-constant-out-of-range-compare -Wno-tautological-type-limit-compare -Wno-tautological-unsigned-zero-compare -Wno-tautological-value-range-compare -Wno-unused-command-line-argument -Wno-user-defined-warnings ' | tr -d '\n' | sed -e 's/ */ /g'` $ ./configure CFLAGS="-O2 -g $WARN_CLANG16" CXXFLAGS="-O2 -g $WARN_CLANG16" $ make Again, use your own judgement to determine whether to fix or ignore a specific warning.