├── .gitignore ├── LICENSE ├── LICENSE.MIT ├── README.md ├── download.sh └── setup ├── main.go ├── manifest_1_.go ├── manifest_2_.go └── manifests.go /.gitignore: -------------------------------------------------------------------------------- 1 | /*.patch 2 | build*/ 3 | snapshots/ 4 | *.swp 5 | *.orig 6 | *.rej 7 | *~ 8 | pull-*/ 9 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | All metadata files (including, but not limited to bb, bbappend, 2 | bbclass, scc, cfg, inc and conf files) are MIT licensed unless otherwise stated. 3 | Source code included in tree for individual recipes is under the 4 | LICENSE stated in the associated recipe (.bb file) unless otherwise 5 | stated. 6 | -------------------------------------------------------------------------------- /LICENSE.MIT: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | DISCONTINUATION OF PROJECT 2 | 3 | This project will no longer be maintained by Intel. 4 | 5 | Intel has ceased development and contributions including, but not limited to, maintenance, bug fixes, new releases, or updates, to this project. 6 | 7 | Intel no longer accepts patches to this project. 8 | 9 | If you have an ongoing need to use this project, are interested in independently developing it, or would like to maintain patches for the open source software community, please create your own fork of this project. 10 | 11 | Contact: webadmin@linux.intel.com 12 | # Xenomai 13 | 14 | This project contains the scripts to setup a Xenomai(xenomai.org) powered real-time co-kernel Linux distribution in Yocto/Bitbake way, it has fewest code for education purpose but not for production. 15 | 16 | ## Overview: 17 | 18 | The entire project is based on Yocto, Xenomai's code and ipipe pathces are organized into meta-xenomai-intel. 'download.sh' will download a code snapshot of Yocto poky and other meta layers, based on the branch&revision in the manifest which you selected. 19 | 20 | ## Build guide: 21 | 22 | - ### Prerequisite: 23 | The scripts are written in Go, please setup Golang environment on your host machine: 24 | https://golang.org/doc/install or https://golang.google.cn/doc/install for China. 25 | - ### Download: 26 | ``` 27 | $./download.sh 28 | Pls select a snapshot of code to download: 29 | [1] manifest_1 30 | [2] manifest_2 31 | ``` 32 | Type "1" to choose "manifest_1", it combines kernel 4.14.68 and xenomai 3.0.7; detailed branch and revision pls see: setup/manifest_1_.go; 33 | depends on your network, download code snapshot will take some time. 34 | - ### Build: 35 | ``` 36 | $cd snapshots/manifest_1/ 37 | $source poky/oe-init-build-env build ### will jump to build/ automaticly 38 | $bitbake -k core-image-xfce-sdk 39 | # or target without build facilities: 40 | $bitbake -k core-image-xfce 41 | # or kernel only: 42 | $bitbake virtual/kernel 43 | ``` 44 | - ### Make bootable USB disk: 45 | Output images under: build/tmp/deploy/images/intel-corei7-64/ 46 | 47 | Assume a USB disk is plugged in and enum as: /dev/sdb 48 | 49 | Liveboot USB disk creation for UEFI BIOS: 50 | ``` 51 | $ sudo dd if=core-image-xfce-sdk-intel-corei7-64.rootfs.wic of=/dev/sdb bs=4M status=progress oflag=sync 52 | ``` 53 | Liveboot USB disk creation for legacy BIOS: 54 | ``` 55 | $ sudo dd if=core-image-xfce-sdk-intel-corei7-64.hddimg of=/dev/sdb bs=4M status=progress oflag=sync 56 | ``` 57 | -------------------------------------------------------------------------------- /download.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Copyright (c) 2019 Intel Corporation 4 | # Authored-by: Fino Meng 5 | # Licensed under the MIT license. See LICENSE.MIT in the project root. 6 | 7 | go run setup/*.go -- down 8 | -------------------------------------------------------------------------------- /setup/main.go: -------------------------------------------------------------------------------- 1 | /****************************************************************************** 2 | # Copyright (c) 2019 Intel Corporation 3 | # Authored-by: Fino Meng 4 | # Licensed under the MIT license. See LICENSE.MIT in the project root. 5 | ******************************************************************************/ 6 | package main 7 | 8 | import ( 9 | "flag" 10 | "fmt" 11 | "log" 12 | "os" 13 | "os/exec" 14 | "sync" 15 | "text/template" 16 | "time" 17 | ) 18 | 19 | // G collecting all global var, no exception. 20 | var G = struct { 21 | DirDownload string 22 | DirBuild string // inside each code snapshot 23 | DirConf string 24 | PWD string 25 | }{ 26 | "snapshots/", 27 | "build/", 28 | "build/conf/", 29 | "", 30 | } 31 | 32 | func printHelp() { 33 | fmt.Printf("\nusage:\n") 34 | fmt.Printf(" supported cmd: down, check, pull\n\n") 35 | } 36 | 37 | /////////////////////////////////////////////////////////////////////////////// 38 | func main() { 39 | 40 | flag.Parse() 41 | lenOfArgs := len(flag.Args()) 42 | flagCmd := "" 43 | if lenOfArgs == 0 { 44 | printHelp() 45 | os.Exit(0) 46 | } else { 47 | flagCmd = flag.Arg(0) 48 | } 49 | 50 | G.PWD, _ = os.Getwd() 51 | 52 | switch flagCmd { 53 | case "down": 54 | 55 | idxSelect := 0 56 | fmt.Printf("Pls select a snapshot of code to download:\n") 57 | for k, v := range manifestNames { 58 | fmt.Printf("[%d] %s\n", k+1, v) 59 | } 60 | fmt.Scanln(&idxSelect) 61 | dirSnapshot := G.PWD + "/" + G.DirDownload + manifestNames[idxSelect-1] + "/" 62 | fmt.Printf("\nSelected code snapshot: %s\n\n", dirSnapshot) 63 | time.Sleep(1) 64 | 65 | generateConf(dirSnapshot, manifestNames[idxSelect-1]) 66 | downloadRepos(dirSnapshot, manifestNames[idxSelect-1]) 67 | 68 | case "check": 69 | //compare commit diff between local branch and upsteam branch 70 | 71 | case "pull": 72 | 73 | default: 74 | println("unknown cmd.") 75 | os.Exit(0) 76 | } 77 | 78 | } 79 | 80 | /////////////////////////////////////////////////////////////////////////////// 81 | 82 | type typeRepoGit struct { 83 | Name string 84 | SrcURI string 85 | Branch string 86 | Tag string 87 | LastRevision string 88 | LocalRepoDir string 89 | ReDown bool // record user selection if re-download the repo 90 | } 91 | 92 | func execCommand(commandName, runDir string, params []string) bool { 93 | 94 | cmd := exec.Command(commandName, params...) 95 | cmd.Dir = runDir 96 | fmt.Println(cmd.Args) 97 | //show stdout&stderr instantly 98 | cmd.Stdout = os.Stdout 99 | cmd.Stderr = os.Stderr 100 | err := cmd.Run() 101 | if err != nil { 102 | log.Fatalf("cmd.Run() failed with %s\n", err) 103 | } 104 | return true 105 | } 106 | 107 | func worker(wg *sync.WaitGroup, id int, name string, commandName, runDir string, params []string) { 108 | defer wg.Done() 109 | 110 | fmt.Printf("\nWorker %v %v: Started\n", id, name) 111 | execCommand(commandName, runDir, params) 112 | fmt.Printf("\nWorker %v %v: Finished\n", id, name) 113 | } 114 | 115 | type typeBBlayersConfTemplate struct { 116 | SnapshotDir string 117 | } 118 | 119 | type typeLocalConfTemplate struct { 120 | SnapshotDir string 121 | } 122 | 123 | func generateConf(dirSnapshot string, manifest string) { 124 | 125 | dirConf := dirSnapshot + G.DirConf 126 | 127 | if _, err := os.Stat(dirConf); !os.IsNotExist(err) { 128 | // path/to/whatever already exist 129 | println("conf dir " + dirConf + " already exist.") 130 | // to do: press y for delete, N for keep 131 | fmt.Printf("do you want to delete existing conf dir and re-generate it? [y/N]\n") 132 | var input string 133 | fmt.Scanln(&input) 134 | if input == "y" { 135 | os.RemoveAll(dirConf) 136 | time.Sleep(3) 137 | println(dirConf + " deleted.\n") 138 | } else { 139 | println(dirConf + " keeped.\n") 140 | return 141 | } 142 | } 143 | os.MkdirAll(dirConf, os.ModePerm) 144 | fmt.Printf("created conf dir for bitbake project: %s\n", dirConf) 145 | 146 | filenameBBlayers := dirConf + "/bblayers.conf" 147 | fileBBlayers, err := os.Create(filenameBBlayers) 148 | if err != nil { 149 | fmt.Println(err) 150 | } 151 | 152 | fmt.Println(" Write to file : " + filenameBBlayers) 153 | bblayers := typeBBlayersConfTemplate{SnapshotDir: dirSnapshot} 154 | t := template.Must(template.New("bblayers").Parse(bblayersConfTemplates[manifest])) 155 | 156 | //err = t.Execute(os.Stdout, bblayers) 157 | err = t.Execute(fileBBlayers, bblayers) 158 | if err != nil { 159 | log.Println("executing template:", err) 160 | } 161 | 162 | fileBBlayers.Close() 163 | 164 | filenameLocalConf := dirConf + "/local.conf" 165 | fileLocalConf, err := os.Create(filenameLocalConf) 166 | if err != nil { 167 | fmt.Println(err) 168 | } 169 | 170 | fmt.Println(" Write to file : " + filenameLocalConf) 171 | localConf := typeLocalConfTemplate{SnapshotDir: dirSnapshot} 172 | t = template.Must(template.New("localConf").Parse(localConfTemplates[manifest])) 173 | 174 | //err = t.Execute(os.Stdout, bblayers) 175 | err = t.Execute(fileLocalConf, localConf) 176 | if err != nil { 177 | log.Println("executing template:", err) 178 | } 179 | 180 | fileLocalConf.Close() 181 | 182 | println("") 183 | } 184 | 185 | // [branch, tag, commit-id] can have multi combinations 186 | // same tag name can exist in multi branch 187 | // dirDownload should be created by generateConf() already. 188 | func downloadRepos(dirDownload string, manifest string) { 189 | 190 | mani := manifests[manifest] 191 | amountOfRepos := len(mani) 192 | 193 | for i := 0; i < amountOfRepos; i++ { 194 | 195 | var localRepoDir string = dirDownload + mani[i].Name 196 | if mani[i].LocalRepoDir != "" { 197 | localRepoDir = dirDownload + mani[i].LocalRepoDir 198 | } 199 | 200 | if _, err := os.Stat(localRepoDir); !os.IsNotExist(err) { 201 | println("repo " + localRepoDir + " already exist.") 202 | fmt.Println("do you want to delete existing repo and re-download again? [y/N] ") 203 | var input string 204 | fmt.Scanln(&input) 205 | if input == "y" { 206 | os.RemoveAll(localRepoDir) 207 | time.Sleep(3) 208 | println("repo " + localRepoDir + " deleted.\n") 209 | mani[i].ReDown = true 210 | } else { 211 | println("repo " + localRepoDir + " keeped.\n") 212 | mani[i].ReDown = false 213 | continue 214 | } 215 | } else { 216 | println("repo " + localRepoDir + " do not exist, will download it.") 217 | mani[i].ReDown = true // folder not exist 218 | } 219 | 220 | } 221 | 222 | var wg sync.WaitGroup 223 | 224 | fmt.Println("Main: start downloading repos...\n") 225 | time.Sleep(3) 226 | timeStart := time.Now().UTC() 227 | 228 | for i := 0; i < amountOfRepos; i++ { 229 | if mani[i].ReDown == true { 230 | var gitParams []string 231 | var localRepoDir string = dirDownload + mani[i].Name 232 | if mani[i].LocalRepoDir != "" { 233 | localRepoDir = dirDownload + mani[i].LocalRepoDir 234 | } 235 | 236 | if mani[i].Branch != "" { 237 | gitParams = []string{"clone", "-b", mani[i].Branch, mani[i].SrcURI, localRepoDir} 238 | } else { 239 | fmt.Println("Branch name is mandatory for a git repo, pls add branch in manifest.") 240 | os.Exit(1) 241 | } 242 | 243 | wg.Add(1) 244 | dir, _ := os.Getwd() 245 | go worker(&wg, i, mani[i].Name, "git", dir, gitParams) 246 | } 247 | } 248 | 249 | wg.Wait() //wait for all the goroutine return 250 | timeEnd := time.Now().UTC() 251 | var dura time.Duration = timeEnd.Sub(timeStart) 252 | dura = dura.Round(time.Second) 253 | 254 | fmt.Printf("Main: download completed, cost time: %v\n\n", dura) 255 | fmt.Println("Main: checking out by tag or commit-id.\n") 256 | 257 | for i := 0; i < amountOfRepos; i++ { 258 | if mani[i].ReDown == true { 259 | 260 | var gitParams []string 261 | var localRepoDir string = dirDownload + mani[i].Name 262 | 263 | if mani[i].LocalRepoDir != "" { 264 | localRepoDir = dirDownload + mani[i].LocalRepoDir 265 | } 266 | 267 | //Tag and commit-id should not co-exist 268 | if mani[i].Tag != "" { 269 | gitParams = []string{"checkout", mani[i].Tag} 270 | } else if mani[i].LastRevision != "" { 271 | gitParams = []string{"checkout", mani[i].LastRevision} 272 | } else { 273 | fmt.Println(localRepoDir, ": last revision is the head of the branch.") 274 | continue 275 | } 276 | execCommand("git", localRepoDir, gitParams) 277 | } 278 | } 279 | } 280 | -------------------------------------------------------------------------------- /setup/manifest_1_.go: -------------------------------------------------------------------------------- 1 | /****************************************************************************** 2 | # Copyright (c) 2019 Intel Corporation 3 | # Authored-by: Fino Meng 4 | # Licensed under the MIT license. See LICENSE.MIT in the project root. 5 | ******************************************************************************/ 6 | package main 7 | 8 | var manifest_1 = []typeRepoGit{ 9 | typeRepoGit{ 10 | Name: "poky", 11 | SrcURI: "git://git.yoctoproject.org/poky", 12 | Branch: "sumo", 13 | LastRevision: "d240b885f26e9b05c8db0364ab2ace9796709aad", 14 | }, 15 | typeRepoGit{ 16 | Name: "meta-openembedded", 17 | SrcURI: "git://git.openembedded.org/meta-openembedded", 18 | Branch: "sumo", 19 | LastRevision: "a19aa29f7fa336cd075b72c496fe1102e6e5422b", 20 | }, 21 | typeRepoGit{ 22 | Name: "meta-intel", 23 | SrcURI: "git://git.yoctoproject.org/meta-intel", 24 | Branch: "sumo", 25 | LastRevision: "aa8f5fad12ed5cda9b3779dd380e29755ab24c79", 26 | }, 27 | typeRepoGit{ 28 | Name: "meta-intel-iotg-bsp", 29 | LocalRepoDir: "meta-intel-iotg", 30 | SrcURI: "https://github.com/intel/iotg-yocto-bsp-public.git", 31 | Branch: "e3900/master", 32 | LastRevision: "a9e85b077160bfa6156ca266599efa9c3eaf5837", 33 | }, 34 | typeRepoGit{ 35 | Name: "meta-measured", 36 | SrcURI: "https://github.com/flihp/meta-measured.git", 37 | Branch: "rocko", 38 | LastRevision: "b7d667e4796623812ab22fdde99d7ce68622de19", 39 | }, 40 | typeRepoGit{ 41 | Name: "meta-xenomai-intel", 42 | SrcURI: "https://github.com/intel/meta-xenomai-intel.git", 43 | Branch: "4.14.68/base/3.0.7", 44 | }, 45 | } 46 | 47 | /////////////////////////////////////////////////////////////////////////////// 48 | 49 | const bblayers_conf_manifest_1_template = ` 50 | # POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf 51 | # changes incompatibly 52 | POKY_BBLAYERS_CONF_VERSION = "2" 53 | 54 | BBPATH = "${TOPDIR}" 55 | BBFILES ?= "" 56 | 57 | BBLAYERS ?= " \ 58 | {{.SnapshotDir}}poky/meta \ 59 | {{.SnapshotDir}}poky/meta-poky \ 60 | {{.SnapshotDir}}poky/meta-yocto-bsp \ 61 | {{.SnapshotDir}}meta-openembedded/meta-filesystems \ 62 | {{.SnapshotDir}}meta-openembedded/meta-networking \ 63 | {{.SnapshotDir}}meta-openembedded/meta-oe \ 64 | {{.SnapshotDir}}meta-openembedded/meta-python \ 65 | {{.SnapshotDir}}meta-openembedded/meta-multimedia \ 66 | {{.SnapshotDir}}meta-openembedded/meta-gnome \ 67 | {{.SnapshotDir}}meta-openembedded/meta-xfce \ 68 | {{.SnapshotDir}}meta-intel \ 69 | {{.SnapshotDir}}meta-measured \ 70 | {{.SnapshotDir}}meta-intel-iotg/meta-intel-middleware \ 71 | {{.SnapshotDir}}meta-xenomai-intel \ 72 | " 73 | ` 74 | 75 | /////////////////////////////////////////////////////////////////////////////// 76 | 77 | const local_conf_manifest_1_template = ` 78 | # 79 | # This file is your local configuration file and is where all local user settings 80 | # are placed. The comments in this file give some guide to the options a new user 81 | # to the system might want to change but pretty much any configuration option can 82 | # be set in this file. More adventurous users can look at local.conf.extended 83 | # which contains other examples of configuration which can be placed in this file 84 | # but new users likely won't need any of them initially. 85 | # 86 | # Lines starting with the '#' character are commented out and in some cases the 87 | # default values are provided as comments to show people example syntax. Enabling 88 | # the option is a question of removing the # character and making any change to the 89 | # variable as required. 90 | 91 | # 92 | # Machine Selection 93 | # 94 | MACHINE = "intel-corei7-64" 95 | 96 | # Set preferred version for kernel 97 | PREFERRED_PROVIDER_virtual/kernel = "linux-intel" 98 | PREFERRED_VERSION_linux-intel-rt = "4.14%" 99 | 100 | # Add serial console and boot parameters for RT 101 | APPEND += "3 \ 102 | scsi_mod.scan=async \ 103 | reboot=efi \ 104 | console=ttyS2,115200n8 \ 105 | processor.max_cstate=0 \ 106 | intel.max_cstate=0 \ 107 | processor_idle.max_cstate=0 \ 108 | intel_idle.max_cstate=0 \ 109 | clocksource=tsc \ 110 | tsc=reliable \ 111 | nmi_watchdog=0 \ 112 | nosoftlockup \ 113 | idle=poll \ 114 | noht \ 115 | isolcpus=1-3 \ 116 | rcu_nocbs=1-3 \ 117 | nohz_full=1-3 \ 118 | i915.enable_guc_loading=1 \ 119 | i915.enable_guc_submission=1 \ 120 | i915.enable_rc6=0 \ 121 | i915.enable_dc=0 \ 122 | i915.disable_power_well=0 \ 123 | " 124 | 125 | # Take note that as we are building 3rd party ingredient. 126 | # We need the LICENSE_FLAGS below. 127 | LICENSE_FLAGS_WHITELIST += "commercial" 128 | 129 | # Enable the security flags as per SDL 4.0 requirement 130 | require conf/distro/include/security_flags.inc 131 | SECURITY_CFLAGS = "-fstack-protector-strong -pie -fpie -D_FORTIFY_SOURCE=2 -O2 -Wformat -Wformat-security" 132 | SECURITY_NO_PIE_CFLAGS = "-fstack-protector-strong -D_FORTIFY_SOURCE=2 -O2 -Wformat -Wformat-security" 133 | SECURITY_LDFLAGS = "-Wl,-z,relro,-z,now,-z,noexecstack" 134 | 135 | # GCC Sanitizers does not compiles with PIE 136 | SECURITY_CFLAGS_pn-gcc-sanitizers = "${SECURITY_NO_PIE_CFLAGS}" 137 | 138 | # 139 | # User Space Configuration Override for Intel Platforms 140 | # 141 | # Selection of jpeg package provider 142 | PREFERRED_PROVIDER_jpeg = "jpeg" 143 | PREFERRED_PROVIDER_jpeg-native = "jpeg-native" 144 | 145 | # Include rt test in image 146 | IMAGE_INSTALL_append = " rt-tests-ptest" 147 | 148 | # Add WKS file with updated boot parameters 149 | WKS_FILE = "systemd-bootdisk-microcode-custom.wks" 150 | 151 | #Exclude piglit, ltp and mesa-demos packages 152 | PACKAGE_EXCLUDE = "packagegroup-core-apl-extra" 153 | 154 | # Use samba 155 | DISTRO_FEATURES_append = " pam" 156 | 157 | # Enable xserver-xorg 158 | IMAGE_INSTALL_append = " xserver-xorg" 159 | 160 | # Enable vp8dec for gstreamer1.0-plugins-good 161 | PACKAGECONFIG_append_pn-gstreamer1.0-plugins-good = "vpx" 162 | 163 | # Multi-libraries support is by default "OFF" 164 | # Please uncomment the 4 lines below to enable multilib support. 165 | #require conf/multilib.conf 166 | #DEFAULTTUNE = "corei7-64" 167 | #MULTILIBS = "multilib:lib32" 168 | #DEFAULTTUNE_virtclass-multilib-lib32 = "corei7-32" 169 | 170 | # Install autoconf-archive 171 | IMAGE_INSTALL_append = " autoconf-archive" 172 | 173 | # Install libva 174 | IMAGE_INSTALL_append = " libva" 175 | 176 | # Install Wayland in image 177 | DISTRO_FEATURES_append = " wayland pam" 178 | CORE_IMAGE_EXTRA_INSTALL += "wayland weston weston-examples" 179 | 180 | # Install mesa glxinfo 181 | IMAGE_INSTALL_append = " mesa-glxinfo" 182 | 183 | # Install USB-modeswitch and USB-modeswitch-data in image 184 | IMAGE_INSTALL_append = " usb-modeswitch usb-modeswitch-data" 185 | 186 | # Install JHI 187 | IMAGE_INSTALL_append = " jhi" 188 | 189 | # Install IQV driver 190 | IMAGE_INSTALL_append = " iqvlinux" 191 | 192 | # Disable lttng modules 193 | LTTNGMODULES_corei7-64-intel-common = "" 194 | 195 | # Install xinitrc environment file 196 | IMAGE_INSTALL_append = " xinit-env" 197 | 198 | # By default, we want our OS to includes all kernel modules. 199 | IMAGE_INSTALL_append = " kernel-modules" 200 | 201 | # Use systemd init instead of sysV init 202 | DISTRO_FEATURES_append = " systemd" 203 | VIRTUAL-RUNTIME_init_manager = "systemd" 204 | DISTRO_FEATURES_BACKFILL_CONSIDERED = "sysvinit" 205 | 206 | # 207 | # Where to place downloads 208 | # 209 | # During a first build the system will download many different source code tarballs 210 | # from various upstream projects. This can take a while, particularly if your network 211 | # connection is slow. These are all stored in DL_DIR. When wiping and rebuilding you 212 | # can preserve this directory to speed up this part of subsequent builds. This directory 213 | # is safe to share between multiple builds on the same machine too. 214 | # 215 | # The default is a downloads directory under TOPDIR which is the build directory. 216 | # 217 | #DL_DIR ?= "${TOPDIR}/downloads" 218 | 219 | # 220 | # Where to place shared-state files 221 | # 222 | # BitBake has the capability to accelerate builds based on previously built output. 223 | # This is done using "shared state" files which can be thought of as cache objects 224 | # and this option determines where those files are placed. 225 | # 226 | # You can wipe out TMPDIR leaving this directory intact and the build would regenerate 227 | # from these files if no changes were made to the configuration. If changes were made 228 | # to the configuration, only shared state files where the state was still valid would 229 | # be used (done using checksums). 230 | # 231 | # The default is a sstate-cache directory under TOPDIR. 232 | # 233 | #SSTATE_DIR ?= "${TOPDIR}/sstate-cache" 234 | 235 | # 236 | # Where to place the build output 237 | # 238 | # This option specifies where the bulk of the building work should be done and 239 | # where BitBake should place its temporary files and output. Keep in mind that 240 | # this includes the extraction and compilation of many applications and the toolchain 241 | # which can use Gigabytes of hard disk space. 242 | # 243 | # The default is a tmp directory under TOPDIR. 244 | # 245 | #TMPDIR = "${TOPDIR}/tmp" 246 | 247 | # 248 | # Default policy config 249 | # 250 | # The distribution setting controls which policy settings are used as defaults. 251 | # The default value is fine for general Yocto project use, at least initially. 252 | # Ultimately when creating custom policy, people will likely end up subclassing 253 | # these defaults. 254 | # 255 | DISTRO ?= "poky" 256 | # As an example of a subclass there is a "bleeding" edge policy configuration 257 | # where many versions are set to the absolute latest code from the upstream 258 | # source control systems. This is just mentioned here as an example, its not 259 | # useful to most new users. 260 | # DISTRO ?= "poky-bleeding" 261 | 262 | # 263 | # Package Management configuration 264 | # 265 | # This variable lists which packaging formats to enable. Multiple package backends 266 | # can be enabled at once and the first item listed in the variable will be used 267 | # to generate the root filesystems. 268 | # Options are: 269 | # - 'package_deb' for debian style deb files 270 | # - 'package_ipk' for ipk files are used by opkg (a debian style embedded package manager) 271 | # - 'package_rpm' for rpm style packages 272 | # E.g.: PACKAGE_CLASSES ?= "package_rpm package_deb package_ipk" 273 | # We default to rpm: 274 | PACKAGE_CLASSES ?= "package_rpm package_deb" 275 | 276 | # 277 | # SDK target architecture 278 | # 279 | # This variable specifies the architecture to build SDK items for and means 280 | # you can build the SDK packages for architectures other than the machine you are 281 | # running the build on (i.e. building i686 packages on an x86_64 host). 282 | # Supported values are i686 and x86_64 283 | #SDKMACHINE ?= "i686" 284 | 285 | # 286 | # Extra image configuration defaults 287 | # 288 | # The EXTRA_IMAGE_FEATURES variable allows extra packages to be added to the generated 289 | # images. Some of these options are added to certain image types automatically. The 290 | # variable can contain the following options: 291 | # "dbg-pkgs" - add -dbg packages for all installed packages 292 | # (adds symbol information for debugging/profiling) 293 | # "dev-pkgs" - add -dev packages for all installed packages 294 | # (useful if you want to develop against libs in the image) 295 | # "ptest-pkgs" - add -ptest packages for all ptest-enabled packages 296 | # (useful if you want to run the package test suites) 297 | # "tools-sdk" - add development tools (gcc, make, pkgconfig etc.) 298 | # "tools-debug" - add debugging tools (gdb, strace) 299 | # "eclipse-debug" - add Eclipse remote debugging support 300 | # "tools-profile" - add profiling tools (oprofile, lttng, valgrind) 301 | # "tools-testapps" - add useful testing tools (ts_print, aplay, arecord etc.) 302 | # "debug-tweaks" - make an image suitable for development 303 | # e.g. ssh root access has a blank password 304 | # There are other application targets that can be used here too, see 305 | # meta/classes/image.bbclass and meta/classes/core-image.bbclass for more details. 306 | # We default to enabling the debugging tweaks. 307 | EXTRA_IMAGE_FEATURES ?= "debug-tweaks" 308 | 309 | # 310 | # Additional image features 311 | # 312 | # The following is a list of additional classes to use when building images which 313 | # enable extra features. Some available options which can be included in this variable 314 | # are: 315 | # - 'buildstats' collect build statistics 316 | # - 'image-mklibs' to reduce shared library files size for an image 317 | # - 'image-prelink' in order to prelink the filesystem image 318 | # NOTE: if listing mklibs & prelink both, then make sure mklibs is before prelink 319 | # NOTE: mklibs also needs to be explicitly enabled for a given image, see local.conf.extended 320 | USER_CLASSES ?= "buildstats image-mklibs image-prelink" 321 | 322 | # 323 | # Runtime testing of images 324 | # 325 | # The build system can test booting virtual machine images under qemu (an emulator) 326 | # after any root filesystems are created and run tests against those images. To 327 | # enable this uncomment this line. See classes/testimage(-auto).bbclass for 328 | # further details. 329 | #TEST_IMAGE = "1" 330 | # 331 | # Interactive shell configuration 332 | # 333 | # Under certain circumstances the system may need input from you and to do this it 334 | # can launch an interactive shell. It needs to do this since the build is 335 | # multithreaded and needs to be able to handle the case where more than one parallel 336 | # process may require the user's attention. The default is iterate over the available 337 | # terminal types to find one that works. 338 | # 339 | # Examples of the occasions this may happen are when resolving patches which cannot 340 | # be applied, to use the devshell or the kernel menuconfig 341 | # 342 | # Supported values are auto, gnome, xfce, rxvt, screen, konsole (KDE 3.x only), none 343 | # Note: currently, Konsole support only works for KDE 3.x due to the way 344 | # newer Konsole versions behave 345 | #OE_TERMINAL = "auto" 346 | # By default disable interactive patch resolution (tasks will just fail instead): 347 | PATCHRESOLVE = "noop" 348 | 349 | # 350 | # Disk Space Monitoring during the build 351 | # 352 | # Monitor the disk space during the build. If there is less that 1GB of space or less 353 | # than 100K inodes in any key build location (TMPDIR, DL_DIR, SSTATE_DIR), gracefully 354 | # shutdown the build. If there is less that 100MB or 1K inodes, perform a hard abort 355 | # of the build. The reason for this is that running completely out of space can corrupt 356 | # files and damages the build in ways which may not be easily recoverable. 357 | # It's necesary to monitor /tmp, if there is no space left the build will fail 358 | # with very exotic errors. 359 | BB_DISKMON_DIRS ??= "\ 360 | STOPTASKS,${TMPDIR},1G,100K \ 361 | STOPTASKS,${DL_DIR},1G,100K \ 362 | STOPTASKS,${SSTATE_DIR},1G,100K \ 363 | STOPTASKS,/tmp,100M,100K \ 364 | ABORT,${TMPDIR},100M,1K \ 365 | ABORT,${DL_DIR},100M,1K \ 366 | ABORT,${SSTATE_DIR},100M,1K \ 367 | ABORT,/tmp,10M,1K" 368 | 369 | # 370 | # Shared-state files from other locations 371 | # 372 | # As mentioned above, shared state files are prebuilt cache data objects which can 373 | # used to accelerate build time. This variable can be used to configure the system 374 | # to search other mirror locations for these objects before it builds the data itself. 375 | # 376 | # This can be a filesystem directory, or a remote url such as http or ftp. These 377 | # would contain the sstate-cache results from previous builds (possibly from other 378 | # machines). This variable works like fetcher MIRRORS/PREMIRRORS and points to the 379 | # cache locations to check for the shared objects. 380 | # NOTE: if the mirror uses the same structure as SSTATE_DIR, you need to add PATH 381 | # at the end as shown in the examples below. This will be substituted with the 382 | # correct path within the directory structure. 383 | #SSTATE_MIRRORS ?= "\ 384 | #file://.* http://someserver.tld/share/sstate/PATH;downloadfilename=PATH \n \ 385 | #file://.* file:///some/local/dir/sstate/PATH" 386 | 387 | # 388 | # Yocto Project SState Mirror 389 | # 390 | # The Yocto Project has prebuilt artefacts available for its releases, you can enable 391 | # use of these by uncommenting the following line. This will mean the build uses 392 | # the network to check for artefacts at the start of builds, which does slow it down 393 | # equally, it will also speed up the builds by not having to build things if they are 394 | # present in the cache. It assumes you can download something faster than you can build it 395 | # which will depend on your network. 396 | # 397 | #SSTATE_MIRRORS ?= "file://.* http://sstate.yoctoproject.org/2.5/PATH;downloadfilename=PATH" 398 | 399 | # 400 | # Qemu configuration 401 | # 402 | # By default qemu will build with a builtin VNC server where graphical output can be 403 | # seen. The two lines below enable the SDL backend too. By default libsdl-native will 404 | # be built, if you want to use your host's libSDL instead of the minimal libsdl built 405 | # by libsdl-native then uncomment the ASSUME_PROVIDED line below. 406 | PACKAGECONFIG_append_pn-qemu-native = " sdl" 407 | PACKAGECONFIG_append_pn-nativesdk-qemu = " sdl" 408 | #ASSUME_PROVIDED += "libsdl-native" 409 | 410 | # CONF_VERSION is increased each time build/conf/ changes incompatibly and is used to 411 | # track the version of this file when it was generated. This can safely be ignored if 412 | # this doesn't mean anything to you. 413 | CONF_VERSION = "1" 414 | ` 415 | -------------------------------------------------------------------------------- /setup/manifest_2_.go: -------------------------------------------------------------------------------- 1 | /****************************************************************************** 2 | # Copyright (c) 2019 Intel Corporation 3 | # Authored-by: Fino Meng 4 | # Licensed under the MIT license. See LICENSE.MIT in the project root. 5 | ******************************************************************************/ 6 | package main 7 | 8 | var manifest_2 = []typeRepoGit{ 9 | typeRepoGit{ 10 | Name: "poky", 11 | SrcURI: "git://git.yoctoproject.org/poky", 12 | Branch: "warrior", 13 | }, 14 | typeRepoGit{ 15 | Name: "meta-openembedded", 16 | SrcURI: "git://git.openembedded.org/meta-openembedded", 17 | Branch: "warrior", 18 | }, 19 | typeRepoGit{ 20 | Name: "meta-intel", 21 | SrcURI: "git://git.yoctoproject.org/meta-intel", 22 | Branch: "warrior", 23 | }, 24 | } 25 | 26 | const bblayers_conf_manifest_2_template = ` 27 | # POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf 28 | # changes incompatibly 29 | POKY_BBLAYERS_CONF_VERSION = "2" 30 | 31 | BBPATH = "${TOPDIR}" 32 | BBFILES ?= "" 33 | 34 | BBLAYERS ?= " \ 35 | {{.SnapshotDir}}poky/meta \ 36 | {{.SnapshotDir}}poky/meta-poky \ 37 | {{.SnapshotDir}}poky/meta-yocto-bsp \ 38 | {{.SnapshotDir}}meta-openembedded/meta-oe \ 39 | {{.SnapshotDir}}meta-openembedded/meta-filesystems \ 40 | {{.SnapshotDir}}meta-openembedded/meta-networking \ 41 | {{.SnapshotDir}}meta-openembedded/meta-python \ 42 | {{.SnapshotDir}}meta-intel \ 43 | " 44 | ` 45 | 46 | /////////////////////////////////////////////////////////////////////////////// 47 | 48 | const local_conf_manifest_2_template = ` 49 | # 50 | # This file is your local configuration file and is where all local user settings 51 | # are placed. The comments in this file give some guide to the options a new user 52 | # to the system might want to change but pretty much any configuration option can 53 | # be set in this file. More adventurous users can look at local.conf.extended 54 | # which contains other examples of configuration which can be placed in this file 55 | # but new users likely won't need any of them initially. 56 | # 57 | # Lines starting with the '#' character are commented out and in some cases the 58 | # default values are provided as comments to show people example syntax. Enabling 59 | # the option is a question of removing the # character and making any change to the 60 | # variable as required. 61 | 62 | # 63 | # Machine Selection 64 | # 65 | # You need to select a specific machine to target the build with. There are a selection 66 | # of emulated machines available which can boot and run in the QEMU emulator: 67 | # 68 | #MACHINE ?= "qemuarm" 69 | #MACHINE ?= "qemuarm64" 70 | #MACHINE ?= "qemumips" 71 | #MACHINE ?= "qemumips64" 72 | #MACHINE ?= "qemuppc" 73 | #MACHINE ?= "qemux86" 74 | #MACHINE ?= "qemux86-64" 75 | # 76 | # There are also the following hardware board target machines included for 77 | # demonstration purposes: 78 | # 79 | #MACHINE ?= "beaglebone-yocto" 80 | #MACHINE ?= "genericx86" 81 | #MACHINE ?= "genericx86-64" 82 | #MACHINE ?= "mpc8315e-rdb" 83 | #MACHINE ?= "edgerouter" 84 | # 85 | # This sets the default machine to be qemux86 if no other machine is selected: 86 | MACHINE ??= "intel-rt-corei7-64" 87 | 88 | # 89 | # Where to place downloads 90 | # 91 | # During a first build the system will download many different source code tarballs 92 | # from various upstream projects. This can take a while, particularly if your network 93 | # connection is slow. These are all stored in DL_DIR. When wiping and rebuilding you 94 | # can preserve this directory to speed up this part of subsequent builds. This directory 95 | # is safe to share between multiple builds on the same machine too. 96 | # 97 | # The default is a downloads directory under TOPDIR which is the build directory. 98 | # 99 | DL_DIR ?= "${TOPDIR}/downloads" 100 | 101 | # 102 | # Where to place shared-state files 103 | # 104 | # BitBake has the capability to accelerate builds based on previously built output. 105 | # This is done using "shared state" files which can be thought of as cache objects 106 | # and this option determines where those files are placed. 107 | # 108 | # You can wipe out TMPDIR leaving this directory intact and the build would regenerate 109 | # from these files if no changes were made to the configuration. If changes were made 110 | # to the configuration, only shared state files where the state was still valid would 111 | # be used (done using checksums). 112 | # 113 | # The default is a sstate-cache directory under TOPDIR. 114 | # 115 | SSTATE_DIR ?= "${TOPDIR}/sstate-cache" 116 | 117 | # 118 | # Where to place the build output 119 | # 120 | # This option specifies where the bulk of the building work should be done and 121 | # where BitBake should place its temporary files and output. Keep in mind that 122 | # this includes the extraction and compilation of many applications and the toolchain 123 | # which can use Gigabytes of hard disk space. 124 | # 125 | # The default is a tmp directory under TOPDIR. 126 | # 127 | TMPDIR = "${TOPDIR}/tmp" 128 | 129 | # 130 | # Default policy config 131 | # 132 | # The distribution setting controls which policy settings are used as defaults. 133 | # The default value is fine for general Yocto project use, at least initially. 134 | # Ultimately when creating custom policy, people will likely end up subclassing 135 | # these defaults. 136 | # 137 | DISTRO ?= "tgr" 138 | # As an example of a subclass there is a "bleeding" edge policy configuration 139 | # where many versions are set to the absolute latest code from the upstream 140 | # source control systems. This is just mentioned here as an example, its not 141 | # useful to most new users. 142 | # DISTRO ?= "poky-bleeding" 143 | 144 | # 145 | # Package Management configuration 146 | # 147 | # This variable lists which packaging formats to enable. Multiple package backends 148 | # can be enabled at once and the first item listed in the variable will be used 149 | # to generate the root filesystems. 150 | # Options are: 151 | # - 'package_deb' for debian style deb files 152 | # - 'package_ipk' for ipk files are used by opkg (a debian style embedded package manager) 153 | # - 'package_rpm' for rpm style packages 154 | # E.g.: PACKAGE_CLASSES ?= "package_rpm package_deb package_ipk" 155 | # We default to rpm: 156 | PACKAGE_CLASSES ?= "package_rpm" 157 | 158 | # 159 | # SDK target architecture 160 | # 161 | # This variable specifies the architecture to build SDK items for and means 162 | # you can build the SDK packages for architectures other than the machine you are 163 | # running the build on (i.e. building i686 packages on an x86_64 host). 164 | # Supported values are i686 and x86_64 165 | #SDKMACHINE ?= "i686" 166 | 167 | # 168 | # Extra image configuration defaults 169 | # 170 | # The EXTRA_IMAGE_FEATURES variable allows extra packages to be added to the generated 171 | # images. Some of these options are added to certain image types automatically. The 172 | # variable can contain the following options: 173 | # "dbg-pkgs" - add -dbg packages for all installed packages 174 | # (adds symbol information for debugging/profiling) 175 | # "src-pkgs" - add -src packages for all installed packages 176 | # (adds source code for debugging) 177 | # "dev-pkgs" - add -dev packages for all installed packages 178 | # (useful if you want to develop against libs in the image) 179 | # "ptest-pkgs" - add -ptest packages for all ptest-enabled packages 180 | # (useful if you want to run the package test suites) 181 | # "tools-sdk" - add development tools (gcc, make, pkgconfig etc.) 182 | # "tools-debug" - add debugging tools (gdb, strace) 183 | # "eclipse-debug" - add Eclipse remote debugging support 184 | # "tools-profile" - add profiling tools (oprofile, lttng, valgrind) 185 | # "tools-testapps" - add useful testing tools (ts_print, aplay, arecord etc.) 186 | # "debug-tweaks" - make an image suitable for development 187 | # e.g. ssh root access has a blank password 188 | # There are other application targets that can be used here too, see 189 | # meta/classes/image.bbclass and meta/classes/core-image.bbclass for more details. 190 | # We default to enabling the debugging tweaks. 191 | EXTRA_IMAGE_FEATURES ?= " \ 192 | debug-tweaks \ 193 | package-management \ 194 | ssh-server-openssh \ 195 | " 196 | 197 | # 198 | # Additional image features 199 | # 200 | # The following is a list of additional classes to use when building images which 201 | # enable extra features. Some available options which can be included in this variable 202 | # are: 203 | # - 'buildstats' collect build statistics 204 | # - 'image-mklibs' to reduce shared library files size for an image 205 | # - 'image-prelink' in order to prelink the filesystem image 206 | # NOTE: if listing mklibs & prelink both, then make sure mklibs is before prelink 207 | # NOTE: mklibs also needs to be explicitly enabled for a given image, see local.conf.extended 208 | USER_CLASSES ?= "buildstats image-mklibs image-prelink" 209 | 210 | # 211 | # Runtime testing of images 212 | # 213 | # The build system can test booting virtual machine images under qemu (an emulator) 214 | # after any root filesystems are created and run tests against those images. It can also 215 | # run tests against any SDK that are built. To enable this uncomment these lines. 216 | # See classes/test{image,sdk}.bbclass for further details. 217 | #IMAGE_CLASSES += "testimage testsdk" 218 | #TESTIMAGE_AUTO_qemuall = "1" 219 | 220 | # 221 | # Interactive shell configuration 222 | # 223 | # Under certain circumstances the system may need input from you and to do this it 224 | # can launch an interactive shell. It needs to do this since the build is 225 | # multithreaded and needs to be able to handle the case where more than one parallel 226 | # process may require the user's attention. The default is iterate over the available 227 | # terminal types to find one that works. 228 | # 229 | # Examples of the occasions this may happen are when resolving patches which cannot 230 | # be applied, to use the devshell or the kernel menuconfig 231 | # 232 | # Supported values are auto, gnome, xfce, rxvt, screen, konsole (KDE 3.x only), none 233 | # Note: currently, Konsole support only works for KDE 3.x due to the way 234 | # newer Konsole versions behave 235 | #OE_TERMINAL = "auto" 236 | # By default disable interactive patch resolution (tasks will just fail instead): 237 | PATCHRESOLVE = "noop" 238 | 239 | # 240 | # Disk Space Monitoring during the build 241 | # 242 | # Monitor the disk space during the build. If there is less that 1GB of space or less 243 | # than 100K inodes in any key build location (TMPDIR, DL_DIR, SSTATE_DIR), gracefully 244 | # shutdown the build. If there is less that 100MB or 1K inodes, perform a hard abort 245 | # of the build. The reason for this is that running completely out of space can corrupt 246 | # files and damages the build in ways which may not be easily recoverable. 247 | # It's necesary to monitor /tmp, if there is no space left the build will fail 248 | # with very exotic errors. 249 | BB_DISKMON_DIRS ??= "\ 250 | STOPTASKS,${TMPDIR},1G,100K \ 251 | STOPTASKS,${DL_DIR},1G,100K \ 252 | STOPTASKS,${SSTATE_DIR},1G,100K \ 253 | STOPTASKS,/tmp,100M,100K \ 254 | ABORT,${TMPDIR},100M,1K \ 255 | ABORT,${DL_DIR},100M,1K \ 256 | ABORT,${SSTATE_DIR},100M,1K \ 257 | ABORT,/tmp,10M,1K" 258 | 259 | # 260 | # Shared-state files from other locations 261 | # 262 | # As mentioned above, shared state files are prebuilt cache data objects which can 263 | # used to accelerate build time. This variable can be used to configure the system 264 | # to search other mirror locations for these objects before it builds the data itself. 265 | # 266 | # This can be a filesystem directory, or a remote url such as http or ftp. These 267 | # would contain the sstate-cache results from previous builds (possibly from other 268 | # machines). This variable works like fetcher MIRRORS/PREMIRRORS and points to the 269 | # cache locations to check for the shared objects. 270 | # NOTE: if the mirror uses the same structure as SSTATE_DIR, you need to add PATH 271 | # at the end as shown in the examples below. This will be substituted with the 272 | # correct path within the directory structure. 273 | #SSTATE_MIRRORS ?= "\ 274 | #file://.* http://someserver.tld/share/sstate/PATH;downloadfilename=PATH \n \ 275 | #file://.* file:///some/local/dir/sstate/PATH" 276 | 277 | # 278 | # Yocto Project SState Mirror 279 | # 280 | # The Yocto Project has prebuilt artefacts available for its releases, you can enable 281 | # use of these by uncommenting the following line. This will mean the build uses 282 | # the network to check for artefacts at the start of builds, which does slow it down 283 | # equally, it will also speed up the builds by not having to build things if they are 284 | # present in the cache. It assumes you can download something faster than you can build it 285 | # which will depend on your network. 286 | # 287 | #SSTATE_MIRRORS ?= "file://.* http://sstate.yoctoproject.org/2.5/PATH;downloadfilename=PATH" 288 | 289 | # 290 | # Qemu configuration 291 | # 292 | # By default qemu will build with a builtin VNC server where graphical output can be 293 | # seen. The two lines below enable the SDL backend too. By default libsdl2-native will 294 | # be built, if you want to use your host's libSDL instead of the minimal libsdl built 295 | # by libsdl2-native then uncomment the ASSUME_PROVIDED line below. 296 | PACKAGECONFIG_append_pn-qemu-system-native = " sdl" 297 | PACKAGECONFIG_append_pn-nativesdk-qemu = " sdl" 298 | #ASSUME_PROVIDED += "libsdl2-native" 299 | 300 | # CONF_VERSION is increased each time build/conf/ changes incompatibly and is used to 301 | # track the version of this file when it was generated. This can safely be ignored if 302 | # this doesn't mean anything to you. 303 | CONF_VERSION = "1" 304 | # Select distro features to include 305 | DISTRO_FEATURES_append = " tgr-bare-metal" 306 | # Add an additional 1GB of space for container images 307 | IMAGE_ROOTFS_EXTRA_SPACE = "1000000" 308 | #NOHDD="1" 309 | #NOISO="1" 310 | ` 311 | -------------------------------------------------------------------------------- /setup/manifests.go: -------------------------------------------------------------------------------- 1 | /****************************************************************************** 2 | # Copyright (c) 2019 Intel Corporation 3 | # Authored-by: Fino Meng 4 | # Licensed under the MIT license. See LICENSE.MIT in the project root. 5 | ******************************************************************************/ 6 | package main 7 | 8 | const key_1 = "manifest_1" 9 | const key_2 = "manifest_2" 10 | 11 | var manifestNames = []string{key_1, key_2} 12 | 13 | // branch is mandatory, tag and commit-id is optional; 14 | // it's due to a tag and a branch may set to same name accidentally. 15 | var manifests = map[string][]typeRepoGit{ 16 | 17 | key_1: manifest_1, 18 | key_2: manifest_2, 19 | } 20 | 21 | var bblayersConfTemplates = map[string]string{ 22 | 23 | key_1: bblayers_conf_manifest_1_template, 24 | key_2: bblayers_conf_manifest_2_template, 25 | } 26 | 27 | var localConfTemplates = map[string]string{ 28 | 29 | key_1: local_conf_manifest_1_template, 30 | key_2: local_conf_manifest_2_template, 31 | } 32 | --------------------------------------------------------------------------------