Makefile: refactor generators to be PWD-independent

We have multiple scripts that generate headers from other data. All of
these scripts have the assumption built-in that they are executed in the
current source directory, which makes them a bit unwieldy to use during
out-of-tree builds.

Refactor them to instead take the source directory as well as the output
file as arguments.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Patrick Steinhardt 2024-12-06 14:24:49 +01:00 committed by Junio C Hamano
parent 19d8fe7da6
commit 3f145a4fe3
5 changed files with 68 additions and 34 deletions

View File

@ -2523,17 +2523,17 @@ $(BUILT_INS): git$X
config-list.h: generate-configlist.sh config-list.h: generate-configlist.sh


config-list.h: Documentation/*config.txt Documentation/config/*.txt config-list.h: Documentation/*config.txt Documentation/config/*.txt
$(QUIET_GEN)$(SHELL_PATH) ./generate-configlist.sh >$@ $(QUIET_GEN)$(SHELL_PATH) ./generate-configlist.sh . $@


command-list.h: generate-cmdlist.sh command-list.txt command-list.h: generate-cmdlist.sh command-list.txt


command-list.h: $(wildcard Documentation/git*.txt) command-list.h: $(wildcard Documentation/git*.txt)
$(QUIET_GEN)$(SHELL_PATH) ./generate-cmdlist.sh \ $(QUIET_GEN)$(SHELL_PATH) ./generate-cmdlist.sh \
$(patsubst %,--exclude-program %,$(EXCLUDED_PROGRAMS)) \ $(patsubst %,--exclude-program %,$(EXCLUDED_PROGRAMS)) \
command-list.txt >$@ . $@


hook-list.h: generate-hooklist.sh Documentation/githooks.txt hook-list.h: generate-hooklist.sh Documentation/githooks.txt
$(QUIET_GEN)$(SHELL_PATH) ./generate-hooklist.sh >$@ $(QUIET_GEN)$(SHELL_PATH) ./generate-hooklist.sh . $@


SCRIPT_DEFINES = $(SHELL_PATH_SQ):$(DIFF_SQ):\ SCRIPT_DEFINES = $(SHELL_PATH_SQ):$(DIFF_SQ):\
$(localedir_SQ):$(USE_GETTEXT_SCHEME):$(SANE_TOOL_PATH_SQ):\ $(localedir_SQ):$(USE_GETTEXT_SCHEME):$(SANE_TOOL_PATH_SQ):\

View File

@ -638,23 +638,24 @@ set(EXCLUSION_PROGS_CACHE ${EXCLUSION_PROGS} CACHE STRING "Programs not built" F
if(NOT EXISTS ${CMAKE_BINARY_DIR}/command-list.h OR NOT EXCLUSION_PROGS_CACHE STREQUAL EXCLUSION_PROGS) if(NOT EXISTS ${CMAKE_BINARY_DIR}/command-list.h OR NOT EXCLUSION_PROGS_CACHE STREQUAL EXCLUSION_PROGS)
list(REMOVE_ITEM EXCLUSION_PROGS empty) list(REMOVE_ITEM EXCLUSION_PROGS empty)
message("Generating command-list.h") message("Generating command-list.h")
execute_process(COMMAND ${SH_EXE} ${CMAKE_SOURCE_DIR}/generate-cmdlist.sh ${EXCLUSION_PROGS} command-list.txt execute_process(COMMAND "${SH_EXE}" "${CMAKE_SOURCE_DIR}/generate-cmdlist.sh"
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ${EXCLUSION_PROGS}
OUTPUT_FILE ${CMAKE_BINARY_DIR}/command-list.h) "${CMAKE_SOURCE_DIR}"
"${CMAKE_BINARY_DIR}/command-list.h")
endif() endif()


if(NOT EXISTS ${CMAKE_BINARY_DIR}/config-list.h) if(NOT EXISTS ${CMAKE_BINARY_DIR}/config-list.h)
message("Generating config-list.h") message("Generating config-list.h")
execute_process(COMMAND ${SH_EXE} ${CMAKE_SOURCE_DIR}/generate-configlist.sh execute_process(COMMAND "${SH_EXE}" "${CMAKE_SOURCE_DIR}/generate-configlist.sh"
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} "${CMAKE_SOURCE_DIR}"
OUTPUT_FILE ${CMAKE_BINARY_DIR}/config-list.h) "${CMAKE_BINARY_DIR}/config-list.h")
endif() endif()


if(NOT EXISTS ${CMAKE_BINARY_DIR}/hook-list.h) if(NOT EXISTS ${CMAKE_BINARY_DIR}/hook-list.h)
message("Generating hook-list.h") message("Generating hook-list.h")
execute_process(COMMAND ${SH_EXE} ${CMAKE_SOURCE_DIR}/generate-hooklist.sh execute_process(COMMAND "${SH_EXE}" ${CMAKE_SOURCE_DIR}/generate-hooklist.sh
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} "${CMAKE_SOURCE_DIR}"
OUTPUT_FILE ${CMAKE_BINARY_DIR}/hook-list.h) "${CMAKE_BINARY_DIR}/hook-list.h")
endif() endif()


include_directories(${CMAKE_BINARY_DIR}) include_directories(${CMAKE_BINARY_DIR})

View File

@ -64,7 +64,7 @@ define_category_names () {
print_command_list () { print_command_list () {
echo "static struct cmdname_help command_list[] = {" echo "static struct cmdname_help command_list[] = {"


echo "$1" | echo "$2" |
while read cmd rest while read cmd rest
do do
synopsis= synopsis=
@ -76,7 +76,7 @@ print_command_list () {
break break
;; ;;
esac esac
done <"Documentation/$cmd.txt" done <"$1/Documentation/$cmd.txt"


printf '\t{ "%s", N_("%s"), 0' "$cmd" "$synopsis" printf '\t{ "%s", N_("%s"), 0' "$cmd" "$synopsis"
printf " | CAT_%s" $rest printf " | CAT_%s" $rest
@ -93,18 +93,28 @@ do
shift shift
done done


commands="$(command_list "$1")" if test "$#" -ne 2
categories="$(category_list "$commands")" then
die "USAGE: $0 <SOURCE_DIR> <OUTPUT>"
fi


echo "/* Automatically generated by generate-cmdlist.sh */ SOURCE_DIR="$1"
struct cmdname_help { OUTPUT="$2"
const char *name;
const char *help; {
uint32_t category; commands="$(command_list "$SOURCE_DIR"/command-list.txt)"
}; categories="$(category_list "$commands")"
"
define_categories "$categories" echo "/* Automatically generated by generate-cmdlist.sh */
echo struct cmdname_help {
define_category_names "$categories" const char *name;
echo const char *help;
print_command_list "$commands" uint32_t category;
};
"
define_categories "$categories"
echo
define_category_names "$categories"
echo
print_command_list "$SOURCE_DIR" "$commands"
} >"$OUTPUT"

View File

@ -1,13 +1,19 @@
#!/bin/sh #!/bin/sh


echo "/* Automatically generated by generate-configlist.sh */" SOURCE_DIR="$1"
echo OUTPUT="$2"

if test -z "$SOURCE_DIR" || ! test -d "$SOURCE_DIR" || test -z "$OUTPUT"
then
echo >&2 "USAGE: $0 <SOURCE_DIR> <OUTPUT>"
exit 1
fi


print_config_list () { print_config_list () {
cat <<EOF cat <<EOF
static const char *config_name_list[] = { static const char *config_name_list[] = {
EOF EOF
grep -h '^[a-zA-Z].*\..*::$' Documentation/*config.txt Documentation/config/*.txt | grep -h '^[a-zA-Z].*\..*::$' "$SOURCE_DIR"/Documentation/*config.txt "$SOURCE_DIR"/Documentation/config/*.txt |
sed '/deprecated/d; s/::$//; s/, */\n/g' | sed '/deprecated/d; s/::$//; s/, */\n/g' |
sort | sort |
sed 's/^.*$/ "&",/' sed 's/^.*$/ "&",/'
@ -17,5 +23,9 @@ EOF
EOF EOF
} }


echo {
print_config_list echo "/* Automatically generated by generate-configlist.sh */"
echo
echo
print_config_list
} >"$OUTPUT"

View File

@ -2,6 +2,17 @@
# #
# Usage: ./generate-hooklist.sh >hook-list.h # Usage: ./generate-hooklist.sh >hook-list.h


SOURCE_DIR="$1"
OUTPUT="$2"

if test -z "$SOURCE_DIR" || ! test -d "$SOURCE_DIR" || test -z "$OUTPUT"
then
echo >&2 "USAGE: $0 <SOURCE_DIR> <OUTPUT>"
exit 1
fi

{

cat <<EOF cat <<EOF
/* Automatically generated by generate-hooklist.sh */ /* Automatically generated by generate-hooklist.sh */


@ -11,10 +22,12 @@ EOF
sed -n \ sed -n \
-e '/^~~~~*$/ {x; s/^.*$/ "&",/; p;}' \ -e '/^~~~~*$/ {x; s/^.*$/ "&",/; p;}' \
-e 'x' \ -e 'x' \
<Documentation/githooks.txt | <"$SOURCE_DIR"/Documentation/githooks.txt |
LC_ALL=C sort LC_ALL=C sort


cat <<EOF cat <<EOF
NULL, NULL,
}; };
EOF EOF

} >"$OUTPUT"