Re: [PATCH] compat: add memrchr()
From: Junio C Hamano <hidden>
Date: 2016-06-15 22:49:48
Ævar Arnfjörð Bjarmason [off-list ref] writes:
Maybe it should be a NO_* flag since that's what we use when we expect sanity, e.g. we have NO_REGEXP=, NO_CURL and NO_GETTEXT. Then you just need NO_MEMRCHR=UnfortunatelyYes entries in the big if/else block for those platforms that don't have it.
Hmmm, perhaps our naming convention have deteriorated over time. I think one of the oldest one is NO_CURL, which started out as a way to say "I do not have to go over http and dumb http transport is of no use to me. I _might_ have curl library installed on this system, but it does not matter. No thanks, please do not build git with curl support". For some people, it also meant "Unfortunately I do not have a working curl library here, so I'll live with a git without http support". On the other hand, NO_REGEX means "regrettably the platform implementation is not good enough for our codebase, and we do need to use a replacement implementation from compat/". The difference is that it is not an option to build a less capable git that lacks features that depend on REGEX. But somehow we ended up using the same NO_ prefix, conflating the two. In that sense NO_GETTEXT is named correctly, I think, as we fall back on implementation (i.e. less capable git) that does not do i18n/l10n.
But memrchr() is a GNU extension so it should probably be a HAVE_*. I don't know.
Yes, if we want to express that we positively rely on the existence of an
extension, HAVE_* does sound more correct. It also is how the world with
autoconf/configure works.
We might want to clean up the names of variables at some point, but from a
quick glance things do not look very good.
Most NO_FOO are misnamed and should be !HAVE_FOO, but because our codebase
tend to use more common features, switching from the way we currently do,
i.e. assuming we have FOO and defining NO_FOO for oddball platforms, to
the other way around of defining HAVE_FOO for platforms where we do have FOO
and omit it for the ones that lack, may make the Makefile more cluttered.
But as I already said, switching to HAVE_FOO has one definite advantage;
it is more conventional and would mesh a lot better with the way
autoconf/configure would do things.
Here is a quick break-down of the current set I found from the 'master'
branch.
* You decline to build, or are unable to build, git with...
NO_CURL transport based on libcurl e.g. HTTP.
NO_ICONV charset re-encoding support.
NO_IPV6 IPV6
NO_NSEC nanosecond resolution file timestamps
NO_POSIX_ONLY_PROGRAMS
NO_PYTHON anything that depends on Python
NO_SYMLINK_HEAD support for original layout where .git/HEAD was a symlink
NO_SVN_TESTS test that spends too much time on git-svn
* We work around the lack of the platform feature FOO without loss of
features from git (i.e. should be !HAVE_FOO):
NO_C99_FORMAT SZ_FMT and friends
NO_D_INO_IN_DIRENT (struct dirent)d.d_ino
NO_D_TYPE_IN_DIRENT (struct dirent)d.d_type
NO_HSTRERROR
NO_INET_NTOP
NO_INET_PTON
NO_LIBGEN_H
NO_MEMMEM
NO_MKDTEMP
NO_MKSTEMPS
NO_MMAP
HAVE_PATHS_H #include <paths.h>
NO_PERL_MAKEMAKER
NO_PREAD
NO_REGEX
NO_R_TO_GCC_LINKER
NO_SETENV
NO_SOCKADDR_STORAGE
NO_ST_BLOCKS_IN_STRUCT_STAT
NO_STRCASESTR
NO_STRLCPY
NO_STRTOK_R
NO_STRTOULL
NO_STRTOUMAX
NO_SYS_SELECT_H
NO_TRUSTABLE_FILEMODE
NO_UINTMAX_T
NO_UNSETENV
Unfortunately the world is not so black-and-white. There is another class
* Depending on platform features, we use different implementation with
almost no observable difference in behaviour (perhaps except for
performance)
NO_PTHREADS
Use of threads for better machine utilization
NO_FAST_WORKING_DIRECTORY
Reading from object database is faster than opening a file in the
working directory and reading from it on this platform, so we do
the former when we know the file in the working directory is clean.
Perhaps !HAVE_FAST_WORKING_DIRECTORY.
And yet another that is completely unrelated:
NO_SUBDIR