1#!/bin/bash
2#
3# NAME:
4#         libacpica.sh - ACPICA release script library
5#
6#
7
8if [ -z $SCRIPT ]; then
9	echo "SCRIPT is empty, please invoking libacpica.sh from release scripts."
10	exit 1
11fi
12
13CURDIR=`pwd`
14TOOLDIR=$SCRIPT/bin
15ACPISRC=$TOOLDIR/acpisrc
16ACPI_TYPES=
17
18linux_dirs()
19{
20	local dirs
21
22	dirs="\
23		drivers/acpi/acpica \
24		include/acpi \
25		include/acpi/platform \
26		tools/power/acpi/common \
27		tools/power/acpi/os_specific/service_layers \
28		tools/power/acpi/tools/acpidump \
29	"
30	echo $dirs
31}
32
33acpica_privs()
34{
35	local incs
36
37	incs="\
38		acapps.h \
39		accommon.h \
40		acdebug.h acdispat.h \
41		acevents.h \
42		acglobal.h \
43		achware.h \
44		acinterp.h \
45		aclocal.h \
46		acmacros.h \
47		acnamesp.h \
48		acobject.h acopcode.h \
49		acparser.h acpredef.h \
50		acresrc.h \
51		acstruct.h \
52		actables.h \
53		acutils.h \
54		amlcode.h amlresrc.h \
55	"
56	echo $incs
57}
58
59acpica_drivers_paths()
60{
61	local paths incs inc
62
63	paths="\
64		components/debugger \
65		components/dispatcher \
66		components/events \
67		components/executer \
68		components/hardware \
69		components/namespace \
70		components/parser \
71		components/resources \
72		components/tables \
73		components/utilities \
74	"
75	incs=`acpica_privs`
76	for inc in $incs; do
77		paths="$paths include/$inc"
78	done
79	echo $paths
80}
81
82acpica_tools_paths()
83{
84	local paths incs inc
85
86	paths="\
87		common/getopt.c \
88		common/cmfsize.c \
89		os_specific/service_layers/oslibcfs.c \
90		os_specific/service_layers/oslinuxtbl.c \
91		os_specific/service_layers/osunixdir.c \
92		os_specific/service_layers/osunixmap.c \
93		os_specific/service_layers/osunixxf.c \
94		tools/acpidump \
95	"
96	echo $paths
97}
98
99acpica_exclude_paths()
100{
101	local paths
102
103	paths="\
104		include/acpi/acclib.h \
105		include/acpi/acdisasm.h \
106		include/acpi/platform/accygwin.h \
107		include/acpi/platform/acefi.h \
108		include/acpi/platform/acefiex.h \
109		include/acpi/platform/acfreebsd.h \
110		include/acpi/platform/achaiku.h \
111		include/acpi/platform/acintel.h \
112		include/acpi/platform/acmacosx.h \
113		include/acpi/platform/acmsvc.h \
114		include/acpi/platform/acmsvcex.h \
115		include/acpi/platform/acnetbsd.h \
116		include/acpi/platform/acos2.h \
117		include/acpi/platform/acqnx.h \
118		include/acpi/platform/acwin.h \
119		include/acpi/platform/acwinex.h \
120		include/acpi/platform/acwin64.h \
121		include/acpi/platform/acdragonfly.h \
122		include/acpi/platform/acdragonflyex.h \
123		drivers/acpi/acpica/utclib.c \
124	"
125	echo $paths
126}
127
128fulldir()
129{
130	( cd $1; pwd )
131}
132
133getdir()
134{
135	local lpath
136
137	lpath=`dirname $1`
138	fulldir $lpath
139}
140
141getfile()
142{
143	local d f
144
145	d=`getdir $1`
146	f=`basename $1`
147	echo $d/$f
148}
149
150identify_bits()
151{
152	local arch no64
153
154	arch=`uname -m`
155	no64=`echo ${arch%64}`
156
157	if [ "x$arch" != "x$no64" ] ; then
158		echo 64
159	else
160		echo 32
161	fi
162}
163
164make_tool()
165{
166	local srcdir acpi_tool tooldir bits
167
168	srcdir=$1
169	acpi_tool=$2
170
171	tooldir=$srcdir/generate/unix
172	bits=`identify_bits`
173
174	mkdir -p $TOOLDIR
175	make -C $srcdir $acpi_tool
176
177	if [ ! -f $tooldir/bin$bits/$acpi_tool ]; then
178		bits=
179	fi
180
181	cp $tooldir/bin$bits/$acpi_tool $TOOLDIR
182}
183
184clean_tool()
185{
186	local srcdir acpi_tool tooldir bits
187
188	srcdir=$1
189	acpi_tool=$2
190
191	tooldir=$srcdir/generate/unix
192	bits=`identify_bits`
193
194	if [ -f $tooldir/bin$bits/$acpi_tool ]; then
195		rm -f $tooldir/bin$bits/$acpi_tool
196		rm -rf $tooldir/$acpi_tool/obj$bits
197	fi
198	if [ -f $tooldir/bin/$acpi_tool ]; then
199		rm -f $tooldir/bin/$acpi_tool
200		rm -rf $tooldir/$acpi_tool/obj
201	fi
202
203	rm -f $tooldir/bin$bits/$acpi_tool
204}
205
206clean_acpisrc()
207{
208	clean_tool $1 acpisrc
209}
210
211make_acpisrc()
212{
213	if [ "x$2" = "xforce" ]; then
214		clean_tool $1 acpisrc
215	fi
216	make_tool $1 acpisrc
217}
218
219find_typedefs()
220{
221	cat $1 | awk '
222	{
223		if (match($0, /^typedef[_a-zA-Z0-9\* \t]+;/)) {
224			s1=substr($0, RSTART, RLENGTH)
225			if (match(s1, /^typedef[ \t]+/)) {
226				s2=substr(s1, RLENGTH+1)
227				if (match(s2, /(signed|unsigned)[ \t]+/)) {
228					s3=substr(s2, RLENGTH+1)
229				} else {
230					s3=s2
231				}
232				if (match(s3, /[_a-zA-Z0-9]+[ \t]+/)) {
233					s4=substr(s3, RLENGTH+1)
234					if (match(s4, /\*[ \t]*/)) {
235						s5=substr(s4, RLENGTH+1)
236					} else {
237						s5=s4
238					}
239					if (match(s5, /[_a-zA-Z0-9]+/)) {
240						def=substr(s5, RSTART, RLENGTH)
241						print def
242					}
243				}
244			}
245		}
246	}
247	'
248}
249
250find_all_typedefs()
251{
252	local f files
253
254	files=`find . -name "*.h"`
255	for f in $files; do
256		find_typedefs $f
257	done
258}
259
260lindent_find_typedefs()
261{
262	ACPI_TYPES=`find_all_typedefs | sort | uniq`
263}
264
265lindent_single()
266{
267	local t indent_flags
268
269	indent_flags="-npro -kr -i8 -ts8 -sob -l80 -ss -ncs -il0"
270	for t in $ACPI_TYPES; do
271		if [ "x$2" = "xtrue" ]; then
272			echo " Adding type $t"
273		fi
274		indent_flags="$indent_flags -T $t"
275	done
276
277	dos2unix $1 > /dev/null 2>&1
278	indent $indent_flags $1
279}
280
281lindent()
282{
283	local files f verbose=true
284
285	(
286		cd $1
287		lindent_find_typedefs
288		files=`find . -name "*.[ch]" | cut -c3-`
289		for f in $files; do
290			lindent_single $f $verbose
291			verbose=false
292		done
293		find . -name "*~" | xargs rm -f
294	)
295}
296
297linuxize_format()
298{
299	echo " Converting (acpisrc -l)..."
300	$ACPISRC -ldqy $1 $1 > /dev/null
301
302	echo " Converting (indent)..."
303	lindent $1
304
305	echo " Converting (acpisrc -i)..."
306	$ACPISRC -idqy $1 $1 > /dev/null
307}
308
309copy_linux_hierarchy()
310{
311	local from to dirs dir
312
313	from=$1
314	to=$2
315
316	rm -rf $to
317	dirs=`linux_dirs`
318
319	for dir in $dirs; do
320		echo " Copying ($dir)..."
321		mkdir -p $to/$dir
322		cp $from/$dir/*.[ch] $to/$dir/
323	done
324}
325
326linuxize_hierarchy_ref()
327{
328	local linux acpica to
329	local all_files
330	local t n d f
331	local private_includes inc
332
333	linux=$1
334	acpica=$2
335	to=$3
336
337	rm -rf $to
338	mkdir -p $to
339
340	#
341	# Ensure that the files in the two directories
342	# (native ACPICA and Linux ACPICA) match
343	#
344
345	all_files=`find $linux`
346
347	for t in $all_files ; do
348		if [ -f $t ] ; then
349			n=${t#${linux}/}
350			d=$to/`dirname $n`
351			f=`find $acpica/source -name \`basename $t\``
352			if [ ! -z $f ] ; then
353				mkdir -p $d
354				cp -f $f $d
355			else
356				echo " Removing ($n)..."
357				rm -f $t
358			fi
359		fi
360	done
361
362	private_includes=`acpica_privs`
363
364	# Do we need to perform things on private_includes?
365	for inc in $private_includes ; do
366		if [ -f $to/include/acpi/$inc ] ; then
367			echo "Warning: private include file $inc is now public.  Please check the linuxize.sh"
368		elif [ ! -f $to/drivers/acpi/acpica/$inc ] ; then
369			echo "Warning: private include file $inc does not exist.  Please check the linuxize.sh."
370		fi
371	done
372}
373
374linuxize_hierarchy_noref()
375{
376	local repo_linux paths path
377
378	repo_linux=$1
379
380	(
381		cd $repo_linux
382
383		# Making hierarchy
384
385		# Making source files
386		mkdir -p drivers/acpi/acpica
387		paths=`acpica_drivers_paths`
388		for path in $paths; do
389			if [ -d source/$path ]; then
390				echo " Moving directory $path..."
391				mv source/$path/*.[ch] drivers/acpi/acpica/
392			fi
393			if [ -f source/$path ]; then
394				echo " Moving file $path..."
395				mv source/$path drivers/acpi/acpica/
396			fi
397		done
398
399		# Making include files
400		mkdir -p include/acpi
401		mv -f source/include/* include/acpi
402
403		# Making tools/power/acpi files
404		paths=`acpica_tools_paths`
405		for path in $paths; do
406			if [ -d source/$path ]; then
407				echo " Moving directory $path..."
408				mkdir -p tools/power/acpi/$path
409				mv source/$path/*.[ch] tools/power/acpi/$path/
410			fi
411			if [ -f source/$path ]; then
412				echo " Moving file $path..."
413				mkdir -p `dirname tools/power/acpi/$path`
414				mv source/$path tools/power/acpi/$path
415			fi
416		done
417
418		# Removing non-Linux files
419		paths=`acpica_exclude_paths`
420		for path in $paths; do
421			if [ -d $path ]; then
422				echo " Removing directory $path..."
423				rm -rf $path
424			fi
425			if [ -f $path ]; then
426				echo " Removing file $path..."
427				rm -f $path
428			fi
429		done
430
431		rm -rf source
432	)
433}
434
435SRCDIR=`fulldir $SCRIPT/../..`
436