summaryrefslogtreecommitdiff
path: root/tools/cmake-format
blob: e9c85722a73c6e66fb61713f9a65d53897832dfd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#!/bin/sh
#
# cmake-format - a simple cmake formatter
#
# Copyright (c) 2019,2021 Ralf Habacker <ralf.habacker@freenet.de>
#
# SPDX-License-Identifier: BSD-3-Clause

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 [<source-dir>]"
	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"
	echo "   --check-indents     check indents"
	echo "   [<source-dir>]      specify root dir to perform the requested action (optional)"
	echo "                       If not specified, dbus source dir root is used"
	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
func=

if test "$1" == "--all"; then
	exp="${expt};${expts}${expku}${expki}${expks}${expke}"
	func=$1
	shift
elif test "$1" == "--end-args"; then
	exp=$expke
	func=$1
	shift
elif test "$1" == "--indents"; then
	exp=$expki
	func=$1
	shift
elif test "$1" == "--keyword-case"; then
	exp=$expku
	func=$1
	shift
elif test "$1" == "--keyword-spaces"; then
	exp=$expks
	func=$1
	shift
elif test "$1" == "--tabs"; then
	exp=$expt
	func=$1
	shift
elif test "$1" == "--trailing-spaces"; then
	exp=$expts
	func=$1
	shift
elif test "$1" == "--check-indents"; then
	echo "locations with unusual indention level changes, please inspect"
	func=$1
	shift
fi

# setup dir to apply
if test -n "$1"; then
    root=$1
else
    s=$(dirname $0)
    root=$(realpath $s/..)
fi

#echo $exp
#echo $root

# script for checking indents
awk='BEGIN { debug=0; indent=0 }
$0 ~ /^ {0}/ && $0 !~ /^$/{ indent=0; }
$0 ~ /^ {4}/ { indent=1; }
$0 ~ /^ {8}/ { indent=2; }
$0 ~ /^ {12}/ { indent=3; }
debug == 1 { print FILENAME "[" NR "]:" indent " " oldindent ":  " $0; }
{ if (indent - oldindent > 1) print FILENAME ":" NR ":" $0; }
{ oldindent = indent;}
'

# 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
	if ! test "$func" = "--check-indents"; then
		sed -i "$exp" $i
	else
		gawk "$awk" $i
	fi
done