Code Style Guide

This is a draft of the official OpenWrt Code Style Guide: conventions to follow when writing code for OpenWrt. //It is not yet approved or agreed upon, and is subject to change based on discussion and consensus // but is drafted here based on common trends observed in the codebase.

General

Applies to all source code files.

  • Code can be indented using either tabs or spaces, as long as it is consistent within the source code file
  • Avoid trailing spaces at the end of lines
  • Files should be terminated with a new line

The main shell used in OpenWrt is the Almquist Shell, ash/sh (#!/bin/sh). Code should conform to the POSIX specification. Tools such as shellcheck can be used to ensure code conforms to the POSIX specification. Some important examples include: variable quoting and the expression of logical statements.

Scripts that launch programs or services are typically stored in the /etc/init.d/ directory. These scripts are written for either procd or the deprecated ucitrack.

  • An opening curly brace goes on the same line as the function declaration, e.g.: my_function() {

Files to store configuration have their own formatting, see this link for details: uci

Makefiles

Makefiles have their own special mix of syntax that must be observed.

  • Use tabs instead of spaces for all sections except for the Package/description section

For the Package/description section, indent with two spaces:

define Package/example
  SECTION:=utils
  CATEGORY:=Utilities
  TITLE:=Example
  DEPENDS:=+example-dependency
endef

Other functions should be indented with a full tab:

define Package/example/install
	$(INSTALL_DIR) $(1)/etc/init.d
	$(INSTALL_BIN) ./files/example.init $(1)/etc/init.d/example
	$(INSTALL_DIR) $(1)/usr/bin
	$(INSTALL_BIN) ./files/example $(1)/usr/bin/example
	$(INSTALL_DIR) $(1)/etc/config
	$(INSTALL_DATA) ./files/example.config $(1)/etc/config/example
endef

LuCI

Options

Option signatures should be put onto a new line after the option name, and subsequent parameters in the signature started on their own line. Line breaks should be tabbed in to be flush with the line above.

		o = s.taboption('general', widgets.NetworkSelect, 'mmifacename',
			_('Name of ModemManager Interface'), 
			_("Applies to Ping Reboot and Restart Interface modes</i> <br> If using ModemManager, \
				you can have Watchcat restart your ModemManger interface by specifying its name."));
		o.depends({ mode: 'restart_iface' });
		o.optional = true;
  • Last modified: 2021/02/02 02:05
  • by bbmian