1# -*- makefile -*-
2# --------------------------------------------------------------------
3#
4# Building Ipe --- common definitions
5#
6# --------------------------------------------------------------------
7# Are we compiling for Windows?  For Mac OS X?
8ifdef COMSPEC
9  WIN32	=  1
10  IPEBUNDLE = 1
11  IPEUI = WIN32
12else ifdef IPECROSS
13  WIN32 = 1
14  IPEBUNDLE = 1
15  IPEUI = WIN32
16else
17  UNAME = $(shell uname)
18  ifeq "$(UNAME)" "Darwin"
19    MACOS = 1
20    IPEUI = COCOA
21    IPECONFIGMAK ?= macos.mak
22  else
23    IPEUI ?= QT
24    IPECONFIGMAK ?= config.mak
25  endif
26endif
27# --------------------------------------------------------------------
28# IPESRCDIR is Ipe's top "src" directory
29# if 'common.mak' is included on a different level than a subdirectory
30# of "src", then IPESRCDIR must be set before including 'common.mak'.
31
32IPESRCDIR ?= ..
33
34# --------------------------------------------------------------------
35# Read configuration options (not used on Win32)
36
37ifndef WIN32
38  include $(IPESRCDIR)/$(IPECONFIGMAK)
39  BUILDDIR = $(IPESRCDIR)/../build
40endif
41
42# --------------------------------------------------------------------
43
44# set variables that depend on UI library
45
46# -------------------- QT --------------------
47ifeq ($(IPEUI),QT)
48CPPFLAGS     += -DIPEUI_QT
49# Qt5 requires -fPIC depending on its own compilation settings.
50CPPFLAGS     += -fPIC
51CXXFLAGS     += -fPIC
52DLL_CFLAGS   = -fPIC
53IPEUI_QT     := 1
54UI_CFLAGS    = $(QT_CFLAGS)
55UI_LIBS      = $(QT_LIBS)
56moc_sources  = $(addprefix moc_, $(subst .h,.cpp,$(moc_headers)))
57all_sources  = $(sources) $(qt_sources)
58objects      = $(addprefix $(OBJDIR)/, $(subst .cpp,.o,$(all_sources) \
59		$(moc_sources)))
60# -------------------- WIN32 --------------------
61else ifeq ($(IPEUI), WIN32)
62CPPFLAGS     += -DIPEUI_WIN32
63IPEUI_WIN32  := 1
64UI_CFLAGS    :=
65UI_LIBS      := -lcomctl32 -lcomdlg32 -lgdi32 -lgdiplus
66all_sources  = $(sources) $(win_sources)
67objects      = $(addprefix $(OBJDIR)/, $(subst .cpp,.o,$(all_sources)))
68# -------------------- COCOA --------------------
69else ifeq ($(IPEUI), COCOA)
70CPPFLAGS     += -DIPEUI_COCOA
71IPEUI_COCOA  := 1
72UI_CFLAGS    = $(IPEOBJCPP)
73UI_LIBS      = -framework Cocoa -framework AppKit \
74	-framework ApplicationServices
75all_sources  = $(sources) $(cocoa_sources)
76objects      = $(addprefix $(OBJDIR)/, $(subst .cpp,.o,$(all_sources)))
77# -------------------- GTK --------------------
78else ifeq ($(IPEUI), GTK)
79CPPFLAGS     += -DIPEUI_GTK -DGDK_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED
80IPEUI_GTK    := 1
81GTK_CFLAGS   ?= $(shell pkg-config --cflags gtk+-2.0)
82GTK_LIBS     ?= $(shell pkg-config --libs gtk+-2.0)
83UI_CFLAGS    = $(GTK_CFLAGS)
84UI_LIBS      = $(GTK_LIBS)
85all_sources  = $(sources) $(gtk_sources)
86BUILDDIR     = $(IPESRCDIR)/../gtkbuild
87objects      = $(addprefix $(OBJDIR)/, $(subst .cpp,.o,$(all_sources)))
88else
89  error("Unknown IPEUI selected")
90endif
91
92CXXFLAGS += -Wall
93
94ifdef IPESTRICT
95  CXXFLAGS += -Wsign-compare -Wzero-as-null-pointer-constant -Werror -DIPESTRICT -std=c++17
96else
97  CXXFLAGS += -std=c++14
98endif
99
100ifdef IPECXX
101  CXX = $(IPECXX)
102endif
103
104DEPEND ?= $(OBJDIR)/depend.mak
105
106.PHONY: clean
107.PHONY: install
108.PHONY: all
109
110# Variables depending on platform
111ifdef WIN32
112  # -------------------- WIN32 --------------------
113  # Set just in case user has environment variables set
114  IPEDOCDIR	 :=
115  IPEICONDIR	 :=
116
117  IPE_NO_IPELIB_VERSION_CHECK := 1
118  CPPFLAGS       += -DWIN32 -DUNICODE -D_UNICODE
119  DLL_LDFLAGS	 += -shared
120  PLUGIN_LDFLAGS += -shared
121  DL_LIBS        :=
122  JPEG_CFLAGS    :=
123  JPEG_LIBS      := -lgdiplus
124  PNG_CFLAGS     :=
125  PNG_LIBS       := -lgdiplus
126  CURL_CFLAGS    :=
127  CURL_LIBS      := -lwinhttp
128
129  buildlib	 = $(BUILDDIR)/bin
130  buildbin       = $(BUILDDIR)/bin
131  buildipelets   = $(BUILDDIR)/ipelets
132  exe_target	 = $(BUILDDIR)/bin/$1.exe
133  dll_target     = $(buildlib)/$1.dll
134  soname         =
135  dll_symlinks   =
136  install_symlinks =
137  ipelet_target  = $(BUILDDIR)/ipelets/$1.dll
138
139ifeq ($(IPECROSS),i686)
140  BUILDDIR       = $(IPESRCDIR)/../mingw32
141else
142  BUILDDIR       = $(IPESRCDIR)/../mingw64
143endif
144  CXXFLAGS	 += -g -O2
145ifdef IPECROSS
146  # --------------- Cross compiling with Mingw-w64 ---------------
147  # http://mingw-w64.sourceforge.net/
148  CXX           = $(IPECROSS)-w64-mingw32-g++
149  CC            = $(IPECROSS)-w64-mingw32-gcc
150  STRIP_TARGET  = $(IPECROSS)-w64-mingw32-strip $(TARGET)
151  WINDRES	= $(IPECROSS)-w64-mingw32-windres
152  IPEDEPS	?= /sw/mingwlibs-$(IPECROSS)
153else
154  # --------------- Compiling with Mingw-w64 under Windows ---------------
155  WINDRES	= windres.exe
156  CXXFLAGS	+= -g -O2
157  STRIP_TARGET  = strip $(TARGET)
158  IPEDEPS	?= /mingwlibs
159endif
160  ZLIB_CFLAGS   := -I$(IPEDEPS)/include
161  ZLIB_LIBS     := -L$(IPEDEPS)/lib -lz
162  FREETYPE_CFLAGS := -I$(IPEDEPS)/include/freetype2 \
163       -I$(IPEDEPS)/include
164  FREETYPE_LIBS := -L$(IPEDEPS)/lib -lfreetype
165  CAIRO_CFLAGS  := -I$(IPEDEPS)/include/cairo
166  CAIRO_LIBS    := -L$(IPEDEPS)/lib -lcairo
167  LUA_CFLAGS    := -I$(IPEDEPS)/lua54/include
168  LUA_LIBS      := $(IPEDEPS)/lua54/lua54.dll
169  SPIRO_CFLAGS  := -I$(IPEDEPS)/include/spiro
170  SPIRO_LIBS    := -L$(IPEDEPS)/lib -lspiro
171  GSL_CFLAGS	:=
172  GSL_LIBS	:= -lgsl -lgslcblas -lm
173
174else
175ifdef MACOS
176  # -------------------- Mac OS X --------------------
177  CXXFLAGS	  += -g -Os
178  IPEOBJCPP       = -x objective-c++ -fobjc-arc
179  OSXTARGET       = -mmacosx-version-min=10.10
180  CXXFLAGS        += $(OSXTARGET) -Wdeprecated-declarations
181  CFLAGS          += $(OSXTARGET)
182  LDFLAGS         += $(OSXTARGET)
183  DLL_LDFLAGS	  += -dynamiclib
184  PLUGIN_LDFLAGS  += -bundle
185  DL_LIBS         ?= -ldl
186  ZLIB_CFLAGS     ?=
187  ZLIB_LIBS       ?= -lz
188  JPEG_CFLAGS     :=
189  JPEG_LIBS       := -framework ApplicationServices
190  CURL_CFLAGS     := $(IPEOBJCPP)
191  CURL_LIBS       := -framework Foundation
192  ifdef IPEBUNDLE
193    IPELIBDIRINFO = @executable_path/../Frameworks
194    BUNDLEDIR     ?= $(BUILDDIR)/Ipe.app/Contents
195    RESOURCEDIR   = $(BUNDLEDIR)/Resources
196    buildlib	  = $(BUNDLEDIR)/Frameworks
197    buildbin      = $(BUNDLEDIR)/MacOS
198    buildipelets  = $(RESOURCEDIR)/ipelets
199    exe_target    = $(BUNDLEDIR)/MacOS/$1
200    ipelet_target = $(RESOURCEDIR)/ipelets/$1.so
201    IPEAPP	  = 1
202  else
203    IPELIBDIRINFO ?= $(IPELIBDIR)
204    buildlib	  = $(BUILDDIR)/lib
205    exe_target    = $(BUILDDIR)/bin/$1
206    ipelet_target = $(BUILDDIR)/ipelets/$1.so
207    buildbin      = $(BUILDDIR)/bin
208    buildipelets  = $(BUILDDIR)/ipelets
209  endif
210  soname          = -Wl,-dylib_install_name,$(IPELIBDIRINFO)/lib$1.$(IPEVERS).dylib
211  dll_target      = $(buildlib)/lib$1.$(IPEVERS).dylib
212  dll_symlinks    = ln -sf lib$1.$(IPEVERS).dylib $(buildlib)/lib$1.dylib
213  install_symlinks = ln -sf lib$1.$(IPEVERS).dylib \
214		$(INSTALL_ROOT)$(IPELIBDIR)/lib$1.dylib
215else
216  # -------------------- Unix --------------------
217  CXXFLAGS	 += -g -O2
218  DLL_LDFLAGS	 += -shared
219  PLUGIN_LDFLAGS += -shared
220  soname         = -Wl,-soname,lib$1.so.$(IPEVERS)
221  dll_target     = $(buildlib)/lib$1.so.$(IPEVERS)
222  dll_symlinks   = ln -sf lib$1.so.$(IPEVERS) $(buildlib)/lib$1.so
223  install_symlinks = ln -sf lib$1.so.$(IPEVERS) \
224		$(INSTALL_ROOT)$(IPELIBDIR)/lib$1.so
225  buildlib	 = $(BUILDDIR)/lib
226  buildbin       = $(BUILDDIR)/bin
227  buildipelets   = $(BUILDDIR)/ipelets
228  exe_target	 = $(BUILDDIR)/bin/$1
229  ipelet_target  = $(BUILDDIR)/ipelets/$1.so
230endif
231endif
232
233# Macros
234
235INSTALL_DIR = install -d
236INSTALL_FILES = install -m 0644
237INSTALL_SCRIPTS = install -m 0755
238INSTALL_PROGRAMS = install -m 0755
239
240MAKE_BINDIR = mkdir -p $(buildbin)
241
242MAKE_LIBDIR = mkdir -p $(buildlib)
243
244MAKE_IPELETDIR = mkdir -p $(buildipelets)
245
246MAKE_DEPEND = \
247	mkdir -p $(OBJDIR); \
248	echo "" > $@; \
249	for f in $(all_sources); do \
250	$(CXX) -MM -MT $(OBJDIR)/$${f%%.cpp}.o $(CPPFLAGS) $$f >> $@; done
251
252# The rules
253
254$(OBJDIR)/%.o:  %.cpp
255	@echo Compiling $(<F)...
256	$(COMPILE.cc) -o $@ $<
257
258ifdef IPEUI_QT
259moc_%.cpp:  %.h
260	@echo Running moc on $(<F)...
261	$(MOC) $(CPPFLAGS )-o $@ $<
262endif
263
264# --------------------------------------------------------------------
265