1 # SPDX-License-Identifier: GPL-2.0-only
2 # Makefile for cpupower
4 # Copyright (C) 2005,2006 Dominik Brodowski <linux@dominikbrodowski.net>
6 # Based largely on the Makefile for udev by:
8 # Copyright (C) 2003,2004 Greg Kroah-Hartman <greg@kroah.com>
11 ifeq ("$(origin O)", "command line")
16 # check that the output directory actually exists
17 OUTDIR
:= $(shell cd
$(OUTPUT
) && pwd
)
18 $(if
$(OUTDIR
),, $(error output directory
"$(OUTPUT)" does not exist
))
22 # --- CONFIGURATION BEGIN ---
24 # Set the following to `true' to make a unstripped, unoptimized
25 # binary. Leave this set to `false' for production use.
28 # make the build silent. Set this to something else to make it noisy again.
31 # Internationalization support (output in different languages).
35 # Set the following to 'true' to build/install the
36 # cpufreq-bench benchmarking tool
39 # Do not build libraries, but build the code in statically
40 # Libraries are still built, otherwise the Makefile code would
42 export STATIC ?
= false
44 # Prefix to the directories we're installing to
47 # --- CONFIGURATION END ---
51 # Package-related definitions. Distributions can modify the version
52 # and _should_ modify the PACKAGE_BUGREPORT definition
54 VERSION
:= $(shell .
/utils
/version-gen.sh
)
59 PACKAGE_BUGREPORT
= linux-pm@vger.kernel.org
60 LANGUAGES
= de fr it cs pt ka zh_CN
63 # Directory definitions. These are default and most probably
64 # do not need to be changed. Please note that DESTDIR is
65 # added in front of any of them
71 includedir ?
= /usr
/include
72 localedir ?
= /usr
/share
/locale
73 docdir ?
= /usr
/share
/doc
/packages
/cpupower
75 bash_completion_dir ?
= /usr
/share
/bash-completion
/completions
77 # Toolchain: what tools do we use, and what options do they need:
80 INSTALL
= /usr
/bin
/install -c
81 INSTALL_PROGRAM
= ${INSTALL}
82 INSTALL_DATA
= ${INSTALL} -m
644
83 #bash completion scripts get sourced and so they should be rw only.
84 INSTALL_SCRIPT
= ${INSTALL} -m
644
86 # If you are running a cross compiler, you may want to set this
87 # to something more interesting, like "arm-linux-". If you want
88 # to compile vs uClibc, that can be done here as well.
89 CROSS ?
= #/usr/i386-linux-uclibc/usr/bin/i386-uclibc-
93 STRIP ?
= $(CROSS
)strip
94 RANLIB ?
= $(CROSS
)ranlib
98 # Now we set up the build system
101 GMO_FILES
= ${shell for HLANG in
${LANGUAGES}; do echo
$(OUTPUT
)po
/$$HLANG.gmo
; done
;}
103 export CROSS CC AR STRIP RANLIB CFLAGS LDFLAGS LIB_OBJS
105 # check if compiler option is supported
106 cc-supports
= ${shell if
$(CC
) ${1} -S
-o
/dev
/null
-x c
/dev
/null
> /dev
/null
2>&1; then echo
"$(1)"; fi
;}
108 # use '-Os' optimization if available, else use -O2
109 OPTIMIZATION
:= $(call cc-supports
,-Os
,-O2
)
111 WARNINGS
:= -Wall
-Wchar-subscripts
-Wpointer-arith
-Wsign-compare
112 WARNINGS
+= $(call cc-supports
,-Wno-pointer-sign
)
113 WARNINGS
+= $(call cc-supports
,-Wdeclaration-after-statement
)
116 override CFLAGS
+= -DVERSION
=\"$(VERSION
)\" -DPACKAGE
=\"$(PACKAGE
)\" \
117 -DPACKAGE_BUGREPORT
=\"$(PACKAGE_BUGREPORT
)\" -D_GNU_SOURCE
119 UTIL_OBJS
= utils
/helpers
/amd.o utils
/helpers
/msr.o \
120 utils
/helpers
/sysfs.o utils
/helpers
/misc.o utils
/helpers
/cpuid.o \
121 utils
/helpers
/pci.o utils
/helpers
/bitmask.o \
122 utils
/idle_monitor
/nhm_idle.o utils
/idle_monitor
/snb_idle.o \
123 utils
/idle_monitor
/hsw_ext_idle.o \
124 utils
/idle_monitor
/amd_fam14h_idle.o utils
/idle_monitor
/cpuidle_sysfs.o \
125 utils
/idle_monitor
/mperf_monitor.o utils
/idle_monitor
/cpupower-monitor.o \
126 utils
/idle_monitor
/rapl_monitor.o \
127 utils
/cpupower.o utils
/cpufreq-info.o utils
/cpufreq-set.o \
128 utils
/cpupower-set.o utils
/cpupower-info.o utils
/cpuidle-info.o \
129 utils
/cpuidle-set.o utils
/powercap-info.o
131 UTIL_SRC
:= $(UTIL_OBJS
:.o
=.c
)
133 UTIL_OBJS
:= $(addprefix $(OUTPUT
),$(UTIL_OBJS
))
135 UTIL_HEADERS
= utils
/helpers
/helpers.h utils
/idle_monitor
/cpupower-monitor.h \
136 utils
/helpers
/bitmask.h \
137 utils
/idle_monitor
/idle_monitors.h utils
/idle_monitor
/idle_monitors.def
139 LIB_HEADERS
= lib
/cpufreq.h lib
/cpupower.h lib
/cpuidle.h lib
/acpi_cppc.h \
141 LIB_SRC
= lib
/cpufreq.c lib
/cpupower.c lib
/cpuidle.c lib
/acpi_cppc.c \
143 LIB_OBJS
= lib
/cpufreq.o lib
/cpupower.o lib
/cpuidle.o lib
/acpi_cppc.o \
145 LIB_OBJS
:= $(addprefix $(OUTPUT
),$(LIB_OBJS
))
147 override CFLAGS
+= -pipe
149 ifeq ($(strip $(NLS
)),true
)
150 INSTALL_NLS
+= install-gmo
151 COMPILE_NLS
+= create-gmo
152 override CFLAGS
+= -DNLS
155 ifeq ($(strip $(CPUFREQ_BENCH
)),true
)
156 INSTALL_BENCH
+= install-bench
157 COMPILE_BENCH
+= compile-bench
160 ifeq ($(strip $(STATIC
)),true
)
161 UTIL_OBJS
+= $(LIB_OBJS
)
162 UTIL_HEADERS
+= $(LIB_HEADERS
)
163 UTIL_SRC
+= $(LIB_SRC
)
166 override CFLAGS
+= $(WARNINGS
)
168 ifeq ($(strip $(V
)),false
)
177 # if DEBUG is enabled, then we do not strip or optimize
178 ifeq ($(strip $(DEBUG
)),true
)
179 override CFLAGS
+= -O1
-g
-DDEBUG
180 STRIPCMD
= /bin
/true
-Since_we_are_debugging
182 override CFLAGS
+= $(OPTIMIZATION
) -fomit-frame-pointer
183 STRIPCMD
= $(STRIP
) -s
--remove-section
=.note
--remove-section
=.comment
187 # the actual make rules
189 all: libcpupower
$(OUTPUT
)cpupower
$(COMPILE_NLS
) $(COMPILE_BENCH
)
191 $(OUTPUT
)lib
/%.o
: $(LIB_SRC
) $(LIB_HEADERS
)
193 $(QUIET
) $(CC
) $(CFLAGS
) -fPIC
-o
$@
-c lib
/$*.c
195 $(OUTPUT
)libcpupower.so.
$(LIB_MAJ
): $(LIB_OBJS
)
197 $(QUIET
) $(CC
) -shared
$(CFLAGS
) $(LDFLAGS
) -o
$@ \
198 -Wl
,-soname
,libcpupower.so.
$(LIB_MIN
) $(LIB_OBJS
)
199 @ln
-sf
$(@F
) $(OUTPUT
)libcpupower.so
200 @ln
-sf
$(@F
) $(OUTPUT
)libcpupower.so.
$(LIB_MIN
)
202 libcpupower
: $(OUTPUT
)libcpupower.so.
$(LIB_MAJ
)
204 # Let all .o files depend on its .c file and all headers
205 # Might be worth to put this into utils/Makefile at some point of time
206 $(UTIL_OBJS
): $(UTIL_HEADERS
)
210 $(QUIET
) $(CC
) $(CFLAGS
) -I.
/lib
-I .
/utils
-o
$@
-c
$*.c
212 $(OUTPUT
)cpupower
: $(UTIL_OBJS
) $(OUTPUT
)libcpupower.so.
$(LIB_MAJ
)
214 ifeq ($(strip $(STATIC
)),true
)
215 $(QUIET
) $(CC
) $(CFLAGS
) $(LDFLAGS
) $(UTIL_OBJS
) -lrt
-lpci
-L
$(OUTPUT
) -o
$@
217 $(QUIET
) $(CC
) $(CFLAGS
) $(LDFLAGS
) $(UTIL_OBJS
) -lcpupower
-lrt
-lpci
-L
$(OUTPUT
) -o
$@
219 $(QUIET
) $(STRIPCMD
) $@
221 ifeq (, $(shell which xgettext
))
222 $(warning
"Install xgettext to extract translatable strings.")
224 $(OUTPUT
)po
/$(PACKAGE
).pot
: $(UTIL_SRC
)
225 $(ECHO
) " GETTEXT " $@
226 $(QUIET
) xgettext
--default-domain
=$(PACKAGE
) --add-comments \
227 --keyword
=_
--keyword
=N_
$(UTIL_SRC
) -p
$(@D
) -o
$(@F
)
230 ifeq (, $(shell which msgfmt
))
231 $(warning
"Install msgfmt to generate binary message catalogs.")
233 $(OUTPUT
)po
/%.gmo
: po
/%.po
234 $(ECHO
) " MSGFMT " $@
235 $(QUIET
) msgfmt
-o
$@ po
/$*.po
238 create-gmo
: ${GMO_FILES}
240 ifeq (, $(shell which msgmerge
))
241 $(warning
"Install msgmerge to merge translations.")
243 update-po
: $(OUTPUT
)po
/$(PACKAGE
).pot
244 $(ECHO
) " MSGMRG " $@
245 $(QUIET
) @for HLANG in
$(LANGUAGES
); do \
246 echo
-n
"Updating $$HLANG "; \
247 if msgmerge po
/$$HLANG.po
$< -o \
248 $(OUTPUT
)po
/$$HLANG.new.po
; then \
249 mv
-f
$(OUTPUT
)po
/$$HLANG.new.po
$(OUTPUT
)po
/$$HLANG.po
; \
251 echo
"msgmerge for $$HLANG failed!"; \
252 rm -f
$(OUTPUT
)po
/$$HLANG.new.po
; \
257 compile-bench
: $(OUTPUT
)libcpupower.so.
$(LIB_MAJ
)
258 @V
=$(V
) confdir
=$(confdir
) $(MAKE
) -C bench O
=$(OUTPUT
)
260 # we compile into subdirectories. if the target directory is not the
261 # source directory, they might not exists. So we depend the various
262 # files onto their directories.
263 DIRECTORY_DEPS
= $(LIB_OBJS
) $(UTIL_OBJS
) $(GMO_FILES
)
264 $(DIRECTORY_DEPS
): |
$(sort $(dir $(DIRECTORY_DEPS
)))
266 # In the second step, we make a rule to actually create these directories
267 $(sort $(dir $(DIRECTORY_DEPS
))):
269 $(QUIET
) $(MKDIR
) -p
$@
2>/dev
/null
272 -find
$(OUTPUT
) \
( -not
-type d \
) -and \
( -name
'*~' -o
-name
'*.[oas]' \
) -type f
-print \
274 -rm -f
$(OUTPUT
)cpupower
275 -rm -f
$(OUTPUT
)libcpupower.so
*
276 -rm -rf
$(OUTPUT
)po
/*.gmo
277 -rm -rf
$(OUTPUT
)po
/*.pot
278 $(MAKE
) -C bench O
=$(OUTPUT
) clean
281 install-lib
: libcpupower
282 $(INSTALL
) -d
$(DESTDIR
)${libdir}
283 $(CP
) $(OUTPUT
)libcpupower.so
* $(DESTDIR
)${libdir}/
284 $(INSTALL
) -d
$(DESTDIR
)${includedir}
285 $(INSTALL_DATA
) lib
/cpufreq.h
$(DESTDIR
)${includedir}/cpufreq.h
286 $(INSTALL_DATA
) lib
/cpuidle.h
$(DESTDIR
)${includedir}/cpuidle.h
287 $(INSTALL_DATA
) lib
/powercap.h
$(DESTDIR
)${includedir}/powercap.h
289 install-tools
: $(OUTPUT
)cpupower
290 $(INSTALL
) -d
$(DESTDIR
)${bindir}
291 $(INSTALL_PROGRAM
) $(OUTPUT
)cpupower
$(DESTDIR
)${bindir}
292 $(INSTALL
) -d
$(DESTDIR
)${bash_completion_dir}
293 $(INSTALL_SCRIPT
) cpupower-completion.sh
'$(DESTDIR)${bash_completion_dir}/cpupower'
296 $(INSTALL_DATA
) -D man
/cpupower
.1 $(DESTDIR
)${mandir}/man1
/cpupower
.1
297 $(INSTALL_DATA
) -D man
/cpupower-frequency-set
.1 $(DESTDIR
)${mandir}/man1
/cpupower-frequency-set
.1
298 $(INSTALL_DATA
) -D man
/cpupower-frequency-info
.1 $(DESTDIR
)${mandir}/man1
/cpupower-frequency-info
.1
299 $(INSTALL_DATA
) -D man
/cpupower-idle-set
.1 $(DESTDIR
)${mandir}/man1
/cpupower-idle-set
.1
300 $(INSTALL_DATA
) -D man
/cpupower-idle-info
.1 $(DESTDIR
)${mandir}/man1
/cpupower-idle-info
.1
301 $(INSTALL_DATA
) -D man
/cpupower-set
.1 $(DESTDIR
)${mandir}/man1
/cpupower-set
.1
302 $(INSTALL_DATA
) -D man
/cpupower-info
.1 $(DESTDIR
)${mandir}/man1
/cpupower-info
.1
303 $(INSTALL_DATA
) -D man
/cpupower-monitor
.1 $(DESTDIR
)${mandir}/man1
/cpupower-monitor
.1
304 $(INSTALL_DATA
) -D man
/cpupower-powercap-info
.1 $(DESTDIR
)${mandir}/man1
/cpupower-powercap-info
.1
306 install-gmo
: create-gmo
307 $(INSTALL
) -d
$(DESTDIR
)${localedir}
308 for HLANG in
$(LANGUAGES
); do \
309 echo
'$(INSTALL_DATA) -D $(OUTPUT)po/$$HLANG.gmo $(DESTDIR)${localedir}/$$HLANG/LC_MESSAGES/cpupower.mo'; \
310 $(INSTALL_DATA
) -D
$(OUTPUT
)po
/$$HLANG.gmo
$(DESTDIR
)${localedir}/$$HLANG/LC_MESSAGES
/cpupower.mo
; \
313 install-bench
: compile-bench
314 @
#DESTDIR must be set from outside to survive
315 @sbindir
=$(sbindir
) bindir=$(bindir) docdir
=$(docdir
) confdir
=$(confdir
) $(MAKE
) -C bench O
=$(OUTPUT
) install
317 ifeq ($(strip $(STATIC
)),true
)
318 install: all install-tools install-man
$(INSTALL_NLS
) $(INSTALL_BENCH
)
320 install: all install-lib install-tools install-man
$(INSTALL_NLS
) $(INSTALL_BENCH
)
324 - rm -f
$(DESTDIR
)${libdir}/libcpupower.
*
325 - rm -f
$(DESTDIR
)${includedir}/cpufreq.h
326 - rm -f
$(DESTDIR
)${includedir}/cpuidle.h
327 - rm -f
$(DESTDIR
)${bindir}/utils
/cpupower
328 - rm -f
$(DESTDIR
)${mandir}/man1
/cpupower
.1
329 - rm -f
$(DESTDIR
)${mandir}/man1
/cpupower-frequency-set
.1
330 - rm -f
$(DESTDIR
)${mandir}/man1
/cpupower-frequency-info
.1
331 - rm -f
$(DESTDIR
)${mandir}/man1
/cpupower-set
.1
332 - rm -f
$(DESTDIR
)${mandir}/man1
/cpupower-info
.1
333 - rm -f
$(DESTDIR
)${mandir}/man1
/cpupower-monitor
.1
334 - rm -f
$(DESTDIR
)${mandir}/man1
/cpupower-powercap-info
.1
335 - for HLANG in
$(LANGUAGES
); do \
336 rm -f
$(DESTDIR
)${localedir}/$$HLANG/LC_MESSAGES
/cpupower.mo
; \
340 @echo
'Building targets:'
341 @echo
' all - Default target. Could be omitted. Put build artifacts'
342 @echo
' to "O" cmdline option dir (default: current dir)'
343 @echo
' install - Install previously built project files from the output'
344 @echo
' dir defined by "O" cmdline option (default: current dir)'
345 @echo
' to the install dir defined by "DESTDIR" cmdline or'
346 @echo
' Makefile config block option (default: "")'
347 @echo
' install-lib - Install previously built library binary from the output'
348 @echo
' dir defined by "O" cmdline option (default: current dir)'
349 @echo
' and library headers from "lib/" for userspace to the install'
350 @echo
' dir defined by "DESTDIR" cmdline (default: "")'
351 @echo
' install-tools - Install previously built "cpupower" util from the output'
352 @echo
' dir defined by "O" cmdline option (default: current dir) and'
353 @echo
' "cpupower-completion.sh" script from the src dir to the'
354 @echo
' install dir defined by "DESTDIR" cmdline or Makefile'
355 @echo
' config block option (default: "")'
356 @echo
' install-man - Install man pages from the "man" src subdir to the'
357 @echo
' install dir defined by "DESTDIR" cmdline or Makefile'
358 @echo
' config block option (default: "")'
359 @echo
' install-gmo - Install previously built language files from the output'
360 @echo
' dir defined by "O" cmdline option (default: current dir)'
361 @echo
' to the install dir defined by "DESTDIR" cmdline or Makefile'
362 @echo
' config block option (default: "")'
363 @echo
' install-bench - Install previously built "cpufreq-bench" util files from the'
364 @echo
' output dir defined by "O" cmdline option (default: current dir)'
365 @echo
' to the install dir defined by "DESTDIR" cmdline or Makefile'
366 @echo
' config block option (default: "")'
368 @echo
'Cleaning targets:'
369 @echo
' clean - Clean build artifacts from the dir defined by "O" cmdline'
370 @echo
' option (default: current dir)'
371 @echo
' uninstall - Remove previously installed files from the dir defined by "DESTDIR"'
372 @echo
' cmdline or Makefile config block option (default: "")'
374 .PHONY
: all utils libcpupower update-po create-gmo install-lib install-tools install-man install-gmo
install uninstall clean help