Re: Enhance Makefiles to rebuild objects on map file changes

From: Chao Li <li(dot)evan(dot)chao(at)gmail(dot)com>
To: John Naylor <johncnaylorls(at)gmail(dot)com>
Cc: pgsql-hackers(at)lists(dot)postgresql(dot)org
Subject: Re: Enhance Makefiles to rebuild objects on map file changes
Date: 2025-08-19 02:16:54
Message-ID: 64537999-E68A-4AA5-9C51-30C86D0E269C@gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi John,

Let me explain the Makefile patch in this separate thread, as this is generic to all maps.

Let’s not use gb18030 as an example, instead, using utf8_and_win.

When any of the win-related map file changes, it suppose to automatically rebuild utf8_and_win.o.

WITHOUT this patch, after I touch a map file, it doesn’t rebuild the object file:

```
# Now it’s in master branch
chaol(at)ChaodeMacBook-Air utf8_and_win % pwd
/Users/chaol/Documents/code/postgresql/src/backend/utils/mb/conversion_procs/utf8_and_win

# touch a map file to simulate a change
chaol(at)ChaodeMacBook-Air utf8_and_win % touch ../../Unicode/win874_to_utf8.map

# make only rebuild header files, without rebuild object files.
chaol(at)ChaodeMacBook-Air utf8_and_win % make
/Library/Developer/CommandLineTools/usr/bin/make -C ../../../../../../src/backend generated-headers
/Library/Developer/CommandLineTools/usr/bin/make -C ../include/catalog generated-headers
'/usr/bin/perl' ../../../src/backend/catalog/genbki.pl --include-path=../../../src/include/ \
--set-version=19 ../../../src/include/catalog/pg_proc.h ../../../src/include/catalog/pg_type.h ../../../src/include/catalog/pg_attribute.h ../../../src/include/catalog/pg_class.h ../../../src/include/catalog/pg_attrdef.h ../../../src/include/catalog/pg_constraint.h ../../../src/include/catalog/pg_inherits.h ../../../src/include/catalog/pg_index.h ../../../src/include/catalog/pg_operator.h ../../../src/include/catalog/pg_opfamily.h ../../../src/include/catalog/pg_opclass.h ../../../src/include/catalog/pg_am.h ../../../src/include/catalog/pg_amop.h ../../../src/include/catalog/pg_amproc.h ../../../src/include/catalog/pg_language.h ../../../src/include/catalog/pg_largeobject_metadata.h ../../../src/include/catalog/pg_largeobject.h ../../../src/include/catalog/pg_aggregate.h ../../../src/include/catalog/pg_statistic.h ../../../src/include/catalog/pg_statistic_ext.h ../../../src/include/catalog/pg_statistic_ext_data.h ../../../src/include/catalog/pg_rewrite.h ../../../src/include/catalog/pg_trigger.h ../../../src/include/catalog/pg_event_trigger.h ../../../src/include/catalog/pg_description.h ../../../src/include/catalog/pg_cast.h ../../../src/include/catalog/pg_enum.h ../../../src/include/catalog/pg_namespace.h ../../../src/include/catalog/pg_conversion.h ../../../src/include/catalog/pg_depend.h ../../../src/include/catalog/pg_database.h ../../../src/include/catalog/pg_db_role_setting.h ../../../src/include/catalog/pg_tablespace.h ../../../src/include/catalog/pg_authid.h ../../../src/include/catalog/pg_auth_members.h ../../../src/include/catalog/pg_shdepend.h ../../../src/include/catalog/pg_shdescription.h ../../../src/include/catalog/pg_ts_config.h ../../../src/include/catalog/pg_ts_config_map.h ../../../src/include/catalog/pg_ts_dict.h ../../../src/include/catalog/pg_ts_parser.h ../../../src/include/catalog/pg_ts_template.h ../../../src/include/catalog/pg_extension.h ../../../src/include/catalog/pg_foreign_data_wrapper.h ../../../src/include/catalog/pg_foreign_server.h ../../../src/include/catalog/pg_user_mapping.h ../../../src/include/catalog/pg_foreign_table.h ../../../src/include/catalog/pg_policy.h ../../../src/include/catalog/pg_replication_origin.h ../../../src/include/catalog/pg_default_acl.h ../../../src/include/catalog/pg_init_privs.h ../../../src/include/catalog/pg_seclabel.h ../../../src/include/catalog/pg_shseclabel.h ../../../src/include/catalog/pg_collation.h ../../../src/include/catalog/pg_parameter_acl.h ../../../src/include/catalog/pg_partitioned_table.h ../../../src/include/catalog/pg_range.h ../../../src/include/catalog/pg_transform.h ../../../src/include/catalog/pg_sequence.h ../../../src/include/catalog/pg_publication.h ../../../src/include/catalog/pg_publication_namespace.h ../../../src/include/catalog/pg_publication_rel.h ../../../src/include/catalog/pg_subscription.h ../../../src/include/catalog/pg_subscription_rel.h
touch bki-stamp
/Library/Developer/CommandLineTools/usr/bin/make -C nodes generated-header-symlinks
'/usr/bin/perl' gen_node_support.pl ../../../src/include/nodes/nodes.h ../../../src/include/nodes/primnodes.h ../../../src/include/nodes/parsenodes.h ../../../src/include/nodes/pathnodes.h ../../../src/include/nodes/plannodes.h ../../../src/include/nodes/execnodes.h ../../../src/include/access/amapi.h ../../../src/include/access/cmptype.h ../../../src/include/access/sdir.h ../../../src/include/access/tableam.h ../../../src/include/access/tsmapi.h ../../../src/include/commands/event_trigger.h ../../../src/include/commands/trigger.h ../../../src/include/executor/tuptable.h ../../../src/include/foreign/fdwapi.h ../../../src/include/nodes/bitmapset.h ../../../src/include/nodes/extensible.h ../../../src/include/nodes/lockoptions.h ../../../src/include/nodes/miscnodes.h ../../../src/include/nodes/replnodes.h ../../../src/include/nodes/supportnodes.h ../../../src/include/nodes/value.h ../../../src/include/utils/rel.h
touch node-support-stamp
cd '../../../src/include/nodes/' && for file in nodetags.h; do \
rm -f $file && ln -s "../../../src/backend/nodes/$file" . ; \
done
touch ../../../src/include/nodes/header-stamp
/Library/Developer/CommandLineTools/usr/bin/make -C utils generated-header-symlinks
/Library/Developer/CommandLineTools/usr/bin/make -C adt jsonpath_gram.h
make[3]: `jsonpath_gram.h' is up to date.

# make again, it does nothing
chaol(at)ChaodeMacBook-Air utf8_and_win % make
/Library/Developer/CommandLineTools/usr/bin/make -C ../../../../../../src/backend generated-headers
/Library/Developer/CommandLineTools/usr/bin/make -C ../include/catalog generated-headers
make[2]: Nothing to be done for `generated-headers'.
/Library/Developer/CommandLineTools/usr/bin/make -C nodes generated-header-symlinks
make[2]: Nothing to be done for `generated-header-symlinks'.
/Library/Developer/CommandLineTools/usr/bin/make -C utils generated-header-symlinks
/Library/Developer/CommandLineTools/usr/bin/make -C adt jsonpath_gram.h
make[3]: `jsonpath_gram.h' is up to date.
```

WITH this patch, it will automatically rebuild object files:

```
# switch to the patch branch
chaol(at)ChaodeMacBook-Air utf8_and_win % git co topic/chaol/mb-makefiles
Switched to branch 'topic/chaol/mb-makefiles’

# After switching branch, make rebuilt header files and object files.
chaol(at)ChaodeMacBook-Air utf8_and_win % make
/Library/Developer/CommandLineTools/usr/bin/make -C ../../../../../../src/backend generated-headers
/Library/Developer/CommandLineTools/usr/bin/make -C ../include/catalog generated-headers
'/usr/bin/perl' ../../../src/backend/catalog/genbki.pl --include-path=../../../src/include/ \
--set-version=19 ../../../src/include/catalog/pg_proc.h ../../../src/include/catalog/pg_type.h ../../../src/include/catalog/pg_attribute.h ../../../src/include/catalog/pg_class.h ../../../src/include/catalog/pg_attrdef.h ../../../src/include/catalog/pg_constraint.h ../../../src/include/catalog/pg_inherits.h ../../../src/include/catalog/pg_index.h ../../../src/include/catalog/pg_operator.h ../../../src/include/catalog/pg_opfamily.h ../../../src/include/catalog/pg_opclass.h ../../../src/include/catalog/pg_am.h ../../../src/include/catalog/pg_amop.h ../../../src/include/catalog/pg_amproc.h ../../../src/include/catalog/pg_language.h ../../../src/include/catalog/pg_largeobject_metadata.h ../../../src/include/catalog/pg_largeobject.h ../../../src/include/catalog/pg_aggregate.h ../../../src/include/catalog/pg_statistic.h ../../../src/include/catalog/pg_statistic_ext.h ../../../src/include/catalog/pg_statistic_ext_data.h ../../../src/include/catalog/pg_rewrite.h ../../../src/include/catalog/pg_trigger.h ../../../src/include/catalog/pg_event_trigger.h ../../../src/include/catalog/pg_description.h ../../../src/include/catalog/pg_cast.h ../../../src/include/catalog/pg_enum.h ../../../src/include/catalog/pg_namespace.h ../../../src/include/catalog/pg_conversion.h ../../../src/include/catalog/pg_depend.h ../../../src/include/catalog/pg_database.h ../../../src/include/catalog/pg_db_role_setting.h ../../../src/include/catalog/pg_tablespace.h ../../../src/include/catalog/pg_authid.h ../../../src/include/catalog/pg_auth_members.h ../../../src/include/catalog/pg_shdepend.h ../../../src/include/catalog/pg_shdescription.h ../../../src/include/catalog/pg_ts_config.h ../../../src/include/catalog/pg_ts_config_map.h ../../../src/include/catalog/pg_ts_dict.h ../../../src/include/catalog/pg_ts_parser.h ../../../src/include/catalog/pg_ts_template.h ../../../src/include/catalog/pg_extension.h ../../../src/include/catalog/pg_foreign_data_wrapper.h ../../../src/include/catalog/pg_foreign_server.h ../../../src/include/catalog/pg_user_mapping.h ../../../src/include/catalog/pg_foreign_table.h ../../../src/include/catalog/pg_policy.h ../../../src/include/catalog/pg_replication_origin.h ../../../src/include/catalog/pg_default_acl.h ../../../src/include/catalog/pg_init_privs.h ../../../src/include/catalog/pg_seclabel.h ../../../src/include/catalog/pg_shseclabel.h ../../../src/include/catalog/pg_collation.h ../../../src/include/catalog/pg_parameter_acl.h ../../../src/include/catalog/pg_partitioned_table.h ../../../src/include/catalog/pg_range.h ../../../src/include/catalog/pg_transform.h ../../../src/include/catalog/pg_sequence.h ../../../src/include/catalog/pg_publication.h ../../../src/include/catalog/pg_publication_namespace.h ../../../src/include/catalog/pg_publication_rel.h ../../../src/include/catalog/pg_subscription.h ../../../src/include/catalog/pg_subscription_rel.h
touch bki-stamp
/Library/Developer/CommandLineTools/usr/bin/make -C nodes generated-header-symlinks
'/usr/bin/perl' gen_node_support.pl ../../../src/include/nodes/nodes.h ../../../src/include/nodes/primnodes.h ../../../src/include/nodes/parsenodes.h ../../../src/include/nodes/pathnodes.h ../../../src/include/nodes/plannodes.h ../../../src/include/nodes/execnodes.h ../../../src/include/access/amapi.h ../../../src/include/access/cmptype.h ../../../src/include/access/sdir.h ../../../src/include/access/tableam.h ../../../src/include/access/tsmapi.h ../../../src/include/commands/event_trigger.h ../../../src/include/commands/trigger.h ../../../src/include/executor/tuptable.h ../../../src/include/foreign/fdwapi.h ../../../src/include/nodes/bitmapset.h ../../../src/include/nodes/extensible.h ../../../src/include/nodes/lockoptions.h ../../../src/include/nodes/miscnodes.h ../../../src/include/nodes/replnodes.h ../../../src/include/nodes/supportnodes.h ../../../src/include/nodes/value.h ../../../src/include/utils/rel.h
touch node-support-stamp
cd '../../../src/include/nodes/' && for file in nodetags.h; do \
rm -f $file && ln -s "../../../src/backend/nodes/$file" . ; \
done
touch ../../../src/include/nodes/header-stamp
/Library/Developer/CommandLineTools/usr/bin/make -C utils generated-header-symlinks
/Library/Developer/CommandLineTools/usr/bin/make -C adt jsonpath_gram.h
make[3]: `jsonpath_gram.h' is up to date.
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Werror=unguarded-availability-new -Wendif-labels -Wmissing-format-attribute -Wcast-function-type -Wformat-security -Wmissing-variable-declarations -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-unused-command-line-argument -Wno-compound-token-split-by-macro -Wno-format-truncation -Wno-cast-function-type-strict -g -O2 -fvisibility=hidden -I../../../../../../src/include -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX15.5.sdk -I/opt/homebrew/Cellar/icu4c(at)77/77.1/include -c -o utf8_and_win.o utf8_and_win.c
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Werror=unguarded-availability-new -Wendif-labels -Wmissing-format-attribute -Wcast-function-type -Wformat-security -Wmissing-variable-declarations -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-unused-command-line-argument -Wno-compound-token-split-by-macro -Wno-format-truncation -Wno-cast-function-type-strict -g -O2 -fvisibility=hidden -bundle -o utf8_and_win.dylib utf8_and_win.o -L../../../../../../src/port -L../../../../../../src/common -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX15.5.sdk -Wl,-dead_strip_dylibs -fvisibility=hidden -bundle_loader ../../../../../../src/backend/postgres

# touch a map file to simulate map file change
chaol(at)ChaodeMacBook-Air utf8_and_win % touch ../../Unicode/win874_to_utf8.map

# make rebuilt object files
chaol(at)ChaodeMacBook-Air utf8_and_win % make
/Library/Developer/CommandLineTools/usr/bin/make -C ../../../../../../src/backend generated-headers
/Library/Developer/CommandLineTools/usr/bin/make -C ../include/catalog generated-headers
make[2]: Nothing to be done for `generated-headers'.
/Library/Developer/CommandLineTools/usr/bin/make -C nodes generated-header-symlinks
make[2]: Nothing to be done for `generated-header-symlinks'.
/Library/Developer/CommandLineTools/usr/bin/make -C utils generated-header-symlinks
/Library/Developer/CommandLineTools/usr/bin/make -C adt jsonpath_gram.h
make[3]: `jsonpath_gram.h' is up to date.
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Werror=unguarded-availability-new -Wendif-labels -Wmissing-format-attribute -Wcast-function-type -Wformat-security -Wmissing-variable-declarations -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-unused-command-line-argument -Wno-compound-token-split-by-macro -Wno-format-truncation -Wno-cast-function-type-strict -g -O2 -fvisibility=hidden -I../../../../../../src/include -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX15.5.sdk -I/opt/homebrew/Cellar/icu4c(at)77/77.1/include -c -o utf8_and_win.o utf8_and_win.c
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Werror=unguarded-availability-new -Wendif-labels -Wmissing-format-attribute -Wcast-function-type -Wformat-security -Wmissing-variable-declarations -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-unused-command-line-argument -Wno-compound-token-split-by-macro -Wno-format-truncation -Wno-cast-function-type-strict -g -O2 -fvisibility=hidden -bundle -o utf8_and_win.dylib utf8_and_win.o -L../../../../../../src/port -L../../../../../../src/common -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX15.5.sdk -Wl,-dead_strip_dylibs -fvisibility=hidden -bundle_loader ../../../../../../src/backend/postgres
chaol(at)ChaodeMacBook-Air utf8_and_win %

# make again did nothing
chaol(at)ChaodeMacBook-Air utf8_and_win % make
/Library/Developer/CommandLineTools/usr/bin/make -C ../../../../../../src/backend generated-headers
/Library/Developer/CommandLineTools/usr/bin/make -C ../include/catalog generated-headers
make[2]: Nothing to be done for `generated-headers'.
/Library/Developer/CommandLineTools/usr/bin/make -C nodes generated-header-symlinks
make[2]: Nothing to be done for `generated-header-symlinks'.
/Library/Developer/CommandLineTools/usr/bin/make -C utils generated-header-symlinks
/Library/Developer/CommandLineTools/usr/bin/make -C adt jsonpath_gram.h
make[3]: `jsonpath_gram.h' is up to date.

# change map file again
chaol(at)ChaodeMacBook-Air utf8_and_win % touch ../../Unicode/win874_to_utf8.map

# make automatically rebuilt object files.
chaol(at)ChaodeMacBook-Air utf8_and_win % make
/Library/Developer/CommandLineTools/usr/bin/make -C ../../../../../../src/backend generated-headers
/Library/Developer/CommandLineTools/usr/bin/make -C ../include/catalog generated-headers
make[2]: Nothing to be done for `generated-headers'.
/Library/Developer/CommandLineTools/usr/bin/make -C nodes generated-header-symlinks
make[2]: Nothing to be done for `generated-header-symlinks'.
/Library/Developer/CommandLineTools/usr/bin/make -C utils generated-header-symlinks
/Library/Developer/CommandLineTools/usr/bin/make -C adt jsonpath_gram.h
make[3]: `jsonpath_gram.h' is up to date.
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Werror=unguarded-availability-new -Wendif-labels -Wmissing-format-attribute -Wcast-function-type -Wformat-security -Wmissing-variable-declarations -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-unused-command-line-argument -Wno-compound-token-split-by-macro -Wno-format-truncation -Wno-cast-function-type-strict -g -O2 -fvisibility=hidden -I../../../../../../src/include -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX15.5.sdk -I/opt/homebrew/Cellar/icu4c(at)77/77.1/include -c -o utf8_and_win.o utf8_and_win.c
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Werror=unguarded-availability-new -Wendif-labels -Wmissing-format-attribute -Wcast-function-type -Wformat-security -Wmissing-variable-declarations -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-unused-command-line-argument -Wno-compound-token-split-by-macro -Wno-format-truncation -Wno-cast-function-type-strict -g -O2 -fvisibility=hidden -bundle -o utf8_and_win.dylib utf8_and_win.o -L../../../../../../src/port -L../../../../../../src/common -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX15.5.sdk -Wl,-dead_strip_dylibs -fvisibility=hidden -bundle_loader ../../../../../../src/backend/postgres

# make again did nothing
chaol(at)ChaodeMacBook-Air utf8_and_win % make
/Library/Developer/CommandLineTools/usr/bin/make -C ../../../../../../src/backend generated-headers
/Library/Developer/CommandLineTools/usr/bin/make -C ../include/catalog generated-headers
make[2]: Nothing to be done for `generated-headers'.
/Library/Developer/CommandLineTools/usr/bin/make -C nodes generated-header-symlinks
make[2]: Nothing to be done for `generated-header-symlinks'.
/Library/Developer/CommandLineTools/usr/bin/make -C utils generated-header-symlinks
/Library/Developer/CommandLineTools/usr/bin/make -C adt jsonpath_gram.h
make[3]: `jsonpath_gram.h' is up to date.
```

--
Chao Li (Evan)
HighGo Software Co., Ltd.
https://www.highgo.com/

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Richard Guo 2025-08-19 03:05:19 Re: Pathify RHS unique-ification for semijoin planning
Previous Message Erik Wienhold 2025-08-19 01:52:15 Re: psql: Count all table footer lines in pager setup