diff mbox series

[v2] meson: ensure correct version-def.h is used

Message ID 20250114-toon-fix-meson-version-v2-1-66ddb1a82c28@iotcl.com (mailing list archive)
State New
Headers show
Series [v2] meson: ensure correct version-def.h is used | expand

Commit Message

Toon Claes Jan. 14, 2025, 11:15 a.m. UTC
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(-)


---

base-commit: fbe8d3079d4a96aeb4e4529cc93cc0043b759a05
change-id: 20250113-toon-fix-meson-version-3d4d33fdabe3

Thanks
--
Toon
diff mbox series

Patch

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;