xref: /aosp_15_r20/external/openscreen/README.md (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
1*3f982cf4SFabien Sanglard# Open Screen Library
2*3f982cf4SFabien Sanglard
3*3f982cf4SFabien SanglardThe Open Screen Library implements the Open Screen Protocol and the Chromecast
4*3f982cf4SFabien Sanglardprotocols (discovery, application control, and media streaming).
5*3f982cf4SFabien Sanglard
6*3f982cf4SFabien SanglardInformation about the Open Screen Protocol and its specification can be found
7*3f982cf4SFabien Sanglard[on GitHub](https://w3c.github.io/openscreenprotocol/).
8*3f982cf4SFabien Sanglard
9*3f982cf4SFabien Sanglard# Getting the code
10*3f982cf4SFabien Sanglard
11*3f982cf4SFabien Sanglard## Installing depot_tools
12*3f982cf4SFabien Sanglard
13*3f982cf4SFabien SanglardLibrary dependencies are managed using `gclient`, from the
14*3f982cf4SFabien Sanglard[depot_tools](https://www.chromium.org/developers/how-tos/depottools) repo.
15*3f982cf4SFabien Sanglard
16*3f982cf4SFabien SanglardTo get gclient, run the following command in your terminal:
17*3f982cf4SFabien Sanglard```bash
18*3f982cf4SFabien Sanglard    git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
19*3f982cf4SFabien Sanglard```
20*3f982cf4SFabien Sanglard
21*3f982cf4SFabien SanglardThen add the `depot_tools` folder to your `PATH` environment variable.
22*3f982cf4SFabien Sanglard
23*3f982cf4SFabien SanglardNote that openscreen does not use other features of `depot_tools` like `repo` or
24*3f982cf4SFabien Sanglard`drover`.  However, some `git-cl` functions *do* work, like `git cl try`,
25*3f982cf4SFabien Sanglard`git cl format`, `git cl lint`, and `git cl upload.`
26*3f982cf4SFabien Sanglard
27*3f982cf4SFabien Sanglard## Checking out code
28*3f982cf4SFabien Sanglard
29*3f982cf4SFabien SanglardFrom the parent directory of where you want the openscreen checkout (e.g.,
30*3f982cf4SFabien Sanglard`~/my_project_dir`), configure `gclient` and check out openscreen with the
31*3f982cf4SFabien Sanglardfollowing commands:
32*3f982cf4SFabien Sanglard
33*3f982cf4SFabien Sanglard```bash
34*3f982cf4SFabien Sanglard    cd ~/my_project_dir
35*3f982cf4SFabien Sanglard    gclient config https://chromium.googlesource.com/openscreen
36*3f982cf4SFabien Sanglard    gclient sync
37*3f982cf4SFabien Sanglard```
38*3f982cf4SFabien Sanglard
39*3f982cf4SFabien SanglardThe first `gclient` command will create a default .gclient file in
40*3f982cf4SFabien Sanglard`~/my_project_dir` that describes how to pull down the `openscreen` repository.
41*3f982cf4SFabien SanglardThe second command creates an `openscreen/` subdirectory, downloads the source
42*3f982cf4SFabien Sanglardcode, all third-party dependencies, and the toolchain needed to build things;
43*3f982cf4SFabien Sanglardand at their appropriate revisions.
44*3f982cf4SFabien Sanglard
45*3f982cf4SFabien Sanglard## Syncing your local checkout
46*3f982cf4SFabien Sanglard
47*3f982cf4SFabien SanglardTo update your local checkout from the openscreen reference repository, just run
48*3f982cf4SFabien Sanglard
49*3f982cf4SFabien Sanglard```bash
50*3f982cf4SFabien Sanglard   cd ~/my_project_dir/openscreen
51*3f982cf4SFabien Sanglard   git pull
52*3f982cf4SFabien Sanglard   gclient sync
53*3f982cf4SFabien Sanglard```
54*3f982cf4SFabien Sanglard
55*3f982cf4SFabien SanglardThis will rebase any local commits on the remote top-of-tree, and update any
56*3f982cf4SFabien Sanglarddependencies that have changed.
57*3f982cf4SFabien Sanglard
58*3f982cf4SFabien Sanglard# Build setup
59*3f982cf4SFabien Sanglard
60*3f982cf4SFabien SanglardThe following are the main tools are required for development/builds:
61*3f982cf4SFabien Sanglard
62*3f982cf4SFabien Sanglard - Build file generator: `gn`
63*3f982cf4SFabien Sanglard - Code formatter: `clang-format`
64*3f982cf4SFabien Sanglard - Builder: `ninja` ([GitHub releases](https://github.com/ninja-build/ninja/releases))
65*3f982cf4SFabien Sanglard - Compiler/Linker: `clang` (installed by default) or `gcc` (installed by you)
66*3f982cf4SFabien Sanglard
67*3f982cf4SFabien SanglardAll of these--except `gcc` as noted above--are automatically downloaded/updated
68*3f982cf4SFabien Sanglardfor the Linux and Mac environments via `gclient sync` as described above. The
69*3f982cf4SFabien Sanglardfirst two are installed into `buildtools/<platform>/`.
70*3f982cf4SFabien Sanglard
71*3f982cf4SFabien SanglardMac only: XCode must be installed on the system, to link against its frameworks.
72*3f982cf4SFabien Sanglard
73*3f982cf4SFabien Sanglard`clang-format` is used for maintaining consistent coding style, but it is not a
74*3f982cf4SFabien Sanglardcomplete replacement for adhering to Chromium/Google C++ style (that's on you!).
75*3f982cf4SFabien SanglardThe presubmit script will sanity-check that it has been run on all new/changed
76*3f982cf4SFabien Sanglardcode.
77*3f982cf4SFabien Sanglard
78*3f982cf4SFabien Sanglard## Linux clang
79*3f982cf4SFabien Sanglard
80*3f982cf4SFabien SanglardOn Linux, the build will automatically download the Clang compiler from the
81*3f982cf4SFabien SanglardGoogle storage cache, the same way that Chromium does it.
82*3f982cf4SFabien Sanglard
83*3f982cf4SFabien SanglardEnsure that libstdc++ 8 is installed, as clang depends on the system
84*3f982cf4SFabien Sanglardinstance of it. On Debian flavors, you can run:
85*3f982cf4SFabien Sanglard
86*3f982cf4SFabien Sanglard```bash
87*3f982cf4SFabien Sanglard   sudo apt-get install libstdc++-8-dev
88*3f982cf4SFabien Sanglard```
89*3f982cf4SFabien Sanglard
90*3f982cf4SFabien Sanglard## Linux gcc
91*3f982cf4SFabien Sanglard
92*3f982cf4SFabien SanglardSetting the `gn` argument "is_gcc=true" on Linux enables building using gcc
93*3f982cf4SFabien Sanglardinstead.
94*3f982cf4SFabien Sanglard
95*3f982cf4SFabien Sanglard```bash
96*3f982cf4SFabien Sanglard  mkdir out/debug-gcc
97*3f982cf4SFabien Sanglard  gn gen out/debug-gcc --args="is_gcc=true"
98*3f982cf4SFabien Sanglard```
99*3f982cf4SFabien Sanglard
100*3f982cf4SFabien SanglardNote that g++ version 7 or newer must be installed.  On Debian flavors you can
101*3f982cf4SFabien Sanglardrun:
102*3f982cf4SFabien Sanglard
103*3f982cf4SFabien Sanglard```bash
104*3f982cf4SFabien Sanglard  sudo apt-get install gcc-7
105*3f982cf4SFabien Sanglard```
106*3f982cf4SFabien Sanglard
107*3f982cf4SFabien Sanglard## Mac clang
108*3f982cf4SFabien Sanglard
109*3f982cf4SFabien SanglardOn Mac OS X, the build will use the clang provided by
110*3f982cf4SFabien Sanglard[XCode](https://apps.apple.com/us/app/xcode/id497799835?mt=12), which must be
111*3f982cf4SFabien Sanglardinstalled.
112*3f982cf4SFabien Sanglard
113*3f982cf4SFabien Sanglard## Debug build
114*3f982cf4SFabien Sanglard
115*3f982cf4SFabien SanglardSetting the `gn` argument "is_debug=true" enables debug build.
116*3f982cf4SFabien Sanglard
117*3f982cf4SFabien Sanglard```bash
118*3f982cf4SFabien Sanglard  gn gen out/debug --args="is_debug=true"
119*3f982cf4SFabien Sanglard```
120*3f982cf4SFabien Sanglard
121*3f982cf4SFabien SanglardTo install debug information for libstdc++ 8 on Debian flavors, you can run:
122*3f982cf4SFabien Sanglard
123*3f982cf4SFabien Sanglard```bash
124*3f982cf4SFabien Sanglard   sudo apt-get install libstdc++6-8-dbg
125*3f982cf4SFabien Sanglard```
126*3f982cf4SFabien Sanglard
127*3f982cf4SFabien Sanglard## gn configuration
128*3f982cf4SFabien Sanglard
129*3f982cf4SFabien SanglardRunning `gn args` opens an editor that allows to create a list of arguments
130*3f982cf4SFabien Sanglardpassed to every invocation of `gn gen`.
131*3f982cf4SFabien Sanglard
132*3f982cf4SFabien Sanglard```bash
133*3f982cf4SFabien Sanglard  gn args out/debug
134*3f982cf4SFabien Sanglard```
135*3f982cf4SFabien Sanglard
136*3f982cf4SFabien Sanglard# Building targets
137*3f982cf4SFabien Sanglard
138*3f982cf4SFabien Sanglard## Cast Streaming sender and receiver
139*3f982cf4SFabien Sanglard
140*3f982cf4SFabien SanglardTODO(jophba): Fill in details
141*3f982cf4SFabien Sanglard
142*3f982cf4SFabien Sanglard## OSP demo
143*3f982cf4SFabien Sanglard
144*3f982cf4SFabien SanglardThe following commands will build the Open Screen Protocol demo and run it.
145*3f982cf4SFabien Sanglard
146*3f982cf4SFabien Sanglard``` bash
147*3f982cf4SFabien Sanglard  mkdir out/debug
148*3f982cf4SFabien Sanglard  gn gen out/debug             # Creates the build directory and necessary ninja files
149*3f982cf4SFabien Sanglard  ninja -C out/debug osp_demo  # Builds the executable with ninja
150*3f982cf4SFabien Sanglard  ./out/debug/osp_demo          # Runs the executable
151*3f982cf4SFabien Sanglard```
152*3f982cf4SFabien Sanglard
153*3f982cf4SFabien SanglardThe `-C` argument to `ninja` works just like it does for GNU Make: it specifies
154*3f982cf4SFabien Sanglardthe working directory for the build.  So the same could be done as follows:
155*3f982cf4SFabien Sanglard
156*3f982cf4SFabien Sanglard``` bash
157*3f982cf4SFabien Sanglard  ./gn gen out/debug
158*3f982cf4SFabien Sanglard  cd out/debug
159*3f982cf4SFabien Sanglard  ninja osp_demo
160*3f982cf4SFabien Sanglard  ./osp_demo
161*3f982cf4SFabien Sanglard```
162*3f982cf4SFabien Sanglard
163*3f982cf4SFabien SanglardAfter editing a file, only `ninja` needs to be rerun, not `gn`.  If you have
164*3f982cf4SFabien Sanglardedited a `BUILD.gn` file, `ninja` will re-run `gn` for you.
165*3f982cf4SFabien Sanglard
166*3f982cf4SFabien SanglardUnless you like to wait longer than necessary for builds to complete, run
167*3f982cf4SFabien Sanglard`autoninja` instead of `ninja`, which takes the same command-line arguments.
168*3f982cf4SFabien SanglardThis will automatically parallelize the build for your system, depending on
169*3f982cf4SFabien Sanglardnumber of processor cores, RAM, etc.
170*3f982cf4SFabien Sanglard
171*3f982cf4SFabien SanglardFor details on running `osp_demo`, see its [README.md](osp/demo/README.md).
172*3f982cf4SFabien Sanglard
173*3f982cf4SFabien Sanglard## Building other targets
174*3f982cf4SFabien Sanglard
175*3f982cf4SFabien SanglardRunning `ninja -C out/debug gn_all` will build all non-test targets in the
176*3f982cf4SFabien Sanglardrepository.
177*3f982cf4SFabien Sanglard
178*3f982cf4SFabien Sanglard`gn ls --type=executable out/debug` will list all of the executable targets
179*3f982cf4SFabien Sanglardthat can be built.
180*3f982cf4SFabien Sanglard
181*3f982cf4SFabien SanglardIf you want to customize the build further, you can run `gn args out/debug` to
182*3f982cf4SFabien Sanglardpull up an editor for build flags. `gn args --list out/debug` prints all of
183*3f982cf4SFabien Sanglardthe build flags available.
184*3f982cf4SFabien Sanglard
185*3f982cf4SFabien Sanglard## Building and running unit tests
186*3f982cf4SFabien Sanglard
187*3f982cf4SFabien Sanglard```bash
188*3f982cf4SFabien Sanglard  ninja -C out/debug openscreen_unittests
189*3f982cf4SFabien Sanglard  ./out/debug/openscreen_unittests
190*3f982cf4SFabien Sanglard```
191*3f982cf4SFabien Sanglard
192*3f982cf4SFabien Sanglard# Contributing changes
193*3f982cf4SFabien Sanglard
194*3f982cf4SFabien SanglardOpen Screen library code should follow the [Open Screen Library Style
195*3f982cf4SFabien SanglardGuide](docs/style_guide.md).
196*3f982cf4SFabien Sanglard
197*3f982cf4SFabien SanglardThis library uses [Chromium Gerrit](https://chromium-review.googlesource.com/) for
198*3f982cf4SFabien Sanglardpatch management and code review (for better or worse).  You will need to register
199*3f982cf4SFabien Sanglardfor an account at `chromium-review.googlesource.com` to upload patches for review.
200*3f982cf4SFabien Sanglard
201*3f982cf4SFabien SanglardThe following sections contain some tips about dealing with Gerrit for code
202*3f982cf4SFabien Sanglardreviews, specifically when pushing patches for review, getting patches reviewed,
203*3f982cf4SFabien Sanglardand committing patches.
204*3f982cf4SFabien Sanglard
205*3f982cf4SFabien Sanglard# Uploading a patch for review
206*3f982cf4SFabien Sanglard
207*3f982cf4SFabien SanglardThe `git cl` tool handles details of interacting with Gerrit (the Chromium code
208*3f982cf4SFabien Sanglardreview tool) and is recommended for pushing patches for review.  Once you have
209*3f982cf4SFabien Sanglardcommitted changes locally, simply run:
210*3f982cf4SFabien Sanglard
211*3f982cf4SFabien Sanglard```bash
212*3f982cf4SFabien Sanglard  git cl format
213*3f982cf4SFabien Sanglard  git cl upload
214*3f982cf4SFabien Sanglard```
215*3f982cf4SFabien Sanglard
216*3f982cf4SFabien SanglardThe first command will will auto-format the code changes. Then, the second
217*3f982cf4SFabien Sanglardcommand runs the `PRESUBMIT.py` script to check style and, if it passes, a
218*3f982cf4SFabien Sanglardnewcode review will be posted on `chromium-review.googlesource.com`.
219*3f982cf4SFabien Sanglard
220*3f982cf4SFabien SanglardIf you make additional commits to your local branch, then running `git cl
221*3f982cf4SFabien Sanglardupload` again in the same branch will merge those commits into the ongoing
222*3f982cf4SFabien Sanglardreview as a new patchset.
223*3f982cf4SFabien Sanglard
224*3f982cf4SFabien SanglardIt's simplest to create a local git branch for each patch you want reviewed
225*3f982cf4SFabien Sanglardseparately.  `git cl` keeps track of review status separately for each local
226*3f982cf4SFabien Sanglardbranch.
227*3f982cf4SFabien Sanglard
228*3f982cf4SFabien Sanglard## Addressing merge conflicts
229*3f982cf4SFabien Sanglard
230*3f982cf4SFabien SanglardIf conflicting commits have been landed in the repository for a patch in review,
231*3f982cf4SFabien SanglardGerrit will flag the patch as having a merge conflict.  In that case, use the
232*3f982cf4SFabien Sanglardinstructions above to rebase your commits on top-of-tree and upload a new
233*3f982cf4SFabien Sanglardpatchset with the merge conflicts resolved.
234*3f982cf4SFabien Sanglard
235*3f982cf4SFabien Sanglard## Tryjobs
236*3f982cf4SFabien Sanglard
237*3f982cf4SFabien SanglardClicking the `CQ DRY RUN` button (also, confusingly, labeled `COMMIT QUEUE +1`)
238*3f982cf4SFabien Sanglardwill run the current patchset through all LUCI builders and report the results.
239*3f982cf4SFabien SanglardIt is always a good idea get a green tryjob on a patch before sending it for
240*3f982cf4SFabien Sanglardreview to avoid extra back-and-forth.
241*3f982cf4SFabien Sanglard
242*3f982cf4SFabien SanglardYou can also run `git cl try` from the commandline to submit a tryjob.
243*3f982cf4SFabien Sanglard
244*3f982cf4SFabien Sanglard## Code reviews
245*3f982cf4SFabien Sanglard
246*3f982cf4SFabien SanglardSend your patch to one or more committers in the
247*3f982cf4SFabien Sanglard[COMMITTERS](https://chromium.googlesource.com/openscreen/+/refs/heads/master/COMMITTERS)
248*3f982cf4SFabien Sanglardfile for code review.  All patches must receive at least one LGTM by a committer
249*3f982cf4SFabien Sanglardbefore it can be submitted.
250*3f982cf4SFabien Sanglard
251*3f982cf4SFabien Sanglard## Submitting patches
252*3f982cf4SFabien Sanglard
253*3f982cf4SFabien SanglardAfter your patch has received one or more LGTM commit it by clicking the
254*3f982cf4SFabien Sanglard`SUBMIT` button (or, confusingly, `COMMIT QUEUE +2`) in Gerrit.  This will run
255*3f982cf4SFabien Sanglardyour patch through the builders again before committing to the main openscreen
256*3f982cf4SFabien Sanglardrepository.
257*3f982cf4SFabien Sanglard
258*3f982cf4SFabien Sanglard# Additional resources
259*3f982cf4SFabien Sanglard
260*3f982cf4SFabien Sanglard* [Continuous builders](docs/continuous_build.md)
261*3f982cf4SFabien Sanglard* [Building and running fuzz tests](docs/fuzzing.md)
262*3f982cf4SFabien Sanglard* [Running on a Raspberry PI](docs/raspberry_pi.md)
263*3f982cf4SFabien Sanglard* [Unit test code coverage](docs/code_coverage.md)
264