######################################################################### # # This file is part of the Yices SMT Solver. # Copyright (C) 2017 SRI International. # # Yices is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Yices is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Yices. If not, see . # ######################################################################### # # Top-level Makefile # # Determine the architecture and top directory. # Import architecture files from top-dir/configs/make.include.$(ARCH) # SHELL=/bin/sh YICES_TOP_DIR=$(shell pwd) # # Version numbers: .. # - this determines the name of the distribution tarfile # - the number is also used in the shared library # for linux: the soname is libyices.so.. # for darwin: the compatibility version is ..0 # the version is set to .. # # Conventions we should follow: # increases for major new releases. # increases when we make changes that loose # backward compatibility. # increases for bug fixes or other improvements # that maintain backward compatibility. # # Example: if P is linked against libyices.so version 2.0.0 # - P should still work (without recompliling) with libyices 2.0.1 # - P should not work anymore with libyices 2.1.0 or 3.0.0 # # N.B There are also an occurrences in: # src/include/yices.h # doc/manual/manual.tex # doc/sphinx/source/conf.py # doc/yices*.1 man files # MAJOR = 2 MINOR = 6 PATCH_LEVEL = 5 YICES_VERSION = $(MAJOR).$(MINOR).$(PATCH_LEVEL) # # Find platform (also default configuration) # ARCH=$(shell ./config.sub `./config.guess`) POSIXOS=$(shell ./autoconf/os) PLATFORM=$(shell uname -p) ifeq (,$(POSIXOS)) $(error "Problem running ./autoconf/os") else ifeq (unknown,$(POSIXOS)) $(error "Unknown OS") endif endif # # OPTION: select an alternative configuration file # # 1) On Mac OS X Leopard/intel (darwin9.X.Y), the default configuration is # in file make.include.i386-apple-darwin9.X.Y # This builds Yices as a 32bit executable. # # It's possible to use an alternative configuration file # make.include.x86_64-apple-darwin9.Y.Z on the same system. # This is intended to build Yices as 64bit code. # # To select the alternative configuration use 'make OPTION=64bits ..' # # 1a) Since Mac OS X Snow Leopard (darwin10.X.Y) and newer, the default # is reversed. The default configuration is in file # make.include.x86_64-apple-darwin10.X.Y # This builds Yices for 64bit by default. # # To build for 32bit on the same system, use the alternative # configuration file make.include.i386-apple-darwin10.X.Y # # To select the alternative configuration use 'make OPTION=32bits ...' # # 2) On Linux/x86_64, we compile in 64 bit mode by default, # using configuration file make.include.x86_64-unknown-linux-gnu # # It may be possible to build in 32 bit mode on the same machine, # provided the compiler understand option -m32 and the necessary # 32bit libraries are present. The corresponding Yices configuration # is make.include.i686-unknown-linux-gnu # # To select this 32bit configuration, use 'make OPTION=32bits ...' # # 3) On cygwin, the default configuration is make.include.i686-pc-cygwin. # Two alternatives are supported: # make.include.i686-pc-mingw32 (mingw32/Windows 32bit native) # and make.include.x86_64-pc-mingw32 (Windows 64bit native) # # To select the Windows 32bit configuration, use # 'make OPTION=no-cygwin ...' # or 'make OPTION=mingw32 ...' # # To select the Windows 64bit configuration, use # 'make OPTION=mingw64' # # Issue: 2013/12/11: this Makefile is not robust for # cross-compilation on Cygwin (to produce Windows 64 code). # The simplest way to configure for this cross-compilation is # ./configure --host=x86_64-w64-mingw32 .... # # This generates ./configs/makefile.include.x86_64-w64-mingw32. # But OPTION=mingw64 gives ./configs/makefile.include.x86_64-pc-mingw32 # # # 4) On solaris, the default is make.include.sparc-sun-solaris2.x # (should be 32bits). # # The alternative is make.include.sparc64-sun-solaris2.x # (should be for 64bits build). To select it, give OPTION=64bits. # # Check README for details on generating these alternative configurations. # ifneq ($(OPTION),) ifeq ($(POSIXOS),linux) ifeq ($(OPTION),32bits) newarch=$(subst x86_64,i686,$(ARCH)) else ifeq ($(OPTION),mingw32) newarch=i686-w64-mingw32 POSIXOS=mingw endif endif else ifeq ($(POSIXOS),darwin) ifeq ($(PLATFORM),powerpc) ifeq ($(OPTION),64bits) newarch=$(subst powerpc,powerpc64,$(ARCH)) else ifeq ($(OPTION),32bits) newarch=$(subst powerpc64,powerpc,$(ARCH)) endif endif else ifeq ($(OPTION),64bits) newarch=$(subst i386,x86_64,$(ARCH)) else ifeq ($(OPTION),32bits) newarch=$(subst x86_64,i386,$(ARCH)) endif endif endif else ifeq ($(POSIXOS),cygwin) ifeq ($(OPTION),32bits) newarch=$(subst x86_64,i686,$(ARCH)) else ifeq ($(OPTION),no-cygwin) newarch=$(subst cygwin,mingw32,$(subst x86_64,i686,$(ARCH))) alternate=$(subst pc,w64,$(subst unknown,w64,$(newarch))) POSIXOS=mingw else ifeq ($(OPTION),mingw32) newarch=$(subst cygwin,mingw32,$(subst x86_64,i686,$(ARCH))) alternate=$(subst pc,w64,$(subst unknown,w64,$(newarch))) POSIXOS=mingw else ifeq ($(OPTION),mingw64) newarch=$(subst cygwin,mingw32,$(subst i686,x86_64,$(ARCH))) alternate=$(subst pc,w64,$(subst unknown,w64,$(newarch))) POSIXOS=mingw endif endif endif endif else ifeq ($(POSIXOS),sunos) ifeq ($(OPTION),64bits) newarch=$(subst sparc,sparc64,$(ARCH)) endif endif ifeq ($(POSIXOS),freebsd) ifeq ($(OPTION),32bits) newarch=$(subst x86_64,i386,$(ARCH)) endif endif endif endif endif ifeq ($(newarch),) $(error "option $(OPTION) not supported on platform $(ARCH)") endif ARCH := $(newarch) endif # # Check whether make.include exists # # Note: we don't want to run ./configure from here. # The user may need to give options to the ./configure # script. # make_include = configs/make.include.$(ARCH) known_make_includes = $(filter-out %.in, $(wildcard configs/make.include.*)) YICES_MAKE_INCLUDE := $(findstring $(make_include), $(known_make_includes)) ifeq (,$(YICES_MAKE_INCLUDE)) # # Try alternate name (--host= ...) # ifneq (,$(alternate)) make_alternate = configs/make.include.$(alternate) YICES_MAKE_INCLUDE := $(findstring $(make_alternate), $(known_make_includes)) ifeq (,$(YICES_MAKE_INCLUDE)) $(error Could not find $(make_include) nor $(make_alternate). Run ./configure) else $(info Could not find $(make_include). Using $(make_alternate) instead) endif else $(error Could not find $(make_include). Run ./configure) endif endif # # Check build mode # default_mode=release allowed_modes=release debug devel profile gcov valgrind purify quantify gperftools sanitize MODE ?= $(default_mode) YICES_MODE := $(filter $(allowed_modes), $(MODE)) ifeq (,$(YICES_MODE)) $(error "Invalid build mode: $(MODE)") endif # # Default target: build binaries/libraries # default: dist # # Just print the configuration # show-config: checkgmake @ echo "ARCH is $(ARCH)" @ echo "POSIXOS is $(POSIXOS)" @ echo "YICES_TOP_DIR is $(YICES_TOP_DIR)" @ echo "YICES_MAKE_INCLUDE is $(YICES_MAKE_INCLUDE)" @ echo "YICES_MODE is $(YICES_MODE)" @ echo "YICES_VERSION is $(YICES_VERSION)" checkgmake: @ ./gmaketest --make=$(MAKE) || \ (echo "GNU-Make is required to compile Yices. Aborting."; exit1) # # Invoke submake that will do the real work # the quotes around the 'YICES_TOP_DIR= ...' help if the directory # name include spaces # # We must have doc as an explicit target since we have a ./doc directory. # Without it 'make doc' does nothing. To be safe, I've also added bin, # lib, obj, etc. so that the Makefile will work event if directories # or files with these names are present. # .DEFAULT doc all bin lib obj dist static-bin static-lib static-obj static-dist install test static-test \ check static-check check-api static-check-api: checkgmake @ echo "Mode: $(YICES_MODE)" @ echo "Platform: $(ARCH)" @ $(MAKE) -f Makefile.build \ 'YICES_MODE=$(YICES_MODE)' \ 'ARCH=$(ARCH)' \ 'POSIXOS=$(POSIXOS)' \ 'YICES_TOP_DIR=$(YICES_TOP_DIR)' \ 'YICES_MAKE_INCLUDE=$(YICES_MAKE_INCLUDE)' \ 'YICES_VERSION=$(YICES_VERSION)' \ 'MAJOR=$(MAJOR)' \ 'MINOR=$(MINOR)' \ 'PATCH_LEVEL=$(PATCH_LEVEL)' \ $@ .PHONY: checkgmake show-config doc all bin lib obj dist static-bin static-lib static-obj static-dist install \ test static-test default check static-check check-api static-check-api