Coder Social home page Coder Social logo

abseil.gn's Introduction

Abseil C++ Library, GN-managed

The Abseil C++ Library (source) is a collection of useful C++ utilities that are elusive in the C++ standard library. Why adopt Abseil?

The official repository supports using Bazel or CMake as the build system. But I want to make it usable with GN, a build system developed by and for the Chromium projects with cross-platform and conditional builds in mind, and which I think is more light-weight and syntactically elegant than Bazel (GN vs Bazel).

This project generates GN build files so that Abseil can serve as a library embedded in another GN-managed project. Therefore, it does not transpile Bazel build settings stored in WORKSPACE and *.bzl files etc.

Prerequisites

  • Python 3.8+,
  • Git 2.21+,
  • (optional) Bazel 3.4.1+

How to regenerate this repository

This requires Bazel.

Working directory: at root of this repository.

# Fetch Abseil source and update *.gn files
$ ./update.sh # add "-r" to skip fetching the Abseil source.

What if the program "hangs"?

On first execution, Bazel may decide to download JDK (yeah, it doesn't do this step during installation), which may take a long time and it appears the program hangs. This peculiar behavior of Bazel is annoying (GitHub issue).

How to inject into an existing Abseil source tree

This doesn't require Bazel.

Working directory: at root of this repository.

# This will automatically "git checkout" the corresponding Abseil commit.
$ ./inject.sh path/to/abseil-cpp

Explore alternative actions

$ ./gen.py --help

What is the profile file?

It controls how Bazel build files are converted to GN build files. Boradly speaking, the JSON file serves two purposes:

  • Controls the generation of GN files.
  • Circumvents complex configuration computation in Bazel.

The profile could be auto-generated by a GN target so its content can depend on how GN handles conditionals.

target_mapping

Type: dict[str, str] (key: apparent Bazel target type, value: apparent GN target type). Default: empty.

Controls what Bazel target types get transpiled into what GN target types (for example, cc_library can correspond to source_set, shared_library, static_library, or even a custom GN target template name like absl_source_set). Bazel targets whose type doesn't appear in this map are ignored.

hidden_target_labels

Type: list[str] (elements: regular expressions). Default: empty.

If a target's full label (i.e. path/to/build/file:target_name) is matched with any of the regular expressions, the target's visibility is private to the Bazel project itself. Otherwise, the target is publicly visible.

Indeed, Bazel targets have their own visibility annotations the grammar is too complicated (e.g. special names like __pkg__, __subpackages__, or a package group), and isn't particularly useful to retain this fine-grained control in the use case where the Bazel project serves as a library - what really matters is whether clients can refer to a target or not.

skip_testonly

Type: bool. Default: false.

Whether to skip Bazel targets which have testonly = 1.

root_replacers

Type: dict[str, str] (key: root path in Bazel syntax, value: paths in GN syntax). Default: empty.

Bazel can handle foreign packages but GN was designed with mono-repo in mind. Therefore, users may need to replace package root path symbols with symbols understandable by GN. For example, @com_google_googletest// can be replaced with $googletest/, and the user need to specify in their GN setup what path string the variable googletest is mapped to.

bazel_build_options

Type: list[str]. Default: empty.

Bazel build options to control how to evaluate config_setting targets, which in turn affect how select() is evaluated.

bazel_variable_expansions

Type: dict[str, Any]. Default: empty.

Controls what values Bazel variables should represent. In Bazel files, their values are determined by the context - the assignment statement may appear elsewhere, even in other files via a load statement. This is complex. bazel_variable_expansions provides a way for user to directly specify their values.

gn_omit_if_empty

Type: list[str]. Default: empty.

Controls what GN attributes should be left out if their values are empty lists. It serves a cosmetic purpose, in that lots of empty attributes like cflags = [] is ugly.

remove_gn_list_elements

Type Dict[str, List[str]]. Default: empty.

Remove list elements in the corresponding any target's GN attribute.

License

MIT License, except the Abseil source (noted in files) are licensed under this license.

โ– 

abseil.gn's People

Contributors

leedehai avatar

Stargazers

 avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.