[MinGW] Fix mingw building issues
Fix config, missing header and command flags issues
Add MinGW tutorial about how to build `gn` and "examples/simple_build"
Change-Id: I3761dde6af96a2b61dfa19f339fac97b55ceb186
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/17182
Reviewed-by: Takuto Ikuta <tikuta@google.com>
Reviewed-by: David Turner <digit@google.com>
Commit-Queue: David Turner <digit@google.com>
diff --git a/README.md b/README.md
index 4bb1a9e..f96d895 100644
--- a/README.md
+++ b/README.md
@@ -107,6 +107,10 @@
expected to be found in `PATH`. This can be overridden by setting the `CC`, `CXX`,
and `AR` environment variables.
+On MSYS and MinGW, the default compiler is `g++`, a recent version is
+expected to be found in `PATH`. This can be overridden by setting the `CC`, `CXX`,
+`LD` and `AR` environment variables.
+
On z/OS, building GN requires [ZOSLIB](https://github.com/ibmruntimes/zoslib) to be
installed, as described at that URL. When building with `build/gen.py`, use the option
`--zoslib-dir` to specify the path to [ZOSLIB](https://github.com/ibmruntimes/zoslib):
diff --git a/build/gen.py b/build/gen.py
index 9168035..6f3652e 100755
--- a/build/gen.py
+++ b/build/gen.py
@@ -245,7 +245,7 @@
describe_output = subprocess.check_output(
['git', 'describe', 'HEAD', '--abbrev=12', '--match', ROOT_TAG],
shell=host.is_windows(), cwd=REPO_ROOT)
- mo = re.match(ROOT_TAG + '-(\d+)-g([0-9a-f]+)', describe_output.decode())
+ mo = re.match(ROOT_TAG + r'-(\d+)-g([0-9a-f]+)', describe_output.decode())
if not mo:
raise ValueError(
'Unexpected output from git describe when generating version header')
@@ -317,7 +317,12 @@
if platform.is_windows():
executable_ext = '.exe'
- library_ext = '.lib'
+
+ if platform.is_msvc():
+ library_ext = '.lib'
+ else:
+ library_ext = '.a'
+
object_ext = '.obj'
else:
executable_ext = ''
@@ -505,21 +510,16 @@
if not options.no_static_libstdcpp:
ldflags.append('-static-libstdc++')
- if platform.is_mingw() or platform.is_msys():
- cflags.remove('-std=c++20')
- cflags.extend([
- '-Wno-deprecated-copy',
- '-Wno-implicit-fallthrough',
- '-Wno-redundant-move',
- '-Wno-unused-variable',
- '-Wno-format', # Use of %llx, which is supported by _UCRT, false positive
- '-Wno-strict-aliasing', # Dereferencing punned pointer
- '-Wno-cast-function-type', # Casting FARPROC to RegDeleteKeyExPtr
- '-std=gnu++20',
- ])
- else:
- # This is needed by libc++.
- libs.append('-ldl')
+ cflags.extend([
+ '-Wno-deprecated-copy',
+ '-Wno-implicit-fallthrough',
+ '-Wno-redundant-move',
+ '-Wno-unused-variable',
+ '-Wno-format', # Use of %llx, which is supported by _UCRT, false positive
+ '-Wno-strict-aliasing', # Dereferencing punned pointer
+ '-Wno-cast-function-type', # Casting FARPROC to RegDeleteKeyExPtr
+ ])
+
elif platform.is_darwin():
min_mac_version_flag = '-mmacosx-version-min=10.9'
cflags.append(min_mac_version_flag)
diff --git a/docs/mingw.md b/docs/mingw.md
new file mode 100644
index 0000000..a80005b
--- /dev/null
+++ b/docs/mingw.md
@@ -0,0 +1,34 @@
+# Building and using `gn` with MinGW on Windows
+
+At the time of writing: 2024-04-13
+Test environment: Windows 11, intel x86_64 CPU
+
+## Requirements
+
+1. Install [MSYS2](https://www.msys2.org/)
+1. Start a Terminal windows for MSYS2's MinGW development by opening one of `clang32.exe`, `clang64.exe`, `clangarm64.exe`,`mingw32.exe`, `mingw64.exe`, `ucrt64.exe`.
+1. To download clang toolchain, Ninja and git programs, run command: `pacman -S mingw-w64-clang-x86_64-toolchain mingw-w64-clang-x86_64-ninja git`
+
+## Build `gn`
+
+1. To clone `gn` source code, run command: `git clone https://gn.googlesource.com/gn`
+1. Run command: `cd gn`
+1. Run command: `build/gen.py --platform mingw`
+ This configuration generates a static executable that does not depend on MSYS2, and can be run in any development environment.
+ Use `--help` flag to check more configuration options.
+ Use `--allow-warning` flag to build with warnings.
+1. Run command: `ninja -C out`
+
+## Testing
+
+1. Run command: `out/gn --version`
+1. Run command: `out/gn_unittests`
+
+> Notes:
+>
+> For "mingw-w64-clang-x86_64-toolchain" in the clang64 environment, g++ is a copy of clang++.
+>
+> The toolchain that builds `gn` does not use vendor lock-in compiler command flags,
+> so `gn` can be built with these clang++, g++.
+>
+> However the build rules in [examples/simple_build](../examples/simple_build/) require GCC-specific compiler macros, and thus only work in the `ucrt64` MSYS2 development environment.