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