1#
2# Copyright (c) 2009-2020 Intel Corporation
3# written by Roman Dementiev and Jim Harris
4#
5
6EXE = pcm.x pcm-numa.x pcm-latency.x pcm-power.x pcm-sensor.x pcm-msr.x pcm-memory.x pcm-tsx.x pcm-pcie.x pcm-core.x pcm-iio.x pcm-lspci.x pcm-pcicfg.x
7
8EXE += pcm-mmio.x
9
10EXE += c_example.x
11EXE += c_example_shlib.x
12
13EXE += pcm-raw.x
14
15UNAME:=$(shell uname)
16
17ifeq ($(UNAME), Linux)
18EXE += daemon-binaries
19endif
20
21COMMON_FLAGS = -Wall -g -O3 -Wno-unknown-pragmas -fPIC
22CFLAGS += $(COMMON_FLAGS)
23CXXFLAGS += $(COMMON_FLAGS) -std=c++11
24
25# uncomment if your Linux kernel supports access to /dev/mem from user space
26# CXXFLAGS += -DPCM_USE_PCI_MM_LINUX
27
28# rely on Linux perf support (user needs CAP_SYS_ADMIN privileges), comment out to disable
29ifneq ($(wildcard /usr/include/linux/perf_event.h),)
30CXXFLAGS += -DPCM_USE_PERF
31endif
32
33ifeq ($(UNAME), Linux)
34CFLAGS += -pthread
35LIB= -lpthread -lrt
36EXE += pcm-sensor-server.x
37CXXFLAGS += -Wextra -pthread
38OPENSSL_LIB=
39# Disabling until we can properly check for dependencies, enable
40# yourself if you have the required headers and library installed
41#CXXFLAGS += -DUSE_SSL
42#OPENSSL_LIB=-lssl -lcrypto -lz -ldl
43endif
44ifeq ($(UNAME), DragonFly)
45LIB= -pthread -lrt
46endif
47ifeq ($(UNAME), Darwin)
48LIB= -lpthread MacMSRDriver/build/Release/libPcmMsr.dylib
49CXXFLAGS += -I/usr/include -IMacMSRDriver
50endif
51ifeq ($(UNAME), FreeBSD)
52CXX=c++
53LIB= -lpthread -lc++
54endif
55
56COMMON_OBJS = msr.o cpucounters.o pci.o mmio.o bw.o utils.o topology.o dashboard.o debug.o threadpool.o resctrl.o simdjson_wrapper.o
57# export some variables
58export CFLAGS CXXFLAGS LDFLAGS
59
60EXE_OBJS = $(EXE:.x=.o)
61OBJS = $(COMMON_OBJS) $(EXE_OBJS)
62
63# ensure 'make' does not delete the intermediate .o files
64.PRECIOUS: $(OBJS)
65
66all: $(EXE) lib
67
68lib: libPCM.a
69
70daemon-binaries:
71	$(MAKE) -C daemon/daemon/Debug
72	$(MAKE) -C daemon/client/Debug
73
74klocwork: $(EXE)
75
76ifneq ($(MAKECMDGOALS),clean)
77-include $(OBJS:.o=.d)
78endif
79libPCM.a: $(COMMON_OBJS)
80	ar -rcs $@ $^
81
82%.x: %.o $(COMMON_OBJS)
83	$(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $^ $(LIB)
84
85pcm-sensor-server.o: pcm-sensor-server.cpp favicon.ico.h
86
87pcm-sensor-server.x: pcm-sensor-server.o $(COMMON_OBJS)
88	$(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $^ $(LIB) $(OPENSSL_LIB)
89
90libpcm.so: $(COMMON_OBJS) pcm-core.o
91	$(CXX) $(CXXFLAGS) $(LDFLAGS) -DPCM_SILENT -shared $^ $(LIB) -o $@
92
93c_example.x: c_example.c libpcm.so
94	$(CC) $(CFLAGS) $(LDFLAGS) -DPCM_DYNAMIC_LIB $< -ldl -Wl,-rpath,$(shell pwd) -o $@
95
96c_example_shlib.x: c_example.c libpcm.so
97	$(CC) $(CFLAGS) $(LDFLAGS) $< -L./ -Wl,-rpath,$(shell pwd) -lpcm -o $@
98
99%.o: %.cpp
100	$(CXX) $(CXXFLAGS) -c $*.cpp -o $*.o
101	@# the following lines generate dependency files for the
102	@#  target object
103	@# from http://scottmcpeak.com/autodepend/autodepend.html
104	$(CXX) -MM $(CXXFLAGS) $*.cpp > $*.d
105	@# these sed/fmt commands modify the .d file to add a target
106	@#  rule for each .h and .cpp file with no dependencies;
107	@# this will force 'make' to rebuild any objects that
108	@#  depend on a file that has been renamed rather than
109	@#  exiting with an error
110	@mv -f $*.d $*.d.tmp
111	@sed -e 's|.*:|$*.o:|' < $*.d.tmp > $*.d
112	@sed -e 's/.*://' -e 's/\\$$//' < $*.d.tmp | fmt -1 | \
113	  sed -e 's/^ *//' -e 's/$$/:/' >> $*.d
114	@rm -f $*.d.tmp
115
116memoptest.x: memoptest.cpp
117	$(CXX) -Wall -g -O0 -std=c++11 memoptest.cpp -o memoptest.x
118
119dashboardtest.x: dashboardtest.cpp $(COMMON_OBJS)
120	$(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $^ $(LIB)
121
122prefix=/usr
123
124ifneq ($(DESTDIR),)
125	prefix=${DESTDIR}/usr
126endif
127
128install: all
129	mkdir -p                                     ${prefix}/sbin/
130	install -m 755 pcm-core.x                 ${prefix}/sbin/pcm-core
131	install -m 755 pcm-iio.x                  ${prefix}/sbin/pcm-iio
132	install -m 755 pcm-latency.x              ${prefix}/sbin/pcm-latency
133	install -m 755 pcm-lspci.x                ${prefix}/sbin/pcm-lspci
134	install -m 755 pcm-memory.x               ${prefix}/sbin/pcm-memory
135	install -m 755 pcm-msr.x                  ${prefix}/sbin/pcm-msr
136	install -m 755 pcm-mmio.x                 ${prefix}/sbin/pcm-mmio
137	install -m 755 pcm-numa.x                 ${prefix}/sbin/pcm-numa
138	install -m 755 pcm-pcicfg.x               ${prefix}/sbin/pcm-pcicfg
139	install -m 755 pcm-pcie.x                 ${prefix}/sbin/pcm-pcie
140	install -m 755 pcm-power.x                ${prefix}/sbin/pcm-power
141	install -m 755 pcm-sensor.x               ${prefix}/sbin/pcm-sensor
142	install -m 755 pcm-tsx.x                  ${prefix}/sbin/pcm-tsx
143	install -m 755 pcm-raw.x                  ${prefix}/sbin/pcm-raw
144	install -m 755 pcm.x                      ${prefix}/sbin/pcm
145ifeq ($(UNAME), Linux)
146	mkdir -p                                     ${prefix}/bin/
147	install -m 755 daemon/client/Debug/client ${prefix}/bin/pcm-client
148	install -m 755 daemon/daemon/Debug/daemon ${prefix}/sbin/pcm-daemon
149	install -m 755 pcm-sensor-server.x        ${prefix}/sbin/pcm-sensor-server
150endif
151	install -m 755 pcm-bw-histogram.sh           ${prefix}/sbin/pcm-bw-histogram
152	mkdir -p                                     ${prefix}/share/pcm/
153	install -m 644 opCode*.txt                   ${prefix}/share/pcm/
154
155clean:
156	rm -rf *.x *.o *~ *.d *.a *.so
157ifeq ($(UNAME), Linux)
158	$(MAKE) -C daemon/daemon/Debug clean
159	$(MAKE) -C daemon/client/Debug clean
160endif
161