#!/bin/sh # # cmake-format - a simple cmake formatter # # Copyright (c) 2019 Ralf Habacker # # SPDX-License-Identifier: BSD # # Redistribution and use is allowed according to the terms of the BSD license. # if test -z "$1"; then echo "format cmake files by Ralf Habacker" echo echo "Usage: $0 --all | --end-args | --indents | --keyword-case | --keyword-spaces | --tabs | --trailing-spaces" echo echo "command line parameter:" echo " --all all above" echo " --end-args remove obsolete parameter list from end... cmake commands" echo " --indents fix indents (requires keyword-case)" echo " --keyword-case make all cmake keywords lowercase" echo " --keyword-spaces remove spaces between keyword and opening bracket" echo " --tabs replace tabs by 4 spaces" echo " --trailing-spaces remove trailing spaces" exit 1 fi # only apply to cmake keywords KEYWORDS=$(cmake --help-command-list) # do not search in comments range="/^[ ]*#/!" # use 4 spaces indent="\ \ \ \ " # remove tabs exp="${range}s/\t/${indent}/g" expt=$exp # remove trailing spaces exp="${range}s/[ \t]*$//" expts=$exp # fix indents exp= for j in $(echo $KEYWORDS); do exp="$exp;${range}s/^ \{1,3\}$j(/${indent}$j(/g" exp="$exp;${range}s/^ \{5,7\}$j(/${indent}${indent}$j(/g" exp="$exp;${range}s/^ \{9,11\}$j(/${indent}${indent}${indent}$j(/g" done expki=$exp # convert upper case keywords to lower case exp= for j in $(echo $KEYWORDS); do u=$(echo $j | sed 's/.*/\U&/') exp="$exp;${range}s/$u[ \t]*(/$j(/g" done expku=$exp # remove spaces after keywords and ( exp= for j in $(echo $KEYWORDS); do exp="$exp;${range}s/$j[ \t]\+(/$j(/g" done expks=$exp # remove obsolete arguments from end...() exp= for j in $(echo $KEYWORDS); do e=$(echo $j | grep '^end') if test -n "$e"; then exp="$exp;${range}s/$j(.*)/$j()/g" fi done expke=$exp if test "$1" == "--all"; then exp="${expt}${expts}${expku}${expki}${expks}${expke}" elif test "$1" == "--end-args"; then exp=$expke elif test "$1" == "--indents"; then exp=$expki elif test "$1" == "--keyword-case"; then exp=$expku elif test "$1" == "--keyword-spaces"; then exp=$expks elif test "$1" == "--tabs"; then exp=$expt elif test "$1" == "--trailing-spaces"; then exp=$expts fi # setup dir to apply s=$(dirname $0) root=$(realpath $s/../cmake) #echo $exp #echo $root echo "locations with unusual indention level changes, please inspect" # apply to cmake related files for i in $(find $root -name 'CMakeLists.txt' -o -name '*.cmake' | grep -v README.cmake | grep -v config.h.cmake | grep -v bat.cmake | grep -v '/Find'); do # apply style sed -i "$exp" $i # show unusual indention changes gawk 'BEGIN { indent=0 } $0 ~ /^ {0}/ && $0 !~ /^$/{ indent=0; } $0 ~ /^ {4}/ { indent=1; } $0 ~ /^ {8}/ { indent=2; } $0 ~ /^ {12}/ { indent=3; } { if (indent - oldindent > 1) print FILENAME ":" NR ":" $0; oldindent=indent;}' $i done