linux/tools/power/cpupower/Makefile
<<
>>
Prefs
   1# SPDX-License-Identifier: GPL-2.0-only
   2# Makefile for cpupower
   3#
   4# Copyright (C) 2005,2006 Dominik Brodowski <linux@dominikbrodowski.net>
   5#
   6# Based largely on the Makefile for udev by:
   7#
   8# Copyright (C) 2003,2004 Greg Kroah-Hartman <greg@kroah.com>
   9#
  10OUTPUT=./
  11ifeq ("$(origin O)", "command line")
  12        OUTPUT := $(O)/
  13endif
  14
  15ifneq ($(OUTPUT),)
  16# check that the output directory actually exists
  17OUTDIR := $(shell cd $(OUTPUT) && pwd)
  18$(if $(OUTDIR),, $(error output directory "$(OUTPUT)" does not exist))
  19endif
  20
  21
  22# --- CONFIGURATION BEGIN ---
  23
  24# Set the following to `true' to make a unstripped, unoptimized
  25# binary. Leave this set to `false' for production use.
  26DEBUG ?=        true
  27
  28# make the build silent. Set this to something else to make it noisy again.
  29V ?=            false
  30
  31# Internationalization support (output in different languages).
  32# Requires gettext.
  33NLS ?=          true
  34
  35# Set the following to 'true' to build/install the
  36# cpufreq-bench benchmarking tool
  37CPUFREQ_BENCH ?= true
  38
  39# Do not build libraries, but build the code in statically
  40# Libraries are still built, otherwise the Makefile code would
  41# be rather ugly.
  42export STATIC ?= false
  43
  44# Prefix to the directories we're installing to
  45DESTDIR ?=
  46
  47# --- CONFIGURATION END ---
  48
  49
  50
  51# Package-related definitions. Distributions can modify the version
  52# and _should_ modify the PACKAGE_BUGREPORT definition
  53
  54VERSION:=                       $(shell ./utils/version-gen.sh)
  55LIB_MAJ=                        0.0.1
  56LIB_MIN=                        0
  57
  58PACKAGE =                       cpupower
  59PACKAGE_BUGREPORT =             linux-pm@vger.kernel.org
  60LANGUAGES =                     de fr it cs pt
  61
  62
  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
  66
  67bindir ?=       /usr/bin
  68sbindir ?=      /usr/sbin
  69mandir ?=       /usr/man
  70includedir ?=   /usr/include
  71localedir ?=    /usr/share/locale
  72docdir ?=       /usr/share/doc/packages/cpupower
  73confdir ?=      /etc/
  74bash_completion_dir ?= /usr/share/bash-completion/completions
  75
  76# Toolchain: what tools do we use, and what options do they need:
  77
  78CP = cp -fpR
  79INSTALL = /usr/bin/install -c
  80INSTALL_PROGRAM = ${INSTALL}
  81INSTALL_DATA  = ${INSTALL} -m 644
  82#bash completion scripts get sourced and so they should be rw only.
  83INSTALL_SCRIPT = ${INSTALL} -m 644
  84
  85# If you are running a cross compiler, you may want to set this
  86# to something more interesting, like "arm-linux-".  If you want
  87# to compile vs uClibc, that can be done here as well.
  88CROSS = #/usr/i386-linux-uclibc/usr/bin/i386-uclibc-
  89CC = $(CROSS)gcc
  90LD = $(CROSS)gcc
  91AR = $(CROSS)ar
  92STRIP = $(CROSS)strip
  93RANLIB = $(CROSS)ranlib
  94HOSTCC = gcc
  95MKDIR = mkdir
  96
  97# 64bit library detection
  98include ../../scripts/Makefile.arch
  99
 100ifeq ($(IS_64_BIT), 1)
 101libdir ?=       /usr/lib64
 102else
 103libdir ?=       /usr/lib
 104endif
 105
 106# Now we set up the build system
 107#
 108
 109GMO_FILES = ${shell for HLANG in ${LANGUAGES}; do echo $(OUTPUT)po/$$HLANG.gmo; done;}
 110
 111export CROSS CC AR STRIP RANLIB CFLAGS LDFLAGS LIB_OBJS
 112
 113# check if compiler option is supported
 114cc-supports = ${shell if $(CC) ${1} -S -o /dev/null -x c /dev/null > /dev/null 2>&1; then echo "$(1)"; fi;}
 115
 116# use '-Os' optimization if available, else use -O2
 117OPTIMIZATION := $(call cc-supports,-Os,-O2)
 118
 119WARNINGS := -Wall -Wchar-subscripts -Wpointer-arith -Wsign-compare
 120WARNINGS += $(call cc-supports,-Wno-pointer-sign)
 121WARNINGS += $(call cc-supports,-Wdeclaration-after-statement)
 122WARNINGS += -Wshadow
 123
 124override CFLAGS += -DVERSION=\"$(VERSION)\" -DPACKAGE=\"$(PACKAGE)\" \
 125                -DPACKAGE_BUGREPORT=\"$(PACKAGE_BUGREPORT)\" -D_GNU_SOURCE
 126
 127UTIL_OBJS =  utils/helpers/amd.o utils/helpers/msr.o \
 128        utils/helpers/sysfs.o utils/helpers/misc.o utils/helpers/cpuid.o \
 129        utils/helpers/pci.o utils/helpers/bitmask.o \
 130        utils/idle_monitor/nhm_idle.o utils/idle_monitor/snb_idle.o \
 131        utils/idle_monitor/hsw_ext_idle.o \
 132        utils/idle_monitor/amd_fam14h_idle.o utils/idle_monitor/cpuidle_sysfs.o \
 133        utils/idle_monitor/mperf_monitor.o utils/idle_monitor/cpupower-monitor.o \
 134        utils/cpupower.o utils/cpufreq-info.o utils/cpufreq-set.o \
 135        utils/cpupower-set.o utils/cpupower-info.o utils/cpuidle-info.o \
 136        utils/cpuidle-set.o
 137
 138UTIL_SRC := $(UTIL_OBJS:.o=.c)
 139
 140UTIL_OBJS := $(addprefix $(OUTPUT),$(UTIL_OBJS))
 141
 142UTIL_HEADERS = utils/helpers/helpers.h utils/idle_monitor/cpupower-monitor.h \
 143        utils/helpers/bitmask.h \
 144        utils/idle_monitor/idle_monitors.h utils/idle_monitor/idle_monitors.def
 145
 146LIB_HEADERS =   lib/cpufreq.h lib/cpupower.h lib/cpuidle.h
 147LIB_SRC =       lib/cpufreq.c lib/cpupower.c lib/cpuidle.c
 148LIB_OBJS =      lib/cpufreq.o lib/cpupower.o lib/cpuidle.o
 149LIB_OBJS :=     $(addprefix $(OUTPUT),$(LIB_OBJS))
 150
 151override CFLAGS +=      -pipe
 152
 153ifeq ($(strip $(NLS)),true)
 154        INSTALL_NLS += install-gmo
 155        COMPILE_NLS += create-gmo
 156        override CFLAGS += -DNLS
 157endif
 158
 159ifeq ($(strip $(CPUFREQ_BENCH)),true)
 160        INSTALL_BENCH += install-bench
 161        COMPILE_BENCH += compile-bench
 162endif
 163
 164ifeq ($(strip $(STATIC)),true)
 165        UTIL_OBJS += $(LIB_OBJS)
 166        UTIL_HEADERS += $(LIB_HEADERS)
 167        UTIL_SRC += $(LIB_SRC)
 168endif
 169
 170override CFLAGS += $(WARNINGS)
 171
 172ifeq ($(strip $(V)),false)
 173        QUIET=@
 174        ECHO=@echo
 175else
 176        QUIET=
 177        ECHO=@\#
 178endif
 179export QUIET ECHO
 180
 181# if DEBUG is enabled, then we do not strip or optimize
 182ifeq ($(strip $(DEBUG)),true)
 183        override CFLAGS += -O1 -g -DDEBUG
 184        STRIPCMD = /bin/true -Since_we_are_debugging
 185else
 186        override CFLAGS += $(OPTIMIZATION) -fomit-frame-pointer
 187        STRIPCMD = $(STRIP) -s --remove-section=.note --remove-section=.comment
 188endif
 189
 190
 191# the actual make rules
 192
 193all: libcpupower $(OUTPUT)cpupower $(COMPILE_NLS) $(COMPILE_BENCH)
 194
 195$(OUTPUT)lib/%.o: $(LIB_SRC) $(LIB_HEADERS)
 196        $(ECHO) "  CC      " $@
 197        $(QUIET) $(CC) $(CFLAGS) -fPIC -o $@ -c lib/$*.c
 198
 199$(OUTPUT)libcpupower.so.$(LIB_MAJ): $(LIB_OBJS)
 200        $(ECHO) "  LD      " $@
 201        $(QUIET) $(CC) -shared $(CFLAGS) $(LDFLAGS) -o $@ \
 202                -Wl,-soname,libcpupower.so.$(LIB_MIN) $(LIB_OBJS)
 203        @ln -sf $(@F) $(OUTPUT)libcpupower.so
 204        @ln -sf $(@F) $(OUTPUT)libcpupower.so.$(LIB_MIN)
 205
 206libcpupower: $(OUTPUT)libcpupower.so.$(LIB_MAJ)
 207
 208# Let all .o files depend on its .c file and all headers
 209# Might be worth to put this into utils/Makefile at some point of time
 210$(UTIL_OBJS): $(UTIL_HEADERS)
 211
 212$(OUTPUT)%.o: %.c
 213        $(ECHO) "  CC      " $@
 214        $(QUIET) $(CC) $(CFLAGS) -I./lib -I ./utils -o $@ -c $*.c
 215
 216$(OUTPUT)cpupower: $(UTIL_OBJS) $(OUTPUT)libcpupower.so.$(LIB_MAJ)
 217        $(ECHO) "  CC      " $@
 218ifeq ($(strip $(STATIC)),true)
 219        $(QUIET) $(CC) $(CFLAGS) $(LDFLAGS) $(UTIL_OBJS) -lrt -lpci -L$(OUTPUT) -o $@
 220else
 221        $(QUIET) $(CC) $(CFLAGS) $(LDFLAGS) $(UTIL_OBJS) -lcpupower -lrt -lpci -L$(OUTPUT) -o $@
 222endif
 223        $(QUIET) $(STRIPCMD) $@
 224
 225$(OUTPUT)po/$(PACKAGE).pot: $(UTIL_SRC)
 226        $(ECHO) "  GETTEXT " $@
 227        $(QUIET) xgettext --default-domain=$(PACKAGE) --add-comments \
 228                --keyword=_ --keyword=N_ $(UTIL_SRC) -p $(@D) -o $(@F)
 229
 230$(OUTPUT)po/%.gmo: po/%.po
 231        $(ECHO) "  MSGFMT  " $@
 232        $(QUIET) msgfmt -o $@ po/$*.po
 233
 234create-gmo: ${GMO_FILES}
 235
 236update-po: $(OUTPUT)po/$(PACKAGE).pot
 237        $(ECHO) "  MSGMRG  " $@
 238        $(QUIET) @for HLANG in $(LANGUAGES); do \
 239                echo -n "Updating $$HLANG "; \
 240                if msgmerge po/$$HLANG.po $< -o \
 241                   $(OUTPUT)po/$$HLANG.new.po; then \
 242                        mv -f $(OUTPUT)po/$$HLANG.new.po $(OUTPUT)po/$$HLANG.po; \
 243                else \
 244                        echo "msgmerge for $$HLANG failed!"; \
 245                        rm -f $(OUTPUT)po/$$HLANG.new.po; \
 246                fi; \
 247        done;
 248
 249compile-bench: $(OUTPUT)libcpupower.so.$(LIB_MAJ)
 250        @V=$(V) confdir=$(confdir) $(MAKE) -C bench O=$(OUTPUT)
 251
 252# we compile into subdirectories. if the target directory is not the
 253# source directory, they might not exists. So we depend the various
 254# files onto their directories.
 255DIRECTORY_DEPS = $(LIB_OBJS) $(UTIL_OBJS) $(GMO_FILES)
 256$(DIRECTORY_DEPS): | $(sort $(dir $(DIRECTORY_DEPS)))
 257
 258# In the second step, we make a rule to actually create these directories
 259$(sort $(dir $(DIRECTORY_DEPS))):
 260        $(ECHO) "  MKDIR      " $@
 261        $(QUIET) $(MKDIR) -p $@ 2>/dev/null
 262
 263clean:
 264        -find $(OUTPUT) \( -not -type d \) -and \( -name '*~' -o -name '*.[oas]' \) -type f -print \
 265         | xargs rm -f
 266        -rm -f $(OUTPUT)cpupower
 267        -rm -f $(OUTPUT)libcpupower.so*
 268        -rm -rf $(OUTPUT)po/*.gmo
 269        -rm -rf $(OUTPUT)po/*.pot
 270        $(MAKE) -C bench O=$(OUTPUT) clean
 271
 272
 273install-lib: libcpupower
 274        $(INSTALL) -d $(DESTDIR)${libdir}
 275        $(CP) $(OUTPUT)libcpupower.so* $(DESTDIR)${libdir}/
 276        $(INSTALL) -d $(DESTDIR)${includedir}
 277        $(INSTALL_DATA) lib/cpufreq.h $(DESTDIR)${includedir}/cpufreq.h
 278        $(INSTALL_DATA) lib/cpuidle.h $(DESTDIR)${includedir}/cpuidle.h
 279
 280install-tools: $(OUTPUT)cpupower
 281        $(INSTALL) -d $(DESTDIR)${bindir}
 282        $(INSTALL_PROGRAM) $(OUTPUT)cpupower $(DESTDIR)${bindir}
 283        $(INSTALL) -d $(DESTDIR)${bash_completion_dir}
 284        $(INSTALL_SCRIPT) cpupower-completion.sh '$(DESTDIR)${bash_completion_dir}/cpupower'
 285
 286install-man:
 287        $(INSTALL_DATA) -D man/cpupower.1 $(DESTDIR)${mandir}/man1/cpupower.1
 288        $(INSTALL_DATA) -D man/cpupower-frequency-set.1 $(DESTDIR)${mandir}/man1/cpupower-frequency-set.1
 289        $(INSTALL_DATA) -D man/cpupower-frequency-info.1 $(DESTDIR)${mandir}/man1/cpupower-frequency-info.1
 290        $(INSTALL_DATA) -D man/cpupower-idle-set.1 $(DESTDIR)${mandir}/man1/cpupower-idle-set.1
 291        $(INSTALL_DATA) -D man/cpupower-idle-info.1 $(DESTDIR)${mandir}/man1/cpupower-idle-info.1
 292        $(INSTALL_DATA) -D man/cpupower-set.1 $(DESTDIR)${mandir}/man1/cpupower-set.1
 293        $(INSTALL_DATA) -D man/cpupower-info.1 $(DESTDIR)${mandir}/man1/cpupower-info.1
 294        $(INSTALL_DATA) -D man/cpupower-monitor.1 $(DESTDIR)${mandir}/man1/cpupower-monitor.1
 295
 296install-gmo: create-gmo
 297        $(INSTALL) -d $(DESTDIR)${localedir}
 298        for HLANG in $(LANGUAGES); do \
 299                echo '$(INSTALL_DATA) -D $(OUTPUT)po/$$HLANG.gmo $(DESTDIR)${localedir}/$$HLANG/LC_MESSAGES/cpupower.mo'; \
 300                $(INSTALL_DATA) -D $(OUTPUT)po/$$HLANG.gmo $(DESTDIR)${localedir}/$$HLANG/LC_MESSAGES/cpupower.mo; \
 301        done;
 302
 303install-bench: compile-bench
 304        @#DESTDIR must be set from outside to survive
 305        @sbindir=$(sbindir) bindir=$(bindir) docdir=$(docdir) confdir=$(confdir) $(MAKE) -C bench O=$(OUTPUT) install
 306
 307ifeq ($(strip $(STATIC)),true)
 308install: all install-tools install-man $(INSTALL_NLS) $(INSTALL_BENCH)
 309else
 310install: all install-lib install-tools install-man $(INSTALL_NLS) $(INSTALL_BENCH)
 311endif
 312
 313uninstall:
 314        - rm -f $(DESTDIR)${libdir}/libcpupower.*
 315        - rm -f $(DESTDIR)${includedir}/cpufreq.h
 316        - rm -f $(DESTDIR)${includedir}/cpuidle.h
 317        - rm -f $(DESTDIR)${bindir}/utils/cpupower
 318        - rm -f $(DESTDIR)${mandir}/man1/cpupower.1
 319        - rm -f $(DESTDIR)${mandir}/man1/cpupower-frequency-set.1
 320        - rm -f $(DESTDIR)${mandir}/man1/cpupower-frequency-info.1
 321        - rm -f $(DESTDIR)${mandir}/man1/cpupower-set.1
 322        - rm -f $(DESTDIR)${mandir}/man1/cpupower-info.1
 323        - rm -f $(DESTDIR)${mandir}/man1/cpupower-monitor.1
 324        - for HLANG in $(LANGUAGES); do \
 325                rm -f $(DESTDIR)${localedir}/$$HLANG/LC_MESSAGES/cpupower.mo; \
 326          done;
 327
 328.PHONY: all utils libcpupower update-po create-gmo install-lib install-tools install-man install-gmo install uninstall clean
 329