Table of Contents

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.

Scripts

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.

Init Scripts

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.

Config Files

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.

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

Javascript

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;