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.


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 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

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



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;
This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies
  • Last modified: 2021/02/02 02:05
  • by bbmian