parent
d894c48660
commit
06b1f457d5
23 changed files with 327 additions and 0 deletions
@ -0,0 +1,8 @@ |
|||||||
|
#include "common.h" |
||||||
|
#include <iostream> |
||||||
|
|
||||||
|
void initialize_target() |
||||||
|
{ |
||||||
|
std::cout << ANSI_START << "some " << THE_TARGET |
||||||
|
<< " initialization" << ANSI_END << std::endl; |
||||||
|
} |
@ -0,0 +1,10 @@ |
|||||||
|
#include "arm.h" |
||||||
|
|
||||||
|
const char *ARMBoard::target() |
||||||
|
{ |
||||||
|
return THE_TARGET; |
||||||
|
} |
||||||
|
|
||||||
|
void ARMBoard::some_arm_thing() |
||||||
|
{ |
||||||
|
} |
@ -0,0 +1,12 @@ |
|||||||
|
#ifndef ARM_H |
||||||
|
#define ARM_H 1 |
||||||
|
|
||||||
|
#include "common.h" |
||||||
|
|
||||||
|
struct ARMBoard: Board { |
||||||
|
const char *target(); |
||||||
|
void some_arm_thing(); |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
#endif |
@ -0,0 +1,8 @@ |
|||||||
|
#include "common.h" |
||||||
|
#include <iostream> |
||||||
|
|
||||||
|
void initialize_target() |
||||||
|
{ |
||||||
|
std::cout << ANSI_START << "a different " << THE_TARGET |
||||||
|
<< " initialization" << ANSI_END << std::endl; |
||||||
|
} |
@ -0,0 +1,16 @@ |
|||||||
|
#include <iostream> |
||||||
|
#include "common.h" |
||||||
|
#include "arm.h" |
||||||
|
|
||||||
|
struct VersatilePBBoard: ARMBoard { |
||||||
|
void say_hello(); |
||||||
|
}; |
||||||
|
|
||||||
|
void VersatilePBBoard::say_hello() |
||||||
|
{ |
||||||
|
some_arm_thing(); |
||||||
|
std::cout << ANSI_START << "I am the versatilepb board" |
||||||
|
<< ANSI_END << std::endl; |
||||||
|
} |
||||||
|
|
||||||
|
static VersatilePBBoard versatilepb; |
@ -0,0 +1,16 @@ |
|||||||
|
#include <iostream> |
||||||
|
#include "common.h" |
||||||
|
#include "arm.h" |
||||||
|
|
||||||
|
struct VirtBoard: ARMBoard { |
||||||
|
void say_hello(); |
||||||
|
}; |
||||||
|
|
||||||
|
void VirtBoard::say_hello() |
||||||
|
{ |
||||||
|
some_arm_thing(); |
||||||
|
std::cout << ANSI_START << "I am the virt board" |
||||||
|
<< ANSI_END << std::endl; |
||||||
|
} |
||||||
|
|
||||||
|
static VirtBoard virt; |
@ -0,0 +1,16 @@ |
|||||||
|
#include <iostream> |
||||||
|
#include "common.h" |
||||||
|
#include "arm.h" |
||||||
|
|
||||||
|
struct XlnxZCU102Board: ARMBoard { |
||||||
|
void say_hello(); |
||||||
|
}; |
||||||
|
|
||||||
|
void XlnxZCU102Board::say_hello() |
||||||
|
{ |
||||||
|
some_arm_thing(); |
||||||
|
std::cout << ANSI_START << "I am the xlnx_zcu102 board" |
||||||
|
<< ANSI_END << std::endl; |
||||||
|
} |
||||||
|
|
||||||
|
static XlnxZCU102Board xlnx_zcu102; |
@ -0,0 +1,7 @@ |
|||||||
|
specific.add(when: 'TARGET_ARM', if_true: files('arm/arm.cc', 'arm/arm32.cc')) |
||||||
|
specific.add(when: 'TARGET_AARCH64', if_true: files('arm/arm.cc', 'arm/aarch64.cc')) |
||||||
|
specific.add(when: 'CONFIG_VIRT', if_true: files('arm/virt.cc')) |
||||||
|
specific.add(when: 'CONFIG_XLNX_ZCU102', if_true: files('arm/xlnx_zcu102.cc')) |
||||||
|
specific.add(when: 'CONFIG_VERSATILEPB', if_true: files('arm/versatilepb.cc')) |
||||||
|
|
||||||
|
specific.add(when: 'TARGET_X86', if_true: files('x86/pc.cc')) |
@ -0,0 +1,26 @@ |
|||||||
|
#include <iostream> |
||||||
|
#include "common.h" |
||||||
|
|
||||||
|
struct X86Board: Board { |
||||||
|
const char *target(); |
||||||
|
void say_hello(); |
||||||
|
}; |
||||||
|
|
||||||
|
const char *X86Board::target() |
||||||
|
{ |
||||||
|
return THE_TARGET; |
||||||
|
} |
||||||
|
|
||||||
|
void X86Board::say_hello() |
||||||
|
{ |
||||||
|
std::cout << ANSI_START << "I am a 1996 PC" |
||||||
|
<< ANSI_END << std::endl; |
||||||
|
} |
||||||
|
|
||||||
|
void initialize_target() |
||||||
|
{ |
||||||
|
std::cout << ANSI_START << "ready, set, go" |
||||||
|
<< ANSI_END << std::endl; |
||||||
|
} |
||||||
|
|
||||||
|
static X86Board pc; |
@ -0,0 +1,41 @@ |
|||||||
|
#ifndef COMMON_H |
||||||
|
#define COMMON_H 1 |
||||||
|
|
||||||
|
/*
|
||||||
|
* target-specific code will print in yellow, common code will print |
||||||
|
* in grey. |
||||||
|
*/ |
||||||
|
#ifdef THE_TARGET |
||||||
|
#define ANSI_START "\x1b[33;1m" |
||||||
|
#define ANSI_END "\x1b[0m" |
||||||
|
#else |
||||||
|
#define ANSI_START "" |
||||||
|
#define ANSI_END "" |
||||||
|
#endif |
||||||
|
|
||||||
|
void some_random_function(); |
||||||
|
void initialize_target(); |
||||||
|
|
||||||
|
struct Board { |
||||||
|
Board *next; |
||||||
|
Board(); |
||||||
|
virtual ~Board(); |
||||||
|
virtual void say_hello() = 0; |
||||||
|
virtual const char *target() = 0; |
||||||
|
}; |
||||||
|
|
||||||
|
struct Device { |
||||||
|
Device *next; |
||||||
|
Device(); |
||||||
|
virtual ~Device(); |
||||||
|
virtual void say_hello() = 0; |
||||||
|
}; |
||||||
|
|
||||||
|
struct Dependency { |
||||||
|
Dependency *next; |
||||||
|
Dependency(); |
||||||
|
virtual ~Dependency(); |
||||||
|
virtual void initialize() = 0; |
||||||
|
}; |
||||||
|
|
||||||
|
#endif |
@ -0,0 +1,5 @@ |
|||||||
|
TARGET_AARCH64=y |
||||||
|
CONFIG_VIRT=y |
||||||
|
CONFIG_XLNX_ZCU102=y |
||||||
|
CONFIG_VIRTIO=y |
||||||
|
CONFIG_VIRTIO_MMIO=y |
@ -0,0 +1,3 @@ |
|||||||
|
TARGET_ARM=y |
||||||
|
CONFIG_VIRT=y |
||||||
|
CONFIG_VERSATILEPB=y |
@ -0,0 +1,4 @@ |
|||||||
|
TARGET_X86=y |
||||||
|
CONFIG_PC=y |
||||||
|
CONFIG_VIRTIO=y |
||||||
|
CONFIG_VIRTIO_PCI=y |
@ -0,0 +1,3 @@ |
|||||||
|
specific.add(when: 'CONFIG_VIRTIO', if_true: files('virtio.cc')) |
||||||
|
common.add(when: 'CONFIG_VIRTIO_PCI', if_true: files('virtio-pci.cc')) |
||||||
|
common.add(when: 'CONFIG_VIRTIO_MMIO', if_true: files('virtio-mmio.cc')) |
@ -0,0 +1,16 @@ |
|||||||
|
#include <iostream> |
||||||
|
#include "common.h" |
||||||
|
#include "virtio.h" |
||||||
|
|
||||||
|
struct VirtioMMIODevice: VirtioDevice { |
||||||
|
void say_hello(); |
||||||
|
}; |
||||||
|
|
||||||
|
void VirtioMMIODevice::say_hello() |
||||||
|
{ |
||||||
|
some_virtio_thing(); |
||||||
|
std::cout << ANSI_START << "virtio-mmio is available" |
||||||
|
<< ANSI_END << std::endl; |
||||||
|
} |
||||||
|
|
||||||
|
static VirtioMMIODevice virtio_mmio; |
@ -0,0 +1,16 @@ |
|||||||
|
#include <iostream> |
||||||
|
#include "common.h" |
||||||
|
#include "virtio.h" |
||||||
|
|
||||||
|
struct VirtioPCIDevice: VirtioDevice { |
||||||
|
void say_hello(); |
||||||
|
}; |
||||||
|
|
||||||
|
void VirtioPCIDevice::say_hello() |
||||||
|
{ |
||||||
|
some_virtio_thing(); |
||||||
|
std::cout << ANSI_START << "virtio-pci is available" |
||||||
|
<< ANSI_END << std::endl; |
||||||
|
} |
||||||
|
|
||||||
|
static VirtioPCIDevice virtio_pci; |
@ -0,0 +1,6 @@ |
|||||||
|
#include <iostream> |
||||||
|
#include "common.h" |
||||||
|
#include "virtio.h" |
||||||
|
|
||||||
|
void VirtioDevice::some_virtio_thing() { |
||||||
|
} |
@ -0,0 +1,10 @@ |
|||||||
|
#ifndef VIRTIO_H |
||||||
|
#define VIRTIO_H 1 |
||||||
|
|
||||||
|
#include "common.h" |
||||||
|
|
||||||
|
struct VirtioDevice: Device { |
||||||
|
void some_virtio_thing(); |
||||||
|
}; |
||||||
|
|
||||||
|
#endif |
@ -0,0 +1,32 @@ |
|||||||
|
#include <iostream> |
||||||
|
#include <vector> |
||||||
|
#include "common.h" |
||||||
|
|
||||||
|
Board* boards; |
||||||
|
Device* devices; |
||||||
|
Dependency* deps; |
||||||
|
|
||||||
|
Board::Board() { this->next = boards; boards = this; } |
||||||
|
Board::~Board() {} |
||||||
|
|
||||||
|
Device::Device() { this->next = devices; devices = this; } |
||||||
|
Device::~Device() {} |
||||||
|
|
||||||
|
Dependency::Dependency() { this->next = deps; deps = this; } |
||||||
|
Dependency::~Dependency() {} |
||||||
|
|
||||||
|
int main() |
||||||
|
{ |
||||||
|
some_random_function(); |
||||||
|
for (auto d = deps; d; d = d->next) |
||||||
|
d->initialize(); |
||||||
|
|
||||||
|
initialize_target(); |
||||||
|
for (auto b = boards; b; b = b->next) { |
||||||
|
std::cout << ANSI_START << b->target() << " - " << ANSI_END; |
||||||
|
b->say_hello(); |
||||||
|
} |
||||||
|
|
||||||
|
for (auto d = devices; d; d = d->next) |
||||||
|
d->say_hello(); |
||||||
|
} |
@ -0,0 +1,44 @@ |
|||||||
|
# a sort-of realistic example that combines the sourceset and kconfig |
||||||
|
# modules, inspired by QEMU's build system |
||||||
|
|
||||||
|
project('sourceset-example', 'cpp') |
||||||
|
ss = import('sourceset') |
||||||
|
kconfig = import('unstable-kconfig') |
||||||
|
|
||||||
|
zlib = dependency('zlib', version : '>=1.2.8', required: false) |
||||||
|
not_found = dependency('not-found', required: false) |
||||||
|
|
||||||
|
common = ss.source_set() |
||||||
|
specific = ss.source_set() |
||||||
|
|
||||||
|
common.add(files('main.cc')) |
||||||
|
common.add(when: zlib, if_true: files('zlib.cc')) |
||||||
|
common.add(when: not_found, |
||||||
|
if_true: files('was-found.cc'), |
||||||
|
if_false: files('not-found.cc')) |
||||||
|
|
||||||
|
subdir('boards') |
||||||
|
subdir('devices') |
||||||
|
|
||||||
|
if meson.is_unity() |
||||||
|
specific.add_all(common) |
||||||
|
common = ss.source_set() |
||||||
|
endif |
||||||
|
|
||||||
|
common_lib = static_library('common', common.all_sources()) |
||||||
|
|
||||||
|
targets = [ 'arm', 'aarch64', 'x86' ] |
||||||
|
target_dirs = { 'arm' : 'arm', 'aarch64' : 'arm', 'x86': 'x86' } |
||||||
|
|
||||||
|
foreach x : targets |
||||||
|
config = kconfig.load('config' / x) |
||||||
|
target_specific = specific.apply(config, strict: false) |
||||||
|
target_common = common.apply(config, strict: false) |
||||||
|
target_deps = target_specific.dependencies() + target_common.dependencies() |
||||||
|
executable(x, |
||||||
|
objects: common_lib.extract_objects(target_common.sources()), |
||||||
|
sources: target_specific.sources(), |
||||||
|
dependencies: target_deps, |
||||||
|
include_directories: 'boards' / target_dirs[x], |
||||||
|
cpp_args: '-DTHE_TARGET="' + x + '"') |
||||||
|
endforeach |
@ -0,0 +1,8 @@ |
|||||||
|
#include <iostream> |
||||||
|
#include "common.h" |
||||||
|
|
||||||
|
void some_random_function() |
||||||
|
{ |
||||||
|
std::cout << ANSI_START << "everything's alright" |
||||||
|
<< ANSI_END << std::endl; |
||||||
|
} |
@ -0,0 +1,7 @@ |
|||||||
|
#include <iostream> |
||||||
|
|
||||||
|
void some_random_function() |
||||||
|
{ |
||||||
|
std::cout << ANSI_START << "huh?" |
||||||
|
<< ANSI_END << std::endl; |
||||||
|
} |
@ -0,0 +1,13 @@ |
|||||||
|
#include <iostream> |
||||||
|
#include "common.h" |
||||||
|
|
||||||
|
struct ZLibDependency : Dependency { |
||||||
|
void initialize(); |
||||||
|
}; |
||||||
|
|
||||||
|
void ZLibDependency::initialize() { |
||||||
|
std::cout << ANSI_START << "hello from zlib" |
||||||
|
<< ANSI_END << std::endl; |
||||||
|
} |
||||||
|
|
||||||
|
ZLibDependency zlib; |
Loading…
Reference in new issue