[PATCH v2] meson: ensure correct version-def.h is used
To build the libgit-version library, Meson first generates `version-def.h` in the build directory. Then it compiles `version.c` into a library. During compilation, Meson tells to include both the build directory and the project root directory.
However, when the user previously has compiled Git using Make, they will have a `version-def.h` file in project root directory as well. Because `version-def.h` is included in `version.c` using the #include directive with double quotes, some preprocessors will look for the header file in the same directory as the source file. This will cause compilation of `version.c` ran by Meson to include `version-def.h` previously made by Make, which might be out of date.
To explicitly tell the preprocessor which `version-def.h` to use, pass the absolute path of this file as macro GIT_VERSION_H to the preprocessor using option `-D` and have `version.c` `#include GIT_VERSION_H`. To remain working with other build systems than Meson, include "version-def.h" if that macro is not defined.
Co-authored-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Toon Claes <toon@iotcl.com>
---
This is version 2 of the patch trying to ensure the Meson build does not
include `version-def.h` created by Make.
---
Changes in v2:
- Instead of copying `version.c` to the Meson build directory, define a
macro with the absolute path of `version-def.h` to include.
- Link to v1: https://lore.kernel.org/r/20250113-toon-fix-meson-version-v1-1-9637e2be32e3@iotcl.com
---
Range-diff versus v1:
1: fad8163ff8 ! 1: c1ca203451 meson: ensure correct version-def.h is used
@@ Commit message
However, when the user previously has compiled Git using Make, they will
have a `version-def.h` file in project root directory as well. Because
`version-def.h` is included in `version.c` using the #include directive
- with double quotes, some compilers will look for the header file in the
- same directory as the source file. This will cause compilation of
+ with double quotes, some preprocessors will look for the header file in
+ the same directory as the source file. This will cause compilation of
`version.c` ran by Meson to include `version-def.h` previously made by
Make, which might be out of date.
- Copy `version.c` to the build directory before compiling it to ensure
- `version-def.h` from the build directory is used.
+ To explicitly tell the preprocessor which `version-def.h` to use, pass
+ the absolute path of this file as macro GIT_VERSION_H to the
+ preprocessor using option `-D` and have `version.c` `#include
+ GIT_VERSION_H`. To remain working with other build systems than Meson,
+ include "version-def.h" if that macro is not defined.
+ Co-authored-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Toon Claes <toon@iotcl.com>
## meson.build ##
-@@ meson.build: version_def_h = custom_target(
- env: version_gen_environment,
+@@ meson.build: libgit_version_library = static_library('git-version',
+ 'version.c',
+ version_def_h,
+ ],
+- c_args: libgit_c_args,
++ c_args: libgit_c_args + [
++ '-DGIT_VERSION_H="' + version_def_h.full_path() + '"',
++ ],
+ dependencies: libgit_dependencies,
+ include_directories: libgit_include_directories,
)
+
+ ## version.c ##
+@@
+ #include "git-compat-util.h"
+ #include "version.h"
+-#include "version-def.h"
+ #include "strbuf.h"
-+# Because most compilers prefer header files in the same directory as the source
-+# file, copy version.c to the build directory.
-+version_c = fs.copyfile(meson.current_source_dir() / 'version.c', 'version.c')
++#ifndef GIT_VERSION_H
++# include "version-def.h"
++#else
++# include GIT_VERSION_H
++#endif
+
- # Build a separate library for "version.c" so that we do not have to rebuild
- # everything when the current Git commit changes.
- libgit_version_library = static_library('git-version',
- sources: [
-- 'version.c',
-+ version_c,
- version_def_h,
- ],
- c_args: libgit_c_args,
+ const char git_version_string[] = GIT_VERSION;
+ const char git_built_from_commit_string[] = GIT_BUILT_FROM_COMMIT;
+
---
meson.build | 4 +++-
version.c | 7 ++++++-
2 files changed, 9 insertions(+), 2 deletions(-)Show changes to 2 files +9 −3
meson.build, version.c
diff --git a/meson.build b/meson.build
index 0064eb64f546a6349a8694ce251bd352febda6fe..db27afa99986598aab22ada718f76a7a49238f24 100644
--- a/meson.build
+++ b/meson.build
@@ -1493,7 +1493,9 @@ libgit_version_library = static_library('git-version',
'version.c',
version_def_h,
],
- c_args: libgit_c_args,
+ c_args: libgit_c_args + [
+ '-DGIT_VERSION_H="' + version_def_h.full_path() + '"',
+ ],
dependencies: libgit_dependencies,
include_directories: libgit_include_directories,
)
diff --git a/version.c b/version.c
index 4d763ab48dd76c0445e5ea390ff4c1f35c1a4b12..4786c4e0a54093ca947da27f8b712bd1ea351203 100644
--- a/version.c
+++ b/version.c
@@ -1,8 +1,13 @@
#include "git-compat-util.h"
#include "version.h"
-#include "version-def.h"
#include "strbuf.h"
+#ifndef GIT_VERSION_H
+# include "version-def.h"
+#else
+# include GIT_VERSION_H
+#endif
+
const char git_version_string[] = GIT_VERSION;
const char git_built_from_commit_string[] = GIT_BUILT_FROM_COMMIT;
---
base-commit: fbe8d3079d4a96aeb4e4529cc93cc0043b759a05
change-id: 20250113-toon-fix-meson-version-3d4d33fdabe3
Thanks
--
Toon