timniederhausen / gn

Licence: other
Standalone version of Chromium's GN

Programming Languages

C++
36643 projects - #6 most used programming language
python
139335 projects - #7 most used programming language
c
50402 projects - #5 most used programming language
emacs lisp
2029 projects
Vim Script
2826 projects
objective c
16641 projects - #2 most used programming language

Projects that are alternatives of or similar to gn

Recorder
A browser extension that generates Cypress, Playwright and Puppeteer test scripts from your interactions 🖱 ⌨
Stars: ✭ 277 (+241.98%)
Mutual labels:  chromium
brujeria
Black Magic to hook into setuptools and distutils for Extensions
Stars: ✭ 17 (-79.01%)
Mutual labels:  build-system
vdpau-va-driver-vp9
Experimental VP9 codec support for vdpau-va-driver (NVIDIA VDPAU-VAAPI wrapper) and chromium-vaapi
Stars: ✭ 68 (-16.05%)
Mutual labels:  chromium
rubium
Rubium is a lightweight alternative to Selenium/Capybara/Watir if you need to perform some operations (like web scraping) using Headless Chromium and Ruby
Stars: ✭ 65 (-19.75%)
Mutual labels:  chromium
my-qt-crasher
😽🖥💥 Example MacOS, Windows, and Linux Qt application integrated with Crashpad.
Stars: ✭ 29 (-64.2%)
Mutual labels:  chromium
homebrew-chromium
🌍 Chromium Snapshots Delivered Through Homebrew!
Stars: ✭ 35 (-56.79%)
Mutual labels:  chromium
cefHtmlSnapshot
Command-line utility for Windows take snapshots of HTML pages and save them as images or PDF
Stars: ✭ 23 (-71.6%)
Mutual labels:  chromium
cpp-compiler-options
Compilation options for different versions of Clang, GCC and MSVC. Provided a generator and different file formats (cmake, xmake, meson, premake5, bjam/b2, ...)
Stars: ✭ 19 (-76.54%)
Mutual labels:  build-system
build
Build system scripts based on GENie (https://github.com/bkaradzic/genie) project generator
Stars: ✭ 30 (-62.96%)
Mutual labels:  build-system
ixm
Make CMake less painful when trying to write Modern Flexible CMake
Stars: ✭ 99 (+22.22%)
Mutual labels:  build-system
scurl
Performance-focused replacement for Python urllib
Stars: ✭ 18 (-77.78%)
Mutual labels:  chromium
FlareSolverrSharp
FlareSolverr .Net / Proxy server to bypass Cloudflare protection
Stars: ✭ 62 (-23.46%)
Mutual labels:  chromium
rote
Automate everything.
Stars: ✭ 66 (-18.52%)
Mutual labels:  build-system
chromium-all-old-stable-versions
Collections of Chromium all old/history stable versions, releases. Support me via Bitcoin: bc1qqgkmph9cvygzxfpupv4jr4n0nfx3qumwg39j5w
Stars: ✭ 50 (-38.27%)
Mutual labels:  chromium
gcf-packs
Library packs for google cloud functions
Stars: ✭ 48 (-40.74%)
Mutual labels:  chromium
assemble-core
The core assemble application with no presets or defaults. All configuration is left to the implementor.
Stars: ✭ 17 (-79.01%)
Mutual labels:  build-system
robotframework-preso
Introduction to Robot Framework - TriTAUG Presentation
Stars: ✭ 16 (-80.25%)
Mutual labels:  chromium
mocket
Reliable UDP server client for flaky networks
Stars: ✭ 21 (-74.07%)
Mutual labels:  chromium
flutter-webview-windows
A WebView2-powered Flutter WebView implementation for the Windows platform.
Stars: ✭ 83 (+2.47%)
Mutual labels:  chromium
BlazorCefApp
Build windows desktop GUI app via CEF / WinForms / Blazor server-site
Stars: ✭ 28 (-65.43%)
Mutual labels:  chromium

GN

Build Status Build status

GN is a meta-build system that generates build files for Ninja.

Related resources:

This is a fork!

Contains changes not wanted/needed by the upstream project.

So far:

  • Custom description labels for action / action_foreach targets

What GN is for

GN is currently used as the build system for Chromium, Fuchsia, and related projects. Some strengths of GN are:

  • It is designed for large projects and large teams. It scales efficiently to many thousands of build files and tens of thousands of source files.

  • It has a readable, clean syntax. Once a build is set-up, it is generally easy for people with no backround in GN to make basic edits to the build.

  • It is designed for multi-platform projects. It can cleanly express many complicated build variants across different platforms. A single build invocation can target multiple platforms.

  • It supports multiple parallel output directories, each with their own configuration. This allows a developer to maintain builds targeting debug, release, or different platforms in parallel without forced rebuilds when switching.

  • It has a focus on correctness. GN checks for the correct dependencies, inputs, and outputs to the extent possible, and has a number of tools to allow developers to ensure the build evolves as desired (for example, gn check, testonly, assert_no_deps).

  • It has comprehensive build-in help available from the command-line.

Although small projects successfully use GN, the focus on large projects has some disadvanages:

  • GN has the goal of being minimally expressive. Although it can be quite flexible, a design goal is to direct members of a large team (who may not have much knowledge about the build) down an easy-to-understand, well-lit path. This isn't necessarily the correct trade-off for smaller projects.

  • The minimal build configuration is relatively heavyweight. There are several files required and the exact way all compilers are linkers are run must be specified in the configuration (see "Examples" below). There is no default compiler configuration.

  • It is not easily composable. GN is designed to compile a single large project with relatively uniform settings and rules. Projects like Chromium do bring together multiple repositories from multiple teams, but the projects must agree on some conventions in the build files to allow this to work.

  • GN is designed with the expectation that the developers building a project want to compile an identical configuration. So while builds can integrate with the user's environment like the CXX and CFLAGS variables if they want, this is not the default and most project's builds do not do this. The result is that many GN projects do not integrate well with other systems like ebuild.

  • There is no simple release scheme (see "Versioning and distribution" below). Projects are expected to manage the version of GN they require. Getting an appropriate GN binary can be a hurdle for new contributors to a project. Since it is relatively uncommon, it can be more difficult to find information and examples.

GN can generate Ninja build files for C, C++, Rust, Objective C, and Swift source on most popular platforms. Other languages can be compiled using the general "action" rules which are executed by Python or another scripting language (Google does this to compile Java and Go). But because this is not as clean, generally GN is only used when the bulk of the build is in one of the main built-in languages.

Getting a binary

You can download the latest version of GN binary for Linux, macOS and Windows from Google's build infrastructure (see "Versioning and distribution" below for how this is expected to work).

Alternatively, you can build GN from source with a C++17 compiler:

git clone https://github.com/timniederhausen/gn.git
cd gn
python build/gen.py
ninja -C out
# To run tests:
out/gn_unittests

On Windows, it is expected that cl.exe, link.exe, and lib.exe can be found in PATH, so you'll want to run from a Visual Studio command prompt, or similar.

On Linux and Mac, the default compiler is clang++, a recent version is expected to be found in PATH. This can be overridden by setting CC, CXX, and AR.

Examples

There is a simple example in examples/simple_build directory that is a good place to get started with the minimal configuration.

To build and run the simple example with the default gcc compiler:

cd examples/simple_build
../../out/gn gen -C out
ninja -C out
./out/hello

For a maximal configuration see the Chromium setup:

the Fuchsia setup:

and the standalone version

Reporting bugs

If you find a bug, you can see if it is known or report it in the bug database.

Sending patches

GN uses Gerrit for code review. The short version of how to patch is:

Register at https://gn-review.googlesource.com.

... edit code ...
ninja -C out && out/gn_unittests

Then, to upload a change for review:

git commit
git push origin HEAD:refs/for/master

The first time you do this you'll get an error from the server about a missing change-ID. Follow the directions in the error message to install the change-ID hook and run git commit --amend to apply the hook to the current commit.

When revising a change, use:

git commit --amend
git push origin HEAD:refs/for/master

which will add the new changes to the existing code review, rather than creating a new one.

We ask that all contributors sign Google's Contributor License Agreement (either individual or corporate as appropriate, select 'any other Google project').

Community

You may ask questions and follow along with GN's development on Chromium's gn-dev@ Google Group.

Versioning and distribution

Most open-source projects are designed to use the developer's computer's current toolchain such as compiler, linker, and build tool. But the large centrally controlled projects that GN is designed for typically want a more hermetic environment. They will ensure that developers are using a specific compatible toolchain that is versioned with the code

As a result, GN expects that the project choose the appropriate version of GN that will work with each version of the project. There is no "current stable version" of GN that is expected to work for all projects.

As a result, the GN developers to not maintain any packages in any of the various packaging systems (Debian, RedHat, HomeBrew, etc.). Some of these systems to have GN packages, but they are maintained by third parties and you should use at your own risk. Instead, we recommend you refer your checkout tooling to download binaries for a specific hash from Google's build infrastructure or compile your own.

GN does not guarantee the backwards-compatibility of new versions and has no branches or versioning scheme beyond the sequence of commits to the master git branch (which is expected to be stable).

In practice, however, GN is very backwards-compatible. The core functionality has been stable for many years and there is enough GN code at Google alone to make non-backwards-compatible changes very difficult, even if they were desirable.

There have been discussions about adding a versioning scheme with some guarantees about backwards-compatibility, but nothing has yet been implemented.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].