15
15
# along with this program. If not, see
16
16
# <http://www.gnu.org/licenses/>.
17
17
18
- GCC =gcc
18
+ .PHONY : all clean debug dump_gimple plugin show-ssa tarball test-suite testcpychecker testcpybuilder
19
19
20
20
PLUGIN_SOURCE_FILES = \
21
21
gcc-python.c \
@@ -37,6 +37,8 @@ PLUGIN_SOURCE_FILES= \
37
37
gcc-python-variable.c \
38
38
gcc-python-version.c \
39
39
gcc-python-wrapper.c \
40
+
41
+ PLUGIN_GENERATED_SOURCE_FILES: = \
40
42
autogenerated-callgraph.c \
41
43
autogenerated-cfg.c \
42
44
autogenerated-option.c \
@@ -50,8 +52,10 @@ PLUGIN_SOURCE_FILES= \
50
52
autogenerated-tree.c \
51
53
autogenerated-variable.c
52
54
53
- PLUGIN_OBJECT_FILES = $(patsubst % .c,% .o,$(PLUGIN_SOURCE_FILES ) )
54
- GCCPLUGINS_DIR: = $(shell $(GCC ) --print-file-name=plugin)
55
+ PLUGIN_OBJECT_SOURCE_FILES: = $(patsubst % .c,% .o,$(PLUGIN_SOURCE_FILES ) )
56
+ PLUGIN_OBJECT_GENERATED_FILES: = $(patsubst % .c,% .o,$(PLUGIN_GENERATED_SOURCE_FILES ) )
57
+ PLUGIN_OBJECT_FILES: = $(PLUGIN_OBJECT_SOURCE_FILES ) $(PLUGIN_OBJECT_GENERATED_FILES )
58
+ GCCPLUGINS_DIR: = $(shell $(CC ) --print-file-name=plugin)
55
59
56
60
GENERATOR_DEPS =cpybuilder.py wrapperbuilder.py
57
61
@@ -90,85 +94,65 @@ PYTHON_CONFIG=python-config
90
94
# PYTHON=python3-debug
91
95
# PYTHON_CONFIG=python3.2dmu-config
92
96
93
- PYTHON_CFLAGS =$(shell $(PYTHON_CONFIG ) --cflags)
94
- PYTHON_LDFLAGS =$(shell $(PYTHON_CONFIG ) --ldflags)
97
+ PYTHON_INCLUDES =$(shell $(PYTHON_CONFIG ) --includes)
98
+ PYTHON_LIBS =$(shell $(PYTHON_CONFIG ) --libs)
99
+
100
+ GCC_PYTHON_PLUGIN_SO := python.so
95
101
96
- CFLAGS+ = -I$(GCCPLUGINS_DIR ) /include -fPIC -fno-strict-aliasing -O2 -Wall -Werror -g $(PYTHON_CFLAGS ) $(PYTHON_LDFLAGS )
102
+ CPPFLAGS+ = -I$(GCCPLUGINS_DIR ) /include -I$(GCCPLUGINS_DIR ) /include/c-family -I. $(PYTHON_INCLUDES )
103
+ # Allow user to pick optimization, choose whether warnings are fatal,
104
+ # and choose debugging information level.
105
+ CFLAGS? =-O2 -Werror -g
106
+ # Force these settings
107
+ CFLAGS+ = -fPIC -fno-strict-aliasing -Wall
108
+ LIBS+ = $(PYTHON_LIBS )
97
109
ifneq "$(PLUGIN_PYTHONPATH ) " ""
98
- CFLAGS + = -DPLUGIN_PYTHONPATH='"$(PLUGIN_PYTHONPATH ) "'
110
+ CPPFLAGS + = -DPLUGIN_PYTHONPATH='"$(PLUGIN_PYTHONPATH ) "'
99
111
endif
100
112
101
113
all : autogenerated-config.h testcpybuilder test-suite testcpychecker
102
114
103
- plugin : autogenerated-config.h python.so
104
-
105
- python.so : $(PLUGIN_OBJECT_FILES )
106
- $(GCC ) $(CFLAGS ) -shared $^ -o $@
107
-
108
- clean :
109
- rm -f * .so * .o
110
- rm -f autogenerated*
111
- rm -rf docs/_build
112
-
113
- autogenerated-config.h : configbuilder.py generate-config-h.py
114
- $(PYTHON ) generate-config-h.py -o $@ --gcc=$(GCC )
115
-
116
- autogenerated-gimple-types.txt : gimple-types.txt.in
117
- cpp $(CFLAGS ) $^ -o $@
118
-
119
- autogenerated-rtl-types.txt : rtl-types.txt.in
120
- cpp $(CFLAGS ) $^ -o $@
115
+ plugin : autogenerated-config.h $(GCC_PYTHON_PLUGIN_SO )
121
116
122
- autogenerated-tree-types.txt : tree-types.txt.in
123
- cpp $(CFLAGS ) $^ -o $@
117
+ $( GCC_PYTHON_PLUGIN_SO ) : $( PLUGIN_OBJECT_FILES )
118
+ $( CC ) $(CPPFLAGS ) $( CFLAGS ) $( LDFLAGS ) -shared $ ^ -o $@ $( LIBS )
124
119
125
- autogenerated-callgraph.c : $(GENERATOR_DEPS ) generate-callgraph-c.py
126
- $(PYTHON ) generate-callgraph-c.py > $@
120
+ $(PLUGIN_OBJECT_GENERATED_FILES ) : CPPFLAGS+= $(if $(srcdir ) ,-I$(srcdir ) )
127
121
128
- autogenerated-cfg.c : $(GENERATOR_DEPS ) generate-cfg-c.py
129
- $(PYTHON ) generate-cfg-c.py > $@
122
+ # This is the standard .c->.o recipe, but it needs to be stated
123
+ # explicitly to support the case that $(srcdir) is not blank.
124
+ $(PLUGIN_OBJECT_SOURCE_FILES ) : % .o: $(srcdir ) % .c autogenerated-config.h $(srcdir ) gcc-python.h
125
+ $(COMPILE.c ) $(OUTPUT_OPTION ) $<
130
126
131
- autogenerated-function.c : $(GENERATOR_DEPS ) generate-function-c.py
132
- $(PYTHON ) generate-function-c.py > $@
133
-
134
- autogenerated-gimple.c : $(GENERATOR_DEPS ) generate-gimple-c.py autogenerated-gimple-types.txt maketreetypes.py
135
- $(PYTHON ) generate-gimple-c.py > $@
136
-
137
- autogenerated-location.c : $(GENERATOR_DEPS ) generate-location-c.py
138
- $(PYTHON ) generate-location-c.py > $@
139
-
140
- autogenerated-option.c : $(GENERATOR_DEPS ) generate-option-c.py
141
- $(PYTHON ) generate-option-c.py > $@
142
-
143
- autogenerated-parameter.c : $(GENERATOR_DEPS ) generate-parameter-c.py
144
- $(PYTHON ) generate-parameter-c.py > $@
145
-
146
- autogenerated-pass.c : $(GENERATOR_DEPS ) generate-pass-c.py
147
- $(PYTHON ) generate-pass-c.py > $@
127
+ clean :
128
+ $(RM ) * .so * .o autogenerated*
129
+ $(RM ) -r docs/_build
148
130
149
- autogenerated-pretty-printer.c : $(GENERATOR_DEPS ) generate-pretty-printer-c .py
150
- $(PYTHON ) generate-pretty-printer-c.py > $@
131
+ autogenerated-config.h : $(addprefix $( srcdir ) , generate-config-h .py configbuilder.py)
132
+ $(PYTHON ) $< -o $@ --gcc= $( CC )
151
133
152
- autogenerated-tree.c : $(GENERATOR_DEPS ) generate-tree-c.py autogenerated-tree-types. txt maketreetypes.py
153
- $(PYTHON ) generate-tree-c.py > $@
134
+ autogenerated-% .txt : $(srcdir ) % . txt.in
135
+ $(CPP ) $( CPPFLAGS ) -x c-header $^ -o $@
154
136
155
- autogenerated-rtl .c : $(GENERATOR_DEPS ) generate-rtl -c.py autogenerated-rtl-types.txt maketreetypes.py
156
- $(PYTHON ) generate-rtl-c.py > $@
137
+ $( PLUGIN_GENERATED_SOURCE_FILES ) : autogenerated-% .c: $(addprefix $( srcdir ) , generate-% -c.py $( GENERATOR_DEPS ) )
138
+ $(PYTHON ) $< > $@
157
139
158
- autogenerated-variable.c : $(GENERATOR_DEPS ) generate-variable-c.py autogenerated-gimple-types.txt maketreetypes.py
159
- $(PYTHON ) generate-variable-c.py > $@
140
+ autogenerated-gimple.c : autogenerated-gimple-types.txt autogenerated-tree-types.txt autogenerated-rtl-types.txt $(srcdir ) maketreetypes.py
141
+ autogenerated-tree.c : autogenerated-tree-types.txt $(srcdir ) maketreetypes.py
142
+ autogenerated-rtl.c : autogenerated-rtl-types.txt $(srcdir ) maketreetypes.py
143
+ autogenerated-variable.c : autogenerated-gimple-types.txt $(srcdir ) maketreetypes.py
160
144
161
145
# Hint for debugging: add -v to the gcc options
162
146
# to get a command line for invoking individual subprocesses
163
147
# Doing so seems to require that paths be absolute, rather than relative
164
148
# to this directory
165
149
TEST_CFLAGS = \
166
- -fplugin=$(shell pwd) /python.so \
150
+ -fplugin=$(CURDIR ) / $( GCC_PYTHON_PLUGIN_SO ) \
167
151
-fplugin-arg-python-script=test.py
168
152
169
153
# A catch-all test for quick experimentation with the API:
170
154
test : plugin
171
- $(GCC ) -v $(TEST_CFLAGS ) $(shell pwd ) /test.c
155
+ $(CC ) -v $(TEST_CFLAGS ) $(CURDIR ) /test.c
172
156
173
157
# Selftest for the cpychecker.py code:
174
158
testcpychecker : plugin
@@ -179,35 +163,35 @@ testcpybuilder:
179
163
$(PYTHON ) testcpybuilder.py -v
180
164
181
165
dump_gimple :
182
- $(GCC ) -fdump-tree-gimple $(shell pwd ) /test.c
166
+ $(CC ) -fdump-tree-gimple $(CURDIR ) /test.c
183
167
184
168
debug : plugin
185
- $(GCC ) -v $(TEST_CFLAGS ) $(shell pwd ) /test.c
169
+ $(CC ) -v $(TEST_CFLAGS ) $(CURDIR ) /test.c
186
170
187
171
# A simple demo, to make it easy to demonstrate the cpychecker:
188
172
demo : plugin
189
- ./gcc-with-cpychecker $(shell $( PYTHON_CONFIG ) --cflags ) demo.c
173
+ $( srcdir ) ./gcc-with-cpychecker $(PYTHON_CFLAGS ) demo.c
190
174
191
175
json-examples : plugin
192
- ./gcc-with-cpychecker -I/usr/include/python2.7 libcpychecker/html/test/example1/bug.c
176
+ $( srcdir ) ./gcc-with-cpychecker -I/usr/include/python2.7 libcpychecker/html/test/example1/bug.c
193
177
194
178
test-suite : plugin
195
179
$(PYTHON ) run-test-suite.py
196
180
197
181
show-ssa : plugin
198
- ./gcc-with-python examples/show-ssa.py test.c
182
+ $( srcdir ) ./gcc-with-python examples/show-ssa.py test.c
199
183
200
184
html : docs/tables-of-passes.rst docs/passes.svg
201
185
cd docs && $(MAKE ) html
202
186
203
187
# We commit this generated file to SCM to allow the docs to be built without
204
188
# needing to build the plugin:
205
189
docs/tables-of-passes.rst : plugin generate-tables-of-passes-rst.py
206
- ./gcc-with-python generate-tables-of-passes-rst.py test.c > $@
190
+ $( srcdir ) ./gcc-with-python generate-tables-of-passes-rst.py test.c > $@
207
191
208
192
# Likewise for this generated file:
209
193
docs/passes.svg : plugin generate-passes-svg.py
210
- ./gcc-with-python generate-passes-svg.py test.c
194
+ $( srcdir ) ./gcc-with-python generate-passes-svg.py test.c
211
195
212
196
# Utility target, to help me to make releases
213
197
# - creates a tag in git, and pushes it
@@ -216,12 +200,15 @@ docs/passes.svg: plugin generate-passes-svg.py
216
200
# The following assumes that VERSION has been set e.g.
217
201
# $ make tarball VERSION=0.4
218
202
219
- tarball :
203
+ $(HOME ) /rpmbuild/SOURCES/% .tar.gz :
204
+ test -n " $( VERSION) "
220
205
-git tag -d v$(VERSION )
221
206
git tag -a v$(VERSION ) -m" $( VERSION) "
222
- git archive --format=tar --prefix=gcc-python-plugin-$(VERSION ) / v$(VERSION ) | gzip > gcc-python-plugin-$(VERSION ) .tar.gz
223
- sha256sum gcc-python-plugin-$(VERSION ) .tar.gz
224
- cp gcc-python-plugin-$(VERSION ) .tar.gz ~ /rpmbuild/SOURCES/
207
+ git archive --format=tar --prefix=$* / v$(VERSION ) | gzip > $* .tar.gz
208
+ sha256sum $* .tar.gz
209
+ cp $* .tar.gz $@
210
+
211
+ tarball : $(HOME ) /rpmbuild/SOURCES/gcc-python-plugin-$(VERSION ) .tar.gz
225
212
226
213
# Notes to self on making a release
227
214
# ---------------------------------
0 commit comments