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