From c5afcf0662a090ba2e7b6fc57d4924ceef05202e Mon Sep 17 00:00:00 2001 From: Daniel Lacasse Date: Thu, 3 Oct 2019 15:33:50 +0200 Subject: [PATCH 01/11] Use Sample plugin --- build.gradle.kts | 65 ++ cpp/application/README.adoc | 21 + settings.gradle.kts | 2 + src/docs/css/manual.css | 2170 +++++++++++++++++++++++++++++++++++ 4 files changed, 2258 insertions(+) create mode 100644 cpp/application/README.adoc create mode 100644 src/docs/css/manual.css diff --git a/build.gradle.kts b/build.gradle.kts index 014efb56..fd1c48ab 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,4 +1,69 @@ +import org.asciidoctor.gradle.AsciidoctorTask +import org.gradle.samples.Sample +import org.gradle.samples.plugins.generators.CppLibraryTemplate +import org.gradle.samples.plugins.generators.SourceCopyTask +import org.gradle.samples.plugins.generators.SwiftLibraryTemplate +import org.gradle.util.GUtil + // This root project is simply a container of sample builds plugins { id("org.gradle.samples.wrapper") + id("org.gradle.samples") +} + +tasks.withType().matching { it.name.contains("Sample") }.configureEach { + options(mapOf("doctype" to "book")) + + inputs.file("src/docs/css/manual.css") + .withPropertyName("manual") + .withPathSensitivity(PathSensitivity.RELATIVE) + + attributes(mapOf("stylesdir" to file("src/docs/css/").absolutePath, + "stylesheet" to "manual.css", + "nofooter" to true, + "sectanchors" to true, + "sectlinks" to true, + "linkattrs" to true)) +} + +val cppUtilsLib = CppLibraryTemplate.of("cpp-lib-with-api-dep", "utilities") +val cppListLib = CppLibraryTemplate.of("cpp-lib", "list") +val cppMessageLib = CppLibraryTemplate.of("cpp-message-api", "message") + +val swiftUtilsLib = SwiftLibraryTemplate.of("swift-lib-with-api-dep", "Utilities") +val swiftListLib = SwiftLibraryTemplate.of("swift-lib", "List") + +val samples = project.extensions.getByName("samples") as NamedDomainObjectContainer + +fun Sample.copySource(configuration: SourceCopyTask.() -> kotlin.Unit) { + val sample = this + val copySourceTask = tasks.register("generate${GUtil.toCamelCase(sample.name)}Sample", SourceCopyTask::class.java) { + val outputDir = project.layout.buildDirectory.dir("sample-generators/${sample.name}") + sampleDir.set(outputDir) + templatesDir.set(file("samples-dev/src/templates")) + } + copySourceTask.configure(configuration) + + val sourceContent = project.fileTree(copySourceTask.flatMap { it.sampleDir }) { + builtBy(copySourceTask) + + // Patch over the stubbed Gradle wrappers + exclude("gradlew*") + } + sample.archiveContent.from(sourceContent) +} + +samples.create("cpp-application") { + sampleDirectory.set(file("cpp/application")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + appProject(".").buildRoot() + appProject(".").fromTemplate("cpp-app") + appProject(".").fromTemplate(cppMessageLib) + appProject(".").fromTemplate("cpp-message-static") + appProject(".").fromTemplate(cppUtilsLib) + appProject(".").fromTemplate(cppListLib) + } } diff --git a/cpp/application/README.adoc b/cpp/application/README.adoc new file mode 100644 index 00000000..e6ab50de --- /dev/null +++ b/cpp/application/README.adoc @@ -0,0 +1,21 @@ += Simple application (application) + +ifndef::env-github[] +- link:{zip-base-file-name}-groovy-dsl.zip[Download Groovy DSL ZIP] +endif::[] + +This sample shows how a simple C++ application can be built with Gradle. The application has no dependencies and the build has minimal configuration. + +Although there is currently no out-of-the-box support for building applications and libraries from C, there is also a sample build that shows how the C++ support can be configured to build a C application. + +To build and run the application: + +``` +> cd cpp-application +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./build/install/main/debug/app +Hello, World! +``` diff --git a/settings.gradle.kts b/settings.gradle.kts index 93ca7033..b4245d64 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,5 +1,6 @@ include("samples-dev") +includeBuild("/Users/daniel/gradle/guides/guides/subprojects/gradle-guides-plugin") includeBuild("samples-dev/plugins") includeBuild("samples-dev/src/templates/custom-publication-plugin") includeBuild("samples-dev/src/templates/build-wrapper-plugin") @@ -14,3 +15,4 @@ pluginManagement { } } } + diff --git a/src/docs/css/manual.css b/src/docs/css/manual.css new file mode 100644 index 00000000..7916e8d0 --- /dev/null +++ b/src/docs/css/manual.css @@ -0,0 +1,2170 @@ +/* + * Copyright 2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Lato (normal, regular) */ +@font-face { + font-family: Lato; + font-weight: 400; + font-style: normal; + src: url("https://assets.gradle.com/lato/fonts/lato-normal/lato-normal.woff2") format("woff2"), + url("https://assets.gradle.com/lato/fonts/lato-normal/lato-normal.woff") format("woff"); +} +/* Lato (normal, italic) */ +@font-face { + font-display: swap; + font-family: Lato; + font-weight: 400; + font-style: italic; + src: url("https://assets.gradle.com/lato/fonts/lato-normal-italic/lato-normal-italic.woff2") format("woff2"), + url("https://assets.gradle.com/lato/fonts/lato-normal-italic/lato-normal-italic.woff") format("woff"); +} +/* Lato (bold, regular) */ +@font-face { + font-display: swap; + font-family: Lato; + font-weight: 500; + font-style: normal; + src: url("https://assets.gradle.com/lato/fonts/lato-semibold/lato-semibold.woff2") format("woff2"), + url("https://assets.gradle.com/lato/fonts/lato-semibold/lato-semibold.woff") format("woff"); +} +/* Lato (bold, regular) */ +@font-face { + font-display: swap; + font-family: Lato; + font-weight: 800; + font-style: normal; + src: url("https://assets.gradle.com/lato/fonts/lato-heavy/lato-heavy.woff2") format("woff2"), + url("https://assets.gradle.com/lato/fonts/lato-heavy/lato-heavy.woff") format("woff"); +} + + +/* BEGIN asciidoc.css */ + +/*! normalize.css v2.1.2 | MIT License | git.io/normalize */ +/* ========================================================================== HTML5 display definitions ========================================================================== */ +/** Correct `block` display not defined in IE 8/9. */ +article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { display: block; } + +/** Correct `inline-block` display not defined in IE 8/9. */ +audio, canvas, video { display: inline-block; } + +/** Prevent modern browsers from displaying `audio` without controls. Remove excess height in iOS 5 devices. */ +audio:not([controls]) { display: none; height: 0; } + +/** Address `[hidden]` styling not present in IE 8/9. Hide the `template` element in IE, Safari, and Firefox < 22. */ +[hidden], template { display: none; } + +script { display: none !important; } + +/* ========================================================================== Base ========================================================================== */ +/** 1. Set default font family to sans-serif. 2. Prevent iOS text size adjust after orientation change, without disabling user zoom. */ +html { font-family: sans-serif; /* 1 */ -ms-text-size-adjust: 100%; /* 2 */ -webkit-text-size-adjust: 100%; /* 2 */ } + +/** Remove default margin. */ +body { margin: 0; } + +/* ========================================================================== Links ========================================================================== */ +/** Remove the gray background color from active links in IE 10. */ +a { background: transparent; } + +/** Address `outline` inconsistency between Chrome and other browsers. */ +a:focus { outline: thin dotted; } + +/** Improve readability when focused and also mouse hovered in all browsers. */ +a:active, a:hover { outline: 0; } + +/* ========================================================================== Typography ========================================================================== */ +/** Address variable `h1` font-size and margin within `section` and `article` contexts in Firefox 4+, Safari 5, and Chrome. */ +h1 { font-size: 2em; margin: 0.67em 0; } + +/** Address styling not present in IE 8/9, Safari 5, and Chrome. */ +abbr[title] { border-bottom: 1px dotted; } + +/** Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. */ +b, strong { font-weight: bold; } + +/** Address styling not present in Safari 5 and Chrome. */ +dfn { font-style: italic; } + +/** Address differences between Firefox and other browsers. */ +hr { -moz-box-sizing: content-box; box-sizing: content-box; height: 0; } + +/** Address styling not present in IE 8/9. */ +mark { background: #ff0; color: #000; } + +/** Correct font family set oddly in Safari 5 and Chrome. */ +code, kbd, pre, samp { font-family: monospace, serif; font-size: 1em; } + +/** Improve readability of pre-formatted text in all browsers. */ +pre { white-space: pre-wrap; } + +/** Set consistent quote types. */ +q { quotes: "\201C" "\201D" "\2018" "\2019"; } + +/** Address inconsistent and variable font size in all browsers. */ +small { font-size: 80%; } + +/** Prevent `sub` and `sup` affecting `line-height` in all browsers. */ +sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } + +sup { top: -0.5em; } + +sub { bottom: -0.25em; } + +/* ========================================================================== Embedded content ========================================================================== */ +/** Remove border when inside `a` element in IE 8/9. */ +img { border: 0; } + +/** Correct overflow displayed oddly in IE 9. */ +svg:not(:root) { overflow: hidden; } + +/* ========================================================================== Figures ========================================================================== */ +/** Address margin not present in IE 8/9 and Safari 5. */ +figure { margin: 0; } + +/* ========================================================================== Forms ========================================================================== */ +/** Define consistent border, margin, and padding. */ +fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; } + +/** 1. Correct `color` not being inherited in IE 8/9. 2. Remove padding so people aren't caught out if they zero out fieldsets. */ +legend { border: 0; /* 1 */ padding: 0; /* 2 */ } + +/** 1. Correct font family not being inherited in all browsers. 2. Correct font size not being inherited in all browsers. 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome. */ +button, input, select, textarea { font-family: inherit; /* 1 */ font-size: 100%; /* 2 */ margin: 0; /* 3 */ } + +/** Address Firefox 4+ setting `line-height` on `input` using `!important` in the UA stylesheet. */ +button, input { line-height: normal; } + +/** Address inconsistent `text-transform` inheritance for `button` and `select`. All other form control elements do not inherit `text-transform` values. Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. Correct `select` style inheritance in Firefox 4+ and Opera. */ +button, select { text-transform: none; } + +/** 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` and `video` controls. 2. Correct inability to style clickable `input` types in iOS. 3. Improve usability and consistency of cursor style between image-type `input` and others. */ +button, html input[type="button"], input[type="reset"], input[type="submit"] { -webkit-appearance: button; /* 2 */ cursor: pointer; /* 3 */ } + +/** Re-set default cursor for disabled elements. */ +button[disabled], html input[disabled] { cursor: default; } + +/** 1. Address box sizing set to `content-box` in IE 8/9. 2. Remove excess padding in IE 8/9. */ +input[type="checkbox"], input[type="radio"] { box-sizing: border-box; /* 1 */ padding: 0; /* 2 */ } + +/** 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome (include `-moz` to future-proof). */ +input[type="search"] { -webkit-appearance: textfield; /* 1 */ -moz-box-sizing: content-box; -webkit-box-sizing: content-box; /* 2 */ box-sizing: content-box; } + +/** Remove inner padding and search cancel button in Safari 5 and Chrome on OS X. */ +input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } + +/** Remove inner padding and border in Firefox 4+. */ +button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; } + +/** 1. Remove default vertical scrollbar in IE 8/9. 2. Improve readability and alignment in all browsers. */ +textarea { overflow: auto; /* 1 */ vertical-align: top; /* 2 */ } + +/* ========================================================================== Tables ========================================================================== */ +/** Remove most spacing between table cells. */ +table { border-collapse: collapse; border-spacing: 0; } + +meta.foundation-mq-small { font-family: "only screen and (min-width: 768px)"; width: 768px; } + +meta.foundation-mq-medium { font-family: "only screen and (min-width:1280px)"; width: 1280px; } + +meta.foundation-mq-large { font-family: "only screen and (min-width:1440px)"; width: 1440px; } + +*, *:before, *:after { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; } + +html, body { font-size: 100%; } + +body { background: white; color: rgba(0, 0, 0, 0.8); padding: 0; margin: 0; font-family: "Noto Serif", "DejaVu Serif", serif; font-weight: normal; font-style: normal; line-height: 1; position: relative; cursor: auto; } + +a:hover { cursor: pointer; } + +img, object, embed { max-width: 100%; height: auto; } + +object, embed { height: 100%; } + +img { -ms-interpolation-mode: bicubic; } + +#map_canvas img, #map_canvas embed, #map_canvas object, .map_canvas img, .map_canvas embed, .map_canvas object { max-width: none !important; } + +.left { float: left !important; } + +.right { float: right !important; } + +.text-left { text-align: left !important; } + +.text-right { text-align: right !important; } + +.text-center { text-align: center !important; } + +.text-justify { text-align: justify !important; } + +.hide { display: none; } + +.antialiased { -webkit-font-smoothing: antialiased; } + +img { display: inline-block; vertical-align: middle; } + +textarea { height: auto; min-height: 50px; } + +select { width: 100%; } + +object, svg { display: inline-block; vertical-align: middle; } + +.center { margin-left: auto; margin-right: auto; } + +.spread { width: 100%; } + +p.lead, .paragraph.lead > p, #preamble > .sectionbody > .paragraph:first-of-type p { font-size: 1.21875em; line-height: 1.6; } + +.subheader, .admonitionblock td.content > .title, .audioblock > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .stemblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, table.tableblock > .title, .verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title { line-height: 1.45; color: #7a2518; font-weight: normal; margin-top: 0; margin-bottom: 0.25em; } + +/* Typography resets */ +div, dl, dt, dd, ul, ol, li, h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6, pre, form, p, blockquote, th, td { margin: 0; padding: 0; direction: ltr; } + +/* Default Link Styles */ +a { color: #2156a5; text-decoration: underline; line-height: inherit; } +a:hover, a:focus { color: #1d4b8f; } +a img { border: none; } + +/* Default paragraph styles */ +p { font-family: inherit; font-weight: normal; font-size: 1em; line-height: 1.6; margin-bottom: 1.25em; text-rendering: optimizeLegibility; } +p aside { font-size: 0.875em; line-height: 1.35; font-style: italic; } + +/* Default header styles */ +h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { font-family: "Open Sans", "DejaVu Sans", sans-serif; font-weight: 300; font-style: normal; color: #ba3925; text-rendering: optimizeLegibility; margin-top: 1em; margin-bottom: 0.5em; line-height: 1.0125em; } +h1 small, h2 small, h3 small, #toctitle small, .sidebarblock > .content > .title small, h4 small, h5 small, h6 small { font-size: 60%; color: #e99b8f; line-height: 0; } + +h1 { font-size: 2.125em; } + +h2 { font-size: 1.6875em; } + +h3, #toctitle, .sidebarblock > .content > .title { font-size: 1.375em; } + +h4 { font-size: 1.125em; } + +h5 { font-size: 1.125em; } + +h6 { font-size: 1em; } + +hr { border: solid #ddddd8; border-width: 1px 0 0; clear: both; margin: 1.25em 0 1.1875em; height: 0; } + +/* Helpful Typography Defaults */ +em, i { font-style: italic; line-height: inherit; } + +strong, b { font-weight: bold; line-height: inherit; } + +small { font-size: 60%; line-height: inherit; } + +code { font-family: "Droid Sans Mono", "DejaVu Sans Mono", monospace; font-weight: normal; color: rgba(0, 0, 0, 0.9); } + +/* Lists */ +ul, ol, dl { font-size: 1em; line-height: 1.6; margin-bottom: 1.25em; list-style-position: outside; font-family: inherit; } + +ul, ol { margin-left: 1.5em; } +ul.no-bullet, ol.no-bullet { margin-left: 1.5em; } + +/* Unordered Lists */ +ul li ul, ul li ol { margin-left: 1.25em; margin-bottom: 0; font-size: 1em; /* Override nested font-size change */ } +ul.square li ul, ul.circle li ul, ul.disc li ul { list-style: inherit; } +ul.square { list-style-type: square; } +ul.circle { list-style-type: circle; } +ul.disc { list-style-type: disc; } +ul.no-bullet { list-style: none; } + +/* Ordered Lists */ +ol li ul, ol li ol { margin-left: 1.25em; margin-bottom: 0; } + +/* Definition Lists */ +dl dt { margin-bottom: 0.3125em; font-weight: bold; } +dl dd { margin-bottom: 1.25em; } + +/* Abbreviations */ +abbr, acronym { text-transform: uppercase; font-size: 90%; color: rgba(0, 0, 0, 0.8); border-bottom: 1px dotted #dddddd; cursor: help; } + +abbr { text-transform: none; } + +/* Blockquotes */ +blockquote { margin: 0 0 1.25em; padding: 0.5625em 1.25em 0 1.1875em; border-left: 1px solid #dddddd; } +blockquote cite { display: block; font-size: 0.9375em; color: rgba(0, 0, 0, 0.6); } +blockquote cite:before { content: "\2014 \0020"; } +blockquote cite a, blockquote cite a:visited { color: rgba(0, 0, 0, 0.6); } + +blockquote, blockquote p { line-height: 1.6; color: rgba(0, 0, 0, 0.85); } + +/* Microformats */ +.vcard { display: inline-block; margin: 0 0 1.25em 0; border: 1px solid #dddddd; padding: 0.625em 0.75em; } +.vcard li { margin: 0; display: block; } +.vcard .fn { font-weight: bold; font-size: 0.9375em; } + +.vevent .summary { font-weight: bold; } +.vevent abbr { cursor: auto; text-decoration: none; font-weight: bold; border: none; padding: 0 0.0625em; } + +@media only screen and (min-width: 768px) { h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { line-height: 1.2; } + h1 { font-size: 2.75em; } + h2 { font-size: 2.3125em; } + h3, #toctitle, .sidebarblock > .content > .title { font-size: 1.6875em; } + h4 { font-size: 1.4375em; } } +/* Tables */ +table { background: white; margin-bottom: 1.25em; border: solid 1px #dedede; } +table thead, table tfoot { background: #f7f8f7; font-weight: bold; } +table thead tr th, table thead tr td, table tfoot tr th, table tfoot tr td { padding: 0.5em 0.625em 0.625em; font-size: inherit; color: rgba(0, 0, 0, 0.8); text-align: left; } +table tr th, table tr td { padding: 0.5625em 0.625em; font-size: inherit; color: rgba(0, 0, 0, 0.8); } +table tr.even, table tr.alt, table tr:nth-of-type(even) { background: #f8f8f7; } +table thead tr th, table tfoot tr th, table tbody tr td, table tr td, table tfoot tr td { display: table-cell; line-height: 1.6; } + +body { tab-size: 4; } + +h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { line-height: 1.2; word-spacing: -0.05em; } +h1 strong, h2 strong, h3 strong, #toctitle strong, .sidebarblock > .content > .title strong, h4 strong, h5 strong, h6 strong { font-weight: 400; } + +.clearfix:before, .clearfix:after, .float-group:before, .float-group:after { content: " "; display: table; } +.clearfix:after, .float-group:after { clear: both; } + +*:not(pre) > code { font-size: 0.9375em; font-style: normal !important; letter-spacing: 0; padding: 0.1em 0.5ex; word-spacing: -0.15em; background-color: #f7f7f8; -webkit-border-radius: 4px; border-radius: 4px; line-height: 1.45; text-rendering: optimizeSpeed; word-wrap: break-word; } +*:not(pre) > code.nobreak { word-wrap: normal; } +*:not(pre) > code.nowrap { white-space: nowrap; } + +pre, pre > code { line-height: 1.45; color: rgba(0, 0, 0, 0.9); font-family: "Droid Sans Mono", "DejaVu Sans Mono", "Monospace", monospace; font-weight: normal; text-rendering: optimizeSpeed; } + +em em { font-style: normal; } + +strong strong { font-weight: normal; } + +.keyseq { color: rgba(51, 51, 51, 0.8); } + +kbd { font-family: "Droid Sans Mono", "DejaVu Sans Mono", monospace; display: inline-block; color: rgba(0, 0, 0, 0.8); font-size: 0.65em; line-height: 1.45; background-color: #f7f7f7; border: 1px solid #ccc; -webkit-border-radius: 3px; border-radius: 3px; -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 0.1em white inset; box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 0.1em white inset; margin: 0 0.15em; padding: 0.2em 0.5em; vertical-align: middle; position: relative; top: -0.1em; white-space: nowrap; } + +.keyseq kbd:first-child { margin-left: 0; } + +.keyseq kbd:last-child { margin-right: 0; } + +.menuseq, .menu { color: rgba(0, 0, 0, 0.8); } + +b.button:before, b.button:after { position: relative; top: -1px; font-weight: normal; } + +b.button:before { content: "["; padding: 0 3px 0 2px; } + +b.button:after { content: "]"; padding: 0 2px 0 3px; } + +p a > code:hover { color: rgba(0, 0, 0, 0.9); } + +#header, #content, #footnotes, #footer { width: 100%; margin-left: auto; margin-right: auto; margin-top: 0; margin-bottom: 0; max-width: 62.5em; *zoom: 1; position: relative; padding-left: 0.9375em; padding-right: 0.9375em; } +#header:before, #header:after, #content:before, #content:after, #footnotes:before, #footnotes:after, #footer:before, #footer:after { content: " "; display: table; } +#header:after, #content:after, #footnotes:after, #footer:after { clear: both; } + +#content { margin-top: 1.25em; } + +#content:before { content: none; } + +#header > h1:first-child { color: rgba(0, 0, 0, 0.85); margin-top: 2.25rem; margin-bottom: 0; } +#header > h1:first-child + #toc { margin-top: 8px; border-top: 1px solid #ddddd8; } +#header > h1:only-child, body.toc2 #header > h1:nth-last-child(2) { border-bottom: 1px solid #ddddd8; padding-bottom: 8px; } +#header .details { border-bottom: 1px solid #ddddd8; line-height: 1.45; padding-top: 0.25em; padding-bottom: 0.25em; padding-left: 0.25em; color: rgba(0, 0, 0, 0.6); display: -ms-flexbox; display: -webkit-flex; display: flex; -ms-flex-flow: row wrap; -webkit-flex-flow: row wrap; flex-flow: row wrap; } +#header .details span:first-child { margin-left: -0.125em; } +#header .details span.email a { color: rgba(0, 0, 0, 0.85); } +#header .details br { display: none; } +#header .details br + span:before { content: "\00a0\2013\00a0"; } +#header .details br + span.author:before { content: "\00a0\22c5\00a0"; color: rgba(0, 0, 0, 0.85); } +#header .details br + span#revremark:before { content: "\00a0|\00a0"; } +#header #revnumber { text-transform: capitalize; } +#header #revnumber:after { content: "\00a0"; } + +#content > h1:first-child:not([class]) { color: rgba(0, 0, 0, 0.85); border-bottom: 1px solid #ddddd8; padding-bottom: 8px; margin-top: 0; padding-top: 1rem; margin-bottom: 1.25rem; } + +#toc { border-bottom: 1px solid #efefed; padding-bottom: 0.5em; } +#toc > ul { margin-left: 0.125em; } +#toc ul.sectlevel0 > li > a { font-style: italic; } +#toc ul.sectlevel0 ul.sectlevel1 { margin: 0.5em 0; } +#toc ul { font-family: "Open Sans", "DejaVu Sans", sans-serif; list-style-type: none; } +#toc li { line-height: 1.3334; margin-top: 0.3334em; } +#toc a { text-decoration: none; } +#toc a:active { text-decoration: underline; } + +#toctitle { color: #7a2518; font-size: 1.2em; } + +@media only screen and (min-width: 768px) { #toctitle { font-size: 1.375em; } + body.toc2 { padding-left: 15em; padding-right: 0; } + #toc.toc2 { margin-top: 0 !important; background-color: #f8f8f7; position: fixed; width: 15em; left: 0; top: 0; border-right: 1px solid #efefed; border-top-width: 0 !important; border-bottom-width: 0 !important; z-index: 1000; padding: 1.25em 1em; height: 100%; overflow: auto; } + #toc.toc2 #toctitle { margin-top: 0; margin-bottom: 0.8rem; font-size: 1.2em; } + #toc.toc2 > ul { font-size: 0.9em; margin-bottom: 0; } + #toc.toc2 ul ul { margin-left: 0; padding-left: 1em; } + #toc.toc2 ul.sectlevel0 ul.sectlevel1 { padding-left: 0; margin-top: 0.5em; margin-bottom: 0.5em; } + body.toc2.toc-right { padding-left: 0; padding-right: 15em; } + body.toc2.toc-right #toc.toc2 { border-right-width: 0; border-left: 1px solid #efefed; left: auto; right: 0; } } +@media only screen and (min-width: 1280px) { body.toc2 { padding-left: 20em; padding-right: 0; } + #toc.toc2 { width: 20em; } + #toc.toc2 #toctitle { font-size: 1.375em; } + #toc.toc2 > ul { font-size: 0.95em; } + #toc.toc2 ul ul { padding-left: 1.25em; } + body.toc2.toc-right { padding-left: 0; padding-right: 20em; } } +#content #toc { border-style: solid; border-width: 1px; border-color: #e0e0dc; margin-bottom: 1.25em; padding: 1.25em; background: #f8f8f7; -webkit-border-radius: 4px; border-radius: 4px; } +#content #toc > :first-child { margin-top: 0; } +#content #toc > :last-child { margin-bottom: 0; } + +#footer { max-width: 100%; background-color: rgba(0, 0, 0, 0.8); padding: 1.25em; } + +#footer-text { color: rgba(255, 255, 255, 0.8); line-height: 1.44; } + +.sect1 { padding-bottom: 0.625em; } + +@media only screen and (min-width: 768px) { .sect1 { padding-bottom: 1.25em; } } +.sect1 + .sect1 { border-top: 1px solid #efefed; } + +#content h1 > a.anchor, h2 > a.anchor, h3 > a.anchor, #toctitle > a.anchor, .sidebarblock > .content > .title > a.anchor, h4 > a.anchor, h5 > a.anchor, h6 > a.anchor { position: absolute; z-index: 1001; width: 1.5ex; margin-left: -1.5ex; display: block; text-decoration: none !important; visibility: hidden; text-align: center; font-weight: normal; } +#content h1 > a.anchor:before, h2 > a.anchor:before, h3 > a.anchor:before, #toctitle > a.anchor:before, .sidebarblock > .content > .title > a.anchor:before, h4 > a.anchor:before, h5 > a.anchor:before, h6 > a.anchor:before { content: "\00A7"; font-size: 0.85em; display: block; padding-top: 0.1em; } +#content h1:hover > a.anchor, #content h1 > a.anchor:hover, h2:hover > a.anchor, h2 > a.anchor:hover, h3:hover > a.anchor, #toctitle:hover > a.anchor, .sidebarblock > .content > .title:hover > a.anchor, h3 > a.anchor:hover, #toctitle > a.anchor:hover, .sidebarblock > .content > .title > a.anchor:hover, h4:hover > a.anchor, h4 > a.anchor:hover, h5:hover > a.anchor, h5 > a.anchor:hover, h6:hover > a.anchor, h6 > a.anchor:hover { visibility: visible; } +#content h1 > a.link, h2 > a.link, h3 > a.link, #toctitle > a.link, .sidebarblock > .content > .title > a.link, h4 > a.link, h5 > a.link, h6 > a.link { color: #ba3925; text-decoration: none; } +#content h1 > a.link:hover, h2 > a.link:hover, h3 > a.link:hover, #toctitle > a.link:hover, .sidebarblock > .content > .title > a.link:hover, h4 > a.link:hover, h5 > a.link:hover, h6 > a.link:hover { color: #a53221; } + +.audioblock, .imageblock, .literalblock, .listingblock, .stemblock, .videoblock { margin-bottom: 1.25em; } + +.admonitionblock td.content > .title, .audioblock > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .stemblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, table.tableblock > .title, .verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title { text-rendering: optimizeLegibility; text-align: left; font-family: "Noto Serif", "DejaVu Serif", serif; font-size: 1rem; font-style: italic; } + +table.tableblock > caption.title { white-space: nowrap; overflow: visible; max-width: 0; } + +.paragraph.lead > p, #preamble > .sectionbody > .paragraph:first-of-type p { color: rgba(0, 0, 0, 0.85); } + +table.tableblock #preamble > .sectionbody > .paragraph:first-of-type p { font-size: inherit; } + +.admonitionblock > table { border-collapse: separate; border: 0; background: none; width: 100%; } +.admonitionblock > table td.icon { text-align: center; width: 80px; } +.admonitionblock > table td.icon img { max-width: initial; } +.admonitionblock > table td.icon .title { font-weight: bold; font-family: "Open Sans", "DejaVu Sans", sans-serif; text-transform: uppercase; } +.admonitionblock > table td.content { padding-left: 1.125em; padding-right: 1.25em; border-left: 1px solid #ddddd8; color: rgba(0, 0, 0, 0.6); } +.admonitionblock > table td.content > :last-child > :last-child { margin-bottom: 0; } + +.exampleblock > .content { border-style: solid; border-width: 1px; border-color: #e6e6e6; margin-bottom: 1.25em; padding: 1.25em; background: white; -webkit-border-radius: 4px; border-radius: 4px; } +.exampleblock > .content > :first-child { margin-top: 0; } +.exampleblock > .content > :last-child { margin-bottom: 0; } + +.sidebarblock { border-style: solid; border-width: 1px; border-color: #e0e0dc; margin-bottom: 1.25em; padding: 1.25em; background: #f8f8f7; -webkit-border-radius: 4px; border-radius: 4px; } +.sidebarblock > :first-child { margin-top: 0; } +.sidebarblock > :last-child { margin-bottom: 0; } +.sidebarblock > .content > .title { color: #7a2518; margin-top: 0; text-align: center; } + +.exampleblock > .content > :last-child > :last-child, .exampleblock > .content .olist > ol > li:last-child > :last-child, .exampleblock > .content .ulist > ul > li:last-child > :last-child, .exampleblock > .content .qlist > ol > li:last-child > :last-child, .sidebarblock > .content > :last-child > :last-child, .sidebarblock > .content .olist > ol > li:last-child > :last-child, .sidebarblock > .content .ulist > ul > li:last-child > :last-child, .sidebarblock > .content .qlist > ol > li:last-child > :last-child { margin-bottom: 0; } + +.literalblock pre, .listingblock pre:not(.highlight), .listingblock pre[class="highlight"], .listingblock pre[class^="highlight "], .listingblock pre.CodeRay, .listingblock pre.prettyprint { background: #f7f7f8; } +.sidebarblock .literalblock pre, .sidebarblock .listingblock pre:not(.highlight), .sidebarblock .listingblock pre[class="highlight"], .sidebarblock .listingblock pre[class^="highlight "], .sidebarblock .listingblock pre.CodeRay, .sidebarblock .listingblock pre.prettyprint { background: #f2f1f1; } + +.literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock pre[class] { -webkit-border-radius: 4px; border-radius: 4px; word-wrap: break-word; padding: 1em; font-size: 0.8125em; } +.literalblock pre.nowrap, .literalblock pre[class].nowrap, .listingblock pre.nowrap, .listingblock pre[class].nowrap { overflow-x: auto; white-space: pre; word-wrap: normal; } +@media only screen and (min-width: 768px) { .literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock pre[class] { font-size: 0.90625em; } } +@media only screen and (min-width: 1280px) { .literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock pre[class] { font-size: 1em; } } + +.literalblock.output pre { color: #f7f7f8; background-color: rgba(0, 0, 0, 0.9); } + +.listingblock pre.highlightjs { padding: 0; } +.listingblock pre.highlightjs > code { padding: 1em; -webkit-border-radius: 4px; border-radius: 4px; } + +.listingblock pre.prettyprint { border-width: 0; } + +.listingblock > .content { position: relative; } + +.listingblock code[data-lang]:before { display: none; content: attr(data-lang); position: absolute; font-size: 0.75em; top: 0.425rem; right: 0.5rem; line-height: 1; text-transform: uppercase; color: #999; } + +.listingblock:hover code[data-lang]:before { display: block; } + +.listingblock.terminal pre .command:before { content: attr(data-prompt); padding-right: 0.5em; color: #999; } + +.listingblock.terminal pre .command:not([data-prompt]):before { content: "$"; } + +table.pyhltable { border-collapse: separate; border: 0; margin-bottom: 0; background: none; } + +table.pyhltable td { vertical-align: top; padding-top: 0; padding-bottom: 0; line-height: 1.45; } + +table.pyhltable td.code { padding-left: .75em; padding-right: 0; } + +pre.pygments .lineno, table.pyhltable td:not(.code) { color: #999; padding-left: 0; padding-right: .5em; border-right: 1px solid #ddddd8; } + +pre.pygments .lineno { display: inline-block; margin-right: .25em; } + +table.pyhltable .linenodiv { background: none !important; padding-right: 0 !important; } + +.quoteblock { margin: 0 1em 1.25em 1.5em; display: table; } +.quoteblock > .title { margin-left: -1.5em; margin-bottom: 0.75em; } +.quoteblock blockquote, .quoteblock blockquote p { color: rgba(0, 0, 0, 0.85); font-size: 1.15rem; line-height: 1.75; word-spacing: 0.1em; letter-spacing: 0; font-style: italic; text-align: justify; } +.quoteblock blockquote { margin: 0; padding: 0; border: 0; } +.quoteblock blockquote:before { content: "\201c"; float: left; font-size: 2.75em; font-weight: bold; line-height: 0.6em; margin-left: -0.6em; color: #7a2518; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); } +.quoteblock blockquote > .paragraph:last-child p { margin-bottom: 0; } +.quoteblock .attribution { margin-top: 0.5em; margin-right: 0.5ex; text-align: right; } +.quoteblock .quoteblock { margin-left: 0; margin-right: 0; padding: 0.5em 0; border-left: 3px solid rgba(0, 0, 0, 0.6); } +.quoteblock .quoteblock blockquote { padding: 0 0 0 0.75em; } +.quoteblock .quoteblock blockquote:before { display: none; } + +.verseblock { margin: 0 1em 1.25em 1em; } +.verseblock pre { font-family: "Open Sans", "DejaVu Sans", sans; font-size: 1.15rem; color: rgba(0, 0, 0, 0.85); font-weight: 300; text-rendering: optimizeLegibility; } +.verseblock pre strong { font-weight: 400; } +.verseblock .attribution { margin-top: 1.25rem; margin-left: 0.5ex; } + +.quoteblock .attribution, .verseblock .attribution { font-size: 0.9375em; line-height: 1.45; font-style: italic; } +.quoteblock .attribution br, .verseblock .attribution br { display: none; } +.quoteblock .attribution cite, .verseblock .attribution cite { display: block; letter-spacing: -0.025em; color: rgba(0, 0, 0, 0.6); } + +.quoteblock.abstract { margin: 0 0 1.25em 0; display: block; } +.quoteblock.abstract blockquote, .quoteblock.abstract blockquote p { text-align: left; word-spacing: 0; } +.quoteblock.abstract blockquote:before, .quoteblock.abstract blockquote p:first-of-type:before { display: none; } + +table.tableblock { max-width: 100%; border-collapse: separate; } +table.tableblock td > .paragraph:last-child p > p:last-child, table.tableblock th > p:last-child, table.tableblock td > p:last-child { margin-bottom: 0; } + +table.tableblock, th.tableblock, td.tableblock { border: 0 solid #dedede; } + +table.grid-all th.tableblock, table.grid-all td.tableblock { border-width: 0 1px 1px 0; } + +table.grid-all tfoot > tr > th.tableblock, table.grid-all tfoot > tr > td.tableblock { border-width: 1px 1px 0 0; } + +table.grid-cols th.tableblock, table.grid-cols td.tableblock { border-width: 0 1px 0 0; } + +table.grid-all * > tr > .tableblock:last-child, table.grid-cols * > tr > .tableblock:last-child { border-right-width: 0; } + +table.grid-rows th.tableblock, table.grid-rows td.tableblock { border-width: 0 0 1px 0; } + +table.grid-all tbody > tr:last-child > th.tableblock, table.grid-all tbody > tr:last-child > td.tableblock, table.grid-all thead:last-child > tr > th.tableblock, table.grid-rows tbody > tr:last-child > th.tableblock, table.grid-rows tbody > tr:last-child > td.tableblock, table.grid-rows thead:last-child > tr > th.tableblock { border-bottom-width: 0; } + +table.grid-rows tfoot > tr > th.tableblock, table.grid-rows tfoot > tr > td.tableblock { border-width: 1px 0 0 0; } + +table.frame-all { border-width: 1px; } + +table.frame-sides { border-width: 0 1px; } + +table.frame-topbot { border-width: 1px 0; } + +th.halign-left, td.halign-left { text-align: left; } + +th.halign-right, td.halign-right { text-align: right; } + +th.halign-center, td.halign-center { text-align: center; } + +th.valign-top, td.valign-top { vertical-align: top; } + +th.valign-bottom, td.valign-bottom { vertical-align: bottom; } + +th.valign-middle, td.valign-middle { vertical-align: middle; } + +table thead th, table tfoot th { font-weight: bold; } + +tbody tr th { display: table-cell; line-height: 1.6; background: #f7f8f7; } + +tbody tr th, tbody tr th p, tfoot tr th, tfoot tr th p { color: rgba(0, 0, 0, 0.8); font-weight: bold; } + +p.tableblock > code:only-child { background: none; padding: 0; } + +p.tableblock { font-size: 1em; } + +td > div.verse { white-space: pre; } + +ol { margin-left: 1.75em; } + +ul li ol { margin-left: 1.5em; } + +dl dd { margin-left: 1.125em; } + +dl dd:last-child, dl dd:last-child > :last-child { margin-bottom: 0; } + +ol > li p, ul > li p, ul dd, ol dd, .olist .olist, .ulist .ulist, .ulist .olist, .olist .ulist { margin-bottom: 0.625em; } + +ul.unstyled, ol.unnumbered, ul.checklist, ul.none { list-style-type: none; } + +ul.unstyled, ol.unnumbered, ul.checklist { margin-left: 0.625em; } + +ul.checklist li > p:first-child > .fa-square-o:first-child, ul.checklist li > p:first-child > .fa-check-square-o:first-child { width: 1em; font-size: 0.85em; } + +ul.checklist li > p:first-child > input[type="checkbox"]:first-child { width: 1em; position: relative; top: 1px; } + +ul.inline { margin: 0 auto 0.625em auto; margin-left: -1.375em; margin-right: 0; padding: 0; list-style: none; overflow: hidden; } +ul.inline > li { list-style: none; float: left; margin-left: 1.375em; display: block; } +ul.inline > li > * { display: block; } + +.unstyled dl dt { font-weight: normal; font-style: normal; } + +ol.arabic { list-style-type: decimal; } + +ol.decimal { list-style-type: decimal-leading-zero; } + +ol.loweralpha { list-style-type: lower-alpha; } + +ol.upperalpha { list-style-type: upper-alpha; } + +ol.lowerroman { list-style-type: lower-roman; } + +ol.upperroman { list-style-type: upper-roman; } + +ol.lowergreek { list-style-type: lower-greek; } + +.hdlist > table, .colist > table { border: 0; background: none; } +.hdlist > table > tbody > tr, .colist > table > tbody > tr { background: none; } + +td.hdlist1, td.hdlist2 { vertical-align: top; padding: 0 0.625em; } + +td.hdlist1 { font-weight: bold; padding-bottom: 1.25em; } + +.literalblock + .colist, .listingblock + .colist { margin-top: -0.5em; } + +.colist > table tr > td:first-of-type { padding: 0 0.75em; line-height: 1; } +.colist > table tr > td:first-of-type img { max-width: initial; } +.colist > table tr > td:last-of-type { padding: 0.25em 0; } + +.thumb, .th { line-height: 0; display: inline-block; border: solid 4px white; -webkit-box-shadow: 0 0 0 1px #dddddd; box-shadow: 0 0 0 1px #dddddd; } + +.imageblock.left, .imageblock[style*="float: left"] { margin: 0.25em 0.625em 1.25em 0; } +.imageblock.right, .imageblock[style*="float: right"] { margin: 0.25em 0 1.25em 0.625em; } +.imageblock > .title { margin-bottom: 0; } +.imageblock.thumb, .imageblock.th { border-width: 6px; } +.imageblock.thumb > .title, .imageblock.th > .title { padding: 0 0.125em; } + +.image.left, .image.right { margin-top: 0.25em; margin-bottom: 0.25em; display: inline-block; line-height: 0; } +.image.left { margin-right: 0.625em; } +.image.right { margin-left: 0.625em; } + +a.image { text-decoration: none; display: inline-block; } +a.image object { pointer-events: none; } + +sup.footnote, sup.footnoteref { font-size: 0.875em; position: static; vertical-align: super; } +sup.footnote a, sup.footnoteref a { text-decoration: none; } +sup.footnote a:active, sup.footnoteref a:active { text-decoration: underline; } + +#footnotes { padding-top: 0.75em; padding-bottom: 0.75em; margin-bottom: 0.625em; } +#footnotes hr { width: 20%; min-width: 6.25em; margin: -0.25em 0 0.75em 0; border-width: 1px 0 0 0; } +#footnotes .footnote { padding: 0 0.375em 0 0.225em; line-height: 1.3334; font-size: 0.875em; margin-left: 1.2em; text-indent: -1.05em; margin-bottom: 0.2em; } +#footnotes .footnote a:first-of-type { font-weight: bold; text-decoration: none; } +#footnotes .footnote:last-of-type { margin-bottom: 0; } +#content #footnotes { margin-top: -0.625em; margin-bottom: 0; padding: 0.75em 0; } + +.gist .file-data > table { border: 0; background: #fff; width: 100%; margin-bottom: 0; } +.gist .file-data > table td.line-data { width: 99%; } + +div.unbreakable { page-break-inside: avoid; } + +.big { font-size: larger; } + +.small { font-size: smaller; } + +.underline { text-decoration: underline; } + +.overline { text-decoration: overline; } + +.line-through { text-decoration: line-through; } + +.aqua { color: #00bfbf; } + +.aqua-background { background-color: #00fafa; } + +.black { color: black; } + +.black-background { background-color: black; } + +.blue { color: #0000bf; } + +.blue-background { background-color: #0000fa; } + +.fuchsia { color: #bf00bf; } + +.fuchsia-background { background-color: #fa00fa; } + +.gray { color: #606060; } + +.gray-background { background-color: #7d7d7d; } + +.green { color: #006000; } + +.green-background { background-color: #007d00; } + +.lime { color: #00bf00; } + +.lime-background { background-color: #00fa00; } + +.maroon { color: #600000; } + +.maroon-background { background-color: #7d0000; } + +.navy { color: #000060; } + +.navy-background { background-color: #00007d; } + +.olive { color: #606000; } + +.olive-background { background-color: #7d7d00; } + +.purple { color: #600060; } + +.purple-background { background-color: #7d007d; } + +.red { color: #bf0000; } + +.red-background { background-color: #fa0000; } + +.silver { color: #909090; } + +.silver-background { background-color: #bcbcbc; } + +.teal { color: #006060; } + +.teal-background { background-color: #007d7d; } + +.white { color: #bfbfbf; } + +.white-background { background-color: #fafafa; } + +.yellow { color: #bfbf00; } + +.yellow-background { background-color: #fafa00; } + +span.icon > .fa { cursor: default; } + +.admonitionblock td.icon [class^="fa icon-"] { font-size: 2.5em; text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5); cursor: default; } +.admonitionblock td.icon .icon-note:before { content: "\f05a"; color: #19407c; } +.admonitionblock td.icon .icon-tip:before { content: "\f0eb"; text-shadow: 1px 1px 2px rgba(155, 155, 0, 0.8); color: #111; } +.admonitionblock td.icon .icon-warning:before { content: "\f071"; color: #bf6900; } +.admonitionblock td.icon .icon-caution:before { content: "\f06d"; color: #bf3400; } +.admonitionblock td.icon .icon-important:before { content: "\f06a"; color: #bf0000; } + +.conum[data-value] { display: inline-block; color: #fff !important; background-color: rgba(0, 0, 0, 0.8); -webkit-border-radius: 100px; border-radius: 100px; text-align: center; font-size: 0.75em; width: 1.67em; height: 1.67em; line-height: 1.67em; font-family: "Open Sans", "DejaVu Sans", sans-serif; font-style: normal; font-weight: bold; } +.conum[data-value] * { color: #fff !important; } +.conum[data-value] + b { display: none; } +.conum[data-value]:after { content: attr(data-value); } +pre .conum[data-value] { position: relative; top: -0.125em; } + +b.conum * { color: inherit !important; } + +.conum:not([data-value]):empty { display: none; } + +dt, th.tableblock, td.content, div.footnote { text-rendering: optimizeLegibility; } + +h1, h2, p, td.content, span.alt { letter-spacing: -0.01em; } + +p strong, td.content strong, div.footnote strong { letter-spacing: -0.005em; } + +p, blockquote, dt, td.content, span.alt { font-size: 1.0625rem; } + +p { margin-bottom: 1.25rem; } + +.sidebarblock p, .sidebarblock dt, .sidebarblock td.content, p.tableblock { font-size: 1em; } + +.exampleblock > .content { background-color: #fffef7; border-color: #e0e0dc; -webkit-box-shadow: 0 1px 4px #e0e0dc; box-shadow: 0 1px 4px #e0e0dc; } + +.print-only { display: none !important; } + +@media print { @page { margin: 1.25cm 0.75cm; } + * { -webkit-box-shadow: none !important; box-shadow: none !important; text-shadow: none !important; } + a { color: inherit !important; text-decoration: underline !important; } + a.bare, a[href^="#"], a[href^="mailto:"] { text-decoration: none !important; } + a[href^="http:"]:not(.bare):after, a[href^="https:"]:not(.bare):after { content: "(" attr(href) ")"; display: inline-block; font-size: 0.875em; padding-left: 0.25em; } + abbr[title]:after { content: " (" attr(title) ")"; } + pre, blockquote, tr, img, object, svg { page-break-inside: avoid; } + thead { display: table-header-group; } + svg { max-width: 100%; } + p, blockquote, dt, td.content { font-size: 1em; orphans: 3; widows: 3; } + h2, h3, #toctitle, .sidebarblock > .content > .title, #toctitle, .sidebarblock > .content > .title { page-break-after: avoid; } + #toc, .sidebarblock, .exampleblock > .content { background: none !important; } + #toc { border-bottom: 1px solid #ddddd8 !important; padding-bottom: 0 !important; } + .sect1 { padding-bottom: 0 !important; } + .sect1 + .sect1 { border: 0 !important; } + #header > h1:first-child { margin-top: 1.25rem; } + body.book #header { text-align: center; } + body.book #header > h1:first-child { border: 0 !important; margin: 2.5em 0 1em 0; } + body.book #header .details { border: 0 !important; display: block; padding: 0 !important; } + body.book #header .details span:first-child { margin-left: 0 !important; } + body.book #header .details br { display: block; } + body.book #header .details br + span:before { content: none !important; } + body.book #toc { border: 0 !important; text-align: left !important; padding: 0 !important; margin: 0 !important; } + body.book #toc, body.book #preamble, body.book h1.sect0, body.book .sect1 > h2 { page-break-before: always; } + .listingblock code[data-lang]:before { display: block; } + #footer { background: none !important; padding: 0 0.9375em; } + #footer-text { color: rgba(0, 0, 0, 0.6) !important; font-size: 0.9em; } + .hide-on-print { display: none !important; } + .print-only { display: block !important; } + .hide-for-print { display: none !important; } + .show-for-print { display: inherit !important; } } + +/* END asciidoc.css */ + +html, +body { + margin: 0; + padding: 0; +} + +html { + font-size: 16px; + font-weight: 400; + line-height: 1.5; +} + +body { + color: #02303A; + background-color: #f7f7f8; + font-family: "Lato", "Helvetica Neue", Arial, sans-serif; + line-height: 1.5; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +/* Links */ +a { + color: #1DA2BD; + text-decoration: none; +} + +a:hover, +a:focus { + text-decoration: underline; +} + +#content a[href^='../dsl/'], +#content a[href^='../javadoc/'] { + font-family: 'Inconsolata', monospace; + font-style: normal; + border-bottom: 1px dotted rgba(29, 162, 189, 0.5); + padding: 0 1px; +} + +#content a[href^='../dsl/']:hover, +#content a[href^='../dsl/']:focus, +#content a[href^='../javadoc/']:hover, +#content a[href^='../javadoc/']:focus { + text-decoration: none; +} + +/* Copy */ + +p { + font-size: 1rem; +} + +pre, +pre > code, +code { + font-family: 'Inconsolata', monospace; +} + +h1, +h2, +h3, +h4, +h5, +h6, +#toctitle, +.sidebarblock > .content > .title { + font-family: inherit; + font-weight: 500; + color: inherit; +} + +h1 { + font-size: 2rem; +} + +h2 { + font-size: 1.5rem; +} + +h3 { + font-size: 1.125rem; +} + +h4 { + font-size: 1.0625rem; +} + +h5, h6 { + font-size: 1rem; +} + +b, strong { + font-weight: 500; +} + +dl { + margin: 0 0 1.25rem 1.5rem; +} + +.dlist dt code { + color: #02303A; + font-size: 1em; + font-weight: bold; +} + +.dlist p { + margin-bottom: 0.625rem; +} + +.sr-only { + border: 0; + clip: rect(0, 0, 0, 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} + +/* Layout */ +.main-content > .appendix, +.main-content > .book, +.main-content > .chapter, +.main-content > .footer { + background-color: white; + border-radius: 5px; + max-width: 45rem; + padding: 1.5rem; +} + +@media screen and (max-width: 45em) { + .footer { + max-width: 100%; + } + + .main-content > .appendix, + .main-content > .book, + .main-content > .chapter { + margin-top: 0; + margin-bottom: 0; + } +} + +/* Override asciidoc styles */ +#header { + position: static; +} + +#header, #content { + padding: 0; +} + +#header .details { + /* TODO: Pretty sure there's a way to avoid Asciidoc generating details */ + display: none; +} + +p { + color: #02303A; +} + +h1, +h2, +p, +p strong, +td.content, +td.content strong, +div.footnote strong, +span.alt { + letter-spacing: normal; +} + +.subheader, +.admonitionblock td.content > .title, +.audioblock > .title, +.exampleblock > .title, +.imageblock > .title, +.listingblock > .title, +.literalblock > .title, +.stemblock > .title, +.openblock > .title, +.paragraph > .title, +.quoteblock > .title, +table.tableblock > .title, +.verseblock > .title, +.videoblock > .title, +.dlist > .title, +.olist > .title, +.ulist > .title, +.qlist > .title, +.hdlist > .title { + color: inherit; + font-family: inherit; +} + +.listingblock .title, +.listingblock .title code { + font-style: normal; + font-weight: bold; +} + +#content .admonitionblock .icon .title { + color: transparent; + font-size: 3.5em; + text-shadow: 0 0 #00c489; + opacity: 0.7; +} + +.admonitionblock td.content > .title { + font-family: inherit; + font-style: normal; + font-size: 1.25em; + color: #555; +} + +.admonitionblock table tr td { + padding: 0; +} + +.imageblock, +.videoblock { + padding: 0.25em; +} + +p.lead, +.paragraph.lead > p, +#preamble > .sectionbody > .paragraph:first-of-type p { + font-size: 1.0625rem; +} + +.paragraph.lead > p, +#preamble > .sectionbody > .paragraph:first-of-type p { + color: inherit; +} + +.sect1 { + padding-bottom: 0; +} + +.sect1 + .sect1 { + border: 0 none; +} + +.admonitionblock .icon .title { + font-size: 2.3em; +} + +.admonitionblock > table td.icon .title { + font-family: "Lato", Arial, sans-serif; +} + +.admonitionblock .content, +.admonitionblock p { + color: #666; +} + +.verseblock pre { + font-family: "Lato", Arial, sans-serif; +} + +td.hdlist1 { + padding-bottom: 0.625rem; +} + +td.hdlist2 p { + margin-bottom: 0.625rem; +} + +body.book #header > h1 { + border: 0; +} + +#header > h1:first-child { + margin-top: 0; +} + +#content a.link { + color: #02303A; +} + +.highlight .com { + color: #777; +} + +.listingblock pre.highlightjs > code { + overflow-x: auto; +} + +.listingblock pre.highlight { + overflow-x: auto; +} + +.listingblock pre.highlight > code { + white-space: pre; +} + +.conum[data-value] { + font-family: "Lato", Arial, sans-serif; +} + +.colist > table tr > td:first-of-type { + padding-top: 0.25em; + padding-bottom: 0.25em; + line-height: 1.4; + vertical-align: baseline; +} + +/* + * Samples + */ +.exampleblock > .content { + background-color: inherit; + border: 0 none; + box-shadow: none; + padding: 0; +} + +.exampleblock > .content .title { + background-color: #f7f7f8; + border-top: 1px solid #ccc; + font-family: 'Inconsolata', monospace; + margin: 0; + padding: 1em 1em 0; +} + +.exampleblock .listingblock { + margin: 0; +} + +/* Multi-language selection */ +.multi-language-selector .language-option[data-lang='groovy'], +.exampleblock[data-lang=groovy] > .content .title { + background-image: url('data:image/svg+xml;base64,PHN2Zw0KICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIg0KICAgd2lkdGg9IjYxNC4wNjA4NSINCiAgIGhlaWdodD0iMzAzLjU5ODYiDQogICB2ZXJzaW9uPSIxLjEiPg0KICA8Zw0KICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzUuMzk2NTk5LC0zMC41NTgxOTYpIj4NCiAgICA8cGF0aA0KICAgICAgIGQ9Im0gMTU0Ljk3Njg3LDMzMi42OTE2MiBjIDAsLTAuODA1ODcgMTAuODMxMjMsLTE4LjYyMTcyIDI0LjA2OTQsLTM5LjU5MDc2IDEzLjIzODE5LC0yMC45NjkwNSAyMi42NjA1NywtMzguNjIwNjYgMjAuOTM4NjcsLTM5LjIyNTc3IC0xLjcyMTkxLC0wLjYwNTEgLTcuNjc5OTIsMC40ODU2NyAtMTMuMjQwMDIsMi40MjM5MyAtMTYuNzQ1MjQsNS44Mzc0MyAtMjAuMTg2MDUsNC4yOTAxNiAtMzIuNjkzMDgsLTE0LjcwMTU1IC0xMy41MzI2NSwtMjAuNTQ5MDYgLTE0LjAxNzI0LC0yMi42Njk4MyAtNi45NjE1OCwtMzAuNDY2MjQgNC42MDg3NiwtNS4wOTI1NiA0LjMzMTU5LC02LjI3OTY3IC0zLjIzMTksLTEzLjg0MzE2IC00LjU1MDA5LC00LjU1MDEgLTguMjcyODksLTkuNjQzMDkgLTguMjcyODksLTExLjMxNzc2IDAsLTIuODE2NzkgLTMwLjk5MTQ1LC0xNS41ODkzMyAtNzkuOTg5NDk2LC0zMi45NjYxNSAtMTEuMTA5NjYsLTMuOTM5OTcgLTIwLjE5OTM3NSwtNy44MjkyOCAtMjAuMTk5Mzc1LC04LjY0MjkxIDAsLTAuODEzNjYgMjMuNDcwNzM4LC0xLjAwNDc2IDUyLjE1NzE5MSwtMC40MjQ2OSBsIDUyLjE1NzIxLDEuMDU0NjYgNS4wOTEyNywtOC4wMzAwMSBjIDIxLjUxNjQ0LC0zMy45MzU5MiA1NC4wMDk1MiwtNjQuNTg4MjEyIDY4LjQ2NzA1LC02NC41ODgyMTIgMy4wMTA2LDAgOS4xMjE0MSwyLjg2OTE4IDEzLjU3OTUzLDYuMzc1OTQ1IDcuMjU5NDYsNS43MTAyODMgOC4yNTY1LDkuMjQ4NjMyIDkuNTQ5OTQsMzMuODkxOTY3IDAuNzk0MywxNS4xMzM4MiAyLjQyNDIyLDI4LjQ5NjAxIDMuNjIxOTgsMjkuNjkzNzkgMS4xOTc3NSwxLjE5Nzc2IDQuOTk3NjksLTAuMzc0MjUgOC40NDQzMSwtMy40OTMzOSA0LjQwMTQsLTMuOTgzMjMgOS4wMzQ4NCwtNS4wNjMxMyAxNS41Njc2MSwtMy42MjgzIDYuNzY3NTYsMS40ODY0MSAxMC42MjcxLDAuNDY4OTUgMTQuMTY5MzgsLTMuNzM1NDMgNS4zMTM2LC02LjMwNjY2IDMxLjkwNTk2LC00OC45MzcyMDEgMzEuOTA1OTYsLTUxLjE0ODc0NCAwLC0wLjc1MTU4OCA1LjI2NTA5LC05Ljc1NzMwNiAxMS43MDAyMywtMjAuMDEyNzAzIDYuNDM1MDksLTEwLjI1NTM5NyAxMy44NDY2NCwtMjIuMDgwNjMxIDE2LjQ3MDA3LC0yNi4yNzgyODMgNC42NjU1OCwtNy40NjUyMDEgNS4zOTY2LC02LjU4MTczNSAzMy40MjY5Miw0MC4zOTg3MzYgMjguOTQxMjEsNDguNTA3MTY0IDQ0LjUxNzY3LDY2LjQwNjU1NCA1Mi4zMTU3LDYwLjExNzYzNCA1LjQ0MiwtNC4zODg4OSAzNC4wMDA1NSwtNC42Mzc5NCA0MS45ODI0NiwtMC4zNjYxNCA0LjUzNjY1LDIuNDI3OTMgNy40MTkxNiwyLjM5NjEgOS45MjQ4NCwtMC4xMDk2MiA1LjIwMDA3LC01LjIwMDA2IDE3LjY0OTgyLC00LjI5NDM3IDIwLjkwNDEyLDEuNTIwNzggMi41NjM5Myw0LjU4MTQ2IDMuMjE3ODQsNC41ODE0NiA3LjAyMDE0LDAgMi4zMDYwNiwtMi43Nzg2NyA5LjEzNjE5LC01LjA1MjA4IDE1LjE3ODAzLC01LjA1MjA4IDguNTM4ODQsMCAxMS43OTMzNiwxLjc3MzY3IDE0LjYxNDAzLDcuOTY0MzcgbCAzLjYyODgxLDcuOTY0MzYgNTYuMDkyMDMsLTEuOTg1OCBjIDMwLjg1MDYyLC0xLjA5MjIyIDU2LjA5MjA0LC0xLjI4Njg4IDU2LjA5MjA0LC0wLjQzMjU1IDAsMC44NTQyNyAtMjIuOTA2MDgsMTAuMDcxOTUgLTUwLjkwMjQxLDIwLjQ4MzcxIC0yNy45OTYzMiwxMC40MTE3MiAtNTEuMzY3LDE5LjI0MzA1IC01MS45MzQ4NCwxOS42MjUxMiAtMC41Njc4NSwwLjM4MjA3IDAuNjk4NDcsOS40OTI3MyAyLjgxNDA1LDIwLjI0NTg4IDUuNTA0NTcsMjcuOTc5MTcgMS45MTQ1OCw0Ni42MjU4OSAtMTEuOTI2MjksNjEuOTQ2MDQgLTYuMjA5LDYuODcyNjMgLTE2LjI4MzM4LDE0LjE0Mzk1IC0yMi4zODc1MywxNi4xNTg0OSAtNi4xMDQxNSwyLjAxNDU0IC0xMS4wOTg0NCw0LjM4NjE0IC0xMS4wOTg0NCw1LjI3MDE5IDAsMC44ODQwNiA2LjUxNTI1LDExLjY3ODkzIDE0LjQ3ODM1LDIzLjk4ODU5IDcuOTYzMDksMTIuMzA5NjkgMTMuMjgyOCwyMi4zODEyNSAxMS44MjE1MiwyMi4zODEyNSAtMi4zODUwNCwwIC02MC40Njk4NywtMjIuNDQyMzggLTE1MC43ODg5OCwtNTguMjYwNyAtMTcuODA5LC03LjA2MjU4IC0zNC4wMjY4MywtMTIuODQxMDkgLTM2LjAzOTYxLC0xMi44NDEwOSAtMy43NTM2MywwIC0zNi4xNjY5LDEyLjI4NjYyIC0xMzEuMjI0MjMsNDkuNzQyMDYgLTU1LjEyNTI1LDIxLjcyMTAzIC01Ny4yOTIxNywyMi40NzM0OCAtNTcuMjkyMTcsMTkuODk0NTEgeiBtIDExMy4xMTY0OCwtNTEuMjUyNjUgYyAyOS4zMjk0OSwtMTEuMzk1MDYgNTguNDE2NTcsLTIyLjUzMDggNjQuNjM3OTgsLTI0Ljc0NjA3IDEwLjcwMDY4LC0zLjgxMDE5IDE0LjI3OTE4LC0yLjg1NDkzIDY2LjI1Mzk0LDE3LjY4NjM0IDMwLjIxODI1LDExLjk0Mjc0IDYwLjAzMjUyLDIzLjU3NTg3IDY2LjI1MzkyLDI1Ljg1MTM0IDYuMjIxNDEsMi4yNzU1MiAxOS4wNDMxNyw3LjIyMDU5IDI4LjQ5Mjc1LDEwLjk4OTA4IDEwLjc3NTAzLDQuMjk3MDQgMTYuMjgyNTEsNS4zMzE2NiAxNC43NzEwOCwyLjc3NDg0IC0xNi44ODM3LC0yOC41NjExMyAtMTcuMzk5OCwtMjkuMDM3MTYgLTI5LjEwMDgzLC0yNi44NDIwNSAtMTQuMTEzNjEsMi42NDc3MiAtMjIuODc4OTcsLTAuMDY4NSAtMjcuMzgzNjksLTguNDg1NTQgLTIuOTIxMTIsLTUuNDU4MTYgLTIuMDI5NDQsLTguMTI3NTkgNS4yNTQ0MiwtMTUuNzMwMzEgMTAuODQ4ODcsLTExLjMyMzc3IDkuMTQ0NTcsLTIxLjc0MTQ0IC00Ljg0NDI5LC0yOS42MTA5OSAtNS4zNjc2NCwtMy4wMTk1OSAtMTIuMTQwNTksLTEwLjQ4MzcyIC0xNS4wNTEwMiwtMTYuNTg2OTcgbCAtNS4yOTE2OSwtMTEuMDk2ODIgLTExLjM0NTUxLDcuNjk5MjggYyAtMTMuOTQ0NTgsOS40NjMwNCAtMzAuOTUwNjIsOS45NTA2MyAtNDUuMTQ3NjQsMS4yOTQ0OCBsIC0xMC40NjQ4OCwtNi4zODA2NSAtMTIuMTU4NDEsOC4yNjI4NCBjIC0xMi4xNzQ2Miw4LjI3Mzg2IC0yNi4xOTEwOCw5LjM0MjggLTQwLjQzNzUyLDMuMDgzOTIgLTMuOTI0OTgsLTEuNzI0MzkgLTUuNjU1ODMsLTEuMDU0MTUgLTUuNjU1ODMsMi4xOTAwOCAwLDIuNTcxMTggLTMuNzA0MjksNi4zNjI2NSAtOC4yMzE4MSw4LjQyNTUzIC0xMy41NzQyLDYuMTg0NzkgLTI2LjgyMTA3LDQuNTQyNDcgLTM1LjgwMjI5LC00LjQzODc1IGwgLTguMTg5NDQsLTguMTg5NDQgLTYuNjA5ODIsOC40MDMwMyBjIC0zLjYzNTM5LDQuNjIxNjYgLTEyLjA0OTUyLDExLjgzNjk4IC0xOC42OTgwNSwxNi4wMzM5OCAtOC4yMjk2NSw1LjE5NTE4IC0xOC40MTc0MSwxNy44NzE4MiAtMzEuOTE2NCwzOS43MTM2MSAtMTAuOTA1NDksMTcuNjQ1NDYgLTE5LjgyODE2LDMyLjk4MDQyIC0xOS44MjgxNiwzNC4wNzc3NiAwLDEuMDk3MyA4LjM2MjU1LC0xLjUyNzM2IDE4LjU4MzQyLC01LjgzMjU5IDEwLjIyMDg5LC00LjMwNTIxIDQyLjU4MDI4LC0xNy4xNTA4NyA3MS45MDk3NywtMjguNTQ1OTMgeiBtIDI0OC43NjcyOSwtMTIuMjU4NDYgYyAyMi4yNTU1NywtMTIuNTA4MzMgMjcuNDE0MjQsLTM1LjY0ODA4IDE3LjU3Njg1LC03OC44NDMxOCAtOC4yMjE0LC0zNi4wOTk2MSAtMTIuMzI1NSwtNDcuOTEzMjcgLTE3LjE5NDk0LC00OS40OTU5NyAtMy4zNjkwMiwtMS4wOTUwMyAtMy44ODY3NCwwLjEwNjk5IC0xLjk4ODU4LDQuNjE2MzUgMTIuMzE1MTYsMjkuMjU3NzEgMTIuOTk5NjMsNDMuOTQ2NjIgMi4yNDAyMiw0OC4wNzU0MSAtNy4zOTE1MSwyLjgzNjQyIC0xNS4yMzIzOSwtNy43OTA3NSAtMjEuMzk5MDIsLTI5LjAwMzI2IC00Ljc3NTEyLC0xNi40MjU4NyAtOS43Njg2MSwtMjMuODI4MzcgLTEzLjUzMzg3LC0yMC4wNjMxMSAtMC45MDE1NywwLjkwMTYgMC42Nzg0OCw2LjEyMTE3IDMuNTExMjQsMTEuNTk5MTMgMi44MzI3Myw1LjQ3NzkgNi43MTcyMSwyMS45NzQ1NSA4LjYzMjE3LDM2LjY1OTIgMS45MTQ5NywxNC42ODQ2MiA1LjYxMzg1LDMwLjA2MDczIDguMjE5NzMsMzQuMTY5MTIgNi43NzE5OCwxMC42NzY2MSAxNy41NTEyOCw4LjEwMzYgMjQuNTIzODIsLTUuODUzODQgNi44OTM3MywtMTMuNzk5NzUgNy42NzI4NCwtNC42MDc4MSAwLjk2OTMsMTEuNDM2MDIgLTYuOTYwNzQsMTYuNjU5MzcgLTI3LjYzNDQyLDIxLjY1NDgxIC01MS41ODQxOCwxMi40NjQ0MiAtMy44MzMzLC0xLjQ3MDk2IC01LjEzMDM5LDAuMDUxNSAtNS4xMzAzOSw2LjAyMDk3IDAsNC4zOTQzMSAtMi45MzYxOCwxMS43MjI0NSAtNi41MjQ4OCwxNi4yODQ3IGwgLTYuNTI0ODgsOC4yOTUwNiA4Ljk0ODgxLDEuNTExMjMgYyAxNS40NDk0NSwyLjYwOTA5IDM2LjYzMzI4LC0wLjc3NjQyIDQ5LjI1ODYsLTcuODcyMjUgeiBtIC0zMjAuMzY2NSwtMjcuNTM3MzMgYyA0Ni40NTk2NSwtMTMuMzU0NSA1NC43NjE4OCwtMjguOTMwOTMgMzkuMzI4ODUsLTczLjc4NzgyIC0zLjU4MTg1LC0xMC40MTA3OSAtNi41MTI0MywtMjEuNjA5NzEgLTYuNTEyNDMsLTI0Ljg4NjU0IDAsLTExLjE1NzEyIC01LjYxMTUyLC02LjAwMTYxIC05LjgxNzEzLDkuMDE5NDMgLTUuNTYyMDMsMTkuODY1NjEgLTIyLjI5MTE1LDM2Ljc1MDUzIC0zNi4zNDUxNiwzNi42ODM2NCAtMTIuMjA1NDcsLTAuMDU4MiAtMTYuMTgyNTEsLTIuMjgwMDggLTIxLjIyMzc4LC0xMS44NTc2OCAtOS4wNDc0OCwtMTcuMTg4ODIgMC44MTQ2OSwtNDMuNTY3OTcgMjUuOTY5NTQsLTY5LjQ2MjcyIDE4LjQyNDMxLC0xOC45NjYzMDQgMjguNDg4OTMsLTIwLjY4Mzk2NSAyOC40ODg5MywtNC44NjIwNSAwLDI0LjY3MzIgLTE3LjAxMTM0LDYwLjk5NDcgLTI1Ljk3MzA5LDU1LjQ1NjA0IC00LjM4MjA1LC0yLjcwODI2IC0zLjY3MTM4LC0xNC42Njc1MiAxLjQxNzIyLC0yMy44NTAwOSA0LjMyNzM1LC03LjgwODgyIDMuNDQ4MTQsLTE5LjcwNzcxIC0xLjQ1NjIsLTE5LjcwNzcxIC01LjY4Njg5LDAgLTE2Ljk0NTQ3LDIwLjcxMTk2IC0xOC40MzMxOCwzMy45MTA3NCAtMS4zMTUxNSwxMS42NjgyNiAtMC40OTI4NiwxNC41MDU0NSA1LjA2NjUyLDE3LjQ4MDcyIDE5LjQ4MjQ0LDEwLjQyNjcgNDUuMDA1MzEsLTIxLjM5NTQ1IDQ2LjI5MDgzLC01Ny43MTU4NCAwLjY3NTA0LC0xOS4wNzMxODEgLTMuMDE2NzYsLTI0LjQ0MTEwNSAtMTQuNzc5MDYsLTIxLjQ4ODk1MSAtMTcuMTE4NzksNC4yOTY1NDMgLTYzLjIzNDgzLDYzLjc4NjY0MSAtNjMuMjM0ODMsODEuNTczNDYxIDAsMTMuOTEyOCA2Ljk4NzM3LDIzLjY5NzI4IDE5LjI4ODI3LDI3LjAwOTYgMjAuOTE0MTksNS42MzE2MiA0MS4xMzUzOSwtNC4zNzM4OSA1NS40NjMzLC0yNy40NDMzOCBsIDYuMDIxNzUsLTkuNjk1NzEgMC4wMTMyLDEzLjE3MjIzIGMgMC4wMTYyLDE5LjA3MzggLTEyLjQyNjE5LDI5LjEyNzQgLTUxLjY5ODE3LDQxLjc2NzkzIC05Ljc3NjQ5LDMuMTQ2OCAtMTguMTgzMzIsNi4wNTQ0MSAtMTguNjgxOCw2LjQ2MTM3IC0xLjgyMDU2LDEuNDg2MzIgMTYuNjg3MzksMjcuNDc1NzEgMTkuNTY2NDQsMjcuNDc1NzEgMS42MzI2MiwwIDExLjE5MTE1LC0yLjM2MzU5IDIxLjI0MTIzLC01LjI1MjM4IHogTSA0NzYuNDExLDIxNy45NjMwMSBjIDQuNjYzNDcsLTUuMTUzMSA1LjQ4NTUxLC0xMC43NTEwMyA0LjQ4NTc5LC0zMC41NDgyMyAtMS4wODczOSwtMjEuNTMzMzEgLTIuMjc3NDYsLTI1LjMzODUxIC0xMC42NjE0MywtMzQuMDg5NDkgLTE1LjE0ODgyLC0xNS44MTE5NCAtMzMuODYxMjMsLTExLjc3ODI4IC0yMi45MDgxOSw0LjkzODE0IDUuODIyNTYsOC44ODYzNyAxMi45MjU0LDcuMzY4NjQgMTAuNDE2NDEsLTIuMjI1ODEgLTEuOTk4NjQsLTcuNjQyNzYgMS43Mjk5OCwtNy44NDM1OCA4LjIyODM5LC0wLjQ0MzIyIDEyLjE5MzAxLDEzLjg4NTM3IDkuMTE1MzQsMzMuMTI2OTggLTUuMjk4NiwzMy4xMjY5OCAtOS44NjcxNiwwIC0xMi45NDE5NSwtNC4yMzE3NiAtMTkuMzczNTMsLTI2LjY2MzE4IC0yLjkzMDU5LC0xMC4yMjA4NyAtNi40OTk2NCwtMTguNTgzNDMgLTcuOTMxMjcsLTE4LjU4MzQzIC00Ljc2ODk5LDAgLTYuODkyODcsNC4yMDg3OCAtMy45MjcyMSw3Ljc4MjQgMS42MTA4OCwxLjk0MTEgNi4wNzIxOCwxNS44OTEyNyA5LjkxNDA0LDMxLjAwMDQxIDkuNjY5MDMsMzguMDI1OTYgMjMuMTc2NjYsNTEuMDQxNDUgMzcuMDU1NiwzNS43MDU0MyB6IG0gLTE4My43NzEyNSwwLjYwMzk1IGMgMS45ODk3OCwtMS4zMzUgMi44OTk3NSwtNy42NDg5MyAyLjA3ODY1LC0xNC40MjMgLTEuMzI0NDksLTEwLjkyNzAyIC0yLjA2NjYyLC0xMS43MjQxIC03Ljk3MjcsLTguNTYzMjcgLTguNDg3MzMsNC41NDIyNyAtMTcuNjA4MzksLTQuMDYzNTEgLTIwLjcwMjIyLC0xOS41MzI2IC0yLjM0NzA3LC0xMS43MzUzOCAtMy4wNjUyNiwtMTEuNTA0ODkgMTQuMDI1NzYsLTQuNTAxNDkgMi4xNDI4OCwwLjg3ODA4IDcuNTk2NzEsLTIuMTA0MDIgMTIuMTE5NjMsLTYuNjI2OTQgOC4yNzQwOCwtOC4yNzQwOCAxMC45OTgwMiwtMTguMjEyOTkgNC45OTE1NiwtMTguMjEyOTkgLTEuNzc3NTQsMCAtMy4yMzE5LDEuNDU0MzYgLTMuMjMxOSwzLjIzMTkgMCw0LjY0OTIzIC04Ljg0MjMxLDMuOTg5ODIgLTEwLjgzNDY1LC0wLjgwNzk3IC0xLjE2MjI0LC0yLjc5ODc5IC0zLjYzODA3LC0xLjgwNTkxIC04LjA1OTE1LDMuMjMxOSAtMy41MDk4NSwzLjk5OTQ4IC03Ljc5NjczLDcuMjcxNzggLTkuNTI2NDEsNy4yNzE3OCAtMS43Mjk2OSwwIC00LjA2NTYsLTMuMjcyMyAtNS4xOTA4OCwtNy4yNzE3OCAtMS45NzE5NSwtNy4wMDg1NiAtMi4yMTM2NiwtNy4wNTI3NyAtNi42NzczNywtMS4yMjE2OSAtMy45MTA2LDUuMTA4NTQgLTMuOTQ1NTcsNi43MzU4MyAtMC4yMjQ2MSwxMC40NTY2MSAzLjk0MDYyLDMuOTQwNjQgMTEuNDI2MTUsMzAuODcxMDIgMTEuNDI2MTUsNDEuMTA3NDQgMCwxMi43Mjg2NyAxNy41MjkzMywyMi43MzgzMiAyNy43NzgzLDE1Ljg2MjEgeiBtIDU4Ljk0MzA5LC0xNi44NzUzMSBjIDEyLjE0NTY3LC0xMi4xNDU2NyAxNS43NDQ1MiwtMzAuMzUxNDMgOS4xMjk0MywtNDYuMTgzNTcgLTUuMTcwMTYsLTEyLjM3Mzk3IC0xNC4xNDQ2NiwtMTcuMDA1MTYgLTI2Ljc5ODc4LC0xMy44MjkxOCAtOS40MDI2MywyLjM1OTkxIC0yMy43MjMxMSwyOS43NzY1OSAtMjMuNzczODcsNDUuNTE1MzYgLTAuMDc5MiwyNC41MjkwMiAyMy4yNTA1MywzMi42OTAwNSA0MS40NDMyMiwxNC40OTczOSB6IG0gLTIyLjA4MzQxLC0xOS40MzQwNyBjIC0zLjU1NTEsLTMuNTU1MSAtNi40MTc1NSwtMTAuNDYzMjggLTYuMzYxMDIsLTE1LjM1MTUzIDAuMDkzNCwtOC4wNzk2NSAwLjQ5MzE1LC04LjM3MzUgNC4zOTYxOSwtMy4yMzE5IDQuODI0NjQsNi4zNTU2OSAxMy4zOTc5Nyw3LjQ1NjY2IDE2LjY4MjQxLDIuMTQyMzIgMS4xOTQzMiwtMS45MzI0MSAwLjU1Mjk1LC01LjEzMjAyIC0xLjQyNTIsLTcuMTEwMTcgLTUuMDgxMzIsLTUuMDgxMzIgLTQuNDY1NjEsLTExLjk5OTYzIDEuMDY3OTIsLTExLjk5OTYzIDYuMTUxMzcsMCAxNC43MjY3OSwxMi41MTQ3NyAxNC43MjY3OSwyMS40OTE5MSAwLDYuNjA2NzQgLTEzLjQ0NDQsMjAuNTIyOCAtMTkuODI3MjQsMjAuNTIyOCAtMS41Mzc4NSwwIC01LjcwNDc2LC0yLjkwODcyIC05LjI1OTg1LC02LjQ2MzggeiBtIDg2LjM0ODk3LDE4LjU4MzQxIGMgMTMuNDEwNzQsLTE0LjYwMjYzIDEyLjEwMzc2LC0zNy4wOTggLTMuMDk4MjUsLTUzLjMyNjM0IC03Ljg1MDU3LC04LjM4MDYgLTI1LjI5Mjk4LC05LjgyNTUyIC0zMi40MzE4NSwtMi42ODY2NCAtNi41ODc2MSw2LjU4NzYxIC0xMy4xNjQ2NSwzMi40OTMwMyAtMTAuNzIxMjIsNDIuMjI4NDEgNS4yMTEyMiwyMC43NjMxOCAzMi40MDA0MSwyOC44NjY1MiA0Ni4yNTEzMiwxMy43ODQ1NyB6IG0gLTI3LjQ1NTY1LC0yMy42MTQ1MiBjIC01LjMwNjIzLC0zLjcxNjY0IC03LjEyOTQxLC04LjE0OTc0IC02Ljk3ODA2LC0xNi45Njc0NyAwLjE2OTM1LC05Ljg2MDMzIDAuNjg0MywtMTAuNzQ5ODEgMi45NjE0NSwtNS4xMTQxNSAzLjM0NTczLDguMjgwMzIgMTAuMzYyOTIsMTEuNDA3MzQgMTYuNTE4MTQsNy4zNjA5IDMuODE3NTMsLTIuNTA5NjMgMy42MzkyOSwtMy42OTU5NyAtMS4xMDEwNCwtNy4zMjkwNyAtNi4zMjE4OSwtNC44NDUyMyAtNy41NTUwOCwtMTEuNzAxOTEgLTIuMTA0NjUsLTExLjcwMTkxIDQuODczNjQsMCAyMi4zMDQwMiwxOS4wNjY2NiAyMi4zMDQwMiwyNC4zOTc3OCAwLDUuMjAzMTYgLTEyLjM3NzM5LDE0LjM4NTAzIC0xOS4zOTEzOSwxNC4zODUwMyAtMi43NjQwNSwwIC04LjI1NzksLTIuMjY0MDIgLTEyLjIwODQ3LC01LjAzMTExIHogbSAxODkuOTYyOTIsLTE0LjI4ODg3IDMzLjkzNDk1LC0xMi43MzY4MiAtMzYuMzU4ODgsLTAuMTMxMjUgYyAtMzIuNTM5MiwtMC4xMTczNiAtMzYuMzU0MjQsMC40NjMwNyAtMzYuMzE0NzUsNS41MjQ3NSAwLjA0MDEsNS4xMjc1NyAzLjMzMDczLDIwLjI4Mzk1IDQuMzcyNywyMC4xMzk2NyAwLjIzNzIyLC0wLjAzMjkgMTUuNzAxNzcsLTUuNzkxMjQgMzQuMzY1OTgsLTEyLjc5NjQ4IHogbSAtNDQzLjQ5MzQzLC0yLjI3OTMgMy40NjgyNSwtMTAuMjg3NjEgLTMwLjQ2Njg2LC0xLjAyNDA0IGMgLTE2Ljc1Njc0NCwtMC41NjMyMiAtMzAuNDYzNTg0LC0wLjEzMjEzIC0zMC40NTk1OCwwLjk1ODA0IDAuMDA1OCwxLjU5NTEzIDUyLjUwNjU3LDIyLjEwNzA3IDUzLjY2MTc0LDIwLjk2NTUyIDAuMTgwMzUsLTAuMTc4NCAxLjg4ODkyLC00Ljk1MzcyIDMuNzk2NDUsLTEwLjYxMTkxIHogbSAyMDguOTA5MiwtMzEuODg2OTUgYyA3LjE2NjY3LDEuMTQ2IDE1LjI0OTgxLDQuMDc5MjQgMTcuOTYyNTYsNi41MTgzNSA0LjIxMjc5LDMuNzg3ODMgNi4wNDUyOCwzLjUyOTY2IDEyLjU2MjA3LC0xLjc2OTg1IDQuMTk2NDMsLTMuNDEyNSA5LjY1MDI2LC02LjIwNDU3IDEyLjExOTYzLC02LjIwNDU3IDIuNDY5MzksMCA0LjQ4OTgyLC0wLjcxMzA4IDQuNDg5ODIsLTEuNTg0NjcgMCwtMy4wMDkxOCAtNDYuNTM5NTQsLTc5LjIxMjUyIC00OC4zMTQ0NywtNzkuMTA5NjEgLTIuMDg1LDAuMTIwODcyIC00OS43ODYwMyw4MC4wODc5OCAtNTEuMjU0NjQsODUuOTI0MzcgLTAuNjE2MzQsMi40NDk1MiAxLjMxODA0LDMuMzUzNzEgNS4wNzM2NCwyLjM3MTYgMy4zMzgzNiwtMC44NzMgNy45NTQxNiwwLjY4MzI2IDEwLjI1NzI3LDMuNDU4MzYgMy43MzU0LDQuNTAwODcgNS4yNjEwOCw0LjE0MjI5IDE0LjEzMDY4LC0zLjMyMDk3IDguNDI2NDcsLTcuMDkwNDEgMTEuOTMwOCwtOC4wNDg4IDIyLjk3MzQ0LC02LjI4MzAxIHoiDQogICAgICAgc3R5bGU9ImZpbGw6IzMzMzMzMztmaWxsLW9wYWNpdHk6MSIgLz4NCiAgICA8cGF0aA0KICAgICAgIHN0eWxlPSJmaWxsOiM2Mzk4YWE7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiDQogICAgICAgZD0ibSAzMDkuNTQ1NzksMTQwLjg3OTIyIGMgLTAuNTAwNzUsLTAuMjMzMTEgLTEuMTE4MDQsLTAuNzY3OTkgLTIuNTI3OCwtMi4xOTAzNSAtMS45MTE4OCwtMS45Mjg5NyAtMi42NzE4OCwtMi40OTAxMyAtNC4yNjEwOCwtMy4xNDYyOCAtMi4wODc5MSwtMC44NjIwNCAtNC4zNTQ5LC0xLjA5NDIzIC02LjQ4MjMxLC0wLjY2MzkxIC0xLjg5ODA4LDAuMzgzOTMgLTIuNDI0MzUsMC40MjUyNyAtMy4yODI0MiwwLjI1NzggLTEuNDMyMjQsLTAuMjc5NTMgLTEuOTQxNTcsLTEuMTQ5MjkgLTEuNTM1ODMsLTIuNjIyNzIgMC41MDU3MywtMS44MzY1NyA0LjMzNjkzLC04Ljk0MjU1IDEyLjAwODk5LC0yMi4yNzM4NyAxNS41ODM3LC0yNy4wNzg5ODggMzYuNTM2MjQsLTYxLjIyMDk2OCAzOC44NTA1NiwtNjMuMzA2NjYyIDAuMjU2MzEsLTAuMjMwOTk0IDAuMjY1LC0wLjIzMDk5NCAwLjUyMjQ4LDAgMS4zNzc2OCwxLjIzNTk3NiA5LjQ3NjIsMTMuNzI1ODg5IDIwLjU0MDM2LDMxLjY3ODI5OCAxNC45NjY5NiwyNC4yODUwMDQgMjcuNDExMDIsNDUuNjQzNzE0IDI3LjQxMTAyLDQ3LjA0NzcwNCAwLDAuODU3MjkgLTEuMzE2MDgsMS4zNzIxNSAtNC4wODU5MSwxLjU5ODQ1IC0zLjQ0MjI2LDAuMjgxMjQgLTcuNDI0NzgsMi4zMDE4OCAtMTIuODY4ODcsNi41MjkzNiAtMi41ODcxMiwyLjAwODk4IC0zLjY5MTI2LDIuNzU5MzMgLTQuOTUwNjIsMy4zNjQzOCAtMS4wNDkyOCwwLjUwNDExIC0xLjEzNjkyLDAuNTI0MzcgLTIuMjY4NTQsMC41MjQzNyAtMS4xMTM2OCwwIC0xLjIyNjYxLC0wLjAyNDkgLTIuMDk2MjMsLTAuNDYxMjggLTAuNTEyMTMsLTAuMjU3MDIgLTEuNTA0NjksLTAuOTQ5MyAtMi4yNDE1NSwtMS41NjM0MiAtMi4xNzg0OCwtMS44MTU2MSAtNC43OTkxOCwtMy4xMzYxNCAtOS4wNzE5NywtNC41NzEyNCAtNS40Mjk5NywtMS44MjM3NiAtMTEuMjQ0NTQsLTIuOTE4NCAtMTYuMTk1NTEsLTMuMDQ4OTYgLTMuOTA5MzQsLTAuMTAzMDggLTUuNzEyMDEsMC4yNDc5OCAtOC42NzYwMiwxLjY4OTYzIC0yLjQxOTg4LDEuMTc2OTggLTMuNTg2MjEsMi4wMTMxMSAtOS4xMjQ3NSw2LjU0MTQ1IC01LjYzMzc2LDQuNjA2MTcgLTcuNjM0NDIsNS41NjIwNSAtOS42NjQsNC42MTcyNSB6IiAvPg0KICAgIDxwYXRoDQogICAgICAgc3R5bGU9ImZpbGw6IzYzOThhYTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSINCiAgICAgICBkPSJtIDEyOC42Mzc4NiwxNzAuNzM5IGMgLTEwLjE1OSwtMi45NjA3IC00NS41MDMxNzEsLTE2LjkxOTYyIC01MC40NTA5MjQsLTE5LjkyNTIzIC0wLjY4MjkxNiwtMC40MTQ4NCAtMC43MzgwOTgsLTAuNDc3ODcgLTAuNTQzMjA3LC0wLjYyMDM4IDEuMTMxNTYzLC0wLjgyNzQxIDEyLjMzNzk4MywtMS4yMzkwMSAyNS4wMDQwMzEsLTAuOTE4MzYgNS4wNTEzMSwwLjEyNzg4IDM1LjUwMTMyLDEuMTMzMjMgMzUuNTUwOSwxLjE3Mzc3IDAuMDk5NywwLjA4MTUgLTYuNTIxNjQsMTkuMjg4OCAtNy4wMzA1MSwyMC4zOTQzMyAtMC4yMTI1MSwwLjQ2MTcgLTAuNjUwNjMsMC40NDM2NyAtMi41MzAyOSwtMC4xMDQxMyB6IiAvPg0KICAgIDxwYXRoDQogICAgICAgc3R5bGU9ImZpbGw6IzYzOThhYTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSINCiAgICAgICBkPSJtIDU0My42OTQxMywxNzUuMzEwNTUgYyAtMS4zODYyLC0yLjcxMjg3IC0zLjg4NzY5LC0xNC45NzA2NyAtMy45NjA3OCwtMTkuNDA4NTggLTAuMDI4NCwtMS43MjQyNCAwLjE4NjY3LC0yLjQyNzQxIDAuOTYwNiwtMy4xNDA4IDEuNzczNzgsLTEuNjM1MDEgNS4zNzkzOCwtMi4yMjMyIDE1LjI5MDE3LC0yLjQ5NDM0IDUuMDAzNDcsLTAuMTM2ODkgMjguMTAxOSwtMC4xNTc5NiA0NC40MTEyNywtMC4wNDA1IGwgMTEuNDI4NTksMC4wODIzIC0yNy41MTc3LDEwLjMxNDI3IGMgLTI1LjA5MjkyLDkuNDA1NCAtMzkuNjg0NzMsMTQuODQxMjYgLTQwLjIyNDkxLDE0Ljk4NDkgLTAuMTM1MTcsMC4wMzYgLTAuMjY5ODEsLTAuMDY3NCAtMC4zODcyNCwtMC4yOTcyMyBsIDAsMCB6IiAvPg0KICAgIDxwYXRoDQogICAgICAgc3R5bGU9ImZpbGw6IzYzOThhYTtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSINCiAgICAgICBkPSJtIDE3OC4wODgzNSwzMTUuNTE0MzMgYyAwLC0wLjc3MDc4IDMuMjY4OSwtNi41MzMxIDExLjU1Mzk1LC0yMC4zNjY5OCAxOS44NTExOCwtMzMuMTQ2MzEgMjguOTI3MTUsLTQ1LjE2MDEyIDQwLjA3MjkyLC01My4wNDQyOSA5Ljk3MTI3LC03LjA1MzM3IDE1LjMwMjc5LC0xMS45Mjk0IDIxLjI0NTM5LC0xOS40MzAzMyBsIDMuNjY0MDksLTQuNjI0OTIgNC45Mzk5LDQuODU2NTIgYyA4LjY0Nzg0LDguNTAxODkgMTMuODYxMywxMC45NjY2OCAyMy4yOTcxNywxMS4wMTQzMiAxMS41NDA1OCwwLjA1ODMgMjQuMTc4NDksLTYuMzg4MSAyNC4xNzg0OSwtMTIuMzMyOTkgMCwtMS4zMzk4IDAuOTU0MDQsLTIuNzIyMzYgMS44Nzg1NywtMi43MjIzNiAwLjM5MTMyLDAgMi42MTY4NiwwLjY4MzY1IDQuOTQ1NjUsMS41MTkyMyA2LjA2OTkyLDIuMTc3OSA5LjYzMDI4LDIuOTY1NDggMTQuNjA5MTIsMy4yMzE2NSA0LjkzOTk4LDAuMjY0MDkgOC41NDg0OCwtMC4xNzA0IDEzLjM1ODE3LC0xLjYwODQxIDQuNzI1NjEsLTEuNDEyODggNy40NDcwOSwtMi44NTkwNSAxNS41OTgzMywtOC4yODg4MiA0LjEwNzYsLTIuNzM2MTggNy41OTk1NCwtNC45NzQ4NyA3Ljc1OTg4LC00Ljk3NDg3IDAuMTYwMzMsMCAzLjEyNTM0LDEuNzE4OTYgNi41ODg5LDMuODE5OTEgMy40NjM1NiwyLjEwMDk1IDcuNjI1NDIsNC4zODEzMyA5LjI0ODU5LDUuMDY3NTEgMTEuMDY4NjIsNC42NzkxOCAyMy4wMjQ0NSw0LjM3MzkgMzMuOTcxMjYsLTAuODY3NDEgMS45NTc5NSwtMC45Mzc0NyA2LjU2NzkzLC0zLjczMDc0IDEwLjI0NDQsLTYuMjA3MjcgMy42NzY0OCwtMi40NzY1MyA2LjczNjEzLC00LjQ0NTc2IDYuNzk5MjMsLTQuMzc2MDYgMC4wNjMxLDAuMDY5NyAxLjQ1NjA1LDIuOTIwOCAzLjA5NTQ0LDYuMzM1NzggMS42Mzk0LDMuNDE0OTggMy42OTg5NSw3LjI2NjcgNC41NzY3OSw4LjU1OTM3IDMuODAwMDEsNS41OTU3OCA4LjE3NTg4LDkuNzUxNDEgMTQuMDgzNDMsMTMuMzc0NjQgNi4wODEyMiwzLjcyOTc1IDkuODMyMDYsOC42ODY4IDEwLjIxODgyLDEzLjUwNTA3IDAuMzgzNjcsNC43Nzk2OCAtMS43MDMyOSw5LjAxOTM5IC03LjcyMTg5LDE1LjY4NzIxIC00LjY5NzQ3LDUuMjA0MTkgLTUuODczMyw3LjIzNTQgLTUuODYxMTMsMTAuMTI0OTEgMC4wMTIyLDIuODkyNjIgMS43MDEwMyw2LjIyODU0IDQuNjY5NjQsOS4yMjM3OSA0LjgwNTMzLDQuODQ4NDQgMTIuMzQ2MDUsNi4yODc3NyAyMy40MzUzNCw0LjQ3MzE5IDIuNDc0MDgsLTAuNDA0ODQgNS41OTQ3OSwtMC43Mzc1NyA2LjkzNDkxLC0wLjczOTM4IDQuMjg1NTEsLTAuMDA2IDYuOTAzMTksMi4wOTU5NSAxMS44OTI1MSw5LjU0ODU5IDMuNDQzNTEsNS4xNDM2NSAxMC45NzM5NiwxNy43NTUwOCAxMC45NzM5NiwxOC4zNzgzNiAwLDAuMzI0MDcgLTAuMzUxNDUsMC41NTIwOCAtMC44NTA5NywwLjU1MjA4IC0xLjA1MTA5LDAgLTUuNjIzMTQsLTEuMjQzOCAtOC45MzIxNCwtMi40Mjk5NCAtNC4zNDg1LC0xLjU1ODc1IC01Ny4yNzIzOCwtMjIuMDA1MjYgLTc0Ljc0Nzg2LC0yOC44Nzc5NSAtNDYuNjYzNSwtMTguMzUxNjIgLTYyLjAyODA1LC0yNC4yMTI0NiAtNjkuNTM2NTcsLTI2LjUyNDg5IC04LjExNDE3LC0yLjQ5ODk1IC0xMy42NDAyOSwtMy4wODUyMiAtMTguMTI2NjEsLTEuOTIzMDYgLTUuNTc5OTYsMS40NDU0NiAtODEuNzIwNjcsMzAuODY4ODggLTEyNi4xMzI0NSw0OC43NDE5NSAtMjEuOTMxMTksOC44MjYgLTI0LjY3NzQ5LDkuODc1NzcgLTI4Ljc4MTE2LDExLjAwMTU5IC0zLjI2MzAzLDAuODk1MjEgLTMuMTQ0MDcsMC44ODI5NCAtMy4xNDQwNywwLjMyNDI2IHoiIC8+DQogIDwvZz4NCjwvc3ZnPg=='); + background-position: 16px 80%; + background-repeat: no-repeat; + background-size: 20px 12px; + padding-left: 2.5em; +} + +.multi-language-selector .language-option[data-lang='kotlin'], +.exampleblock[data-lang=kotlin] > .content .title { + background-image: url('data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9IjAgMCA2MCA2MCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNjAgNjA7Ij4NCjxnPg0KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iWE1MSURfM18iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMTUuOTU5NCIgeTE9Ii0xMy4wMTQzIiB4Mj0iNDQuMzA2OCIgeTI9IjE1LjMzMzIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgMCA2MSkiPg0KCQk8c3RvcCAgb2Zmc2V0PSI5LjY3NzAwMGUtMDIiIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDk1RDUiLz4NCgkJPHN0b3AgIG9mZnNldD0iMC4zMDA3IiBzdHlsZT0ic3RvcC1jb2xvcjojMjM4QUQ5Ii8+DQoJCTxzdG9wICBvZmZzZXQ9IjAuNjIxMSIgc3R5bGU9InN0b3AtY29sb3I6IzU1N0JERSIvPg0KCQk8c3RvcCAgb2Zmc2V0PSIwLjg2NDMiIHN0eWxlPSJzdG9wLWNvbG9yOiM3NDcyRTIiLz4NCgkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzgwNkVFMyIvPg0KCTwvbGluZWFyR3JhZGllbnQ+DQoJPHBvbHlnb24gaWQ9IlhNTElEXzJfIiBzdHlsZT0iZmlsbDp1cmwoI1hNTElEXzNfKTsiIHBvaW50cz0iMCw2MCAzMC4xLDI5LjkgNjAsNjAgCSIvPg0KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNC4yMDkyIiB5MT0iNDguOTQwOSIgeDI9IjIwLjY3MzQiIHkyPSI2NS40MDUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgMCA2MSkiPg0KCQk8c3RvcCAgb2Zmc2V0PSIwLjExODMiIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDk1RDUiLz4NCgkJPHN0b3AgIG9mZnNldD0iMC40MTc4IiBzdHlsZT0ic3RvcC1jb2xvcjojM0M4M0RDIi8+DQoJCTxzdG9wICBvZmZzZXQ9IjAuNjk2MiIgc3R5bGU9InN0b3AtY29sb3I6IzZENzRFMSIvPg0KCQk8c3RvcCAgb2Zmc2V0PSIwLjgzMzMiIHN0eWxlPSJzdG9wLWNvbG9yOiM4MDZFRTMiLz4NCgk8L2xpbmVhckdyYWRpZW50Pg0KCTxwb2x5Z29uIHN0eWxlPSJmaWxsOnVybCgjU1ZHSURfMV8pOyIgcG9pbnRzPSIwLDAgMzAuMSwwIDAsMzIuNSAJIi8+DQogICAgPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8yXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSItMTAuMTAxNyIgeTE9IjUuODM2MiIgeDI9IjQ1LjczMTUiIHkyPSI2MS42Njk0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgNjEpIj4NCgkJPHN0b3AgIG9mZnNldD0iMC4xMDc1IiBzdHlsZT0ic3RvcC1jb2xvcjojQzc1N0JDIi8+DQoJCTxzdG9wICBvZmZzZXQ9IjAuMjEzOCIgc3R5bGU9InN0b3AtY29sb3I6I0QwNjA5QSIvPg0KCQk8c3RvcCAgb2Zmc2V0PSIwLjQyNTQiIHN0eWxlPSJzdG9wLWNvbG9yOiNFMTcyNUMiLz4NCgkJPHN0b3AgIG9mZnNldD0iMC42MDQ4IiBzdHlsZT0ic3RvcC1jb2xvcjojRUU3RTJGIi8+DQoJCTxzdG9wICBvZmZzZXQ9IjAuNzQzIiBzdHlsZT0ic3RvcC1jb2xvcjojRjU4NjEzIi8+DQoJCTxzdG9wICBvZmZzZXQ9IjAuODIzMiIgc3R5bGU9InN0b3AtY29sb3I6I0Y4ODkwOSIvPg0KCTwvbGluZWFyR3JhZGllbnQ+DQoJPHBvbHlnb24gc3R5bGU9ImZpbGw6dXJsKCNTVkdJRF8yXyk7IiBwb2ludHM9IjMwLjEsMCAwLDMxLjcgMCw2MCAzMC4xLDI5LjkgNjAsMCAJIi8+DQo8L2c+DQo8L3N2Zz4='); + background-position: 17px 80%; + background-repeat: no-repeat; + background-size: 11px 11px; + padding-left: 2.3em; +} + +.multi-language-selector { + display: block; +} + +.multi-language-selector .language-option[data-lang='groovy'] { + background-position: 20px center; + padding-left: 32px; +} + +.multi-language-selector .language-option[data-lang='kotlin'] { + background-position: 30px center; + padding-left: 27px; +} + +.multi-language-selector .language-option { + background-color: white; + border: 1px solid #f7f7f8; + border-radius: 4px 4px 0 0; + cursor: pointer; + display: inline-block; + font-weight: normal; + font-family: 'Lato', Arial, sans-serif; + margin: 0; + padding: 4px 20px; + min-width: 130px; + max-width: 320px; + text-align: center; + filter: grayscale(1); + -webkit-filter: grayscale(1); + opacity: 0.7; +} + +.multi-language-selector .language-option.selected { + background-color: #f7f7f8; + color: #02303a; + filter: none; + -webkit-filter: none; + opacity: 1; +} + +.multi-language-text.hidden, +.multi-language-selector ~ .multi-language-sample.hidden { + display: none; +} + +.multi-language-sample { + border-radius: 0 0 4px 4px; +} + +/* + * Ensure that blocks of code do not wrap by applying the behavior of `[listing%nowrap]` by default. + * + * These styles are copied from a CSS ruleset in asciidoctor.css that has the same group of + * selectors except that they end with `.nowrap`. + */ +.literalblock pre, +.literalblock pre[class], +.listingblock pre, +.listingblock pre[class] { + overflow-x: auto; + white-space: pre; + word-wrap: normal; +} + +/* + * This CSS ruleset solves: https://github.com/gradle/guides/issues/113#issuecomment-314826749. + */ +.literalblock pre::after, +.literalblock pre[class]::after, +.listingblock pre::after, +.listingblock pre[class]::after { + content: ""; +} + +.quoteblock blockquote, +.quoteblock blockquote p { + text-align: left; + text-align: start; +} + +div.screenshot { + box-shadow: 0 0 20px 1px rgba(0, 0, 0, 0.2); + margin-left: auto; + margin-right: auto; + width: 90%; +} + +.inset { + box-shadow: 0 0 1px 1px rgba(0, 0, 0, 0.1); + padding: 1em; +} + +.image.inline-icon img { + vertical-align: sub; +} + +/* TOC */ +#header > h1:first-child + #toc { + background: none; + border: 0 none; + margin-top: 0; +} + +#header #toctitle { + margin-bottom: 0.425rem; +} + +#toc, +#content #toc { + border: 0 none; +} + +#toc > ul { + margin-left: 0; + font-family: inherit; +} + +#toc > ul > li { + line-height: 1.25; + margin-top: 0; + padding-bottom: 0.5rem; +} + +#toc > ul > li:last-of-type { + padding-bottom: 0; +} + +#toc a { + font-style: normal; +} + +#toc a:hover, +#toc a:focus, +#toc a:hover code, +#toc a:focus code { + color: #1DA2BD; +} + +#toc a:active { + text-decoration: none; +} + +@media screen and (min-width: 75rem) and (min-height: 48rem) { + #header #toc { + font-size: 1rem; + background: #f7f7f8; + border-radius: 0; + margin-bottom: 0; + padding: 15px 0 0; + } + + #header #toctitle { + font-size: 1rem; + font-weight: 700; + margin: 0.4rem 0 0.5rem 0; + } + + #toc a { + color: #02303A; + } + + #toc a.active { + color: #1BA8C4; + } +} + +/* Site header specific styles */ +.hamburger { + background-color: transparent; + background-image: none; + border: none; + border-radius: 4px; + cursor: pointer; + margin-left: auto; + padding: 11px 10px; +} + +.hamburger:focus { + outline: 0; +} + +.hamburger__bar { + display: block; + width: 22px; + height: 2px; + background-color: black; + border-radius: 1px; +} + +.hamburger__bar + .hamburger__bar { + margin-top: 4px; +} + +.site-header { + background-color: white; +} + +/* Override javadoc styles */ +.site-header div { + font-family: 'Lato', Arial, sans-serif; +} + +.site-header__navigation-header a { + align-self: center; + border-bottom: 0 none; + height: 36px; +} + +.site-header .site-header-version { + align-self: flex-end; + color: #1da2bd; + font-size: 20px; + padding-left: 1px; +} + +.site-header__navigation { + display: flex; + flex-direction: column; +} + +.site-header__navigation-header { + display: flex; + flex: 0 0 auto; + margin-left: 12px; +} + +.site-header__navigation-collapsible { + flex: 1 1 auto; + height: 210px; + overflow: visible; + transition: height 0.3s ease; +} + +.site-header__navigation-items { + display: flex; + flex-direction: column; + flex-wrap: wrap; + align-items: flex-start; + max-height: 210px; /* This matches the collapsible height above */ + margin: 0 20px; + padding-top: 12px; + padding-left: 0; + list-style-type: none; +} + +.site-header__navigation-item { + flex: 0 1 auto; + font-size: 16px; + width: 250px; +} + +.site-header__navigation-item .site-header__navigation-link { + position: relative; + display: inline-block; + cursor: pointer; + width: 100%; + padding: 5px; + line-height: 20px; + border: 0 none; + color: #02303A; + text-decoration: none; + transition: none; + -o-transition: none; + -moz-transition: none; + -webkit-transition: none; +} + +.site-header__navigation-item .site-header__navigation-link:hover { + color: #1DA2BD; +} + +.site-header__navigation-item .site-header__navigation-link.active { + font-weight: 500; +} + +/* Navigation submenu styles */ +.site-header__navigation-submenu-section { + position: relative; +} + +.site-header__navigation-submenu-section .site-header__down-arrow { + width: 8px; + height: 8px; + margin-left: 2px; + margin-top: 0; +} + +.site-header__navigation-submenu-section .site-header__navigation-link:hover { + color: #02303A; +} + +.site-header__navigation-submenu-section .site-header__navigation-link:hover path { + fill: none; +} + +.site-header__navigation-submenu-section .site-header__navigation-submenu .site-header__navigation-submenu-item-link:hover { + color: #1DA2BD; +} + +.site-header__navigation-submenu-section .site-header__navigation-submenu { + display: none; + width: 170px; + background-color: white; + top: 40px; + left: 21px; /* NOTE: This must match the padding of .site-header__navigation-link */ + padding: 3px 10px 6px 10px; + z-index: 100; +} + +.site-header__navigation-submenu-section .site-header__navigation-submenu .site-header__navigation-submenu-item-link { + width: 100%; + color: #02303A; + white-space: nowrap; + display: inline-block; + padding-top: 3px; + border: 0 none; + transition: none; + -o-transition: none; + -moz-transition: none; + -webkit-transition: none; +} + +.site-header__navigation-submenu-section .site-header__navigation-submenu .site-header__navigation-submenu-item-link .site-header__navigation-submenu-item-link-text { + display: inline-block; + font-size: 16px; +} + +.site-header__navigation-submenu-section.open .site-header__navigation-submenu { + display: block; +} + +/* Top navigation mobile styles */ +@media (max-width: 1023px) { + .site-header__navigation-collapsible--collapse { + height: 0; + overflow-y: hidden; + } + + .site-header__navigation-submenu-section .site-header__navigation-submenu { + padding: 0 1rem 0.5rem 1.5rem; + display: block; + top: 30px !important; + left: 0 !important; + } + + .site-header__navigation-item, + .site-header__navigation-submenu-section .site-header__navigation-submenu .site-header__navigation-submenu-item-link .site-header__navigation-submenu-item-link-text { + font-size: 18px; + } + + .site-header { + padding: 5px 12px; + } + + .site-header-version { + display: none; + } + + .site-footer__navigation { + flex-direction: column; + } + + .site-footer__links { + flex-wrap: wrap; + } + + .site-footer__link-group { + margin-bottom: 1rem; + } +} + +/* Top navigation desktop styles */ +@media (min-width: 1024px) { + .site-header { + position: fixed; + top: 0; + left: 0; + right: 0; + -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, .15); + -moz-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, .15); + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, .15); + z-index: 1; + } + + /* + Pushes the section headings to just below the top nav bar when a user + navigates directly to section anchors. + */ + #content h2[id], #content h3[id], #content h4[id], #content h5[id] { + padding-top: 60px; + } + + #content h2[id] { + /* Little extra room above h2s */ + margin-top: -1em; + } + + #content h3[id], #content h4[id], #content h5[id] { + margin-top: -60px; + } + + .site-header__navigation { + flex-direction: row; + } + + .site-header__navigation-button { + display: none; + } + + .site-header__navigation-items { + flex-direction: row; + align-items: center; + float: right; + width: auto; + padding-top: 0; + } + + .site-header__navigation-item { + width: auto; + } + + .site-header__navigation-item .site-header__navigation-link { + padding: 15px 18px; + } + + .site-header__navigation-item:last-of-type .site-header__navigation-link { + padding-right: 0; + } + + .site-header__navigation-link--button { + padding: 6px 12px; + } + + .site-header__navigation-collapsible { + height: auto; + } + + .site-header__navigation-submenu-section .site-header__navigation-submenu { + position: absolute; + border: 1px solid #9a9a9a; + border-radius: 3px; + } + + .site-header__navigation-submenu-section:hover .site-header__navigation-submenu { + display: block; + } + + /* + Pushes the section headings to just below the top nav bar when a user + navigates directly to section anchors. It doesn't work if you try + to apply the padding and margin to the `h` elements directly. + */ + .chapter a[name], + .chapter .anchor { + padding-top: 60px; + margin-top: -60px; + text-decoration: none; + border: none; + display: inline-block; + } +} + +/* Side Navigation styles */ +/* Docs Navigation */ +.docs-navigation { + display: none; + padding-left: 5px; +} + +.docs-navigation .search-container { + display: none; + margin-bottom: 1rem; +} + +.docs-navigation .search-input { + height: 30px; + line-height: 30px; + box-sizing: border-box; + padding: 0 20px 0 30px; + border: 1px solid #e3e3e3; + border-radius: 3px; + color: #666; + outline: none; + margin-right: 10px; + transition: border-color 0.2s ease; + background: white url('data:image/svg+xml;utf8,') no-repeat 8px 5px; + background-size: 20px; + vertical-align: middle !important; + max-width: 100%; +} + +.docs-navigation .search-input:focus { + border-color: #1BA8CB; +} + +.docs-navigation .search-input::placeholder { + color: #ccc; +} + +/* Docsearch overrides */ +.docs-navigation .algolia-autocomplete { + display: block !important; + flex: 1; +} + +.docs-navigation .algolia-autocomplete .ds-dropdown-menu { + width: 100%; + min-width: 0 !important; + max-width: none !important; + padding: .75rem 0 !important; + background-color: #fff !important; + background-clip: padding-box; + border: 1px solid #e3e3e3 !important; + box-shadow: 0 .5rem 1rem rgba(0, 0, 0, .175) !important; +} + +@media (min-width: 768px) { + .docs-navigation .algolia-autocomplete .ds-dropdown-menu { + width: 300%; + } +} + +.docs-navigation .algolia-autocomplete .ds-dropdown-menu [class^="ds-dataset-"] { + padding: 0 !important; + overflow: visible !important; + background-color: transparent !important; + border: 0 !important; +} + +.docs-navigation .algolia-autocomplete .ds-dropdown-menu .ds-suggestions { + margin-top: 0 !important; +} + +.docs-navigation .algolia-autocomplete .algolia-docsearch-suggestion { + padding: 0 15px !important; +} + +.docs-navigation .algolia-autocomplete .algolia-docsearch-suggestion--category-header { + font-weight: 800 !important; + color: #1BA8CB !important; +} + +.docs-navigation .algolia-autocomplete .algolia-docsearch-suggestion--wrapper {} + +.docs-navigation .algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column {} + +.docs-navigation .algolia-autocomplete .algolia-docsearch-suggestion--content { + padding: 0 !important; +} + +.docs-navigation .algolia-autocomplete .algolia-docsearch-suggestion--title { + display: block !important; + color: #02303A; + padding: .25rem 1rem !important; + margin-bottom: 0 !important; + font-weight: 500 !important; +} + +.docs-navigation .algolia-autocomplete .algolia-docsearch-suggestion--text { + padding: 0 1rem .5rem !important; + margin-top: -.25rem !important; + font-size: 0.9em !important; + font-weight: 400 !important; + line-height: 1.25 !important; +} + +.docs-navigation .algolia-autocomplete .algolia-docsearch-footer { + float: none !important; + width: auto !important; + height: auto !important; + padding: .75rem 1rem 0; + font-size: .875rem !important; + line-height: 1 !important; + color: #767676 !important; + border-top: 1px solid #e3e3e3 !important; + text-align: right; +} + +.docs-navigation .algolia-autocomplete .algolia-docsearch-footer a { + font-size: .875rem; + text-decoration: underline; +} + +.docs-navigation .algolia-autocomplete .algolia-docsearch-footer--logo { + display: inline !important; + overflow: visible !important; + color: inherit !important; + text-indent: 0 !important; + background: none !important; +} + +.docs-navigation .algolia-autocomplete .algolia-docsearch-suggestion--highlight { + background-color: rgba(143, 187, 237, .1) !important; +} + +.docs-navigation .algolia-autocomplete .ds-suggestion .ds-cursor .algolia-docsearch-suggestion--content { + background-color: rgba(208, 189, 236, .15) !important; +} + +.docs-navigation a { + color: #02303A; + display: block; + font-size: 1rem; + line-height: 1.25; +} + +.docs-navigation a code { + color: #02303A; + overflow-wrap: break-word; + padding: 0; + word-break: break-all; +} + +.docs-navigation a.active { + color: #1BA8C4; +} + +.docs-navigation ul { + list-style-type: none; + margin: 0.5em 0; + padding: 0; +} + +.docs-navigation ul:last-of-type { + margin-bottom: 0; +} + +.docs-navigation li:first-of-type { + margin-top: 0; +} + +.docs-navigation li { + margin-bottom: 0.5em; +} + +.docs-navigation li:last-of-type { + margin-bottom: 0; +} + +.docs-navigation .nav-dropdown { + background: transparent url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iNiIgdmlld0JveD0iMCAwIDE5IDExIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIHRyYW5zZm9ybT0icm90YXRlKC0xODAgOS4zNzQgNS40OTQpIiBkPSJNMTcuOTk5MSAxMC40MjI4MjVMOS4zNzQxIDAuNTY1NTc1IDAuNzQ5MSAxMC40MjI4MjUiIHN0cm9rZT0iIzAyMzAzQSIgb3BhY2l0eT0iMC43IiBzdHJva2Utd2lkdGg9IjEuNSIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PC9zdmc+') no-repeat center right; +} + +.docs-navigation > ul ul, +.docs-navigation > ul ul ul { + display: none; + height: 0; + margin-left: 1rem; +} + +.docs-navigation > ul ul:target, +.docs-navigation > ul ul:target ul, +.docs-navigation > ul .nav-dropdown.expanded ~ ul { + display: block; + height: auto; +} + +.docs-navigation h3 { + font-size: 1rem; + font-weight: 700; + line-height: 1.5; + margin: 1.5em 0 0; +} + +.docs-navigation .docs-home-link { + position: relative; +} + +.docs-navigation .pdf-link-container { + display: inline-block; + position: absolute; + top: -1.25em; + right: 0; +} + +.docs-navigation .pdf-link-container a { + color: #999; + font-size: 12px; +} + +.docs-navigation .pdf-link-container svg { + fill: #999; + height: 12px; + vertical-align: bottom; +} + +@media screen and (min-width: 45rem) { + .main-content { + display: flex; + justify-content: center; + } +} + +/* User guide navigation appears for desktops */ +@media screen and (min-width: 64rem) { + .main-content { + padding-top: 75px; + } + + .docs-navigation { + display: block; + flex: 0 0 auto; + width: 13.75rem; + } + + .main-content > .appendix, + .main-content > .book, + .main-content > .chapter { + flex: 0 0 45rem; + margin: 0 20px; + } +} + +/* Fixed intra-chapter navigation for desktops */ +@media screen and (min-width: 75rem) and (min-height: 48rem) { + .appendix #header #toc, + .book #header #toc, + .chapter #header #toc { + position: fixed; + left: calc(50% + 380px); + top: 50px; + width: 13.75rem; + padding-top: 15px; + font-size: 1rem; + background-color: #F7F7F8; + } + + .appendix #toc a, + .book #toc a, + .chapter #toc a { + color: #02303A; + display: inline-block; + } + + .appendix #toc a.active, + .book #toc a.active, + .chapter #toc a.active { + color: #1BA8C4; + } + + .docs-navigation { + flex-basis: 13.75rem; + } + + /* Sneaky way to make room for TOC */ + .secondary-navigation { + flex: 0 0 13.75rem; + } +} + +@media screen and (min-width: 84.375rem) and (min-height: 48rem) { + .appendix #header #toc, + .book #header #toc, + .chapter #header #toc { + left: calc(50% + 26.25rem); + } +} + +@media screen and (min-width: 93.75rem) and (min-height: 48rem) { + .appendix #header #toc, + .book #header #toc, + .chapter #header #toc { + left: calc(50% + 31.25rem); + } +} + +/* Userguide Meta */ +.chapter-meta { + float: right; + text-align: right; +} + +.chapter-meta .edit-link { + color: #999; + font-size: 0.9em; + padding-right: 3px; +} + +.chapter-meta .edit-link svg { + margin-right: 1px; +} + +/* Clever use of RTL to fill in all stars to left of hover position */ +.rating { + direction: rtl; +} + +.rating > .star { + cursor: pointer; + display: table-cell; + padding: 3px; +} + +.rating > .star:hover > svg > g, +.rating > .star:hover ~ .star > svg > g, +.rating > .star.selected > svg > g, +.rating > .star.selected ~ .star > svg > g { + fill: #999; +} + +/* Footer styles */ +.site-footer { +} + +.site-footer__navigation { + display: flex; + max-width: 75rem; + margin: 3rem auto 0 auto; + padding: 0.5rem 0.75rem; +} + +.site-footer__links { + display: flex; + flex: 1 1 auto; +} + +.site-footer__links .site-footer__links-list { + list-style-type: none; + margin: 0; +} + +.site-footer__links .site-footer__links-list a { + color: #666; +} + +.site-footer__link-group { + flex: 1 1 auto; + flex-basis: 175px; +} + +.site-footer__link-group header { + color: #555; +} + +.site-footer__subscribe-newsletter { + flex: 0 0 350px; +} + +.site-footer__subscribe-newsletter .newsletter-form__header h5 { + color: #555; + margin-top: 0; +} + +.site-footer__subscribe-newsletter p { + font-size: 0.875rem; + margin: 2px 0 0 2px; + opacity: 0.7; +} + +.site-footer__subscribe-newsletter .disclaimer { + font-size: 0.75rem; + opacity: 0.55; +} + +.site-footer__subscribe-newsletter .newsletter-form { + padding-top: 6px; + display: flex; + justify-content: flex-start; +} + +.site-footer__subscribe-newsletter .email, +.site-footer__subscribe-newsletter .submit { + height: 40px; +} + +.site-footer__subscribe-newsletter .email { + line-height: 40px; + width: 250px; + color: #1DA2BD; + font-size: 16px; + padding-left: 20px; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + border-style: none; +} + +.site-footer__subscribe-newsletter .submit { + font-family: inherit; + font-size: inherit; + line-height: inherit; + width: 100px; + background-color: #1BA8CB; + color: white; + font-weight: 500; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + border-style: none; + cursor: pointer; + transition: all .3s ease; +} + +/* Secondary footer (below) */ +.site-footer-secondary { + background-color: white; +} + +.site-footer-secondary__contents { + display: flex; + align-items: center; + justify-content: space-between; + max-width: 75rem; + margin-left: auto; + margin-right: auto; + font-size: 0.875rem; + padding: 0.5rem 0.75rem; +} + +/* + * 1. Value is the largest computed width among 'site-footer__copy' and 'site-footer__links'. + */ +.site-footer__copy, +.site-footer__secondary-links { + flex-grow: 0; + flex-basis: 280px; + /* 1. */ +} + +/* + * 1. 'flex-shrink: 1' is applied to the element with the smallest computed width among + * 'site-footer__copy' and 'site-footer__links'. + */ +.site-footer__copy { + flex-shrink: 1; + /* 1. */ +} + +.site-footer__logo { + flex: 0 0 auto; + margin-right: 10px; + margin-left: 10px; +} + +.site-footer__logo svg { + width: 35px; + height: 35px; +} + +/* + * 1. 'flex-shrink: 0' is applied to the element with the largest computed width among + * 'site-footer__copy' and 'site-footer__links'. + */ +.site-footer__secondary-links { + flex-shrink: 0; + /* 1 */ + text-align: right; + white-space: nowrap; +} + +.site-footer-secondary a { + color: #999; +} + +.site-footer-secondary__links a:not(:last-child) { + padding-right: 10px; +} + +.site-footer-secondary__links a:not(:first-child) { + padding-left: 10px; +} + +@media all and (max-width: 29.99rem) { + .site-footer__rights, + .site-footer-secondary__links { + display: none; + } + + .site-footer__logo { + order: 1; + text-align: left; + } + + .site-footer__copy { + order: 2; + text-align: right; + } +} + +/* Avoid the footer taking up much of the screen on short displays */ +@media all and (max-height: 56.25rem) { + .site-footer__navigation { + margin: 1.5rem auto 0 auto; + padding-top: 0; + padding-bottom: 0; + } +} + +@media screen and (min-width: 84.375rem) { + .ui-logos .ui-logo { + box-shadow: 0 6px 15px 1px rgba(0, 0, 0, 0.56); + } + + .main-content > .appendix, + .main-content > .book, + .main-content > .chapter { + flex-basis: 50rem; + max-width: 50rem; + } +} + +@media screen and (min-width: 93.75rem) { + .main-content > .appendix, + .main-content > .book, + .main-content > .chapter { + flex-basis: 60rem; + max-width: 60rem; + } +} + +/* User Manual Home */ +.technology-logos, +.ui-logos { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-around; +} + +.technology-logo, +.ui-logo { + flex: 0 1 auto; +} + +.ui-logo { + width: 224px; + height: 135px; + margin: 12px; +} From 11f38caa6821352d2a841cc03fbe916fb675bdc0 Mon Sep 17 00:00:00 2001 From: Daniel Lacasse Date: Wed, 9 Oct 2019 14:50:17 +0200 Subject: [PATCH 02/11] Allow samples to be tested by exemplar --- build.gradle.kts | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/build.gradle.kts b/build.gradle.kts index fd1c48ab..042c8db9 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,4 +1,5 @@ import org.asciidoctor.gradle.AsciidoctorTask +import org.gradle.samples.ExemplarExtension import org.gradle.samples.Sample import org.gradle.samples.plugins.generators.CppLibraryTemplate import org.gradle.samples.plugins.generators.SourceCopyTask @@ -53,6 +54,31 @@ fun Sample.copySource(configuration: SourceCopyTask.() -> kotlin.Unit) { sample.archiveContent.from(sourceContent) } +samples.configureEach { + val sample = this + val generatorTask = tasks.register("generate${GUtil.toCamelCase(sample.name)}") { + val outputDir = project.layout.buildDirectory.dir("sample-exemplar-generators/${sample.name}") + outputs.dir(outputDir) + doLast { + outputDir.get().file("helpTask.sample.conf").asFile.writeText(""" +commands: [{ + execution-subdirectory: . + executable: gradle + args: help +}] +""") + outputDir.get().file("taskList.sample.conf").asFile.writeText(""" +commands: [{ + execution-subdirectory: . + executable: gradle + args: tasks +}] +""") + } + } + sample.extensions.getByType(ExemplarExtension::class.java).source.from(generatorTask) +} + samples.create("cpp-application") { sampleDirectory.set(file("cpp/application")) withGroovyDsl { From 8bc76f474da38310479768926412dd43f0a6a3b7 Mon Sep 17 00:00:00 2001 From: Sterling Greene Date: Thu, 3 Oct 2019 16:31:48 -0400 Subject: [PATCH 03/11] Move injected plugins to included build --- .../{buildSrc => plugins}/build.gradle | 0 cpp/injected-plugins/plugins/settings.gradle | 0 .../gradle/cpp/samples/CommonPlugin.groovy | 0 .../gradle/cpp/samples/ListBuildPlugin.groovy | 0 .../cpp/samples/UtilitiesBuildPlugin.groovy | 0 cpp/injected-plugins/settings.gradle | 2 ++ gradle/wrapper/gradle-wrapper.jar | Bin 55616 -> 56849 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 29 ++++++++---------- .../{buildSrc => plugins}/build.gradle | 0 .../injected-plugins/plugins/settings.gradle | 0 .../gradle/swift/samples/CommonPlugin.groovy | 0 .../swift/samples/GenerateSource.groovy | 0 .../swift/samples/ListBuildPlugin.groovy | 0 .../swift/samples/UtilitiesBuildPlugin.groovy | 0 swift/injected-plugins/settings.gradle | 2 ++ 16 files changed, 17 insertions(+), 18 deletions(-) rename cpp/injected-plugins/{buildSrc => plugins}/build.gradle (100%) create mode 100644 cpp/injected-plugins/plugins/settings.gradle rename cpp/injected-plugins/{buildSrc => plugins}/src/main/groovy/org/gradle/cpp/samples/CommonPlugin.groovy (100%) rename cpp/injected-plugins/{buildSrc => plugins}/src/main/groovy/org/gradle/cpp/samples/ListBuildPlugin.groovy (100%) rename cpp/injected-plugins/{buildSrc => plugins}/src/main/groovy/org/gradle/cpp/samples/UtilitiesBuildPlugin.groovy (100%) rename swift/injected-plugins/{buildSrc => plugins}/build.gradle (100%) create mode 100644 swift/injected-plugins/plugins/settings.gradle rename swift/injected-plugins/{buildSrc => plugins}/src/main/groovy/org/gradle/swift/samples/CommonPlugin.groovy (100%) rename swift/injected-plugins/{buildSrc => plugins}/src/main/groovy/org/gradle/swift/samples/GenerateSource.groovy (100%) rename swift/injected-plugins/{buildSrc => plugins}/src/main/groovy/org/gradle/swift/samples/ListBuildPlugin.groovy (100%) rename swift/injected-plugins/{buildSrc => plugins}/src/main/groovy/org/gradle/swift/samples/UtilitiesBuildPlugin.groovy (100%) diff --git a/cpp/injected-plugins/buildSrc/build.gradle b/cpp/injected-plugins/plugins/build.gradle similarity index 100% rename from cpp/injected-plugins/buildSrc/build.gradle rename to cpp/injected-plugins/plugins/build.gradle diff --git a/cpp/injected-plugins/plugins/settings.gradle b/cpp/injected-plugins/plugins/settings.gradle new file mode 100644 index 00000000..e69de29b diff --git a/cpp/injected-plugins/buildSrc/src/main/groovy/org/gradle/cpp/samples/CommonPlugin.groovy b/cpp/injected-plugins/plugins/src/main/groovy/org/gradle/cpp/samples/CommonPlugin.groovy similarity index 100% rename from cpp/injected-plugins/buildSrc/src/main/groovy/org/gradle/cpp/samples/CommonPlugin.groovy rename to cpp/injected-plugins/plugins/src/main/groovy/org/gradle/cpp/samples/CommonPlugin.groovy diff --git a/cpp/injected-plugins/buildSrc/src/main/groovy/org/gradle/cpp/samples/ListBuildPlugin.groovy b/cpp/injected-plugins/plugins/src/main/groovy/org/gradle/cpp/samples/ListBuildPlugin.groovy similarity index 100% rename from cpp/injected-plugins/buildSrc/src/main/groovy/org/gradle/cpp/samples/ListBuildPlugin.groovy rename to cpp/injected-plugins/plugins/src/main/groovy/org/gradle/cpp/samples/ListBuildPlugin.groovy diff --git a/cpp/injected-plugins/buildSrc/src/main/groovy/org/gradle/cpp/samples/UtilitiesBuildPlugin.groovy b/cpp/injected-plugins/plugins/src/main/groovy/org/gradle/cpp/samples/UtilitiesBuildPlugin.groovy similarity index 100% rename from cpp/injected-plugins/buildSrc/src/main/groovy/org/gradle/cpp/samples/UtilitiesBuildPlugin.groovy rename to cpp/injected-plugins/plugins/src/main/groovy/org/gradle/cpp/samples/UtilitiesBuildPlugin.groovy diff --git a/cpp/injected-plugins/settings.gradle b/cpp/injected-plugins/settings.gradle index e56071ab..9dce610e 100644 --- a/cpp/injected-plugins/settings.gradle +++ b/cpp/injected-plugins/settings.gradle @@ -1,5 +1,7 @@ rootProject.name = 'app' +includeBuild('plugins') + sourceControl { gitRepository("repos/utilities-library") { producesModule("org.gradle.cpp-samples:utilities") diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 5c2d1cf016b3885f6930543d57b744ea8c220a1a..8849c475a9c5166c28b3bcab239d2300ed59a0f2 100644 GIT binary patch delta 11444 zcmZ9yWmFu&7BvckJHcIoyAAFT+}+&@Q{%(qUMIzt3B1{w<IxhCC zVP1)!cQj0%3skl{1aF&uWmK6303AI$VDkX>4&51jiN= zntGU&mt#0$$D$pW%N&2NC{R1FZY;nn;`W^$53ueYB}J^&tm_GqCv(+sE#E{7!FRC< zvv!Etix_A2(YhI1OSJN!Qtp9mbiqtzX*BN%=V>(H3r0s7nNz8HM(Z>;1HhrkfL$jG z9**>2Ab2&V0w@R8lFVwg^<{SwSuEQg&`8hmZxhL}Txv7sMme^M@_Ati=?tlt@ zaZ5gSaLkJxv8ol$g!=LZ(vLMaXVk06*#|H;uOz=80dbFs3EdxsW>uaF!Nf8@Jc)H$ z6@OB@eYpo_a(6y_$Y*0;(E|T5x=;v&{YjiwUbA$C?2*{=i$Z=})&0PNU}64++uZGx zW?%S+6osB`^r9I7_3}x>drDn*;YBxH5&3K+xht|LgBQb|A}I3${u(DSdXvI$lt{h9 z*s~`7UZByZD*VS?&?0^9BADLB!n)$SKiqGQg>>Rs>}OIED(l_PZ)E6l(@251v~yoc zyCNenOEi$OD;}XU;D4)p$hKY9ne}GY7^g4##@I>8 zcV9>3^&hII4U9>Yc(?S1y0w7d*45`P(f1Fm)gpS5G5h@Ccps1EZ+(Tz-+WJR#B(@- z?{KOLFtEr_P>6_7f8Q`rGfl`M_z*J$aqv$kEO8v+@2Yq$3PW0b`hUy}&efBPgQUVZ zY}sjPK^dBvX>S?*uuBf!W9+iNOmRqMhOr<8V=0>NAG*iO&7}NBZF}^<{gx>uvYQB+tUhpU-F{`&lkHsKHEX zM(l<)&-p&f{6d&F!lH=udzytr827DrzkP8OD@wLYHonGw^;;)h#L2(0H=UTq$O_^|&8bKpBtFSy8hW_a{-G$UAvwWavL z^5ZGqJrn8^63so6Uq6b*+8}Zl5%IG^?`#-s7nFc+<2)++cmCk(WFGj2JC&h6=T?Al zE&&w6vaQm`$d@lKDFp(l?;(RSbo_&{5VuLn`9MRW-e)()V@$LY$VKq9Wa3G@+;My{ zQd-}O>@$D$@F;%f1(P=_!4q)4BUAT_ZHxKK$C{yHG`p_g$~qUxfreAj|6MRD*}3F> z=ulADWKd9)|NTHAf>|vb%-r3p^^klFbv)nVt$kGrONT5B?pLC?zFNpE5ea@JoruDo zIA6JuUDD-j*ymH3hXC(E(&@ey2719_n|L7P@Wya4L`>P>IzF6uMI3ey4i=*m34Hm} zjQK8){NhH~-#y-VaYa#xuXY9xo8FggHlpucDsST$#xHimic`jcx{#&@>L zU7f`%d-!gwVDg?C;~+`b*OI7hHF) zN68WFyhjcIKgzs7Lcl!NKcRSbO#)QGM8QNaOm8f~rB}abyRm!0JEF;-e=&}GqrIdy z?EBk2I&;6o6Lr@{==`{X;hvnw3t_+#%hgQZ;~294!WO*Q>J*);!hsW0ZoP;Kfdzb# zjbqS;;xFeeo=)(SvSYVOXAp<^#ct^%ge2b>ZoLYtllVet*hK}xCwF@oINT~(uic&{)|Dgvh7Wa$KPf` z@d0BNR@}(hWTvnCwSFbNE0TV_5R2-HPTj&{{7chj`JL{F?i!gKA1VI){Xr4r@?i^W;|yPUD~kDZ(C-j6M4W z_}d37qH}W*rgNLYvDRx#ah=VVF6Q7@{K#y%rqL-hsqAk>=S2{&&|#~EC^+?wwrbW) z*LnZpEQw;yYsu9)H7yRU(sqyvr{LT%{kr`|l098}_CcDUaY-*BL*fBDwjpz8S9#U^ zq#>sz(EGPgm&4a0t}2IOxE#$TTwuxz_;jotqL-@XeSyTPGt?GnWy_tIWdJPNOhA`( z;GTkhzO z?q!AF^3km{!9H%>NKTW=C;h}@-6;qkxuUf;-SDJar^DT$KSoRd=rR`41#O4(rPU}=-NY`WqxY`CHnvKS*Xo7h%$XktZ!otE{LY=BIFT}uPx#-0`fhunNmiofmAsALNlVP#4Ua|HMMqb^FxL!q2EC>BoGUY>{%uV86}6 zQNmp_OOu`Lk^MpPtHC^*L*F4y!U;oi9fc+iVYjJGzZLO%ay?8$R^5RoCumHLpC*{{ zLC;Mep1I9LYMYTwPholoOrt=i8dg0?tp44MJJuzSZ=@esgB-wUOQ;}irRZ`xn9~iS z_G913HH(VCAQjyrUh=`t!Qk8d;Y&x_3;}ZPquwSV&6vrrD22zQ5g(OYiIcWmAx_Ye zl8-ay+`BmUQ?8Xcrt|r8WU(;BHhm9DZr2oeQ-$8rX1U0zaS+M}`>*Hn&Lp}<89egk zv>a63++2QB;Y_bwl?qT+4($C8Mr zE$Qeq8qKH`*Koek1^Dcgu`a|6_6C$T;tNPM;l$TG4Q>I3bYg#_h_{$ya7tSPE>BCKVnNe_p~&zU^dUZ-Gi=0r(~5OX}H1S8PP(&UuL zV_&_uDV#TIJvvY)n9w}1cpZAPHh>~kQoJFyt24dh7(t-HCobKgQkZn;}G zZqz3G?F@BukPO7u31!1`A)Z z+!VFSA8WQ?tlKCMJz2Xuugd#i+czJ9!e2dft0_+MGA)Dr-m8X7jgP~`b`=4)8up$Z zym~oH+$fgQ9kTGJTDiBTDa!|KVw?KA-C9p>CNe6=S`!tVIuo_oPaT9>TqaJ}_X^uo zoj*%{8?7#TR48=uOfs=|X(|}%%rSS*^b8)9pZ(zg=R{3rYaZh77>6s-D5U66X!O9d zUsiam7FDu{N(igVUvKP2#$`@jkd^|i7H;4k+6E$%9k# z|6tnc9(x<(P3^ZaEbOTmSE-M+hv{yNRy!^v;5Vkp04;Dww9`NXg<0Ikgx7wZ;_pQD`b=2D8Wk1b zJ4J?D5Uw+GnGb?inTe2-U5>Pt`vk5}#(GWfI?0W3NUbmYTVKkOErE_{V!og9yMO?O zhw8awQU{#pN;Gb3cHe45T&v`IBMV!b^#M90UPnz-MBPt-H-;Z*g;ey-aZK+8F$IeWQ zx4_<7aM%f?%;QBc58%?7jibd+WQUxxpgjg%Lu5n0J-MnmppA^D~xzcmuoc2Eur%89;ql$>QvaEcDGAf&39AANV=L~Vm#QM+MlitA2kV!W zrX~j%DMSyshP!UM7Y_#fi|Z;WAMAyw=ru|xrsBM$Vv#*huV|7xuJ6(q7h5;QV^x=4k3a9$tX zhK4=cmnWR-wuO1_}_XpOe0wJn3D(O7UWNXvO0BN`u@n5QnP zLuSKwe^~bpvcCe0p(BJv3gyaBM-I#_?R@yX_4Dvg9-R+R+Pt(ysg-OhzjOirCL+Kv z7Tr%jw2PmFN^%B&&O2Q&zB2pu);pq8J*s0tFf62R2Ps^qwnG|Q>AshPwn^m=5z}B< z`nQnFWN&lsKLy#Zbr2)h*u~8eeR7+oo{-tZd^M@6j%2=XC9!qWs5dE~CYepQHc5?5aSM0!`*CVye>CD>r=>AO6@`Z{mg|Qg^ z23fzUE6^~jPXSJ_N1UdDT?Ij9q5pE{b#0And~FAYM6gTTKsca}^7j=&B(Y+)=~53b z&&lBcKCxx`Ap9%kbZmks52$$%p7^DjB(`})D|Qm(Y1WM*qAZwO8lJlocLeDq4U9Ir zvfUVuW!OglTUB>+i2w%vGQGYfqkQ3`S&-=p0#WvRKFb#+*Xu^wGbgE&| zO>N(mP*Y7b-B7dNtk(W%*R-VXxOi`%FPa+ge!DeknTQHFO5ON#>2?2eOX$yGSUl#O z!`rM}c9lGrVaA8~*d$sy;wgGtH!Hq1IVmCOT_Kcf`*{8_@R)@ai%Ev7ve&hbEiIq# zM-{huPa(Yw2IP)xV1!EIs|K#fYTrVZ2OB=U(5BqJZv^CWUm~3$u|#(li%w~mLz(rE zlTORE4V9@VonflV%p=W)Nob_c9XE$g@JP@Wo-N@?gQQdSS)S7STNR6!x=8NX4$XXS z%9KLe_}D}%crB{-5P6x;7TU$kF&tQ`puvQB2HQ`FE}~(5hU=u-I@iZU+9^*v?KZD& z%%TK=7$0*Z*J}A>2h@10lji;`(s$DK34;*9`ms2BT=81g$z|vv=k6ELZdF~iDKE83 z5yeB6#$%V|ri6z3+V868C*9nLTLf3=fX-t_)ff2SX#hI9JULcqKXUGIk@h!hCYgvi z8Iok$5|<4*gEs99#|GDqeo|y_0S0D&$$)N>R2|{Cf6Z|M+R?WvuMLQ$* zGMS23ePD%5y5WSqwq|v;$#-90qlJt`&xxg)a)Z@YU#-Oq{gRDmmNlO0{#v+o#tich zCUuVB4+~dks_aAyq4k~_qBVk#=CmE6KbA^l(rAA~essij{4jOC%+xH?=%O31`GYuy z@AN978R3<3Y68f=Fx-9^<=Ka|Wd2i&f@5|Me^i5uR5!UBA#(Vflng9%wq8$0Lvc4)qI}F{z2Rwo68(;^YJxr>on>_U(w_;W;hMc`oOenRWiT2 zyV>Vc%#%c)lvK%lU_SD8>#sH)rp;9Uv7}q5qgqmC^k_r^JENqtr(^evT1V9aoP`S9l3W}U9GM*|z zdoiBcz+ODFFB5@|en46}1F2JA1`^Lcu!|6UYdc;qqa^BmijRF|n%~l})m3wfGRP#x zR&iC#PQ4fCgs3$Ut5I-Ll6JJZmKTmDsPVXt{7du1NmoCUtPC_MvE| ziNWc{8EHvBpcDGuZuH;~7rk|ai%#>HhT3PF99&L0s&hNIm$6+Jdhxevzdnhm##j*S zZ>KBqkHd}J2J*TbPdhNaZZN)(2HV{4;F#E-a&b;}oVcwe$VKI_DY7u@Q4=yg2d2inC%}A90XC^=b8eXEJwyEEklI zt{J1+QW97?sY8K5*jSP2(ioc*OwUj#Ch2Y+QVcA_bZ4Prgi(={Yj-TlT(CbP0Kr@v zB$|-`XcokGb=QwLaz4rZ9TX-e9$jo-ieQIX!lj6NE$G+E#&#WQFPCY+KGK|sD8$L2 z4Ou)2LaNA8(oQLlv|lH2gk5CP)w2eQ%|2HFJXc{hh2n6=~Na!q+G<}Ql7RQ8(mnB zl&d(MX6hnH^E<585itEzGRJjsMJ9FLDgbmH1tVV@lvsB}LcGKQkQ1$H15{poGIcx= z6;eUZ^(2W@0e-ReoID-jG^t}2_*;f{C}I5w#XizT=OwIP2L^(<>uU|0%kOZ6tLFvp zY?8@}jFW>DdNfWs{0xho=V%xMA*|Y`6q~j4tlfYwDrG;CB)2tA)t|r0ZqpdAKE|aC)e)VfBPCg{i9J2a52L8{@FV$+yi}gNvTQ8s!UsRYhZbx zWkF|w1Q)ZH={*VTtokI~Eq9ptWb=hJeF8q*S?x)?Tj_B92|fAYCVPIP_+~Spc>G~D za}@5CPG=;H!$eGF$f3kth4;~=bQ$K75N?jp$yqkOJuE+s_|Qi27H(6&4txEhY#C*g z_2Fg4Coj(tiA!x*x0bDtPZz&DX5@dKGs`f{#e=OT@DwY-o$+8+x3$`vt^kCEl0vL+ zy`*r_34&L@=~bUZMDph2VAaSD{%8e3sqcCfX59G3LS3LYwR6qQR)}+NL6Ae?`mEEe zhlQc57dC4g7dBbi$vj3H#dPPJ{X5u}jEymY$TzaRr1s0^AdiRG*u#5NZ$7O4KHXB{ z#7i8*l8|ID4QiE8J$mz|dSiQ_8Y10CAqfs+{=KD-6f7SGO)22p2VK4Gsc~HFFLkNO zaDCII)Z5sPl-cMv%Q6`^;pRe3If>ef&mc7J0yM5F1woZS960t%#zI8mhP)d}*Fx6h zjy9Ry0Y*{!=wFAC3DtiJt+c2MJmp6I(3rn#2B|eGy`9M`?51i4rJJZd>0n*lL`p|| zMvSfmOS<+fyO{qdaQSM^hj*0kXpLu>^wIJrSHM=xR5{Q)wC_?oK>xT7 zZv9rYa;_7N{YQNUSFpzmiCfifWXkYpZMuf$QdW!5SumoBqOV`b)iYX4GmMYpGc*RB z^)P(cKyO~3_$&;%jaBP+eA0dBA>{Sj=s-t9ZB2x;J+oRoNCP5v$=GTa(smsl-Wc|H zS%~Ybk2DD$%Hn-b$pP+?RU@fj4Tobr*lVB!E_GCqH6I(fGV)SIxHpL`yHatTv|cq4 zeF(oA>9a*E+nPaKn)8NL1k^g8W&`2a%*3ZJof^`C$1#Nx_>w*G3;Bb-ku+!NiamML!8Y0vuCX?8T%&sGPi$JAW|U>o`$ zn(WfjNmD5;1ocw;97Q16SmL7?Ruw!K3h`SBZ#wcn=_vGWy&6q;sBmg)Pf8`jc-B5R z>=LAt{N}QpMhUMol;d7g_>$-{x;#~)ETKoG;lUwnA^V)$-Ei9{Z^eV(zfKAavYo}X zWDe0;a!DEoQzLRylMl^nMiDr-g14?dSJI8Zz|``0$ZlCBN=3Sc3$mulcC)m7^^;0% z30KV|l+~t*HYzzCfdi{0l5%m#XQiapG%1z8e=A~P<_!H52ofwP!dv{~TJ&q|i=?<& zp?8&oa5T&kp|gY9f+=S=R~zzz7S~m{jb#U(BcjwDQ4d)#y6NLUsGkfo2biQPHi?%B zGxdqq8pDBm+uG>W8hF4^`Z0SM`j?i>cb&`;ax8|`W-7aL4=hjh43kjFmt3s^lZ<#QYwBX)t;(S?w2 zh49m9vrdsNOV&gf6KxyLD`69{+*TL5olwdYv&>|8Vk@$`zAdR^D@(=TpGR z;)BVH0?2X)PI^XjP-)o1ebC->7XCO zCNgCox62t%J83_m-1-Un8j7DAgS_|NXI%Cd5ByEEdRFKq|0^q*p3nDlGx;U2!5Y%d zA`ah~ew3?rOFS@okTbz{WWCVD^+!r*Ji2Gps4kWQ1A>*&=Uiz6wC#(BxZxxhA~XZ@{d4GxiT*Ktflo%5%DmQEk}jMJVT2zfd8`7J7jOiG ze4%16)SW|zQYj@V3ra3*D_B{7mPE_jr$0_j3Ih>n!QA$NmkvWaMMdSS(NX+LQ_T$} z)*Ta!Sz2r8^M>`KzDr~oU>%nkcPEunogja^E^x~_GLyzpf zQ!GqZZQH<#_}wc^j#v`brJLax!S<~J@Iv%C`_-12zlWMc0hN8 zF-dC$I2Er~T>0CVdKca)ah+A&`_X_(t8NwyRxgyciJQNP{mJT&&$6auS3VJxhG#SP zoXyiZVo?0LmgxYsfd;b$^V3KrTuc}ngunL(nC7J(7VeU7fHs5hjKiyiWF$~$0!&Mu z&*T4_lU+N2-t%k`>QkMB3j1gFQ&H2$FCV(WIfL68cYhZSC9dEPWe-?u?=zpugUiwhdOJ%m7WWnsvVl256audETHu9L65QCW4 z*7HLIDQX43m0$LM^*1&6Q-&pON@&@Vb1Buz9~|s~*>?b)^$V_uHS1Rd?ma*squ|aA zbS@4$rxf!~%Lx{a+Ul?C`+YTJGRuVtK5iS;=_#@asm`XQWW0cy=126LSwNX}rpcCL zn^#aBIb8X}*%jJmpFfs*suKZ6E_eEZ*kyMT0Ng|f+putH$qmYG*dcP`dk$XyrpXgj ziKAaJdyc%w_(SZDUuoDdw`lK9>C*&`oq%M1)4(RwANa0x*|nbpQH8NHn;VkHU^43J z82vK^H({fLsrERBrNERxhSDkS(Lg{Ed5BMLk!u~phhbf8iBPm;=~-t~8JtAY&-4Py z^rMORFR)8wi2V^k;!(Sw4o~jjClcj~Wo77aiQ)AGYUSnRo~gR5 z*y|{YBjN7oBr*DXT^a(!sc`%<=>m}{^lr$bKFJ5cjSfL-&Wg3=h8;_2S`*@yVAnugsJpT1O zh}btpbR~-Y+`HOOZmrPn<~4AIRb`Dt3gfC~+%ql4Dpc|lvCnpYz+2tmUUosu?7dgH zX~pgL@O$uwz4ti4uXojhAo$gQ98P&CCAk79{|BN(`n>muLFzyijxz!jMV{QZkut}7 zVv&f(xCHQy`}lrPfjdd>-7nZVZa$hs?P!IBX42Q>s!cJDK8ij^r~G$nS=Ez;&zv}z zOt_yIjR21}6dN8pVC1`o3EFFZF3{qJY3T4S+sOoKx`s?esDUY-gzJ8WM7>xA~I~0?awJtuA6?cP5)T`v9u=%d- zS~vCO&KAo?(19Bw@SU^p$M2?}qXhLH|E{r`8zD|JT|HDIdoq`De%iKtU<~HGu;ETD1P}Q515B0{KRT z`_~Uj3CS44B>5jB&i{@2+ZKf=qyIM$5mGXN2YDJJ0w|OIztSxM-hU>7=#CQsM9BWh z>x2}4B}RZ0&0k6kxf&M%AkqJY%n-u~M!+M-zo6_1e!w2*KL}>UfV@m#lKjs<(EquF zaDo2@B0xS(vIDx6|Is*k)PGZ#P7(p^)c#2#Q)m!rB?8FnBqP8}@HAArXJa%DpUL7X9hOiiN$QXC+vAf~^R5wPt50nP{l z&>bPJGe&@P=f4dh#KE2#f;P(tkoSPhMUp@$T<{?df9a0rKY9Ve_}hyKS(qgPh_-GS9>s(l%@F|zLjOrL^FjcW@PF_mnD}3B{X7xC zI_jTvHLn7|kA;XY*aEyD|CE^pDS&4RL_C85BKkuN;Fk^w`C$Qw&ibcdED8c5bN)i^ ze*=A6Bm#ux|D|k@jYR=~ThYG}RPsJRf)_9$hD$_%;gWw+=8`M`s^TyF2tin82k3V~ zD0@Fb4E{o!!M~98@4aF|CYFf+F(Z)UWov-R7(`{o3cxu5xfrJWPYy9@{^u!vo`8sq Y(BY{nz`_4V2mU=dv7n&FCjP_z4|RE|6951J delta 10348 zcmZ9SWl$YKx2|z_4esu+aSQJ59wfMX2r$7lA+T|RySqyW?zV9YZh?(!2;7|9bLxKQ z&it6?eb?↰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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 59b5f892..5eac8fd3 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions-snapshots/gradle-6.0-20191003083626+0000-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 83f2acfd..2fe81a7d 100755 --- a/gradlew +++ b/gradlew @@ -154,19 +154,19 @@ if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then else eval `echo args$i`="\"$arg\"" fi - i=$((i+1)) + i=`expr $i + 1` done case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; esac fi @@ -175,14 +175,9 @@ save () { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } -APP_ARGS=$(save "$@") +APP_ARGS=`save "$@"` # Collect all arguments for the java command, following the shell quoting and substitution rules eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - exec "$JAVACMD" "$@" diff --git a/swift/injected-plugins/buildSrc/build.gradle b/swift/injected-plugins/plugins/build.gradle similarity index 100% rename from swift/injected-plugins/buildSrc/build.gradle rename to swift/injected-plugins/plugins/build.gradle diff --git a/swift/injected-plugins/plugins/settings.gradle b/swift/injected-plugins/plugins/settings.gradle new file mode 100644 index 00000000..e69de29b diff --git a/swift/injected-plugins/buildSrc/src/main/groovy/org/gradle/swift/samples/CommonPlugin.groovy b/swift/injected-plugins/plugins/src/main/groovy/org/gradle/swift/samples/CommonPlugin.groovy similarity index 100% rename from swift/injected-plugins/buildSrc/src/main/groovy/org/gradle/swift/samples/CommonPlugin.groovy rename to swift/injected-plugins/plugins/src/main/groovy/org/gradle/swift/samples/CommonPlugin.groovy diff --git a/swift/injected-plugins/buildSrc/src/main/groovy/org/gradle/swift/samples/GenerateSource.groovy b/swift/injected-plugins/plugins/src/main/groovy/org/gradle/swift/samples/GenerateSource.groovy similarity index 100% rename from swift/injected-plugins/buildSrc/src/main/groovy/org/gradle/swift/samples/GenerateSource.groovy rename to swift/injected-plugins/plugins/src/main/groovy/org/gradle/swift/samples/GenerateSource.groovy diff --git a/swift/injected-plugins/buildSrc/src/main/groovy/org/gradle/swift/samples/ListBuildPlugin.groovy b/swift/injected-plugins/plugins/src/main/groovy/org/gradle/swift/samples/ListBuildPlugin.groovy similarity index 100% rename from swift/injected-plugins/buildSrc/src/main/groovy/org/gradle/swift/samples/ListBuildPlugin.groovy rename to swift/injected-plugins/plugins/src/main/groovy/org/gradle/swift/samples/ListBuildPlugin.groovy diff --git a/swift/injected-plugins/buildSrc/src/main/groovy/org/gradle/swift/samples/UtilitiesBuildPlugin.groovy b/swift/injected-plugins/plugins/src/main/groovy/org/gradle/swift/samples/UtilitiesBuildPlugin.groovy similarity index 100% rename from swift/injected-plugins/buildSrc/src/main/groovy/org/gradle/swift/samples/UtilitiesBuildPlugin.groovy rename to swift/injected-plugins/plugins/src/main/groovy/org/gradle/swift/samples/UtilitiesBuildPlugin.groovy diff --git a/swift/injected-plugins/settings.gradle b/swift/injected-plugins/settings.gradle index 569284a8..209aead8 100644 --- a/swift/injected-plugins/settings.gradle +++ b/swift/injected-plugins/settings.gradle @@ -1,5 +1,7 @@ rootProject.name = 'app' +includeBuild("plugins") + sourceControl { gitRepository("repos/utilities-library") { producesModule("org.gradle.swift-samples:utilities") From c7f758d4ded2e8af371bb228451464689e703de4 Mon Sep 17 00:00:00 2001 From: Sterling Greene Date: Thu, 3 Oct 2019 17:38:02 -0400 Subject: [PATCH 04/11] Remove use of deprecated/removed APIs --- .../org/gradle/samples/tasks/GenerateDummyCppSource.java | 2 +- cpp/provisionable-tool-chains/buildSrc/build.gradle | 6 +++--- .../buildSrc/build.gradle | 6 +++--- .../buildSrc/build.gradle | 6 +++--- swift/provisionable-tool-chains/buildSrc/build.gradle | 6 +++--- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/cpp/header-only-library/header-gradle-plugin/src/main/java/org/gradle/samples/tasks/GenerateDummyCppSource.java b/cpp/header-only-library/header-gradle-plugin/src/main/java/org/gradle/samples/tasks/GenerateDummyCppSource.java index 97b1987f..81626cc8 100644 --- a/cpp/header-only-library/header-gradle-plugin/src/main/java/org/gradle/samples/tasks/GenerateDummyCppSource.java +++ b/cpp/header-only-library/header-gradle-plugin/src/main/java/org/gradle/samples/tasks/GenerateDummyCppSource.java @@ -14,7 +14,7 @@ @CacheableTask public class GenerateDummyCppSource extends DefaultTask { private final Property symbolName = getProject().getObjects().property(String.class); - private final RegularFileProperty outputFile = newOutputFile(); + private final RegularFileProperty outputFile = getProject().getObjects().fileProperty(); @TaskAction private void doGenerate() throws IOException { diff --git a/cpp/provisionable-tool-chains/buildSrc/build.gradle b/cpp/provisionable-tool-chains/buildSrc/build.gradle index cb45f2b1..88844b30 100644 --- a/cpp/provisionable-tool-chains/buildSrc/build.gradle +++ b/cpp/provisionable-tool-chains/buildSrc/build.gradle @@ -28,7 +28,7 @@ class DownloadToolChainTask extends DefaultTask { final Property fromUrl = project.objects.property(URL) @OutputFile - final RegularFileProperty outputFile = newOutputFile() + final RegularFileProperty outputFile = project.objects.fileProperty() @TaskAction private void download() { @@ -38,13 +38,13 @@ class DownloadToolChainTask extends DefaultTask { class ExtractToolChainTask extends DefaultTask { @InputFile - final RegularFileProperty toolChainArchive = newInputFile() + final RegularFileProperty toolChainArchive = project.objects.fileProperty() // Currently cannot use the OutputDirectory annotation on directory containing symbolic links to non-existing files // See https://github.com/gradle/gradle/issues/4428 // Use a done file instead //@OutputDirectory - final DirectoryProperty toolChainLocation = newOutputDirectory() + final DirectoryProperty toolChainLocation = project.objects.directoryProperty() @OutputFile // See comment on toolChainLocation property final Provider doneFile = project.provider {new File(toolChainLocation.get().asFile.absolutePath + ".done")} diff --git a/samples-dev/src/templates/cpp-provisionable-tool-chains-build/buildSrc/build.gradle b/samples-dev/src/templates/cpp-provisionable-tool-chains-build/buildSrc/build.gradle index cb45f2b1..88844b30 100644 --- a/samples-dev/src/templates/cpp-provisionable-tool-chains-build/buildSrc/build.gradle +++ b/samples-dev/src/templates/cpp-provisionable-tool-chains-build/buildSrc/build.gradle @@ -28,7 +28,7 @@ class DownloadToolChainTask extends DefaultTask { final Property fromUrl = project.objects.property(URL) @OutputFile - final RegularFileProperty outputFile = newOutputFile() + final RegularFileProperty outputFile = project.objects.fileProperty() @TaskAction private void download() { @@ -38,13 +38,13 @@ class DownloadToolChainTask extends DefaultTask { class ExtractToolChainTask extends DefaultTask { @InputFile - final RegularFileProperty toolChainArchive = newInputFile() + final RegularFileProperty toolChainArchive = project.objects.fileProperty() // Currently cannot use the OutputDirectory annotation on directory containing symbolic links to non-existing files // See https://github.com/gradle/gradle/issues/4428 // Use a done file instead //@OutputDirectory - final DirectoryProperty toolChainLocation = newOutputDirectory() + final DirectoryProperty toolChainLocation = project.objects.directoryProperty() @OutputFile // See comment on toolChainLocation property final Provider doneFile = project.provider {new File(toolChainLocation.get().asFile.absolutePath + ".done")} diff --git a/samples-dev/src/templates/swift-provisionable-tool-chains-build/buildSrc/build.gradle b/samples-dev/src/templates/swift-provisionable-tool-chains-build/buildSrc/build.gradle index 543bca13..b0d4b9d0 100644 --- a/samples-dev/src/templates/swift-provisionable-tool-chains-build/buildSrc/build.gradle +++ b/samples-dev/src/templates/swift-provisionable-tool-chains-build/buildSrc/build.gradle @@ -28,7 +28,7 @@ class DownloadToolChainTask extends DefaultTask { final Property fromUrl = project.objects.property(URL) @OutputFile - final RegularFileProperty outputFile = newOutputFile() + final RegularFileProperty outputFile = project.objects.fileProperty() @TaskAction private void download() { @@ -38,13 +38,13 @@ class DownloadToolChainTask extends DefaultTask { class ExtractToolChainTask extends DefaultTask { @InputFile - final RegularFileProperty toolChainArchive = newInputFile() + final RegularFileProperty toolChainArchive = project.objects.fileProperty() // Currently cannot use the OutputDirectory annotation on directory containing symbolic links to non-existing files // See https://github.com/gradle/gradle/issues/4428 // Use a done file instead //@OutputDirectory - final DirectoryProperty toolChainLocation = newOutputDirectory() + final DirectoryProperty toolChainLocation = project.objects.directoryProperty() @OutputFile // See comment on toolChainLocation property final Provider doneFile = project.provider {new File(toolChainLocation.get().asFile.absolutePath + ".done")} diff --git a/swift/provisionable-tool-chains/buildSrc/build.gradle b/swift/provisionable-tool-chains/buildSrc/build.gradle index 543bca13..b0d4b9d0 100644 --- a/swift/provisionable-tool-chains/buildSrc/build.gradle +++ b/swift/provisionable-tool-chains/buildSrc/build.gradle @@ -28,7 +28,7 @@ class DownloadToolChainTask extends DefaultTask { final Property fromUrl = project.objects.property(URL) @OutputFile - final RegularFileProperty outputFile = newOutputFile() + final RegularFileProperty outputFile = project.objects.fileProperty() @TaskAction private void download() { @@ -38,13 +38,13 @@ class DownloadToolChainTask extends DefaultTask { class ExtractToolChainTask extends DefaultTask { @InputFile - final RegularFileProperty toolChainArchive = newInputFile() + final RegularFileProperty toolChainArchive = project.objects.fileProperty() // Currently cannot use the OutputDirectory annotation on directory containing symbolic links to non-existing files // See https://github.com/gradle/gradle/issues/4428 // Use a done file instead //@OutputDirectory - final DirectoryProperty toolChainLocation = newOutputDirectory() + final DirectoryProperty toolChainLocation = project.objects.directoryProperty() @OutputFile // See comment on toolChainLocation property final Provider doneFile = project.provider {new File(toolChainLocation.get().asFile.absolutePath + ".done")} From 7208cb829beafd5449bf4c641dc5ebea58a04dfc Mon Sep 17 00:00:00 2001 From: Sterling Greene Date: Thu, 3 Oct 2019 17:42:58 -0400 Subject: [PATCH 05/11] Use OutputDirectory instead of a done file --- cpp/provisionable-tool-chains/buildSrc/build.gradle | 11 +---------- .../buildSrc/build.gradle | 11 +---------- .../buildSrc/build.gradle | 13 +------------ .../provisionable-tool-chains/buildSrc/build.gradle | 13 +------------ 4 files changed, 4 insertions(+), 44 deletions(-) diff --git a/cpp/provisionable-tool-chains/buildSrc/build.gradle b/cpp/provisionable-tool-chains/buildSrc/build.gradle index 88844b30..8ca75c30 100644 --- a/cpp/provisionable-tool-chains/buildSrc/build.gradle +++ b/cpp/provisionable-tool-chains/buildSrc/build.gradle @@ -40,18 +40,11 @@ class ExtractToolChainTask extends DefaultTask { @InputFile final RegularFileProperty toolChainArchive = project.objects.fileProperty() - // Currently cannot use the OutputDirectory annotation on directory containing symbolic links to non-existing files - // See https://github.com/gradle/gradle/issues/4428 - // Use a done file instead - //@OutputDirectory + @OutputDirectory final DirectoryProperty toolChainLocation = project.objects.directoryProperty() - @OutputFile // See comment on toolChainLocation property - final Provider doneFile = project.provider {new File(toolChainLocation.get().asFile.absolutePath + ".done")} - @TaskAction private void extract() { - doneFile.get().delete() FileUtils.deleteDirectory(toolChainLocation.get().asFile) InputStream fileStream = Files.newInputStream(toolChainArchive.get().asFile.toPath()); @@ -85,8 +78,6 @@ class ExtractToolChainTask extends DefaultTask { } IOUtils.closeQuietly(tarStream) - - doneFile.get().createNewFile() } private InputStream createDecompressStream(InputStream inputStream) { diff --git a/samples-dev/src/templates/cpp-provisionable-tool-chains-build/buildSrc/build.gradle b/samples-dev/src/templates/cpp-provisionable-tool-chains-build/buildSrc/build.gradle index 88844b30..8ca75c30 100644 --- a/samples-dev/src/templates/cpp-provisionable-tool-chains-build/buildSrc/build.gradle +++ b/samples-dev/src/templates/cpp-provisionable-tool-chains-build/buildSrc/build.gradle @@ -40,18 +40,11 @@ class ExtractToolChainTask extends DefaultTask { @InputFile final RegularFileProperty toolChainArchive = project.objects.fileProperty() - // Currently cannot use the OutputDirectory annotation on directory containing symbolic links to non-existing files - // See https://github.com/gradle/gradle/issues/4428 - // Use a done file instead - //@OutputDirectory + @OutputDirectory final DirectoryProperty toolChainLocation = project.objects.directoryProperty() - @OutputFile // See comment on toolChainLocation property - final Provider doneFile = project.provider {new File(toolChainLocation.get().asFile.absolutePath + ".done")} - @TaskAction private void extract() { - doneFile.get().delete() FileUtils.deleteDirectory(toolChainLocation.get().asFile) InputStream fileStream = Files.newInputStream(toolChainArchive.get().asFile.toPath()); @@ -85,8 +78,6 @@ class ExtractToolChainTask extends DefaultTask { } IOUtils.closeQuietly(tarStream) - - doneFile.get().createNewFile() } private InputStream createDecompressStream(InputStream inputStream) { diff --git a/samples-dev/src/templates/swift-provisionable-tool-chains-build/buildSrc/build.gradle b/samples-dev/src/templates/swift-provisionable-tool-chains-build/buildSrc/build.gradle index b0d4b9d0..9ee37162 100644 --- a/samples-dev/src/templates/swift-provisionable-tool-chains-build/buildSrc/build.gradle +++ b/samples-dev/src/templates/swift-provisionable-tool-chains-build/buildSrc/build.gradle @@ -4,8 +4,6 @@ import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream import org.apache.commons.compress.compressors.xz.XZCompressorInputStream import org.apache.commons.compress.utils.IOUtils import org.apache.commons.io.FileUtils -import org.gradle.api.provider.Property -import org.gradle.api.provider.Provider import java.nio.file.Files import java.nio.file.Paths @@ -40,18 +38,11 @@ class ExtractToolChainTask extends DefaultTask { @InputFile final RegularFileProperty toolChainArchive = project.objects.fileProperty() - // Currently cannot use the OutputDirectory annotation on directory containing symbolic links to non-existing files - // See https://github.com/gradle/gradle/issues/4428 - // Use a done file instead - //@OutputDirectory + @OutputDirectory final DirectoryProperty toolChainLocation = project.objects.directoryProperty() - @OutputFile // See comment on toolChainLocation property - final Provider doneFile = project.provider {new File(toolChainLocation.get().asFile.absolutePath + ".done")} - @TaskAction private void extract() { - doneFile.get().delete() FileUtils.deleteDirectory(toolChainLocation.get().asFile) InputStream fileStream = Files.newInputStream(toolChainArchive.get().asFile.toPath()); @@ -85,8 +76,6 @@ class ExtractToolChainTask extends DefaultTask { } IOUtils.closeQuietly(tarStream) - - doneFile.get().createNewFile() } private InputStream createDecompressStream(InputStream inputStream) { diff --git a/swift/provisionable-tool-chains/buildSrc/build.gradle b/swift/provisionable-tool-chains/buildSrc/build.gradle index b0d4b9d0..9ee37162 100644 --- a/swift/provisionable-tool-chains/buildSrc/build.gradle +++ b/swift/provisionable-tool-chains/buildSrc/build.gradle @@ -4,8 +4,6 @@ import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream import org.apache.commons.compress.compressors.xz.XZCompressorInputStream import org.apache.commons.compress.utils.IOUtils import org.apache.commons.io.FileUtils -import org.gradle.api.provider.Property -import org.gradle.api.provider.Provider import java.nio.file.Files import java.nio.file.Paths @@ -40,18 +38,11 @@ class ExtractToolChainTask extends DefaultTask { @InputFile final RegularFileProperty toolChainArchive = project.objects.fileProperty() - // Currently cannot use the OutputDirectory annotation on directory containing symbolic links to non-existing files - // See https://github.com/gradle/gradle/issues/4428 - // Use a done file instead - //@OutputDirectory + @OutputDirectory final DirectoryProperty toolChainLocation = project.objects.directoryProperty() - @OutputFile // See comment on toolChainLocation property - final Provider doneFile = project.provider {new File(toolChainLocation.get().asFile.absolutePath + ".done")} - @TaskAction private void extract() { - doneFile.get().delete() FileUtils.deleteDirectory(toolChainLocation.get().asFile) InputStream fileStream = Files.newInputStream(toolChainArchive.get().asFile.toPath()); @@ -85,8 +76,6 @@ class ExtractToolChainTask extends DefaultTask { } IOUtils.closeQuietly(tarStream) - - doneFile.get().createNewFile() } private InputStream createDecompressStream(InputStream inputStream) { From 7e282b8f313146f9d81a56931e7d271add97b1bc Mon Sep 17 00:00:00 2001 From: Sterling Greene Date: Mon, 21 Oct 2019 19:33:25 -0400 Subject: [PATCH 06/11] Update to 6.0-rc-1 --- gradle/wrapper/gradle-wrapper.jar | Bin 56849 -> 58702 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 8849c475a9c5166c28b3bcab239d2300ed59a0f2..cc4fdc293d0e50b0ad9b65c16e7ddd1db2f6025b 100644 GIT binary patch delta 10893 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 delta 9152 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 5eac8fd3..041a7bf8 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions-snapshots/gradle-6.0-20191003083626+0000-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.0-rc-1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 00702a66324c97502dce4f846d8e1b9e1a4f6cbd Mon Sep 17 00:00:00 2001 From: Sterling Greene Date: Tue, 22 Oct 2019 00:11:22 -0400 Subject: [PATCH 07/11] Use GE plugin instead of build-scan plugin --- build-scan/buildScanUserData.gradle | 2 +- gradle/buildScanInit.gradle | 19 +++++++++++-------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/build-scan/buildScanUserData.gradle b/build-scan/buildScanUserData.gradle index 73233a69..c92d426d 100644 --- a/build-scan/buildScanUserData.gradle +++ b/build-scan/buildScanUserData.gradle @@ -1,5 +1,5 @@ rootProject { - pluginManager.withPlugin("com.gradle.build-scan") { + afterEvaluate { def buildScanExtension = extensions.getByName("buildScan") allprojects { project -> components.withType(ComponentWithNativeRuntime) { binary -> diff --git a/gradle/buildScanInit.gradle b/gradle/buildScanInit.gradle index 73425c2b..157e36ee 100644 --- a/gradle/buildScanInit.gradle +++ b/gradle/buildScanInit.gradle @@ -1,16 +1,19 @@ +import com.gradle.enterprise.gradleplugin.GradleEnterprisePlugin + initscript { + def pluginVersion = "3.0" + repositories { - maven { url "https://plugins.gradle.org/m2" } + gradlePluginPortal() } dependencies { - classpath "com.gradle:build-scan-plugin:2.3" + classpath("com.gradle:gradle-enterprise-gradle-plugin:${pluginVersion}") } } -if (!gradle.startParameter.systemPropertiesArgs.containsKey("disableScanPlugin")) { - rootProject { - apply plugin: com.gradle.scan.plugin.BuildScanPlugin - buildScan { - server = "https://e.grdev.net" - } + +apply from: "https://raw.githubusercontent.com/gradle/gradle/v6.0.0-RC1/gradle/init-scripts/build-scan.init.gradle.kts" +gradle.settingsEvaluated { + if (!it.pluginManager.hasPlugin("com.gradle.enterprise")) { + it.pluginManager.apply(GradleEnterprisePlugin) } } From be407da17c7ae9497d64cedd59598402e83d6733 Mon Sep 17 00:00:00 2001 From: Daniel Lacasse Date: Fri, 25 Oct 2019 18:39:10 +0300 Subject: [PATCH 08/11] Delete directories if not empty --- .../gradle/samples/plugins/generators/CleanSamplesTask.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/samples-dev/plugins/src/main/java/org/gradle/samples/plugins/generators/CleanSamplesTask.java b/samples-dev/plugins/src/main/java/org/gradle/samples/plugins/generators/CleanSamplesTask.java index 8801609c..1a9f3c91 100644 --- a/samples-dev/plugins/src/main/java/org/gradle/samples/plugins/generators/CleanSamplesTask.java +++ b/samples-dev/plugins/src/main/java/org/gradle/samples/plugins/generators/CleanSamplesTask.java @@ -60,7 +60,11 @@ private void cleanDir(File dir) { private void delete(File file) { getLogger().lifecycle("Cleaning " + file.getAbsolutePath()); try { - Files.delete(file.toPath()); + if (file.isDirectory()) { + FileUtils.deleteDirectory(file); + } else { + Files.delete(file.toPath()); + } } catch (IOException e) { throw new UncheckedIOException("Couldn't clean file '" + file.getAbsolutePath() + "'", e); } From f19422403fcdc1f1ff1a66065b1c50d80ff857dd Mon Sep 17 00:00:00 2001 From: Daniel Lacasse Date: Fri, 25 Oct 2019 18:26:31 +0300 Subject: [PATCH 09/11] Use latest released sample plugin --- build.gradle.kts | 4 ++-- settings.gradle.kts | 12 ------------ 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 042c8db9..26da8b86 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,7 +9,7 @@ import org.gradle.util.GUtil // This root project is simply a container of sample builds plugins { id("org.gradle.samples.wrapper") - id("org.gradle.samples") + id("org.gradle.samples") version "0.15.18" } tasks.withType().matching { it.name.contains("Sample") }.configureEach { @@ -79,7 +79,7 @@ commands: [{ sample.extensions.getByType(ExemplarExtension::class.java).source.from(generatorTask) } -samples.create("cpp-application") { +samples.create("cppApplication") { sampleDirectory.set(file("cpp/application")) withGroovyDsl { archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) diff --git a/settings.gradle.kts b/settings.gradle.kts index b4245d64..b3de9216 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,18 +1,6 @@ include("samples-dev") -includeBuild("/Users/daniel/gradle/guides/guides/subprojects/gradle-guides-plugin") includeBuild("samples-dev/plugins") includeBuild("samples-dev/src/templates/custom-publication-plugin") includeBuild("samples-dev/src/templates/build-wrapper-plugin") includeBuild("samples-dev/src/templates/release-plugin") - -pluginManagement { - resolutionStrategy { - eachPlugin { - if (requested.id.id.startsWith("org.gradle.samples.")) { - useModule("org.gradle.samples.plugins:plugins:1.0") - } - } - } -} - From db5f663f5a409b5653aac4691309a50362cfa2e0 Mon Sep 17 00:00:00 2001 From: Daniel Lacasse Date: Fri, 25 Oct 2019 18:27:17 +0300 Subject: [PATCH 10/11] Split README.md into README.adoc files --- c/application/README.adoc | 18 +++++++ cpp/autotools-library/README.adoc | 24 ++++++++++ cpp/binary-dependencies/README.adoc | 35 ++++++++++++++ cpp/cmake-library/README.adoc | 28 +++++++++++ cpp/cmake-source-dependencies/README.adoc | 27 +++++++++++ cpp/composite-build/README.adoc | 16 +++++++ cpp/dependency-on-upstream-branch/README.adoc | 42 ++++++++++++++++ cpp/header-only-library/README.adoc | 11 +++++ cpp/injected-plugins/README.adoc | 25 ++++++++++ cpp/library-with-tests/README.adoc | 12 +++++ cpp/multiple-target-machines/README.adoc | 16 +++++++ .../README.adoc | 18 +++++++ cpp/prebuilt-binaries/README.adoc | 24 ++++++++++ cpp/precompiled-headers/README.adoc | 16 +++++++ cpp/provisionable-tool-chains/README.adoc | 17 +++++++ cpp/publish-macros/README.adoc | 15 ++++++ cpp/simple-library/README.adoc | 26 ++++++++++ cpp/source-dependencies/README.adoc | 36 ++++++++++++++ cpp/source-generation/README.adoc | 15 ++++++ cpp/static-library/README.adoc | 13 +++++ cpp/swift-package-manager-publish/README.adoc | 22 +++++++++ cpp/swift-package-manager/README.adoc | 17 +++++++ cpp/transitive-dependencies/README.adoc | 29 +++++++++++ cpp/windows-resources/README.adoc | 18 +++++++ swift/application/README.adoc | 16 +++++++ swift/composite-build/README.adoc | 16 +++++++ swift/cpp-dependencies/README.adoc | 19 ++++++++ .../dependency-on-upstream-branch/README.adoc | 48 +++++++++++++++++++ swift/injected-plugins/README.adoc | 26 ++++++++++ swift/ios-application/README.adoc | 18 +++++++ swift/multiple-target-machines/README.adoc | 16 +++++++ .../README.adoc | 18 +++++++ swift/prebuilt-binaries/README.adoc | 24 ++++++++++ swift/provisionable-tool-chains/README.adoc | 17 +++++++ swift/simple-library/README.adoc | 24 ++++++++++ swift/source-dependencies/README.adoc | 38 +++++++++++++++ swift/source-generation/README.adoc | 15 ++++++ swift/static-library/README.adoc | 13 +++++ .../swift-package-manager-publish/README.adoc | 21 ++++++++ swift/swift-package-manager/README.adoc | 18 +++++++ swift/swift-versions/README.adoc | 44 +++++++++++++++++ swift/system-library-as-module/README.adoc | 14 ++++++ swift/transitive-dependencies/README.adoc | 21 ++++++++ 43 files changed, 946 insertions(+) create mode 100644 c/application/README.adoc create mode 100644 cpp/autotools-library/README.adoc create mode 100644 cpp/binary-dependencies/README.adoc create mode 100644 cpp/cmake-library/README.adoc create mode 100644 cpp/cmake-source-dependencies/README.adoc create mode 100644 cpp/composite-build/README.adoc create mode 100644 cpp/dependency-on-upstream-branch/README.adoc create mode 100644 cpp/header-only-library/README.adoc create mode 100644 cpp/injected-plugins/README.adoc create mode 100644 cpp/library-with-tests/README.adoc create mode 100644 cpp/multiple-target-machines/README.adoc create mode 100644 cpp/operating-system-specific-dependencies/README.adoc create mode 100644 cpp/prebuilt-binaries/README.adoc create mode 100644 cpp/precompiled-headers/README.adoc create mode 100644 cpp/provisionable-tool-chains/README.adoc create mode 100644 cpp/publish-macros/README.adoc create mode 100644 cpp/simple-library/README.adoc create mode 100644 cpp/source-dependencies/README.adoc create mode 100644 cpp/source-generation/README.adoc create mode 100644 cpp/static-library/README.adoc create mode 100644 cpp/swift-package-manager-publish/README.adoc create mode 100644 cpp/swift-package-manager/README.adoc create mode 100644 cpp/transitive-dependencies/README.adoc create mode 100644 cpp/windows-resources/README.adoc create mode 100644 swift/application/README.adoc create mode 100644 swift/composite-build/README.adoc create mode 100644 swift/cpp-dependencies/README.adoc create mode 100644 swift/dependency-on-upstream-branch/README.adoc create mode 100644 swift/injected-plugins/README.adoc create mode 100644 swift/ios-application/README.adoc create mode 100644 swift/multiple-target-machines/README.adoc create mode 100644 swift/operating-system-specific-dependencies/README.adoc create mode 100644 swift/prebuilt-binaries/README.adoc create mode 100644 swift/provisionable-tool-chains/README.adoc create mode 100644 swift/simple-library/README.adoc create mode 100644 swift/source-dependencies/README.adoc create mode 100644 swift/source-generation/README.adoc create mode 100644 swift/static-library/README.adoc create mode 100644 swift/swift-package-manager-publish/README.adoc create mode 100644 swift/swift-package-manager/README.adoc create mode 100644 swift/swift-versions/README.adoc create mode 100644 swift/system-library-as-module/README.adoc create mode 100644 swift/transitive-dependencies/README.adoc diff --git a/c/application/README.adoc b/c/application/README.adoc new file mode 100644 index 00000000..d6a0d29d --- /dev/null +++ b/c/application/README.adoc @@ -0,0 +1,18 @@ += Simple application (application) + +This sample shows how a simple C application can be built with Gradle. +The application has no dependencies and the build has minimal configuration. + +Although there is currently no out-of-the-box support for building applications and libraries from C, this sample shows how the C++ support can be configured to build a C application. + +To build and run the application: + +``` +> cd c/application +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./build/install/main/debug/app +Hello, World! +``` diff --git a/cpp/autotools-library/README.adoc b/cpp/autotools-library/README.adoc new file mode 100644 index 00000000..a3d4ed58 --- /dev/null +++ b/cpp/autotools-library/README.adoc @@ -0,0 +1,24 @@ += Libraries build with autotools (autotools-library) + +This sample demonstrates using Gradle's dependency management features to coordinate building libraries built by Autotools (i.e. `configure` and `make`). +The sample is composed of an application and a curl library. +The curl library is downloaded from the [Curl home page](https://curl.haxx.se/) and then built using the Autotools configuration provided with the library. +The application is built with Gradle, linking the curl library statically. +When run, the application uses curl to query a REST service to lookup the capital of Sweden and prints this to the console. + +To use the sample, create the Git repositories containing the libraries: + +``` +> cd cpp/autotools-library +> ./gradlew -p ../.. generateRepos +``` + +Now build the application: + +``` +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./app/build/install/main/debug/app +``` diff --git a/cpp/binary-dependencies/README.adoc b/cpp/binary-dependencies/README.adoc new file mode 100644 index 00000000..3d5be9f1 --- /dev/null +++ b/cpp/binary-dependencies/README.adoc @@ -0,0 +1,35 @@ += Application with prebuilt library dependencies in a Maven repository (binary-dependencies) + +This sample shows how to publish C++ libraries to a Maven repository and use them from another build. + +NOTE: This is currently not supported for Swift. + +To use the sample, first publish a library to the repository using the `simple-library` build: + +``` +> cd cpp/binary-dependencies +> ./gradlew -p ../simple-library publish + +BUILD SUCCESSFUL in 1s +``` + +You can find the repository in the `cpp/repo` directory. + +Next, build the application that uses the library from this repository. + +``` +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./build/install/main/debug/app +Hello, World! +``` + +The build is also configured to download the Google test binaries from a Maven repository to build and run the unit tests: + +``` +> ./gradlew test + +BUILD SUCCESSFUL in 1s +``` diff --git a/cpp/cmake-library/README.adoc b/cpp/cmake-library/README.adoc new file mode 100644 index 00000000..65775f88 --- /dev/null +++ b/cpp/cmake-library/README.adoc @@ -0,0 +1,28 @@ += Application uses a library built by CMake (cmake-library) + +This sample demonstrates integrating a library that is built by CMake into a Gradle build. +The sample is structured as a multi-project build. +There are two projects, 'app' and 'utilities', which are built by Gradle. Both of these depend on a library 'list' that is built using CMake. +The 'list' library has a Gradle project that wraps the CMake build and exposes its outputs in a way that other Gradle builds can consume. + +The sample packages the CMake integration logic as a 'cmake-library' plugin and applies the plugin to the 'library' project as a source dependency. + +To use the sample, first create the Git repository containing the sample plugin: + +``` +> cd cpp/cmake-library +> ./gradlew -p ../.. generateRepos +``` + +Now build the application: + +``` +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./app/build/install/main/debug/app +Hello, World! +``` + +This generates the CMake build for the 'list' library, if required, and builds the libraries and application. diff --git a/cpp/cmake-source-dependencies/README.adoc b/cpp/cmake-source-dependencies/README.adoc new file mode 100644 index 00000000..d34b914b --- /dev/null +++ b/cpp/cmake-source-dependencies/README.adoc @@ -0,0 +1,27 @@ += Application and libraries built by CMake (cmake-source-dependencies) + +This sample demonstrates using Gradle's dependency management features to coordinate building an application and libraries built by CMake. +The sample is composed of an application and two libraries. +Each of these is hosted in a separate Git repository and connected together using source dependencies. + +The sample packages the CMake integration logic as a 'cmake-application' and 'cmake-library' plugin and applies these to the different builds. + +To use the sample, first create the Git repository containing the sample plugin: + +``` +> cd cpp/cmake-source-dependencies/app +> ./gradlew -p ../../.. generateRepos +``` + +Now build the application: + +``` +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./build/debug/app +Hello, World! +``` + +This generates the CMake builds for each of the libraries and the application, then builds and links the libraries and applications. diff --git a/cpp/composite-build/README.adoc b/cpp/composite-build/README.adoc new file mode 100644 index 00000000..85f7c507 --- /dev/null +++ b/cpp/composite-build/README.adoc @@ -0,0 +1,16 @@ += Application with library dependencies in a composite build (composite-build) + +This sample shows how several otherwise independent C++ libraries can be built together with Gradle. +The sample is structured as separate builds for each of the libraries and a composite build that includes these. + +To build and run the application: + +``` +> cd cpp/composite-build +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./build/install/main/debug/app +Hello, World! +``` diff --git a/cpp/dependency-on-upstream-branch/README.adoc b/cpp/dependency-on-upstream-branch/README.adoc new file mode 100644 index 00000000..b568fa29 --- /dev/null +++ b/cpp/dependency-on-upstream-branch/README.adoc @@ -0,0 +1,42 @@ +## Application with dependency on upstream branch (dependency-on-upstream-branch) + +This sample shows how a source dependency on a particular branch can be used. + +To use this sample, create the Git repositories containing the libraries: + +``` +> cd cpp/dependency-on-upstream-branch/app +> ./gradlew -p ../../.. generateRepos +``` + +Build and run the application: + +``` +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./build/install/main/debug/app +World! +``` + +Edit the source of the utilities library to fix the bug: + +``` +> cd repos/utilities-library +> git checkout release +> edit src/main/cpp/join.cpp # follow the instructions to fix the bug in function join() +> git commit -a -m 'fixed bug' +``` + +Now build the application: + +``` +> cd ../.. +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./build/install/main/debug/app +Hello, World! +``` diff --git a/cpp/header-only-library/README.adoc b/cpp/header-only-library/README.adoc new file mode 100644 index 00000000..3d75d87e --- /dev/null +++ b/cpp/header-only-library/README.adoc @@ -0,0 +1,11 @@ += Header-only libraries (header-only-library) + +This sample demonstrates header-only libraries. + +To use the sample, run the tests from the command line: + +``` +> cd cpp/header-only-library +> ./gradlew assemble +> ./gradlew test +``` diff --git a/cpp/injected-plugins/README.adoc b/cpp/injected-plugins/README.adoc new file mode 100644 index 00000000..35e4d989 --- /dev/null +++ b/cpp/injected-plugins/README.adoc @@ -0,0 +1,25 @@ += Application uses libraries that are not built by Gradle (injected-plugins) + +Gradle can also consume source dependencies that come from repositories without Gradle builds. +When declaring a source dependency's repository information, you can instruct Gradle to inject plugins into the source dependency. +These plugins can configure a Gradle build based on the contents of the repository. + +To use the sample, create the Git repositories containing the libraries: + +``` +> cd cpp/injected-plugins +> ./gradlew -p ../.. generateRepos +``` + +Now build the application: + +``` +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./build/install/main/debug/app +Hello, World! +``` + +In the "repos" directory, you can find the source code without any Gradle configuration. The `utilities` and `list` builds are configured with the `utilities-build` and `list-build` plugins. diff --git a/cpp/library-with-tests/README.adoc b/cpp/library-with-tests/README.adoc new file mode 100644 index 00000000..694ff173 --- /dev/null +++ b/cpp/library-with-tests/README.adoc @@ -0,0 +1,12 @@ +== Libraries with tests (library-with-tests) + +This sample demonstrates some basic Google test support in Gradle, building the GoogleTest library from source. + +To run the tests from the command line: + +``` +> cd cpp/library-with-tests +> ./gradlew -p ../.. generateRepos +> ./gradlew assemble +> ./gradlew test +``` diff --git a/cpp/multiple-target-machines/README.adoc b/cpp/multiple-target-machines/README.adoc new file mode 100644 index 00000000..931e404a --- /dev/null +++ b/cpp/multiple-target-machines/README.adoc @@ -0,0 +1,16 @@ += Targeting multiple machines (multiple-target-machines) + +This sample shows how a simple C++ application can target multiple machines with Gradle. +The application has no dependencies and the build has minimal configuration. + +To build and run the application for the target machine of the same type as the current host: + +``` +> cd cpp/multiple-target-machines +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./build/install/main/debug/app +Hello, World! +``` diff --git a/cpp/operating-system-specific-dependencies/README.adoc b/cpp/operating-system-specific-dependencies/README.adoc new file mode 100644 index 00000000..d883ffca --- /dev/null +++ b/cpp/operating-system-specific-dependencies/README.adoc @@ -0,0 +1,18 @@ += Application with operating system specific library dependencies (operating-system-specific-dependencies) + +This sample demonstrates an application that has dependencies on different libraries for each operating system. +Currently, there are no conveniences for using libraries that are installed on the build machine. + +``` +> cd cpp/operating-system-specific-dependencies +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./app/build/install/main/debug/app +Hello, World! +``` + +The application selects the 'ansiConsole' library on macOS and Linux and the 'winConsole' library when built on Windows. +The output is blue on macOS and green on Linux and Windows. +Each console library is configured to only build on specific operating systems, while the application is configured to build on all operating systems (Windows, Linux, macOS). diff --git a/cpp/prebuilt-binaries/README.adoc b/cpp/prebuilt-binaries/README.adoc new file mode 100644 index 00000000..f152b7a0 --- /dev/null +++ b/cpp/prebuilt-binaries/README.adoc @@ -0,0 +1,24 @@ += Application with prebuilt library dependencies (prebuilt-binaries) + +This sample shows how to use pre-built binaries that are already available on the local machine. +Currently, Gradle does not offer a convenient way to do this but it is possible to configure Gradle to use these binaries. + +To use the sample, first create the binaries using the `simple-library` build: + +``` +> cd cpp/prebuilt-binaries +> ./gradlew -p ../simple-library assembleDebug assembleRelease + +BUILD SUCCESSFUL in 1s +``` + +Next, build and run the application that uses these binaries: + +``` +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./build/install/main/debug/app +Hello, World! +``` diff --git a/cpp/precompiled-headers/README.adoc b/cpp/precompiled-headers/README.adoc new file mode 100644 index 00000000..6f9de0f7 --- /dev/null +++ b/cpp/precompiled-headers/README.adoc @@ -0,0 +1,16 @@ += Application with precompiled headers (precompiled-headers) + +This sample shows how Gradle is able to compile code using precompiled headers. +This sample applies the `'cpp-application'` plugin. + +To build and run the application: + +``` +> cd cpp/precompiled-headers +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./build/exe/main/debug/app +Hello, World! +``` diff --git a/cpp/provisionable-tool-chains/README.adoc b/cpp/provisionable-tool-chains/README.adoc new file mode 100644 index 00000000..3d921067 --- /dev/null +++ b/cpp/provisionable-tool-chains/README.adoc @@ -0,0 +1,17 @@ += Provisioning tool chains from within Gradle (provisionable-tool-chains) + +This sample shows how to provision tool chains used by a Gradle build instead of the system tool chains. +Please note the sample doesn't provision any tool chain for Windows yet. +The sample can only provision tool chain at configuration. +We use the `buildSrc` included build to use tasks for the provisioning. + +This sample demonstrates a Clang tool chain provisioning under macOS and Linux. + +``` +> cd cpp/provisionable-tool-chains +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./build/install/main/debug/app +``` diff --git a/cpp/publish-macros/README.adoc b/cpp/publish-macros/README.adoc new file mode 100644 index 00000000..5baf6a86 --- /dev/null +++ b/cpp/publish-macros/README.adoc @@ -0,0 +1,15 @@ += Publishing macros for transitive consumption by downstream projects (publish-macros) + +This sample demonstrates how to publish macros to downstream projects. + +To build and run the application: + +``` +> cd cpp/publish-macros +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./app/build/install/main/debug/app +Hello, World! +``` diff --git a/cpp/simple-library/README.adoc b/cpp/simple-library/README.adoc new file mode 100644 index 00000000..3581ef51 --- /dev/null +++ b/cpp/simple-library/README.adoc @@ -0,0 +1,26 @@ += Simple Library (simple-library) + +This sample shows how a C++ library can be built with Gradle. +The library has no dependencies. +The build is configured to add unit tests. +The C++ sample also adds binary publishing to a Maven repository. + +To build the library: + +``` +> cd cpp/simple-library +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> find build/lib/main/debug +build/lib/main/debug/liblist.dylib +``` + +To run the unit tests for the library: + +``` +> ./gradlew test + +BUILD SUCCESSFUL in 1s +``` diff --git a/cpp/source-dependencies/README.adoc b/cpp/source-dependencies/README.adoc new file mode 100644 index 00000000..06fbe441 --- /dev/null +++ b/cpp/source-dependencies/README.adoc @@ -0,0 +1,36 @@ += Application with source library dependencies (source-dependencies) + +This sample demonstrates using external source dependencies to build C++ applications that require two libraries. +The source for the libraries are hosted in separate Git repositories and declared as 'source dependencies' of the application. +When Gradle builds the application, it first checks out a revision of the library source and uses this to build the binaries for the library. + +The Git repositories to use are declared in the build's `settings.gradle` and then the libraries are referenced in the same way as binary dependencies in the build files. + +To use this sample, build and run the application: + +``` +> cd cpp/source-dependencies +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./build/install/main/debug/app +World! +``` + +This will clone version `1.0` of the Git repository at `https://github.com/gradle/native-samples-cpp-library` and build the library binaries. + +The application output is incorrect because of a bug in the utilities library. + +Update the application to use a new version that contains a fix: + +``` +> cd ../.. +> edit build.gradle # change dependency on org.gradle.cpp-samples:utilities:1.0 to org.gradle.cpp-samples:utilities:1.1 +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./build/install/main/debug/app +Hello, World! +``` diff --git a/cpp/source-generation/README.adoc b/cpp/source-generation/README.adoc new file mode 100644 index 00000000..87551b87 --- /dev/null +++ b/cpp/source-generation/README.adoc @@ -0,0 +1,15 @@ += Source generation (source-generation) + +This sample demonstrates using a task to generate source code before building a C++ application. + +``` +> cd cpp/source-generation +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./build/install/main/debug/app +Hello, World! +``` + +Generated sources will be under `build/generated`. diff --git a/cpp/static-library/README.adoc b/cpp/static-library/README.adoc new file mode 100644 index 00000000..ec44d9b9 --- /dev/null +++ b/cpp/static-library/README.adoc @@ -0,0 +1,13 @@ += Application with static library dependencies (static-library) + +This sample demonstrates building and using static libraries. + +``` +> cd cpp/static-library +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./app/build/install/main/debug/app +Hello, World! +``` diff --git a/cpp/swift-package-manager-publish/README.adoc b/cpp/swift-package-manager-publish/README.adoc new file mode 100644 index 00000000..7c9005d1 --- /dev/null +++ b/cpp/swift-package-manager-publish/README.adoc @@ -0,0 +1,22 @@ += Using Gradle builds from Swift Package Manager (swift-package-manager-publish) + +This sample shows how libraries built with Gradle can be used by projects that are built with Swift Package Manager, without having to maintain separate Gradle and Swift PM build for the library. + +The sample is made up of an application built using Swift PM, and two libraries that are built using Gradle. +The sample also includes a 'release' plugin that takes care of generating a Swift PM build from a Gradle build. + +``` +> ./gradlew generateRepos +> cd cpp/swift-package-manager-publish/list-library +> ./gradlew build release + +BUILD SUCCESSFUL in 1s + +> cd ../utilities-library +> ./gradlew build release + +BUILD SUCCESSFUL in 1s + +> cd ../app +> swift build +``` diff --git a/cpp/swift-package-manager/README.adoc b/cpp/swift-package-manager/README.adoc new file mode 100644 index 00000000..a983b4d8 --- /dev/null +++ b/cpp/swift-package-manager/README.adoc @@ -0,0 +1,17 @@ += Application with Swift package manager conventions (swift-package-manager) + +This sample shows how to configure Gradle to use a source layout that is different to its conventions. +In this case, the sample uses the typical layout for a Swift Package Manager package. +It contains an application and a single library. The source files for the application and libraries are all under a single `Sources` directory. + +This sample also includes a Swift Package Manager build file, so the same source can be built using Swift Package Manager + +``` +> cd cpp/swift-package-manager +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./build/app/install/main/debug/app +Hello, World! +``` diff --git a/cpp/transitive-dependencies/README.adoc b/cpp/transitive-dependencies/README.adoc new file mode 100644 index 00000000..ba2a3da6 --- /dev/null +++ b/cpp/transitive-dependencies/README.adoc @@ -0,0 +1,29 @@ +## Application with library dependencies in a single build (transitive-dependencies) + +This sample shows how a C++ application and several libraries can be built with Gradle and linked together. +The sample is structured as a multi-project build, with the application and each library as separate projects in this build. +Dependencies are added using project dependencies. + +In this sample, the application and libraries all use the same implementation language. + +NOTE: Mixing C++ and Swift is shown in another sample below. + +To build and run the application: + +``` +> cd cpp/transitive-dependencies +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./app/build/install/main/debug/app +Hello, World! +``` + +The build script also demonstrates how to configure convenience tasks like `assembleDebuggable`, which will assemble all "debuggable" binaries. + +``` +> ./gradlew assembleDebuggable + +BUILD SUCCESSFUL in 1s +``` diff --git a/cpp/windows-resources/README.adoc b/cpp/windows-resources/README.adoc new file mode 100644 index 00000000..68a005a7 --- /dev/null +++ b/cpp/windows-resources/README.adoc @@ -0,0 +1,18 @@ += Application with Windows Resources (windows-resources) + +This sample shows how Gradle is able to compile Windows Resources (`rc`) files and link them into a native binary. +This sample applies the `'cpp-application'` plugin. +This sample requires you have VisualCpp toolchain installed + +To build and run the application: +(Note the application only runs and build on Windows) + +``` +> cd cpp/windows-resources +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./build/exe/main/debug/app.exe +Hello, World! +``` diff --git a/swift/application/README.adoc b/swift/application/README.adoc new file mode 100644 index 00000000..43837080 --- /dev/null +++ b/swift/application/README.adoc @@ -0,0 +1,16 @@ += Simple application (application) + +This sample shows how a simple Swift application can be built with Gradle. +The application has no dependencies and the build has minimal configuration. + +To build and run the application: + +``` +> cd swift/application +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./build/install/main/debug/App +Hello, World! +``` diff --git a/swift/composite-build/README.adoc b/swift/composite-build/README.adoc new file mode 100644 index 00000000..f66125c9 --- /dev/null +++ b/swift/composite-build/README.adoc @@ -0,0 +1,16 @@ += Application with library dependencies in a composite build (composite-build) + +This sample shows how several otherwise independent Swift libraries can be built together with Gradle. +The sample is structured as separate builds for each of the libraries and a composite build that includes these. + +To build and run the application: + +``` +> cd swift/composite-build +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./build/install/main/debug/App +Hello, World! +``` diff --git a/swift/cpp-dependencies/README.adoc b/swift/cpp-dependencies/README.adoc new file mode 100644 index 00000000..26352cd5 --- /dev/null +++ b/swift/cpp-dependencies/README.adoc @@ -0,0 +1,19 @@ += Swift application with C++ library dependencies (cpp-dependencies) + +This sample demonstrates using a C++ library from Swift. + +``` +> cd swift/cpp-dependencies +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./app/build/install/main/debug/app +Hello, World! +``` + +There are three projects in this sample: a shared C++ library (`:list`), a static C++ library (`:listStatic`), and a swift application with a dependency on the shared C++ library (`:app`). + +By default, when building the application, only the shared library will be built and used. +To change the application to use the static library instead, change the dependency in [app/build.gradle](swift/cpp-dependencies/app/build.gradle#L9) to depend on the `:listStatic` project instead of `:list`. +You'll also need to change [app/src/main/swift/LinkedList.swift](swift/cpp-dependencies/app/src/main/swift/LinkedList.swift#L4) to import the "listStatic" module (rather than the "list" module). \ No newline at end of file diff --git a/swift/dependency-on-upstream-branch/README.adoc b/swift/dependency-on-upstream-branch/README.adoc new file mode 100644 index 00000000..961d5caa --- /dev/null +++ b/swift/dependency-on-upstream-branch/README.adoc @@ -0,0 +1,48 @@ += Application with dependency on upstream branch (dependency-on-upstream-branch) + +This sample shows how a source dependency on a particular branch can be used. + +To use this sample, create the Git repositories containing the libraries: + +``` +> cd swift/dependency-on-upstream-branch/app +> ./gradlew -p ../../.. generateRepos +``` + +Now you can build and run the application: + +``` +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./build/install/main/debug/App +World! +``` + +You can see the application's output is incorrect. +The build is configured to use the most recent changes from the 'release' branch of the utilities library and this branch contains a bug. +Let's fix this. + +Edit the source of the utilities library to fix the bug: + +``` +> cd repos/utilities-library +> git checkout release +> edit src/main/swift/Util.swift # follow the instructions to fix the bug in function join() +> git commit -a -m 'fixed bug' +``` + +There's no need to create a tag, as Gradle will take care of checking out the new branch tip. + +Now build and run the application: + +``` +> cd ../.. +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./build/install/main/debug/App +Hello, World! +``` diff --git a/swift/injected-plugins/README.adoc b/swift/injected-plugins/README.adoc new file mode 100644 index 00000000..3eec0502 --- /dev/null +++ b/swift/injected-plugins/README.adoc @@ -0,0 +1,26 @@ += Application uses libraries that are not built by Gradle (injected-plugins) + +Gradle can also consume source dependencies that come from repositories without Gradle builds. +When declaring a source dependency's repository information, you can instruct Gradle to inject plugins into the source dependency. +These plugins can configure a Gradle build based on the contents of the repository. + +To use the sample, create the Git repositories containing the libraries: + +``` +> cd swift/injected-plugins +> ./gradlew -p ../.. generateRepos +``` + +Now build the application: + +``` +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./build/install/main/debug/App +Hello, from Gradle build +Hello, World! +``` + +In the "repos" directory, you can find the source code without any Gradle configuration. The `utilities` and `list` builds are configured with the `utilities-build` and `list-build` plugins. diff --git a/swift/ios-application/README.adoc b/swift/ios-application/README.adoc new file mode 100644 index 00000000..5cf0ae25 --- /dev/null +++ b/swift/ios-application/README.adoc @@ -0,0 +1,18 @@ += iOS Application (ios-application) + +This sample demonstrates a iOS 11.2 application build for the iPhone simulator, allowing editing of the iOS specific files inside Xcode. + +To use the sample, build the application: + +``` +> cd swift/ios-application +> ./gradlew assemble +``` + +Now install the application into an iOS simulator running iOS 11.2 by drag and dropping the app into a running simulator. + +Finally, you can develop the application using Xcode IDE to edit the storyboard and asset catalog. Note that the sample doesn't allow running the iOS application from the IDE. + +``` +> ./gradlew openXcode +``` diff --git a/swift/multiple-target-machines/README.adoc b/swift/multiple-target-machines/README.adoc new file mode 100644 index 00000000..5585e6a2 --- /dev/null +++ b/swift/multiple-target-machines/README.adoc @@ -0,0 +1,16 @@ += Targeting multiple machines (multiple-target-machines) + +This sample shows how a simple Swift application can target multiple machines with Gradle. +The application has no dependencies and the build has minimal configuration. + +To build and run the application for the target machine of the same type as the current host: + +``` +> cd swift/multiple-target-machines +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./build/install/main/debug/App +Hello, World! +``` diff --git a/swift/operating-system-specific-dependencies/README.adoc b/swift/operating-system-specific-dependencies/README.adoc new file mode 100644 index 00000000..ce1c104a --- /dev/null +++ b/swift/operating-system-specific-dependencies/README.adoc @@ -0,0 +1,18 @@ += Application with operating system specific library dependencies (operating-system-specific-dependencies) + +This sample demonstrates an application that has dependencies on different libraries for each operating system. +Currently, there are no conveniences for using libraries that are installed on the build machine. + +``` +> cd swift/operating-system-specific-dependencies +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> app/build/install/main/debug/App +Hello, World! +``` + +The application selects the 'MacOsConsole' library that prints the output in blue when building on macOS. +On Linux, it selects the 'LinuxConsole' library that prints the output in green. +Each console library is configured to only build on specific operating systems. diff --git a/swift/prebuilt-binaries/README.adoc b/swift/prebuilt-binaries/README.adoc new file mode 100644 index 00000000..64b5c6f2 --- /dev/null +++ b/swift/prebuilt-binaries/README.adoc @@ -0,0 +1,24 @@ += Application with prebuilt library dependencies (prebuilt-binaries) + +This sample shows how to use pre-built binaries that are already available on the local machine. +Currently, Gradle does not offer a convenient way to do this but it is possible to configure Gradle to use these binaries. + +To use the sample, first create the binaries using the `simple-library` build: + +``` +> cd swift/prebuilt-binaries +> ./gradlew -p ../simple-library assembleDebug assembleRelease + +BUILD SUCCESSFUL in 1s +``` + +Next, build and run the application that uses these binaries: + +``` +> ./gradlew assemble + +BUILD SUCCESSFUL in 0s + +> ./build/install/main/debug/App +Hello, World! +``` diff --git a/swift/provisionable-tool-chains/README.adoc b/swift/provisionable-tool-chains/README.adoc new file mode 100644 index 00000000..41fae7e1 --- /dev/null +++ b/swift/provisionable-tool-chains/README.adoc @@ -0,0 +1,17 @@ += Provisioning tool chains from within Gradle (provisionable-tool-chains) + +This sample shows how to provision tool chains used by a Gradle build instead of the system tool chains. +Please note the sample doesn't provision any tool chain for Windows yet. +The sample can only provision tool chain at configuration. +We use the `buildSrc` included build to use tasks for the provisioning. + +This sample demonstrates a Swift tool chain provisioning under Linux. + +``` +> cd swift/provisionable-tool-chains +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./build/install/main/debug/App +``` diff --git a/swift/simple-library/README.adoc b/swift/simple-library/README.adoc new file mode 100644 index 00000000..86f43861 --- /dev/null +++ b/swift/simple-library/README.adoc @@ -0,0 +1,24 @@ += Simple Library (simple-library) + +This sample shows how a Swift library can be built with Gradle. +The library has no dependencies. +The build is configured to add unit tests. + +To build the library: + +``` +> cd swift/simple-library +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> find build/lib/main/debug +build/lib/main/debug/libList.dylib +``` + +To run the unit tests for the library: + +``` +> ./gradlew test +> open build/reports/tests/xcTest/index.html +``` diff --git a/swift/source-dependencies/README.adoc b/swift/source-dependencies/README.adoc new file mode 100644 index 00000000..174a6cfb --- /dev/null +++ b/swift/source-dependencies/README.adoc @@ -0,0 +1,38 @@ +## Application with source library dependencies (source-dependencies) + +This sample demonstrates using external source dependencies to build Swift applications that require two libraries. +The source for the libraries are hosted in separate Git repositories and declared as 'source dependencies' of the application. +When Gradle builds the application, it first checks out a revision of the library source and uses this to build the binaries for the library. + +The Git repositories to use are declared in the build's `settings.gradle` and then the libraries are referenced in the same way as binary dependencies in the build files. + +To use this sample, build and run the application: + +``` +> cd swift/source-dependencies +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./build/install/main/debug/App +World! +``` + +This will clone version `1.0` of the Git repository at `https://github.com/gradle/native-samples-swift-library` and build the library binaries. + +You can see the application's output is incorrect. The build is configured to use version `1.0` of the utilities library from this repository and this version contains a bug. Let's fix this. + +Version `1.1` of the library contains a bug fix. Update the application to use the new version: + +``` +> cd ../.. +> edit build.gradle # change dependency on org.gradle.swift-samples:utilities:1.0 to org.gradle.swift-samples:utilities:1.1 +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./build/install/main/debug/App +Hello, World! +``` + +Dynamic dependencies are also supported, so you could also use `1.+`, `[1.1,2.0]` or `latest.release`. Gradle matches the tags of the Git repository to determine which Git revision to use. Branches are also supported, but use a different syntax. See the following sample. diff --git a/swift/source-generation/README.adoc b/swift/source-generation/README.adoc new file mode 100644 index 00000000..5706984a --- /dev/null +++ b/swift/source-generation/README.adoc @@ -0,0 +1,15 @@ += Source generation (source-generation) + +This sample demonstrates using a task to generate source code before building a Swift application. + +``` +> cd swift/source-generation +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./build/install/main/debug/App +Hello, World! +``` + +Generated sources will be under `build/generated`. diff --git a/swift/static-library/README.adoc b/swift/static-library/README.adoc new file mode 100644 index 00000000..ef55a574 --- /dev/null +++ b/swift/static-library/README.adoc @@ -0,0 +1,13 @@ += Application with static library dependencies (static-library) + +This sample demonstrates building and using static libraries. + +``` +> cd swift/static-library +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./app/build/install/main/debug/App +Hello, World! +``` diff --git a/swift/swift-package-manager-publish/README.adoc b/swift/swift-package-manager-publish/README.adoc new file mode 100644 index 00000000..9456a413 --- /dev/null +++ b/swift/swift-package-manager-publish/README.adoc @@ -0,0 +1,21 @@ += Using Gradle builds from Swift Package Manager (swift-package-manager-publish) + +This sample shows how libraries built with Gradle can be used by projects that are built with Swift Package Manager, without having to maintain separate Gradle and Swift PM build for the library. + +The sample is made up of an application built using Swift PM, and two libraries that are built using Gradle. The sample also includes a 'release' plugin that takes care of generating a Swift PM build from a Gradle build. + +``` +> ./gradlew generateRepos +> cd cpp/swift-package-manager-publish/list-library +> ./gradlew build release + +BUILD SUCCESSFUL in 1s + +> cd ../utilities-library +> ./gradlew build release + +BUILD SUCCESSFUL in 1s + +> cd ../app +> swift build +``` diff --git a/swift/swift-package-manager/README.adoc b/swift/swift-package-manager/README.adoc new file mode 100644 index 00000000..6447a8f0 --- /dev/null +++ b/swift/swift-package-manager/README.adoc @@ -0,0 +1,18 @@ += Application with Swift package manager conventions (swift-package-manager) + +This sample shows how to configure Gradle to use a source layout that is different to its conventions. +In this case, the sample uses the typical layout for a Swift Package Manager package. +It contains an application and a single library. +The source files for the application and libraries are all under a single `Sources` directory. + +This sample also includes a Swift Package Manager build file, so the same source can be built using Swift Package Manager + +``` +> cd swift/swift-package-manager +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./build/app/install/main/debug/App +Hello, World! +``` diff --git a/swift/swift-versions/README.adoc b/swift/swift-versions/README.adoc new file mode 100644 index 00000000..a117474a --- /dev/null +++ b/swift/swift-versions/README.adoc @@ -0,0 +1,44 @@ += Supporting multiple Swift versions (swift-versions) + +This sample demonstrates using multiple versions of Swift in a single build. +There are two projects that build identical applications. +One is written in Swift 3 compatible code (`swift3-app`) and one is written with Swift 4 compatible code (`swift4-app`). +When running the application, it will print a message about which version of Swift was used. + +== Swift 4 + +If you have the Swift 4 compiler installed, you can build both applications: + +``` +# NOTE: Needs Swift 4 tool chain +> cd swift/swift-versions +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./swift4-app/build/install/main/debug/App +Built for Swift 4 +Hello, World! +> ./swift3-app/build/install/main/debug/App +Built for Swift 3 +Hello, World! +``` + +By default, the tests for a given Swift production component will be compiled for the same version of Swift. For instance, in `swift3-app`, the production and test code will be built with Swift 3 source compatibility. + +== Swift 3 + +If you have the Swift 3 compiler installed, you can only build the Swift 3 application. Attempting to build the Swift 4 application will fail. + +``` +> cd swift/swift-versions +> ./gradlew swift3-app:assemble + +BUILD SUCCESSFUL in 1s + +> ./swift3-app/build/install/main/debug/app +Built for Swift 3 +Hello, World! +``` + +Currently, Gradle does not offer a convenience to ignore projects that are not buildable due to missing or incompatible tool chains. diff --git a/swift/system-library-as-module/README.adoc b/swift/system-library-as-module/README.adoc new file mode 100644 index 00000000..02f35835 --- /dev/null +++ b/swift/system-library-as-module/README.adoc @@ -0,0 +1,14 @@ += Using a module for a system library with Swift (system-library-as-module) + +Existing system libraries can be wrapped in user defined `module.modulemap` files. + +This sample demonstrates a Swift application that uses libcurl to fetch `example.com`. + +``` +> cd swift/system-library-as-module +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./build/install/main/debug/App +``` diff --git a/swift/transitive-dependencies/README.adoc b/swift/transitive-dependencies/README.adoc new file mode 100644 index 00000000..35cafa4f --- /dev/null +++ b/swift/transitive-dependencies/README.adoc @@ -0,0 +1,21 @@ += Application with library dependencies in a single build (transitive-dependencies) + +This sample shows how a Swift application and several libraries can be built with Gradle and linked together. +The sample is structured as a multi-project build, with the application and each library as separate projects in this build. +Dependencies are added using project dependencies. + +In this sample, the application and libraries all use the same implementation language. + +NOTE: Mixing C++ and Swift is shown in another sample below. + +To build and run the application: + +``` +> cd swift/transitive-dependencies +> ./gradlew assemble + +BUILD SUCCESSFUL in 1s + +> ./app/build/install/main/debug/App +Hello, World! +``` From df445454258bfc0f898c5b249c219227da16e236 Mon Sep 17 00:00:00 2001 From: Daniel Lacasse Date: Mon, 28 Oct 2019 15:01:30 +0300 Subject: [PATCH 11/11] Add all samples to the sample plugin model It basically convert the sample declaration from `:samples-dev` to the `org.gradle.samples` model. --- build.gradle.kts | 606 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 606 insertions(+) diff --git a/build.gradle.kts b/build.gradle.kts index 26da8b86..0a249bcb 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -79,6 +79,24 @@ commands: [{ sample.extensions.getByType(ExemplarExtension::class.java).source.from(generatorTask) } +/** + * C Samples + */ +samples.create("cApplication") { + sampleDirectory.set(file("c/application")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + appProject(".").buildRoot() + appProject(".").fromTemplate("c-app") + } +} + + +/** + * C++ Samples + */ samples.create("cppApplication") { sampleDirectory.set(file("cpp/application")) withGroovyDsl { @@ -93,3 +111,591 @@ samples.create("cppApplication") { appProject(".").fromTemplate(cppListLib) } } +samples.create("cppAutotoolsLibrary") { + sampleDirectory.set(file("cpp/autotools-library")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + appProject(".").buildRoot() + appProject("app").fromTemplate("cpp-app-with-curl") + appProject("app").fromTemplate(cppUtilsLib) + appProject("app").fromTemplate(cppListLib) + appProject("app").fromTemplate(cppMessageLib) + appProject("app").fromTemplate("cpp-message-static") + project("build-wrapper-plugin").buildRoot() + project("build-wrapper-plugin").fromTemplate("build-wrapper-plugin") + } +} +samples.create("cppBinaryDependencies") { + sampleDirectory.set(file("cpp/binary-dependencies")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + appProject(".").buildRoot() + appProject(".").fromTemplate("cpp-app") + appProject(".").fromTemplate(cppMessageLib) + appProject(".").fromTemplate("cpp-message-static") + appProject(".").fromTemplate(cppUtilsLib) + } +} +samples.create("cppCmakeLibrary") { + sampleDirectory.set(file("cpp/cmake-library")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + project(".").buildRoot() + appProject("app").fromTemplate("cpp-app") + appProject("app").fromTemplate(cppMessageLib) + appProject("app").fromTemplate("cpp-message-static") + libProject("utilities").fromTemplate(cppUtilsLib) + cmakeProject("list", "list").fromTemplate(cppListLib) + project("build-wrapper-plugin").buildRoot() + project("build-wrapper-plugin").fromTemplate("build-wrapper-plugin") + project("custom-publication-plugin").buildRoot() + project("custom-publication-plugin").fromTemplate("custom-publication-plugin") + } +} +samples.create("cppCmakeSourceDependencies") { + sampleDirectory.set(file("cpp/cmake-source-dependencies")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + cmakeAppProject("app").buildRoot() + cmakeAppProject("app").fromTemplate("cpp-app-cmake-build") + cmakeAppProject("app").fromTemplate("cpp-app") + cmakeAppProject("app").fromTemplate(cppMessageLib) + cmakeAppProject("app").fromTemplate("cpp-message-static") + cmakeProject("utilities").buildRoot() + cmakeProject("utilities").fromTemplate("cpp-utilities-lib-cmake-build") + cmakeProject("utilities").fromTemplate(cppUtilsLib) + cmakeProject("list").buildRoot() + cmakeProject("list").fromTemplate("cpp-list-lib-cmake-build") + cmakeProject("list").fromTemplate(cppListLib) + project("build-wrapper-plugin").buildRoot() + project("build-wrapper-plugin").fromTemplate("build-wrapper-plugin") + } +} +samples.create("cppCompositeBuild") { + sampleDirectory.set(file("cpp/composite-build")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + appProject(".").buildRoot() + appProject(".").fromTemplate("cpp-app") + appProject(".").fromTemplate(cppMessageLib) + appProject(".").fromTemplate("cpp-message-static") + libProject("utilities-library").fromTemplate(cppUtilsLib) + libProject("list-library").fromTemplate(cppListLib) + } +} +samples.create("cppDependencyOnUpstreamBranch") { + sampleDirectory.set(file("cpp/dependency-on-upstream-branch")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + appProject("app").buildRoot() + appProject("app").fromTemplate("cpp-app") + appProject("app").fromTemplate(cppMessageLib) + appProject("app").fromTemplate("cpp-message-static") + libProject("utilities-library").buildRoot() + libProject("utilities-library").fromTemplate(cppUtilsLib) + libProject("utilities-library").fromTemplate("cpp-utilities-lib-build") + libProject("list-library").buildRoot() + libProject("list-library").fromTemplate(cppListLib) + libProject("list-library").fromTemplate("cpp-list-lib-build") + } +} +samples.create("cppHeaderOnlyLibrary") { + sampleDirectory.set(file("cpp/header-only-library")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + libProject(".").buildRoot() + libProject(".").fromTemplate(CppLibraryTemplate.of("cpp-lib-header-only", "list")) + } +} +samples.create("cppInjectedPlugins") { + sampleDirectory.set(file("cpp/injected-plugins")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + appProject(".").buildRoot() + appProject(".").fromTemplate("cpp-app") + appProject(".").fromTemplate(cppMessageLib) + appProject(".").fromTemplate("cpp-message-static") + libProject("repos/utilities-library").fromTemplate(cppUtilsLib) + libProject("repos/list-library").fromTemplate(cppListLib) + } +} +samples.create("cppLibraryWithTests") { + sampleDirectory.set(file("cpp/library-with-tests")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + libProject(".").buildRoot() + libProject(".").fromTemplate(cppListLib) + project("build-wrapper-plugin").buildRoot() + project("build-wrapper-plugin").fromTemplate("build-wrapper-plugin") + } +} +samples.create("cppMultipleTargetMachines") { + sampleDirectory.set(file("cpp/multiple-target-machines")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + appProject(".").buildRoot() + appProject(".").fromTemplate("cpp-app") + appProject(".").fromTemplate(cppMessageLib) + appProject(".").fromTemplate("cpp-message-static") + appProject(".").fromTemplate(cppUtilsLib) + appProject(".").fromTemplate(cppListLib) + } +} +samples.create("cppOperatingSystemSpecificDependencies") { + sampleDirectory.set(file("cpp/operating-system-specific-dependencies")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + project(".").buildRoot() + appProject("app").fromTemplate("cpp-app-uses-logger") + appProject("app").fromTemplate("cpp-logger-uses-console") + appProject("app").fromTemplate(cppUtilsLib) + appProject("app").fromTemplate(cppListLib) + libProject("ansiConsole").fromTemplate(CppLibraryTemplate.of("cpp-ansi-console-lib", "ansi_console")) + libProject("winConsole").fromTemplate(CppLibraryTemplate.of("cpp-windows-console-lib", "win_console")) + } +} +samples.create("cppPrebuiltBinaries") { + sampleDirectory.set(file("cpp/prebuilt-binaries")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + appProject(".").buildRoot() + appProject(".").fromTemplate("cpp-app") + appProject(".").fromTemplate(cppMessageLib) + appProject(".").fromTemplate("cpp-message-static") + appProject(".").fromTemplate(cppUtilsLib) + } +} +samples.create("cppPrecompiledHeaders") { + sampleDirectory.set(file("cpp/precompiled-headers")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + appProject(".").buildRoot() + appProject(".").fromTemplate("cpp-app") + appProject(".").fromTemplate("cpp-app-precompiled-header") + appProject(".").fromTemplate(cppMessageLib) + appProject(".").fromTemplate("cpp-message-static") + appProject(".").fromTemplate(cppUtilsLib) + appProject(".").fromTemplate(cppListLib) + } +} +samples.create("cppProvisionableToolChains") { + sampleDirectory.set(file("cpp/provisionable-tool-chains")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + appProject(".").buildRoot() + appProject(".").fromTemplate("cpp-app") + appProject(".").fromTemplate(cppUtilsLib) + appProject(".").fromTemplate(cppListLib) + appProject(".").fromTemplate(cppMessageLib) + appProject(".").fromTemplate("cpp-message-static") + appProject(".").fromTemplate("cpp-provisionable-tool-chains-build") + } +} +samples.create("cppPublishMacros") { + sampleDirectory.set(file("cpp/publish-macros")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + project(".").buildRoot() + appProject("app").fromTemplate("cpp-app") + appProject("app").fromTemplate(cppMessageLib) + appProject("app").fromTemplate("cpp-message-static") + appProject("app").fromTemplate("cpp-app-check-published-macros") + libProject("utilities").fromTemplate(cppUtilsLib) + libProject("list").fromTemplate(cppListLib) + } +} +samples.create("cppSimpleLibrary") { + sampleDirectory.set(file("cpp/simple-library")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + libProject(".").buildRoot() + libProject(".").fromTemplate(cppListLib) + } +} +samples.create("cppSourceDependencies") { + sampleDirectory.set(file("cpp/source-dependencies")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + appProject(".").buildRoot() + appProject(".").fromTemplate("cpp-app") + appProject(".").fromTemplate(cppMessageLib) + appProject(".").fromTemplate("cpp-message-static") + } +} +samples.create("cppSourceGeneration") { + sampleDirectory.set(file("cpp/source-generation")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + project(".").buildRoot() + } +} +samples.create("cppStaticLibrary") { + sampleDirectory.set(file("cpp/static-library")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + project(".").buildRoot() + appProject("app").fromTemplate("cpp-app") + appProject("app").fromTemplate(cppMessageLib) + appProject("app").fromTemplate("cpp-message-static") + staticLibProject("utilities").fromTemplate(cppUtilsLib) + libProject("list").fromTemplate(cppListLib) + } +} +samples.create("cppSwiftPackageManager") { + sampleDirectory.set(file("cpp/swift-package-manager")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + project(".").buildRoot() + swiftPMProject(".", "App").fromTemplate("cpp-app") + swiftPMProject(".", "App").fromTemplate(cppMessageLib) + swiftPMProject(".", "App").fromTemplate("cpp-message-static") + swiftPMProject(".", "Utilities").fromTemplate(cppUtilsLib) + swiftPMProject(".", "List").fromTemplate(cppListLib) + } +} +samples.create("cppSwiftPackageManagerPublish") { + sampleDirectory.set(file("cpp/swift-package-manager-publish")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + swiftPMProject("app", "App").fromTemplate("cpp-app") + swiftPMProject("app", "App").fromTemplate(cppMessageLib) + swiftPMProject("app", "App").fromTemplate("cpp-message-static") + + project("release-plugin").buildRoot() + project("release-plugin").fromTemplate("release-plugin") + + libProject("list-library").buildRoot() + libProject("list-library").noPrivateHeaderDir() + libProject("list-library").fromTemplate("cpp-list-lib-build-with-release") + libProject("list-library").fromTemplate(cppListLib) + + libProject("utilities-library").buildRoot() + libProject("utilities-library").noPrivateHeaderDir() + libProject("utilities-library").fromTemplate("cpp-utilities-lib-build-with-release") + libProject("utilities-library").fromTemplate(cppUtilsLib) + } +} +samples.create("cppTransitiveDependencies") { + sampleDirectory.set(file("cpp/transitive-dependencies")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + project(".").buildRoot() + appProject("app").fromTemplate("cpp-app") + appProject("app").fromTemplate(cppMessageLib) + appProject("app").fromTemplate("cpp-message-static") + libProject("utilities").fromTemplate(cppUtilsLib) + libProject("list").fromTemplate(cppListLib) + } +} +samples.create("cppWindowsResources") { + sampleDirectory.set(file("cpp/windows-resources")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + appProject(".").buildRoot() + appProject(".").fromTemplate("cpp-app") + appProject(".").fromTemplate(cppMessageLib) + appProject(".").fromTemplate("cpp-message-resources") + appProject(".").fromTemplate(cppUtilsLib) + appProject(".").fromTemplate(cppListLib) + } +} + + +/** + * Swift Samples + */ +samples.create("swiftApplication") { + sampleDirectory.set(file("swift/application")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + appProject(".").buildRoot() + appProject(".").fromTemplate("swift-app") + appProject(".").fromTemplate(swiftUtilsLib) + appProject(".").fromTemplate(swiftListLib) + } +} +samples.create("swiftCompositeBuild") { + sampleDirectory.set(file("swift/composite-build")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + appProject(".").buildRoot() + appProject(".").fromTemplate("swift-app") + libProject("utilities-library").fromTemplate(swiftUtilsLib) + libProject("list-library").fromTemplate(swiftListLib) + } +} +samples.create("swiftCppDependencies") { + sampleDirectory.set(file("swift/cpp-dependencies")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + project(".").buildRoot() + staticLibProject("list").fromTemplate("cpp-lib-with-c-api") + appProject("app").fromTemplate(SwiftLibraryTemplate.of("swift-lib-uses-c-api", "List")) + appProject("app").fromTemplate(swiftUtilsLib) + appProject("app").fromTemplate("swift-app") + } +} +samples.create("swiftDependencyOnUpstreamBranch") { + sampleDirectory.set(file("swift/dependency-on-upstream-branch")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + appProject("app").buildRoot() + appProject("app").fromTemplate("swift-app") + libProject("utilities-library").buildRoot() + libProject("utilities-library").fromTemplate(swiftUtilsLib) + libProject("utilities-library").fromTemplate("swift-utilities-lib-build") + libProject("list-library").buildRoot() + libProject("list-library").fromTemplate(swiftListLib) + libProject("list-library").fromTemplate("swift-list-lib-build") + } +} +samples.create("swiftInjectedPlugins") { + sampleDirectory.set(file("swift/injected-plugins")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + appProject(".").buildRoot() + appProject(".").fromTemplate("swift-app") + libProject("repos/utilities-library").fromTemplate(swiftUtilsLib) + libProject("repos/list-library").fromTemplate(SwiftLibraryTemplate.of("swift-lib-unusable", "List")) + } +} +samples.create("swiftIOSApplication") { + sampleDirectory.set(file("swift/ios-application")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + project(".").buildRoot() + project("ios-plugin").buildRoot() + } +} +samples.create("swiftMultipleTargetMachines") { + sampleDirectory.set(file("swift/multiple-target-machines")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + appProject(".").buildRoot() + appProject(".").fromTemplate("swift-app") + appProject(".").fromTemplate(swiftUtilsLib) + appProject(".").fromTemplate(swiftListLib) + } +} +samples.create("swiftOperatingSystemSpecificDependencies") { + sampleDirectory.set(file("swift/operating-system-specific-dependencies")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + project(".").buildRoot() + appProject("app").fromTemplate("swift-app") + appProject("app").fromTemplate("swift-app-uses-logger") + appProject("app").fromTemplate("swift-logger-uses-console") + appProject("app").fromTemplate(swiftUtilsLib) + appProject("app").fromTemplate(swiftListLib) + + libProject("linux-console").fromTemplate(SwiftLibraryTemplate.of("swift-linux-console-lib", "LinuxLogger")) + libProject("macos-console").fromTemplate(SwiftLibraryTemplate.of("swift-macos-console-lib", "MacOsLogger")) + } +} +samples.create("swiftPrebuiltBinaries") { + sampleDirectory.set(file("swift/prebuilt-binaries")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + appProject(".").buildRoot() + appProject(".").fromTemplate("swift-app") + appProject(".").fromTemplate(swiftUtilsLib) + } +} +samples.create("swiftProvisionableToolChains") { + sampleDirectory.set(file("swift/provisionable-tool-chains")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + appProject(".").buildRoot() + appProject(".").fromTemplate("swift-app") + appProject(".").fromTemplate(swiftUtilsLib) + appProject(".").fromTemplate(swiftListLib) + appProject(".").fromTemplate("swift-provisionable-tool-chains-build") + } +} +samples.create("swiftSimpleLibrary") { + sampleDirectory.set(file("swift/simple-library")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + libProject(".").buildRoot() + libProject(".").fromTemplate(swiftListLib) + } +} +samples.create("swiftSourceDependencies") { + sampleDirectory.set(file("swift/source-dependencies")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + appProject(".").buildRoot() + appProject(".").fromTemplate("swift-app") + } +} +samples.create("swiftSourceGeneration") { + sampleDirectory.set(file("swift/source-generation")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + project(".").buildRoot() + } +} +samples.create("swiftStaticLibrary") { + sampleDirectory.set(file("swift/static-library")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + project(".").buildRoot() + appProject("app").fromTemplate("swift-app") + libProject("utilities").fromTemplate(swiftUtilsLib) + libProject("list").fromTemplate(swiftListLib) + } +} +samples.create("swiftSwiftPackageManager") { + sampleDirectory.set(file("swift/swift-package-manager")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + project(".").buildRoot() + swiftPMProject(".", "App").fromTemplate("swift-app") + swiftPMProject(".", "Utilities").fromTemplate(swiftUtilsLib) + swiftPMProject(".", "List").fromTemplate(swiftListLib) + } +} +samples.create("swiftSwiftPackageManagerPublish") { + sampleDirectory.set(file("swift/swift-package-manager-publish")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + swiftPMProject("app", "App").fromTemplate("swift-app") + + project("release-plugin").buildRoot() + project("release-plugin").fromTemplate("release-plugin") + + libProject("list-library").buildRoot() + libProject("list-library").fromTemplate("swift-list-lib-build-with-release") + libProject("list-library").fromTemplate(swiftListLib) + + libProject("utilities-library").buildRoot() + libProject("utilities-library").fromTemplate("swift-utilities-lib-build-with-release") + libProject("utilities-library").fromTemplate(swiftUtilsLib) + } +} +samples.create("swiftSwiftVersions") { + sampleDirectory.set(file("swift/swift-versions")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + project(".").buildRoot() + + appProject("swift3-app").fromTemplate("swift-app") + appProject("swift3-app").fromTemplate("swift-app-uses-logger") + appProject("swift3-app").fromTemplate(SwiftLibraryTemplate.of("swift-logger-reports-swift-version", "Logger")) + appProject("swift3-app").fromTemplate(SwiftLibraryTemplate.of("swift3-lib-with-api-dep", "Utilities")) + appProject("swift3-app").fromTemplate(swiftListLib) + + appProject("swift4-app").fromTemplate("swift-app") + appProject("swift4-app").fromTemplate("swift-app-uses-logger") + appProject("swift4-app").fromTemplate(SwiftLibraryTemplate.of("swift-logger-reports-swift-version", "Logger")) + appProject("swift4-app").fromTemplate(SwiftLibraryTemplate.of("swift4-lib-with-api-dep", "Utilities")) + appProject("swift4-app").fromTemplate(swiftListLib) + + appProject("swift5-app").fromTemplate("swift-app") + appProject("swift5-app").fromTemplate("swift-app-uses-logger") + appProject("swift5-app").fromTemplate(SwiftLibraryTemplate.of("swift-logger-reports-swift-version", "Logger")) + appProject("swift5-app").fromTemplate(SwiftLibraryTemplate.of("swift5-lib-with-api-dep", "Utilities")) + appProject("swift5-app").fromTemplate(swiftListLib) + } +} +samples.create("swiftSystemLibraryAsModule") { + sampleDirectory.set(file("swift/system-library-as-module")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + project(".").buildRoot() + } +} +samples.create("swiftTransitiveDependencies") { + sampleDirectory.set(file("swift/transitive-dependencies")) + withGroovyDsl { + archiveContent.from(fileTree(sampleDirectory).include("**/*.gradle")) + } + copySource { + project(".").buildRoot() + appProject("app").fromTemplate("swift-app") + libProject("utilities").fromTemplate(swiftUtilsLib) + libProject("list").fromTemplate(swiftListLib) + } +} \ No newline at end of file