Mercurial > mxe-octave
diff Makefile.in @ 3043:cbfe5d38ff2c
use configure script to generate Makefile
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Wed, 12 Jun 2013 13:50:50 -0400 |
parents | Makefile@ace9dd211c99 |
children | eb1a22446662 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Makefile.in Wed Jun 12 13:50:50 2013 -0400 @@ -0,0 +1,447 @@ +# This file is part of MXE. +# See index.html for further information. + +PWD := $(shell pwd) + +## Configuration variables. + +# Set the following configuration variables with a configure script? + +# Current valid values are mingw (cross) and gnu-linux (native). +MXE_SYSTEM := @MXE_SYSTEM@ + +# Set to "no" if doing a cross compile build. +MXE_NATIVE_BUILD := @MXE_NATIVE_BUILD@ + +# Set to "yes" to use the versions of GCC and binutils already +# installed on your system. NOTE: building a copy of GCC for a +# native build does not appear to work correctly yet, so for now you +# must set USE_SYSTEM_GCC to yes if MXE_NATIVE_BUILD is set to yes. +USE_SYSTEM_GCC := @USE_SYSTEM_GCC@ + +# Should match what config.guess prints for your system. +# If cross compiling, you must set it manually. +ifeq ($(MXE_NATIVE_BUILD),yes) + TARGET := $(shell tools/config.guess) +else + TARGET := i686-pc-mingw32 +endif +BUILD_SYSTEM := $(shell tools/config.guess) + +# Enable shared or static libs, or perhaps both. At least one +# package uses --with instead of --enable. Probably it doesn't +# make sense to disable both... +BUILD_SHARED := @BUILD_SHARED@ + +USE_PIC_FLAG := @BUILD_STATIC@ + +# Attempt to build Octave and dependencies with 64-bit indexing +# enabled (experimental; requires 64-bit system and compiler). +ENABLE_64 := @ENABLE_64@ + +# Attempt to build LLVM and enable Octave's experimental JIT compiler. +ENABLE_JIT := @ENABLE_JIT@ + +## end of configuration variables. + +ifneq ($(MXE_NATIVE_BUILD),yes) + HOST_AND_BUILD_CONFIGURE_OPTIONS := \ + --host='$(TARGET)' --build='$(BUILD_SYSTEM)' +endif + +# are we doing a native mingw build ? +ifeq ($(MXE_NATIVE_BUILD),yes) + ifeq ($(MXE_SYSTEM),mingw) + MXE_NATIVE_MINGW_BUILD := yes + endif +endif + +# These can't be chosen arbitrarily. The way things are configured now, +# GCC expects to find cross-compiler include files in $(PREFIX)/$(TARGET). +# and it's not clear to me how to change that. +BUILD_TOOLS_PREFIX := $(PWD)/usr +HOST_PREFIX := $(PWD)/usr/$(TARGET) + +ifeq ($(BUILD_SHARED),yes) + ifeq ($(BUILD_STATIC),yes) + ENABLE_SHARED_OR_STATIC := --enable-shared --enable-static + WITH_SHARED_OR_STATIC := --with-shared --with-static + else + ENABLE_SHARED_OR_STATIC := --enable-shared --disable-static + WITH_SHARED_OR_STATIC := --with-shared --without-static + endif +else + ENABLE_SHARED_OR_STATIC := --disable-shared --enable-static + WITH_SHARED_OR_STATIC := --without-shared --with-static +endif + +ifeq ($(USE_PIC_FLAG),yes) + MXE_CC_PICFLAG := -fPIC + MXE_CXX_PICFLAG := -fPIC + MXE_F77_PICFLAG := -fPIC +endif + +JOBS := 1 +SOURCEFORGE_MIRROR := freefr.dl.sourceforge.net +PKG_MIRROR := s3.amazonaws.com/mxe-pkg +PKG_CDN := d1yihgixbnrglp.cloudfront.net + +SHELL := bash + +INSTALL := $(shell ginstall --help >/dev/null 2>&1 && echo g)install +PATCH := $(shell gpatch --help >/dev/null 2>&1 && echo g)patch +SED := $(shell gsed --help >/dev/null 2>&1 && echo g)sed +WGET := wget --no-check-certificate \ + --user-agent=$(shell wget --version | \ + $(SED) -n 's,GNU \(Wget\) \([0-9.]*\).*,\1/\2,p') + +REQUIREMENTS := bash bzip2 gcc $(MAKE) openssl $(PATCH) $(PERL) \ + $(SED) unzip wget xz + +LIBTOOL := libtool +LIBTOOLIZE := libtoolize +BUILD_TOOLS := $(patsubst src/%.mk, %, $(wildcard src/build-*.mk)) +# Building flex for native mingw fails, so disable it. +ifeq ($(MXE_NATIVE_MINGW_BUILD),yes) + BUILD_TOOLS := $(filter-out build-flex, $(BUILD_TOOLS)) +endif + +STAMP_DIR := $(PWD)/installed-packages +MSYS_INFO_DIR := $(PWD)/msys-info +LOG_DIR := $(PWD)/log +TIMESTAMP := $(shell date +%Y%m%d_%H%M%S) +PKG_DIR := $(PWD)/pkg +TMP_DIR = $(PWD)/tmp-$(1) +TOP_DIR := $(PWD) +MAKEFILE := $(TOP_DIR)/Makefile +PKGS := $(filter-out $(BUILD_TOOLS), $(shell $(SED) -n 's/^.* id="\([^"]*\)-package">.*$$/\1/p' '$(TOP_DIR)/index.html')) + +ifeq ($(MXE_NATIVE_MINGW_BUILD),yes) + PATH := $(HOST_PREFIX)/bin:$(PATH) +endif +PATH := $(BUILD_TOOLS_PREFIX)/bin:$(PATH) + +CONFIGURE_CPPFLAGS := CPPFLAGS='-I$(HOST_PREFIX)/include' +CONFIGURE_LDFLAGS := LDFLAGS='-L$(HOST_PREFIX)/lib' + +ifeq ($(MXE_NATIVE_BUILD),yes) + MXE_TOOL_PREFIX := + MXE_AR := ar + MXE_RANLIB := ranlib + MXE_CC := gcc + MXE_CXX := g++ + MXE_F77 := gfortran + MXE_DLLTOOL := dlltool + MXE_NM := nm + MXE_STRIP := strip + ifeq ($(MXE_SYSTEM),mingw) + MXE_WINDRES := windres + else + MXE_WINDRES := true + endif + MXE_PKG_CONFIG := pkg-config + MXE_QMAKE := qmake +else + MXE_TOOL_PREFIX := $(TARGET)- + MXE_AR := '$(BUILD_TOOLS_PREFIX)/bin/$(MXE_TOOL_PREFIX)ar' + MXE_RANLIB := '$(BUILD_TOOLS_PREFIX)/bin/$(MXE_TOOL_PREFIX)ranlib' + MXE_CC := '$(BUILD_TOOLS_PREFIX)/bin/$(MXE_TOOL_PREFIX)gcc' + MXE_CXX := '$(BUILD_TOOLS_PREFIX)/bin/$(MXE_TOOL_PREFIX)g++' + MXE_F77 := '$(BUILD_TOOLS_PREFIX)/bin/$(MXE_TOOL_PREFIX)gfortran' + MXE_DLLTOOL := '$(BUILD_TOOLS_PREFIX)/bin/$(MXE_TOOL_PREFIX)dlltool' + MXE_NM := '$(BUILD_TOOLS_PREFIX)/bin/$(MXE_TOOL_PREFIX)nm' + MXE_STRIP := '$(BUILD_TOOLS_PREFIX)/bin/$(MXE_TOOL_PREFIX)strip' + ifeq ($(MXE_SYSTEM),mingw) + MXE_WINDRES := '$(BUILD_TOOLS_PREFIX)/bin/$(MXE_TOOL_PREFIX)windres' + else + MXE_WINDRES := true + endif + MXE_PKG_CONFIG := '$(BUILD_TOOLS_PREFIX)/bin/$(MXE_TOOL_PREFIX)pkg-config' + MXE_QMAKE := '$(BUILD_TOOLS_PREFIX)/bin/$(MXE_TOOL_PREFIX)qmake' +endif + +ifeq ($(MXE_SYSTEM),mingw) + MAKE_SHARED_FROM_STATIC_OPTIONS := --windowsdll +endif + +HOST_BINDIR := $(HOST_PREFIX)/bin +HOST_LIBDIR := $(HOST_PREFIX)/lib +HOST_INCDIR := $(HOST_PREFIX)/include + +ifeq ($(MXE_SYSTEM),mingw) + ifneq ($(MXE_NATIVE_BUILD),yes) + MSYS_BASE_URL := http://sourceforge.net/projects/mingw/files/MSYS/Base + MSYS_BASE_VER := 1.0.13 + MSYS_BASE_DIR := $(TOP_DIR)/msys-base + MSYS_BASE_PACKAGES := $(addprefix msys-,bash coreutils diffutils file findutils gawk grep gzip less libiconv libintl libmagic make msys-core regex sed tar termcap) + + NOTEPAD_BASE_DIR := $(TOP_DIR)/notepad++ + endif +else + LD_LIBRARY_PATH := '$(HOST_LIBDIR)' + export LD_LIBRARY_PATH + MXE_CPPFLAGS := '-I$(HOST_INCDIR)' + MXE_LDFLAGS := '-L$(HOST_LIBDIR)' +endif + +LN := ln +LN_S := $(LN) -s +LN_SF := $(LN_S) -f +ifeq ($(MXE_SYSTEM),mingw) + ifeq ($(MXE_NATIVE_BUILD),yes) + LN := cp + LN_S := $(LN) + LN_SF := $(LN_S) + endif +endif + +OCTAVE_FORGE_BASE_URL := 'http://sourceforge.net/projects/octave/files/Octave Forge Packages/Individual Package Releases' +OCTAVE_FORGE_PACKAGES := $(addprefix of-,miscellaneous struct optim specfun general signal communications image io statistics control) + +MAKE_SHARED_FROM_STATIC := \ + $(TOP_DIR)/tools/make-shared-from-static $(MAKE_SHARED_FROM_STATIC_OPTIONS) + +CMAKE_TOOLCHAIN_FILE := $(HOST_PREFIX)/share/cmake/mxe-conf.cmake + +# unexport any environment variables that might cause trouble +unexport AR CC CFLAGS C_INCLUDE_PATH CPATH CPLUS_INCLUDE_PATH CPP +unexport CPPFLAGS CROSS CXX CXXCPP CXXFLAGS EXEEXT EXTRA_CFLAGS +unexport EXTRA_LDFLAGS LD LDFLAGS LIBRARY_PATH LIBS NM +unexport OBJC_INCLUDE_PATH PKG_CONFIG QMAKESPEC RANLIB STRIP + +SHORT_PKG_VERSION = \ + $(word 1,$(subst ., ,$($(1)_VERSION))).$(word 2,$(subst ., ,$($(1)_VERSION))) + +UNPACK_ARCHIVE = \ + $(if $(filter %.tgz, $(1)),tar xzf '$(1)', \ + $(if $(filter %.tar.gz, $(1)),tar xzf '$(1)', \ + $(if $(filter %.tar.bz2, $(1)),tar xjf '$(1)', \ + $(if $(filter %.tar.lzma,$(1)),xz -dc -F lzma '$(1)' | tar xf -, \ + $(if $(filter %.tar.xz,$(1)),xz -dc '$(1)' | tar xf -, \ + $(if $(filter %.zip, $(1)),unzip -q '$(1)', \ + $(error Unknown archive format: $(1)))))))) + +UNPACK_PKG_ARCHIVE = \ + $(call UNPACK_ARCHIVE,$(PKG_DIR)/$($(1)_FILE)) + +PKG_CHECKSUM = \ + openssl sha1 '$(PKG_DIR)/$($(1)_FILE)' 2>/dev/null | $(SED) -n 's,^.*\([0-9a-f]\{40\}\)$$,\1,p' + +CHECK_PKG_ARCHIVE = \ + [ '$($(1)_CHECKSUM)' == "`$$(call PKG_CHECKSUM,$(1))`" ] + +DOWNLOAD_PKG_ARCHIVE = \ + mkdir -p '$(PKG_DIR)' && \ + $(if $($(1)_URL_2), \ + ( $(WGET) -T 30 -t 3 -O- '$($(1)_URL)' || \ + $(WGET) -O- '$($(1)_URL_2)' || \ + $(WGET) -O- '$(PKG_MIRROR)/$($(1)_FILE)' || \ + $(WGET) -O- '$(PKG_CDN)/$($(1)_FILE)' ), \ + ( $(WGET) -O- '$($(1)_URL)' || \ + $(WGET) -O- '$(PKG_MIRROR)/$($(1)_FILE)' || \ + $(WGET) -O- '$(PKG_CDN)/$($(1)_FILE)' )) \ + $(if $($(1)_FIX_GZIP), \ + | gzip -d | gzip -9n, \ + ) \ + > '$(PKG_DIR)/$($(1)_FILE)' || rm -f '$(PKG_DIR)/$($(1)_FILE)' + +ifeq ($(IGNORE_SETTINGS),yes) + $(info [ignore settings.mk]) +else ifeq ($(wildcard $(PWD)/settings.mk),$(PWD)/settings.mk) + include $(PWD)/settings.mk +else + $(info [create settings.mk]) + $(shell { \ + echo '#JOBS = $(JOBS)'; \ + echo '#PKGS ='; \ + } >'$(PWD)/settings.mk') +endif + +.PHONY: all +all: octave + +.PHONY: all-packages +all-packages: $(PKGS) + +$(PKGS): $(BUILD_TOOLS) + +.PHONY: msys-base +msys-base: $(MSYS_BASE_PACKAGES) + +.PHONY: octave-forge-packages +octave-forge-packages: $(OCTAVE_FORGE_PACKAGES) + +.PHONY: check-requirements +define CHECK_REQUIREMENT + @if ! $(1) --help &>/dev/null; then \ + echo; \ + echo 'Missing requirement: $(1)'; \ + echo; \ + echo 'Please have a look at "index.html" to ensure'; \ + echo 'that your system meets all requirements.'; \ + echo; \ + exit 1; \ + fi + +endef +define CHECK_REQUIREMENT_VERSION + @if ! $(1) --version | head -1 | grep ' \($(2)\)$$' >/dev/null; then \ + echo; \ + echo 'Wrong version of requirement: $(1)'; \ + echo; \ + echo 'Please have a look at "index.html" to ensure'; \ + echo 'that your system meets all requirements.'; \ + echo; \ + exit 1; \ + fi + +endef +check-requirements: $(STAMP_DIR)/check-requirements +$(STAMP_DIR)/check-requirements: $(MAKEFILE) + @echo '[check requirements]' + $(foreach REQUIREMENT,$(REQUIREMENTS),$(call CHECK_REQUIREMENT,$(REQUIREMENT))) + @[ -d '$(STAMP_DIR)' ] || mkdir -p '$(STAMP_DIR)' + @if test "$(USE_SYSTEM_GCC)" = yes; then \ + $(INSTALL) -d '$(BUILD_TOOLS_PREFIX)/bin' ; \ + $(INSTALL) -m 755 tools/config.guess '$(BUILD_TOOLS_PREFIX)/bin/config.guess' ; \ + $(INSTALL) -m 755 tools/config.sub '$(BUILD_TOOLS_PREFIX)/bin/config.sub' ; \ + fi + @touch '$@' + +define newline + + +endef +$(eval $(subst #,$(newline),$(shell \ + $(SED) -n \ + 's/^.* id="\([A-Za-z0-9_+-]*\)-version">\([^<]*\)<.*$$/\1_VERSION := \2#/p' \ + '$(TOP_DIR)/index.html' \ +))) + +include $(patsubst %,$(TOP_DIR)/src/%.mk,$(BUILD_TOOLS)) +include $(patsubst %,$(TOP_DIR)/src/%.mk,$(PKGS)) + +.PHONY: download +download: $(addprefix download-,$(PKGS)) $(addprefix download-,$(BUILD_TOOLS)) + +define PKG_RULE +.PHONY: download-$(1) +download-$(1): $(addprefix download-,$($(1)_DEPS)) + if ! $(call CHECK_PKG_ARCHIVE,$(1)); then \ + $(call DOWNLOAD_PKG_ARCHIVE,$(1)); \ + $(call CHECK_PKG_ARCHIVE,$(1)) || { echo 'Wrong checksum!'; exit 1; }; \ + fi + +.PHONY: $(1) +$(1): $(STAMP_DIR)/$(1) +$(STAMP_DIR)/$(1): $(TOP_DIR)/src/$(1).mk \ + $(wildcard $(TOP_DIR)/src/$(1)-*.patch) \ + $(wildcard $(TOP_DIR)/src/$(1)-test*) \ + $(addprefix $(STAMP_DIR)/,$($(1)_DEPS)) \ + | check-requirements + @[ -d '$(LOG_DIR)/$(TIMESTAMP)' ] || mkdir -p '$(LOG_DIR)/$(TIMESTAMP)' + @if ! $(call CHECK_PKG_ARCHIVE,$(1)); then \ + echo '[download] $(1)'; \ + touch '$(LOG_DIR)/$(TIMESTAMP)/$(1)-download'; \ + ln -sf '$(TIMESTAMP)/$(1)-download' '$(LOG_DIR)/$(1)-download'; \ + ($(call DOWNLOAD_PKG_ARCHIVE,$(1))) &> '$(LOG_DIR)/$(1)-download'; \ + if ! $(call CHECK_PKG_ARCHIVE,$(1)); then \ + echo; \ + echo 'Wrong checksum of package $(1)!'; \ + echo '------------------------------------------------------------'; \ + tail -n 10 '$(LOG_DIR)/$(1)-download' | $(SED) -n '/./p'; \ + echo '------------------------------------------------------------'; \ + echo '[log] $(LOG_DIR)/$(1)-download'; \ + echo; \ + exit 1; \ + fi; \ + fi + $(if $(value $(1)_BUILD), + @echo '[build] $(1)' + ,) + @touch '$(LOG_DIR)/$(TIMESTAMP)/$(1)' + @ln -sf '$(TIMESTAMP)/$(1)' '$(LOG_DIR)/$(1)' + @if ! (time $(MAKE) -f '$(MAKEFILE)' 'build-only-$(1)') &> '$(LOG_DIR)/$(1)'; then \ + echo; \ + echo 'Failed to build package $(1)!'; \ + echo '------------------------------------------------------------'; \ + tail -n 10 '$(LOG_DIR)/$(1)' | $(SED) -n '/./p'; \ + echo '------------------------------------------------------------'; \ + echo '[log] $(LOG_DIR)/$(1)'; \ + echo; \ + exit 1; \ + fi + @echo '[done] $(1)' + +.PHONY: build-only-$(1) +build-only-$(1): PKG = $(1) +build-only-$(1): + $(if $(value $(1)_BUILD), + rm -rf '$(2)' + mkdir -p '$(2)' + cd '$(2)' && $(call UNPACK_PKG_ARCHIVE,$(1)) + cd '$(2)/$($(1)_SUBDIR)' + $(foreach PKG_PATCH,$(sort $(wildcard $(TOP_DIR)/src/$(1)-*.patch)), + (cd '$(2)/$($(1)_SUBDIR)' && $(PATCH) -p1 -u) < $(PKG_PATCH)) + $$(call $(1)_BUILD,$(2)/$($(1)_SUBDIR),$(TOP_DIR)/src/$(1)-test) + (du -k -d 0 '$(2)' 2>/dev/null || du -k --max-depth 0 '$(2)') | $(SED) -n 's/^\(\S*\).*/du: \1 KiB/p' + rm -rfv '$(2)' + ,) + [ -d '$(STAMP_DIR)' ] || mkdir -p '$(STAMP_DIR)' + touch '$(STAMP_DIR)/$(1)' +endef +$(foreach PKG,$(PKGS),$(eval $(call PKG_RULE,$(PKG),$(call TMP_DIR,$(PKG))))) +$(foreach TOOL,$(BUILD_TOOLS),$(eval $(call PKG_RULE,$(TOOL),$(call TMP_DIR,$(TOOL))))) + +.PHONY: clean +clean: + rm -rf $(call TMP_DIR,*) $(BUILD_TOOLS_PREFIX) + rm -rf $(STAMP_DIR) $(MSYS_INFO_DIR) $(LOG_DIR) + rm -rf $(MSYS_BASE_DIR) $(NOTEPAD_BASE_DIR) + rm -rf native-tools cross-tools octave gnuplot + +.PHONY: clean-pkg +clean-pkg: + rm -f $(patsubst %,'%', \ + $(filter-out \ + $(foreach PKG,$(PKGS),$(PKG_DIR)/$($(PKG)_FILE)), \ + $(wildcard $(PKG_DIR)/*))) + +.PHONY: update +define UPDATE + $(if $(2), + $(if $(filter $(2),$($(1)_IGNORE)), + $(info IGNORED $(1) $(2)), + $(if $(filter $(2),$($(1)_VERSION)), + $(info . $(1) $(2)), + $(info NEW $(1) $($(1)_VERSION) --> $(2)) + $(SED) -i 's/\( id="$(1)-version"\)>[^<]*/\1>$(2)/' '$(TOP_DIR)/index.html' + $(MAKE) -f '$(MAKEFILE)' 'update-checksum-$(1)' \ + || { $(SED) -i 's/\( id="$(1)-version"\)>[^<]*/\1>$($(1)_VERSION)/' '$(TOP_DIR)/index.html'; \ + exit 1; })), + $(error Unable to update version number of package $(1))) + +endef +update: + $(foreach PKG,$(PKGS),$(call UPDATE,$(PKG),$(shell $($(PKG)_UPDATE)))) + +update-checksum-%: + $(call DOWNLOAD_PKG_ARCHIVE,$*) + $(SED) -i 's/^\([^ ]*_CHECKSUM *:=\).*/\1 '"`$(call PKG_CHECKSUM,$*)`"'/' '$(TOP_DIR)/src/$*.mk' + +cleanup-style: + @$(foreach FILE,$(wildcard $(addprefix $(TOP_DIR)/,Makefile index.html CNAME src/*.mk src/*test.* tools/*)),\ + $(SED) ' \ + s/\r//g; \ + s/[ \t]\+$$//; \ + s,^#!/bin/bash$$,#!/usr/bin/env bash,; \ + $(if $(filter %Makefile,$(FILE)),,\ + s/\t/ /g; \ + ) \ + ' < $(FILE) > $(TOP_DIR)/tmp-cleanup-style; \ + diff -u $(FILE) $(TOP_DIR)/tmp-cleanup-style >/dev/null \ + || { echo '[cleanup] $(FILE)'; \ + cp $(TOP_DIR)/tmp-cleanup-style $(FILE); }; \ + rm -f $(TOP_DIR)/tmp-cleanup-style; \ + ) +