\subsection{Multi-Device build infrastructure} \subsubsection{Framework integration} The framework has been changed to keep control over the application life-cycle. It ensures that the device unspecific code is executed at the right time and provides an API for device specific functionality. The framework specifies a simple interface, which must be implemented by each device. A single function \texttt{Device* getDevice()} must be defined exactly once in each device specific folder. To implement this interface, a static instance of \texttt{Device} is created and returned. Each \texttt{Device} is populated with device specific \texttt{Feature} instances. While the \texttt{Feature}-API leverages common runtime polymorphism to share functionality between features, the initial \texttt{Device} creation uses compile-time polymorphism which reduces the need for memory management and increases performance by avoiding virtual function tables. Listing~\ref{lst:create_device_socket} shows the complete device specific code used for a simple power socket. \begin{lstlisting}[caption={Device specific code for a socket driver.}, label=lst:create_device_socket, basicstyle=\ttfamily\scriptsize] #include "Device.h" #include "features/Socket.h" Device device: constexpr const char NAME[] = "socket"; constexpr const uint16_t GPIO = 12; OnOffFeature socket(&device); Device* getDevice() { return &device; } \end{lstlisting} \subsubsection{Build system} The existing \textit{Makefile} has been refactored to accept a parameter for device type identifiers called \texttt{DEVICE} and to create its whole output inside a subdirectory specific to the device type. Another \textit{Makefile} has been created which scans a project subdirectory and uses each directory in there as container for device specific code. For each of these directories, the other \textit{Makefile} is called and the subdirectories name is used as \texttt{DEVICE} parameter. By splitting the build and recompiling the framework each time before intermixing it with the device specific code, the device type identifier can be used inside the shared framework code. While building a devices firmware, the version identifier file used during updates is also created and stored beside the binary firmware image. For development, each device can be build separately by using the device type identifier as \textit{Makefile} target. In addition the prefix \texttt{/flash} can be used to flash a specific firmware.