mathicgb-1.1/0000775000175000017500000000000015117247675006713 5mathicgb-1.1/cmake/0000775000175000017500000000000015117247676007774 5mathicgb-1.1/cmake/FindMathic.cmake0000664000175000017500000000155414560325357012723 # Try to find the mathic libraries # See https://github.com/Macaulay2/mathic # # This file sets up mathic for CMake. Once done this will define # MATHIC_FOUND - system has MATHIC lib # MATHIC_INCLUDE_DIR - the MATHIC include directory # MATHIC_LIBRARIES - Libraries needed to use MATHIC # # Copyright (c) 2020, Mahrud Sayrafi, # # Redistribution and use is allowed according to the terms of the BSD license. find_path(MATHIC_INCLUDE_DIR NAMES mathic.h PATHS ${INCLUDE_INSTALL_DIR} ${CMAKE_INSTALL_PREFIX}/include PATH_SUFFIXES mathic ) find_library(MATHIC_LIBRARIES NAMES mathic PATHS ${LIB_INSTALL_DIR} ${CMAKE_INSTALL_PREFIX}/lib ) include(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(Mathic DEFAULT_MSG MATHIC_INCLUDE_DIR MATHIC_LIBRARIES) mark_as_advanced(MATHIC_INCLUDE_DIR MATHIC_LIBRARIES) mathicgb-1.1/cmake/FindTBB.cmake0000664000175000017500000004012214560325357012117 # - Find ThreadingBuildingBlocks include dirs and libraries # Use this module by invoking find_package with the form: # find_package(TBB # [REQUIRED] # Fail with error if TBB is not found # ) # # Once done, this will define # # TBB_FOUND - system has TBB # TBB_INCLUDE_DIRS - the TBB include directories # TBB_LIBRARIES - TBB libraries to be lined, doesn't include malloc or # malloc proxy # TBB::tbb - imported target for the TBB library # # TBB_VERSION_MAJOR - Major Product Version Number # TBB_VERSION_MINOR - Minor Product Version Number # TBB_INTERFACE_VERSION - Engineering Focused Version Number # TBB_COMPATIBLE_INTERFACE_VERSION - The oldest major interface version # still supported. This uses the engineering # focused interface version numbers. # # TBB_MALLOC_FOUND - system has TBB malloc library # TBB_MALLOC_INCLUDE_DIRS - the TBB malloc include directories # TBB_MALLOC_LIBRARIES - The TBB malloc libraries to be lined # TBB::malloc - imported target for the TBB malloc library # # TBB_MALLOC_PROXY_FOUND - system has TBB malloc proxy library # TBB_MALLOC_PROXY_INCLUDE_DIRS = the TBB malloc proxy include directories # TBB_MALLOC_PROXY_LIBRARIES - The TBB malloc proxy libraries to be lined # TBB::malloc_proxy - imported target for the TBB malloc proxy library # # # This module reads hints about search locations from variables: # ENV TBB_ARCH_PLATFORM - for eg. set it to "mic" for Xeon Phi builds # ENV TBB_ROOT or just TBB_ROOT - root directory of tbb installation # ENV TBB_BUILD_PREFIX - specifies the build prefix for user built tbb # libraries. Should be specified with ENV TBB_ROOT # and optionally... # ENV TBB_BUILD_DIR - if build directory is different than ${TBB_ROOT}/build # # # Modified by Robert Maynard from the original OGRE source # #------------------------------------------------------------------- # This file is part of the CMake build system for OGRE # (Object-oriented Graphics Rendering Engine) # For the latest info, see http://www.ogre3d.org/ # # The contents of this file are placed in the public domain. Feel # free to make use of it in any way you like. #------------------------------------------------------------------- # #============================================================================= # Copyright 2010-2012 Kitware, Inc. # Copyright 2012 Rolf Eike Beer # # Distributed under the OSI-approved BSD License (the "License"); # see accompanying file Copyright.txt for details. # # This software is distributed WITHOUT ANY WARRANTY; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the License for more information. #============================================================================= # (To distribute this file outside of CMake, substitute the full # License text for the above reference.) #============================================================================= # FindTBB helper functions and macros # # Use TBBConfig.cmake if possible. set(_tbb_find_quiet) if (TBB_FIND_QUIETLY) set(_tbb_find_quiet QUIET) endif () set(_tbb_find_components) set(_tbb_find_optional_components) foreach (_tbb_find_component IN LISTS TBB_FIND_COMPONENTS) if (TBB_FIND_REQUIRED_${_tbb_find_component}) list(APPEND _tbb_find_components "${_tbb_find_component}") else () list(APPEND _tbb_find_optional_components "${_tbb_find_component}") endif () endforeach () unset(_tbb_find_component) find_package(TBB CONFIG ${_tbb_find_quiet} COMPONENTS ${_tbb_find_components} OPTIONAL_COMPONENTS ${_tbb_find_optional_components}) unset(_tbb_find_quiet) unset(_tbb_find_components) unset(_tbb_find_optional_components) if (TBB_FOUND) return () endif () #==================================================== # Fix the library path in case it is a linker script #==================================================== function(tbb_extract_real_library library real_library) if(NOT UNIX OR NOT EXISTS ${library}) set(${real_library} "${library}" PARENT_SCOPE) return() endif() #Read in the first 4 bytes and see if they are the ELF magic number set(_elf_magic "7f454c46") file(READ ${library} _hex_data OFFSET 0 LIMIT 4 HEX) if(_hex_data STREQUAL _elf_magic) #we have opened a elf binary so this is what #we should link to set(${real_library} "${library}" PARENT_SCOPE) return() endif() file(READ ${library} _data OFFSET 0 LIMIT 1024) if("${_data}" MATCHES "INPUT \\(([^(]+)\\)") #extract out the .so name from REGEX MATCH command set(_proper_so_name "${CMAKE_MATCH_1}") #construct path to the real .so which is presumed to be in the same directory #as the input file get_filename_component(_so_dir "${library}" DIRECTORY) set(${real_library} "${_so_dir}/${_proper_so_name}" PARENT_SCOPE) else() #unable to determine what this library is so just hope everything works #and pass it unmodified. set(${real_library} "${library}" PARENT_SCOPE) endif() endfunction() #=============================================== # Do the final processing for the package find. #=============================================== macro(findpkg_finish PREFIX TARGET_NAME) if (${PREFIX}_INCLUDE_DIR AND ${PREFIX}_LIBRARY) set(${PREFIX}_FOUND TRUE) set (${PREFIX}_INCLUDE_DIRS ${${PREFIX}_INCLUDE_DIR}) set (${PREFIX}_LIBRARIES ${${PREFIX}_LIBRARY}) else () if (${PREFIX}_FIND_REQUIRED AND NOT ${PREFIX}_FIND_QUIETLY) message(FATAL_ERROR "Required library ${PREFIX} not found.") endif () endif () if (NOT TARGET "TBB::${TARGET_NAME}") if (${PREFIX}_LIBRARY_RELEASE) tbb_extract_real_library(${${PREFIX}_LIBRARY_RELEASE} real_release) endif () if (${PREFIX}_LIBRARY_DEBUG) tbb_extract_real_library(${${PREFIX}_LIBRARY_DEBUG} real_debug) endif () add_library(TBB::${TARGET_NAME} UNKNOWN IMPORTED) set_target_properties(TBB::${TARGET_NAME} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${${PREFIX}_INCLUDE_DIR}") if (${PREFIX}_LIBRARY_DEBUG AND ${PREFIX}_LIBRARY_RELEASE) set_target_properties(TBB::${TARGET_NAME} PROPERTIES IMPORTED_LOCATION "${real_release}" IMPORTED_LOCATION_DEBUG "${real_debug}" IMPORTED_LOCATION_RELEASE "${real_release}") elseif (${PREFIX}_LIBRARY_RELEASE) set_target_properties(TBB::${TARGET_NAME} PROPERTIES IMPORTED_LOCATION "${real_release}") elseif (${PREFIX}_LIBRARY_DEBUG) set_target_properties(TBB::${TARGET_NAME} PROPERTIES IMPORTED_LOCATION "${real_debug}") endif () endif () #mark the following variables as internal variables mark_as_advanced(${PREFIX}_INCLUDE_DIR ${PREFIX}_LIBRARY ${PREFIX}_LIBRARY_DEBUG ${PREFIX}_LIBRARY_RELEASE) endmacro() #=============================================== # Generate debug names from given release names #=============================================== macro(get_debug_names PREFIX) foreach(i ${${PREFIX}}) set(${PREFIX}_DEBUG ${${PREFIX}_DEBUG} ${i}d ${i}D ${i}_d ${i}_D ${i}_debug ${i}) endforeach() endmacro() #=============================================== # See if we have env vars to help us find tbb #=============================================== macro(getenv_path VAR) set(ENV_${VAR} $ENV{${VAR}}) # replace won't work if var is blank if (ENV_${VAR}) string( REGEX REPLACE "\\\\" "/" ENV_${VAR} ${ENV_${VAR}} ) endif () endmacro() #=============================================== # Couple a set of release AND debug libraries #=============================================== macro(make_library_set PREFIX) if (${PREFIX}_RELEASE AND ${PREFIX}_DEBUG) set(${PREFIX} optimized ${${PREFIX}_RELEASE} debug ${${PREFIX}_DEBUG}) elseif (${PREFIX}_RELEASE) set(${PREFIX} ${${PREFIX}_RELEASE}) elseif (${PREFIX}_DEBUG) set(${PREFIX} ${${PREFIX}_DEBUG}) endif () endmacro() #============================================================================= # Now to actually find TBB # # Get path, convert backslashes as ${ENV_${var}} getenv_path(TBB_ROOT) # initialize search paths set(TBB_PREFIX_PATH ${TBB_ROOT} ${ENV_TBB_ROOT}) set(TBB_INC_SEARCH_PATH "") set(TBB_LIB_SEARCH_PATH "") # If user built from sources set(TBB_BUILD_PREFIX $ENV{TBB_BUILD_PREFIX}) if (TBB_BUILD_PREFIX AND ENV_TBB_ROOT) getenv_path(TBB_BUILD_DIR) if (NOT ENV_TBB_BUILD_DIR) set(ENV_TBB_BUILD_DIR ${ENV_TBB_ROOT}/build) endif () # include directory under ${ENV_TBB_ROOT}/include list(APPEND TBB_LIB_SEARCH_PATH ${ENV_TBB_BUILD_DIR}/${TBB_BUILD_PREFIX}_release ${ENV_TBB_BUILD_DIR}/${TBB_BUILD_PREFIX}_debug) endif () # For Windows, let's assume that the user might be using the precompiled # TBB packages from the main website. These use a rather awkward directory # structure (at least for automatically finding the right files) depending # on platform and compiler, but we'll do our best to accommodate it. # Not adding the same effort for the precompiled linux builds, though. Those # have different versions for CC compiler versions and linux kernels which # will never adequately match the user's setup, so there is no feasible way # to detect the "best" version to use. The user will have to manually # select the right files. (Chances are the distributions are shipping their # custom version of tbb, anyway, so the problem is probably nonexistent.) if (WIN32 AND MSVC) set(COMPILER_PREFIX "vc7.1") if (MSVC_VERSION EQUAL 1400) set(COMPILER_PREFIX "vc8") elseif(MSVC_VERSION EQUAL 1500) set(COMPILER_PREFIX "vc9") elseif(MSVC_VERSION EQUAL 1600) set(COMPILER_PREFIX "vc10") elseif(MSVC_VERSION EQUAL 1700) set(COMPILER_PREFIX "vc11") elseif(MSVC_VERSION EQUAL 1800) set(COMPILER_PREFIX "vc12") elseif(MSVC_VERSION GREATER_EQUAL 1900) set(COMPILER_PREFIX "vc14") endif () # for each prefix path, add ia32/64\${COMPILER_PREFIX}\lib to the lib search path foreach (dir IN LISTS TBB_PREFIX_PATH) if (CMAKE_CL_64) list(APPEND TBB_LIB_SEARCH_PATH ${dir}/ia64/${COMPILER_PREFIX}/lib) list(APPEND TBB_LIB_SEARCH_PATH ${dir}/lib/ia64/${COMPILER_PREFIX}) list(APPEND TBB_LIB_SEARCH_PATH ${dir}/intel64/${COMPILER_PREFIX}/lib) list(APPEND TBB_LIB_SEARCH_PATH ${dir}/lib/intel64/${COMPILER_PREFIX}) else () list(APPEND TBB_LIB_SEARCH_PATH ${dir}/ia32/${COMPILER_PREFIX}/lib) list(APPEND TBB_LIB_SEARCH_PATH ${dir}/lib/ia32/${COMPILER_PREFIX}) endif () endforeach () endif () # For OS X binary distribution, choose libc++ based libraries for Mavericks (10.9) # and above and AppleClang if (CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND NOT CMAKE_SYSTEM_VERSION VERSION_LESS 13.0) set (USE_LIBCXX OFF) cmake_policy(GET CMP0025 POLICY_VAR) if (POLICY_VAR STREQUAL "NEW") if (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") set (USE_LIBCXX ON) endif () else () if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") set (USE_LIBCXX ON) endif () endif () if (USE_LIBCXX) foreach (dir IN LISTS TBB_PREFIX_PATH) list (APPEND TBB_LIB_SEARCH_PATH ${dir}/lib/libc++ ${dir}/libc++/lib) endforeach () endif () endif () # check compiler ABI if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") set(COMPILER_PREFIX) if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8) list(APPEND COMPILER_PREFIX "gcc4.8") endif() if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.7) list(APPEND COMPILER_PREFIX "gcc4.7") endif() if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.4) list(APPEND COMPILER_PREFIX "gcc4.4") endif() list(APPEND COMPILER_PREFIX "gcc4.1") elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(COMPILER_PREFIX) if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.0) # Complete guess list(APPEND COMPILER_PREFIX "gcc4.8") endif() if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.6) list(APPEND COMPILER_PREFIX "gcc4.7") endif() list(APPEND COMPILER_PREFIX "gcc4.4") else() # Assume compatibility with 4.4 for other compilers list(APPEND COMPILER_PREFIX "gcc4.4") endif () # if platform architecture is explicitly specified set(TBB_ARCH_PLATFORM $ENV{TBB_ARCH_PLATFORM}) if (TBB_ARCH_PLATFORM) foreach (dir IN LISTS TBB_PREFIX_PATH) list(APPEND TBB_LIB_SEARCH_PATH ${dir}/${TBB_ARCH_PLATFORM}/lib) list(APPEND TBB_LIB_SEARCH_PATH ${dir}/lib/${TBB_ARCH_PLATFORM}) endforeach () endif () foreach (dir IN LISTS TBB_PREFIX_PATH) foreach (prefix IN LISTS COMPILER_PREFIX) if (CMAKE_SIZEOF_VOID_P EQUAL 8) list(APPEND TBB_LIB_SEARCH_PATH ${dir}/lib/intel64) list(APPEND TBB_LIB_SEARCH_PATH ${dir}/lib/intel64/${prefix}) list(APPEND TBB_LIB_SEARCH_PATH ${dir}/intel64/lib) list(APPEND TBB_LIB_SEARCH_PATH ${dir}/intel64/${prefix}/lib) else () list(APPEND TBB_LIB_SEARCH_PATH ${dir}/lib/ia32) list(APPEND TBB_LIB_SEARCH_PATH ${dir}/lib/ia32/${prefix}) list(APPEND TBB_LIB_SEARCH_PATH ${dir}/ia32/lib) list(APPEND TBB_LIB_SEARCH_PATH ${dir}/ia32/${prefix}/lib) endif () endforeach() endforeach () # add general search paths foreach (dir IN LISTS TBB_PREFIX_PATH) list(APPEND TBB_LIB_SEARCH_PATH ${dir}/lib ${dir}/Lib ${dir}/lib/tbb ${dir}/Libs) list(APPEND TBB_INC_SEARCH_PATH ${dir}/include ${dir}/Include ${dir}/include/tbb) endforeach () set(TBB_LIBRARY_NAMES tbb) get_debug_names(TBB_LIBRARY_NAMES) find_path(TBB_INCLUDE_DIR NAMES tbb/tbb.h PATHS ${TBB_INC_SEARCH_PATH}) find_library(TBB_LIBRARY_RELEASE NAMES ${TBB_LIBRARY_NAMES} PATHS ${TBB_LIB_SEARCH_PATH}) find_library(TBB_LIBRARY_DEBUG NAMES ${TBB_LIBRARY_NAMES_DEBUG} PATHS ${TBB_LIB_SEARCH_PATH}) make_library_set(TBB_LIBRARY) findpkg_finish(TBB tbb) #if we haven't found TBB no point on going any further if (NOT TBB_FOUND) return() endif () #============================================================================= # Look for TBB's malloc package set(TBB_MALLOC_LIBRARY_NAMES tbbmalloc) get_debug_names(TBB_MALLOC_LIBRARY_NAMES) find_path(TBB_MALLOC_INCLUDE_DIR NAMES tbb/tbb.h PATHS ${TBB_INC_SEARCH_PATH}) find_library(TBB_MALLOC_LIBRARY_RELEASE NAMES ${TBB_MALLOC_LIBRARY_NAMES} PATHS ${TBB_LIB_SEARCH_PATH}) find_library(TBB_MALLOC_LIBRARY_DEBUG NAMES ${TBB_MALLOC_LIBRARY_NAMES_DEBUG} PATHS ${TBB_LIB_SEARCH_PATH}) make_library_set(TBB_MALLOC_LIBRARY) findpkg_finish(TBB_MALLOC tbbmalloc) #============================================================================= # Look for TBB's malloc proxy package set(TBB_MALLOC_PROXY_LIBRARY_NAMES tbbmalloc_proxy) get_debug_names(TBB_MALLOC_PROXY_LIBRARY_NAMES) find_path(TBB_MALLOC_PROXY_INCLUDE_DIR NAMES tbb/tbbmalloc_proxy.h PATHS ${TBB_INC_SEARCH_PATH}) find_library(TBB_MALLOC_PROXY_LIBRARY_RELEASE NAMES ${TBB_MALLOC_PROXY_LIBRARY_NAMES} PATHS ${TBB_LIB_SEARCH_PATH}) find_library(TBB_MALLOC_PROXY_LIBRARY_DEBUG NAMES ${TBB_MALLOC_PROXY_LIBRARY_NAMES_DEBUG} PATHS ${TBB_LIB_SEARCH_PATH}) make_library_set(TBB_MALLOC_PROXY_LIBRARY) findpkg_finish(TBB_MALLOC_PROXY tbbmalloc_proxy) #============================================================================= #parse all the version numbers from tbb if(NOT TBB_VERSION) if (EXISTS "${TBB_INCLUDE_DIR}/oneapi/tbb/version.h") file(STRINGS "${TBB_INCLUDE_DIR}/oneapi/tbb/version.h" TBB_VERSION_CONTENTS REGEX "VERSION") else() #only read the start of the file file(STRINGS "${TBB_INCLUDE_DIR}/tbb/tbb_stddef.h" TBB_VERSION_CONTENTS REGEX "VERSION") endif() string(REGEX REPLACE ".*#define TBB_VERSION_MAJOR ([0-9]+).*" "\\1" TBB_VERSION_MAJOR "${TBB_VERSION_CONTENTS}") string(REGEX REPLACE ".*#define TBB_VERSION_MINOR ([0-9]+).*" "\\1" TBB_VERSION_MINOR "${TBB_VERSION_CONTENTS}") string(REGEX REPLACE ".*#define TBB_INTERFACE_VERSION ([0-9]+).*" "\\1" TBB_INTERFACE_VERSION "${TBB_VERSION_CONTENTS}") string(REGEX REPLACE ".*#define TBB_COMPATIBLE_INTERFACE_VERSION ([0-9]+).*" "\\1" TBB_COMPATIBLE_INTERFACE_VERSION "${TBB_VERSION_CONTENTS}") endif() mathicgb-1.1/cmake/FindMemtailor.cmake0000664000175000017500000000164014560325357013443 # Try to find the MEMTAILOR libraries # See https://github.com/Macaulay2/memtailor # # This file sets up GLPK for CMake. Once done this will define # MEMTAILOR_FOUND - system has MEMTAILOR lib # MEMTAILOR_INCLUDE_DIR - the MEMTAILOR include directory # MEMTAILOR_LIBRARIES - Libraries needed to use MEMTAILOR # # Copyright (c) 2020, Mahrud Sayrafi, # # Redistribution and use is allowed according to the terms of the BSD license. find_path(MEMTAILOR_INCLUDE_DIR NAMES memtailor.h PATHS ${INCLUDE_INSTALL_DIR} ${CMAKE_INSTALL_PREFIX}/include PATH_SUFFIXES memtailor ) find_library(MEMTAILOR_LIBRARIES NAMES memtailor PATHS ${LIB_INSTALL_DIR} ${CMAKE_INSTALL_PREFIX}/lib ) include(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(Memtailor DEFAULT_MSG MEMTAILOR_INCLUDE_DIR MEMTAILOR_LIBRARIES) mark_as_advanced(MEMTAILOR_INCLUDE_DIR MEMTAILOR_LIBRARIES) mathicgb-1.1/README.md0000664000175000017500000000134214560325357010105 mathicgb ========= Mathicgb is a program for computing Groebner basis and signature Grobner bases. Mathicgb is based on the fast data structures from [mathic](https://github.com/broune/mathic). The paper "Practical Grobner Basis Computation" describes the algorithms in Mathicgb from a high level. It was presented at ISSAC 2012 and is available at http://arxiv.org/abs/1206.6940 The following copyright and license notice applies to all of the files in mathicgb. Copyright 2012 2013 Bjarke Hammersholt Roune (http://www.broune.com) and Michael Stillman Mathicgb is licensed for use under the terms of GNU General Public License version 2 and under any later version; the option is yours. See the files gpl-*.txt in this directory. mathicgb-1.1/build/0000775000175000017500000000000015117247675010012 5mathicgb-1.1/build/autotools/0000775000175000017500000000000015117247675012043 5mathicgb-1.1/build/autotools/m4/0000775000175000017500000000000015117247675012363 5mathicgb-1.1/build/autotools/m4/libtool.m40000644000175000017500000113165215117247645014215 # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996-2001, 2003-2019, 2021-2022 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 2014 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool 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 2 of of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program or library that is built # using GNU Libtool, you may include this file under the same # distribution terms that you use for the rest of that program. # # GNU Libtool 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 this program. If not, see . ]) # serial 59 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_PREPARE_CC_BASENAME # ----------------------- m4_defun([_LT_PREPARE_CC_BASENAME], [ # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in @S|@*""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } ])# _LT_PREPARE_CC_BASENAME # _LT_CC_BASENAME(CC) # ------------------- # It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, # but that macro is also expanded into generated libtool script, which # arranges for $SED and $ECHO to be set by different means. m4_defun([_LT_CC_BASENAME], [m4_require([_LT_PREPARE_CC_BASENAME])dnl AC_REQUIRE([_LT_DECL_SED])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl func_cc_basename $1 cc_basename=$func_cc_basename_result ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_DECL_FILECMD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl m4_require([_LT_CMD_TRUNCATE])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a '.a' archive for static linking (except MSVC and # ICC, which need '.lib'). libext=a with_gnu_ld=$lt_cv_prog_gnu_ld old_CC=$CC old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from 'configure', and 'config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # 'config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain=$ac_aux_dir/ltmain.sh ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the 'libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to 'config.status' so that its # declaration there will have the same value as in 'configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags='_LT_TAGS'dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into 'config.status', and then the shell code to quote escape them in # for loops in 'config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # '#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test 0 = "$lt_write_fail" && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ '$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test 0 != $[#] do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try '$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try '$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test yes = "$silent" && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 _LT_COPYING _LT_LIBTOOL_TAGS # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE _LT_PREPARE_MUNGE_PATH_LIST _LT_PREPARE_CC_BASENAME # ### END FUNCTIONS SHARED WITH CONFIGURE _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? $SED '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS=$save_LDFLAGS ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR $AR_FLAGS libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR $AR_FLAGS libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; darwin*) case $MACOSX_DEPLOYMENT_TARGET,$host in 10.[[012]],*|,*powerpc*-darwin[[5-8]]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; *) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi if test yes = "$lt_cv_ld_exported_symbols_list"; then _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test yes = "$lt_cv_ld_force_load"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" _LT_TAGVAR(archive_expsym_cmds, $1)="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" _LT_TAGVAR(module_expsym_cmds, $1)="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" m4_if([$1], [CXX], [ if test yes != "$lt_cv_apple_cc_single_mod"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" _LT_TAGVAR(archive_expsym_cmds, $1)="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script that will find a shell with a builtin # printf (that we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case $ECHO in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [m4_require([_LT_DECL_SED])dnl AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], [Search for dependent libraries within DIR (or the compiler's sysroot if not specified).])], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case $with_sysroot in #( yes) if test yes = "$GCC"; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | $SED -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([$with_sysroot]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and where our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test no = "$enable_libtool_lock" || enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out what ABI is being produced by ac_compile, and set mode # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `$FILECMD conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE=32 ;; *ELF-64*) HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test yes = "$lt_cv_prog_gnu_ld"; then case `$FILECMD conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `$FILECMD conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; mips64*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then emul=elf case `$FILECMD conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; *64-bit*) emul="${emul}64" ;; esac case `$FILECMD conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; *LSB*) emul="${emul}ltsmip" ;; esac case `$FILECMD conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; esac LD="${LD-ld} -m $emul" fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when # doing 32-bit compilation for a host where ld defaults to 64-bit, or # vice versa); the common cases where no linker options are needed do # not appear in the list. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `$FILECMD conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `$FILECMD conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `$FILECMD conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD=${LD-ld}_sol2 fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks=$enable_libtool_lock ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} _LT_DECL([], [AR], [1], [The archiver]) # Use ARFLAGS variable as AR's operation code to sync the variable naming with # Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have # higher priority because thats what people were doing historically (setting # ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS # variable obsoleted/removed. test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr} lt_ar_flags=$AR_FLAGS _LT_DECL([], [lt_ar_flags], [0], [Flags to create an archive (by configure)]) # Make AR_FLAGS overridable by 'make ARFLAGS='. Don't try to run-time override # by AR_FLAGS because that was never working and AR_FLAGS is about to die. _LT_DECL([], [AR_FLAGS], [\@S|@{ARFLAGS-"\@S|@lt_ar_flags"}], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in bitrig* | openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test yes = "[$]$2"; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS ]) if test yes = "[$]$2"; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring=ABCD case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; bitrig* | darwin* | dragonfly* | freebsd* | midnightbsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | $SED 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test X`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n "$lt_cv_sys_max_cmd_len"; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test yes = "$cross_compiling"; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test yes != "$enable_dlopen"; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen=load_add_on lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen=dlopen lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; tpf*) # Don't try to run any link tests for TPF. We know it's impossible # because TPF is a cross-compiler, and we know how we open DSOs. lt_cv_dlopen=dlopen lt_cv_dlopen_libs= lt_cv_dlopen_self=no ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen=shl_load], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen=dlopen], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) ]) ]) ]) ]) ]) ;; esac if test no = "$lt_cv_dlopen"; then enable_dlopen=no else enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS=$CPPFLAGS test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS=$LDFLAGS wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS=$save_CPPFLAGS LDFLAGS=$save_LDFLAGS LIBS=$save_LIBS ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links=nottested if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test no = "$hard_links"; then AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", [Define to the sub-directory where libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then # We can hardcode non-existent directories. if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -z "$STRIP"; then AC_MSG_RESULT([no]) else if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then old_striplib="$STRIP --strip-debug" striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else case $host_os in darwin*) # FIXME - insert some real tests, host_os isn't really good enough striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) ;; freebsd*) if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then old_striplib="$STRIP --strip-debug" striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_PREPARE_MUNGE_PATH_LIST # --------------------------- # Make sure func_munge_path_list() is defined correctly. m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], [[# func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x@S|@2 in x) ;; *:) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" ;; x:*) eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; *::*) eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" ;; *) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; esac } ]])# _LT_PREPARE_PATH_LIST # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test yes = "$GCC"; then case $host_os in darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary... lt_tmp_lt_search_path_spec= lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` # ...but if some path component already ends with the multilib dir we assume # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= ;; esac for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" elif test -n "$lt_multi_os_dir"; then test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS = " "; FS = "/|\n";} { lt_foo = ""; lt_count = 0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown AC_ARG_VAR([LT_SYS_LIBRARY_PATH], [User-defined run-time library search path.]) case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a[(]lib.so.V[)]' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl* | *,icl*) # Native MSVC or ICC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC and ICC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly* | midnightbsd*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], [Detected run-time system search path for libraries]) _LT_DECL([], [configure_time_lt_sys_library_path], [2], [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program that can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$1"; then lt_cv_path_MAGIC_CMD=$ac_dir/"$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac]) MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program that can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test no = "$withval" || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test yes = "$with_gnu_ld"; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], [if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi]) rm -f conftest.i conftest2.i conftest.out]) ])# _LT_PATH_DD # _LT_CMD_TRUNCATE # ---------------- # find command to truncate a binary pipe m4_defun([_LT_CMD_TRUNCATE], [m4_require([_LT_PATH_DD]) AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], [printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) _LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], [Command to truncate a binary pipe]) ])# _LT_CMD_TRUNCATE # _LT_CHECK_MAGIC_METHOD # ---------------------- # how to check for library dependencies # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_MAGIC_METHOD], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) AC_CACHE_CHECK([how to recognize dependent libraries], lt_cv_deplibs_check_method, [lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # that responds to the $file_magic_cmd with a given extended regex. # If you have 'file' or equivalent on your system and you're not sure # whether 'pass_all' will *always* work, you probably want this one. case $host_os in aix[[4-9]]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[[45]]*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='$FILECMD -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly* | midnightbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=$FILECMD lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=$FILECMD case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=$FILECMD lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd* | bitrig*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; os2*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM else lt_nm_to_check=${ac_tool_prefix}nm if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. tmp_nm=$ac_dir/$lt_tmp_nm if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then # Check to see if the nm accepts a BSD-compat flag. # Adding the 'sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in mingw*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | $SED '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | $SED '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} fi]) if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols -headers /dev/null 2>&1 | $SED '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test : != "$DUMPBIN"; then NM=$DUMPBIN fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh; # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # _LT_DLL_DEF_P([FILE]) # --------------------- # True iff FILE is a Windows DLL '.def' file. # Keep in sync with func_dll_def_p in the libtool script AC_DEFUN([_LT_DLL_DEF_P], [dnl test DEF = "`$SED -n dnl -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl -e q dnl Only consider the first "real" line $1`" dnl ])# _LT_DLL_DEF_P # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM=-lm) ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test yes = "$GCC"; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test ia64 = "$host_cpu"; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. lt_cv_sys_global_symbol_to_import="$SED -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" lt_c_name_lib_hook="\ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" else # Disable hooks by default. lt_cv_sys_global_symbol_to_import= lt_cdecl_hook= lt_c_name_hook= lt_c_name_lib_hook= fi # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="$SED -n"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="$SED -n"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="$SED -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function, # D for any global variable and I for any imported variable. # Also find C++ and __fastcall symbols from MSVC++ or ICC, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ " /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ " /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ " {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ " s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="$SED -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | $SED '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&AS_MESSAGE_LOG_FD if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&AS_MESSAGE_LOG_FD && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS=conftstm.$ac_objext CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], [Transform the output of nm into a list of symbols to manually relocate]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([nm_interface], [lt_cv_nm_interface], [1], [The name lister interface]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly* | midnightbsd*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' if test ia64 != "$host_cpu"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64, which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | $SED 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test yes = "$GCC"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64, which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # flang / f18. f95 an alias for gfortran or flang on Debian flang* | f18* | f95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | $SED 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl* | icl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ' (' and ')$', so one must not match beginning or # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', # as well as any symbol that contains 'd'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++ or Intel C++ Compiler. if test yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC) with_gnu_ld=yes ;; openbsd* | bitrig*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v | $SED -e 's/([[^)]]\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test ia64 != "$host_cpu"; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | $SED 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in tcc*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GCC"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++ or Intel C++ Compiler. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl* | icl*) # Native MSVC or ICC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC and ICC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly* | midnightbsd*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; hpux10*) if test yes,no = "$GCC,$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS=$save_LDFLAGS]) if test yes = "$lt_cv_irix_exported_symbol"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi _LT_TAGVAR(link_all_deplibs, $1)=no else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(ld_shlibs, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' ;; esac ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' ;; osf3*) if test yes = "$GCC"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test yes = "$GCC"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test yes = "$GCC"; then wlarc='$wl' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='$wl' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test yes = "$GCC"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test sequent = "$host_vendor"; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test yes,yes = "$GCC,$enable_shared"; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting $shlibpath_var if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to 'libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC=$CC AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report what library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC=$lt_save_CC ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to 'libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test no != "$CXX" && ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || (test g++ != "$CXX"))); then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_caught_CXX_error"; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test yes = "$GXX"; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test yes = "$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='$wl' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GXX"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag=$shared_flag' $wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. # The "-G" linker flag allows undefined symbols. _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl* | ,icl* | no,icl*) # Native MSVC or ICC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ func_to_tool_file "$lt_outputfile"~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly* | midnightbsd*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | $SED 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes,no = "$GXX,$with_gnu_ld"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test yes,no = "$GXX,$with_gnu_ld"; then _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' else # g++ 2.7 appears to require '-G' NOT '-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no _LT_TAGVAR(GCC, $1)=$GXX _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test yes != "$_lt_caught_CXX_error" AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case @S|@2 in .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case $prev$p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test x-L = "$p" || test x-R = "$p"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test no = "$pre_test_object_deps_done"; then case $prev in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)=$prev$p else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test no = "$pre_test_object_deps_done"; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)=$p else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)=$p else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test no = "$F77"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_disable_F77"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)=$G77 _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test yes != "$_lt_disable_F77" AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test no = "$FC"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_disable_FC"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test yes != "$_lt_disable_FC" AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code=$lt_simple_compile_test_code # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_FILECMD # ---------------- # Check for a file(cmd) program that can be used to detect file type and magic m4_defun([_LT_DECL_FILECMD], [AC_CHECK_TOOL([FILECMD], [file], [:]) _LT_DECL([], [FILECMD], [1], [A file(cmd) program that detects file types]) ])# _LD_DECL_FILECMD # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f "$lt_ac_sed" && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test 10 -lt "$lt_ac_count" && break lt_ac_count=`expr $lt_ac_count + 1` if test "$lt_ac_count" -gt "$lt_ac_max"; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine what file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS mathicgb-1.1/build/autotools/m4/ltoptions.m40000644000175000017500000003427515117247645014606 # Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004-2005, 2007-2009, 2011-2019, 2021-2022 Free # Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 8 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option '$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl 'shared' nor 'disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], [_LT_WITH_AIX_SONAME([aix])]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the 'shared' and # 'disable-shared' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS=$lt_save_ifs ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the 'static' and # 'disable-static' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS=$lt_save_ifs ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the 'fast-install' # and 'disable-fast-install' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS=$lt_save_ifs ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_AIX_SONAME([DEFAULT]) # ---------------------------------- # implement the --with-aix-soname flag, and support the `aix-soname=aix' # and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT # is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. m4_define([_LT_WITH_AIX_SONAME], [m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[[5-9]]*,yes) AC_MSG_CHECKING([which variant of shared library versioning to provide]) AC_ARG_WITH([aix-soname], [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], [case $withval in aix|svr4|both) ;; *) AC_MSG_ERROR([Unknown argument to --with-aix-soname]) ;; esac lt_cv_with_aix_soname=$with_aix_soname], [AC_CACHE_VAL([lt_cv_with_aix_soname], [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) with_aix_soname=$lt_cv_with_aix_soname]) AC_MSG_RESULT([$with_aix_soname]) if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, # the AIX toolchain works better with OBJECT_MODE set (default 32). if test 64 = "${OBJECT_MODE-32}"; then shared_archive_member_spec=shr_64 else shared_archive_member_spec=shr fi fi ;; *) with_aix_soname=aix ;; esac _LT_DECL([], [shared_archive_member_spec], [0], [Shared archive member basename, for filename based shared library versioning on AIX])dnl ])# _LT_WITH_AIX_SONAME LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the 'pic-only' and 'no-pic' # LT_INIT options. # MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $withval; do IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS=$lt_save_ifs ;; esac], [pic_mode=m4_default([$1], [default])]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) mathicgb-1.1/build/autotools/m4/lt~obsolete.m40000644000175000017500000001400715117247645015114 # lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004-2005, 2007, 2009, 2011-2019, 2021-2022 Free # Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) mathicgb-1.1/build/autotools/m4/ltversion.m40000644000175000017500000000131215117247645014562 # ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004, 2011-2019, 2021-2022 Free Software Foundation, # Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 4245 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.7]) m4_define([LT_PACKAGE_REVISION], [2.4.7]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.7' macro_revision='2.4.7' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) mathicgb-1.1/build/autotools/m4/ltsugar.m40000644000175000017500000001045315117247645014224 # ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004-2005, 2007-2008, 2011-2019, 2021-2022 Free Software # Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59, which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) mathicgb-1.1/build/autotools/m4/ax_cxx_compile_stdcxx_11.m40000664000175000017500000001076314560325357017447 # ============================================================================ # http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html # ============================================================================ # # SYNOPSIS # # AX_CXX_COMPILE_STDCXX_11([ext|noext],[mandatory|optional]) # # DESCRIPTION # # Check for baseline language coverage in the compiler for the C++11 # standard; if necessary, add switches to CXXFLAGS to enable support. # # The first argument, if specified, indicates whether you insist on an # extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. # -std=c++11). If neither is specified, you get whatever works, with # preference for an extended mode. # # The second argument, if specified 'mandatory' or if left unspecified, # indicates that baseline C++11 support is required and that the macro # should error out if no mode with that support is found. If specified # 'optional', then configuration proceeds regardless, after defining # HAVE_CXX11 if and only if a supporting mode is found. # # LICENSE # # Copyright (c) 2008 Benjamin Kosnik # Copyright (c) 2012 Zack Weinberg # Copyright (c) 2013 Roy Stogner # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 3 m4_define([_AX_CXX_COMPILE_STDCXX_11_testbody], [ template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; typedef check> right_angle_brackets; int a; decltype(a) b; typedef check check_type; check_type c; check_type&& cr = static_cast(c); auto d = a; ]) AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [dnl m4_if([$1], [], [], [$1], [ext], [], [$1], [noext], [], [m4_fatal([invalid argument `$1' to AX_CXX_COMPILE_STDCXX_11])])dnl m4_if([$2], [], [ax_cxx_compile_cxx11_required=true], [$2], [mandatory], [ax_cxx_compile_cxx11_required=true], [$2], [optional], [ax_cxx_compile_cxx11_required=false], [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX_11])])dnl AC_LANG_PUSH([C++])dnl ac_success=no AC_CACHE_CHECK(whether $CXX supports C++11 features by default, ax_cv_cxx_compile_cxx11, [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], [ax_cv_cxx_compile_cxx11=yes], [ax_cv_cxx_compile_cxx11=no])]) if test x$ax_cv_cxx_compile_cxx11 = xyes; then ac_success=yes fi m4_if([$1], [noext], [], [dnl if test x$ac_success = xno; then for switch in -std=gnu++11 -std=gnu++0x; do cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch]) AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch, $cachevar, [ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS $switch" AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], [eval $cachevar=yes], [eval $cachevar=no]) CXXFLAGS="$ac_save_CXXFLAGS"]) if eval test x\$$cachevar = xyes; then CXXFLAGS="$CXXFLAGS $switch" ac_success=yes break fi done fi]) m4_if([$1], [ext], [], [dnl if test x$ac_success = xno; then for switch in -std=c++11 -std=c++0x; do cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch]) AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch, $cachevar, [ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS $switch" AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], [eval $cachevar=yes], [eval $cachevar=no]) CXXFLAGS="$ac_save_CXXFLAGS"]) if eval test x\$$cachevar = xyes; then CXXFLAGS="$CXXFLAGS $switch" ac_success=yes break fi done fi]) AC_LANG_POP([C++]) if test x$ax_cxx_compile_cxx11_required = xtrue; then if test x$ac_success = xno; then AC_MSG_ERROR([*** A compiler with support for C++11 language features is required.]) fi else if test x$ac_success = xno; then HAVE_CXX11=0 AC_MSG_NOTICE([No compiler with C++11 support was found]) else HAVE_CXX11=1 AC_DEFINE(HAVE_CXX11,1, [define if the compiler supports basic C++11 syntax]) fi AC_SUBST(HAVE_CXX11) fi ]) mathicgb-1.1/build/autotools/install-sh0000755000175000017500000003577615117247651014001 #!/bin/sh # install - install a program, script, or datafile scriptversion=2020-11-14.01; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_mkdir= # Desired mode of installed file. mode=0755 # Create dirs (including intermediate dirs) using mode 755. # This is like GNU 'install' as of coreutils 8.32 (2020). mkdir_umask=22 backupsuffix= chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -p pass -p to $cpprog. -s $stripprog installed files. -S SUFFIX attempt to back up existing files, with suffix SUFFIX. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG By default, rm is invoked with -f; when overridden with RMPROG, it's up to you to specify -f if you want it. If -S is not specified, no backups are attempted. Email bug reports to bug-automake@gnu.org. Automake home page: https://www.gnu.org/software/automake/ " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -p) cpprog="$cpprog -p";; -s) stripcmd=$stripprog;; -S) backupsuffix="$2" shift;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? # Don't chown directories that already exist. if test $dstdir_status = 0; then chowncmd="" fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dstbase=`basename "$src"` case $dst in */) dst=$dst$dstbase;; *) dst=$dst/$dstbase;; esac dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi case $dstdir in */) dstdirslash=$dstdir;; *) dstdirslash=$dstdir/;; esac obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false # The $RANDOM variable is not portable (e.g., dash). Use it # here however when possible just to lower collision chance. tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap ' ret=$? rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null exit $ret ' 0 # Because "mkdir -p" follows existing symlinks and we likely work # directly in world-writeable /tmp, make sure that the '$tmpdir' # directory is successfully created first before we actually test # 'mkdir -p'. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi trap '' 0;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=${dstdirslash}_inst.$$_ rmtmp=${dstdirslash}_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && { test -z "$stripcmd" || { # Create $dsttmp read-write so that cp doesn't create it read-only, # which would cause strip to fail. if test -z "$doit"; then : >"$dsttmp" # No need to fork-exec 'touch'. else $doit touch "$dsttmp" fi } } && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # If $backupsuffix is set, and the file being installed # already exists, attempt a backup. Don't worry if it fails, # e.g., if mv doesn't support -f. if test -n "$backupsuffix" && test -f "$dst"; then $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null fi # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: mathicgb-1.1/build/autotools/config.sub0000755000175000017500000010511615117247651013742 #! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2022 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale timestamp='2022-01-03' # This file 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. # # This program 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 this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # https://git.savannah.gnu.org/cgit/config.git/plain/config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. # The "shellcheck disable" line above the timestamp inhibits complaints # about features and limitations of the classic Bourne shell that were # superseded or lifted in POSIX. However, this script identifies a wide # variety of pre-POSIX systems that do not have POSIX shells at all, and # even some reasonably current systems (Solaris 10 as case-in-point) still # have a pre-POSIX /bin/sh. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2022 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; *local*) # First pass through any local machine types. echo "$1" exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Split fields of configuration type # shellcheck disable=SC2162 saved_IFS=$IFS IFS="-" read field1 field2 field3 field4 <&2 exit 1 ;; *-*-*-*) basic_machine=$field1-$field2 basic_os=$field3-$field4 ;; *-*-*) # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two # parts maybe_os=$field2-$field3 case $maybe_os in nto-qnx* | linux-* | uclinux-uclibc* \ | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ | storm-chaos* | os2-emx* | rtmk-nova*) basic_machine=$field1 basic_os=$maybe_os ;; android-linux) basic_machine=$field1-unknown basic_os=linux-android ;; *) basic_machine=$field1-$field2 basic_os=$field3 ;; esac ;; *-*) # A lone config we happen to match not fitting any pattern case $field1-$field2 in decstation-3100) basic_machine=mips-dec basic_os= ;; *-*) # Second component is usually, but not always the OS case $field2 in # Prevent following clause from handling this valid os sun*os*) basic_machine=$field1 basic_os=$field2 ;; zephyr*) basic_machine=$field1-unknown basic_os=$field2 ;; # Manufacturers dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ | unicom* | ibm* | next | hp | isi* | apollo | altos* \ | convergent* | ncr* | news | 32* | 3600* | 3100* \ | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ | ultra | tti* | harris | dolphin | highlevel | gould \ | cbm | ns | masscomp | apple | axis | knuth | cray \ | microblaze* | sim | cisco \ | oki | wec | wrs | winbond) basic_machine=$field1-$field2 basic_os= ;; *) basic_machine=$field1 basic_os=$field2 ;; esac ;; esac ;; *) # Convert single-component short-hands not valid as part of # multi-component configurations. case $field1 in 386bsd) basic_machine=i386-pc basic_os=bsd ;; a29khif) basic_machine=a29k-amd basic_os=udi ;; adobe68k) basic_machine=m68010-adobe basic_os=scout ;; alliant) basic_machine=fx80-alliant basic_os= ;; altos | altos3068) basic_machine=m68k-altos basic_os= ;; am29k) basic_machine=a29k-none basic_os=bsd ;; amdahl) basic_machine=580-amdahl basic_os=sysv ;; amiga) basic_machine=m68k-unknown basic_os= ;; amigaos | amigados) basic_machine=m68k-unknown basic_os=amigaos ;; amigaunix | amix) basic_machine=m68k-unknown basic_os=sysv4 ;; apollo68) basic_machine=m68k-apollo basic_os=sysv ;; apollo68bsd) basic_machine=m68k-apollo basic_os=bsd ;; aros) basic_machine=i386-pc basic_os=aros ;; aux) basic_machine=m68k-apple basic_os=aux ;; balance) basic_machine=ns32k-sequent basic_os=dynix ;; blackfin) basic_machine=bfin-unknown basic_os=linux ;; cegcc) basic_machine=arm-unknown basic_os=cegcc ;; convex-c1) basic_machine=c1-convex basic_os=bsd ;; convex-c2) basic_machine=c2-convex basic_os=bsd ;; convex-c32) basic_machine=c32-convex basic_os=bsd ;; convex-c34) basic_machine=c34-convex basic_os=bsd ;; convex-c38) basic_machine=c38-convex basic_os=bsd ;; cray) basic_machine=j90-cray basic_os=unicos ;; crds | unos) basic_machine=m68k-crds basic_os= ;; da30) basic_machine=m68k-da30 basic_os= ;; decstation | pmax | pmin | dec3100 | decstatn) basic_machine=mips-dec basic_os= ;; delta88) basic_machine=m88k-motorola basic_os=sysv3 ;; dicos) basic_machine=i686-pc basic_os=dicos ;; djgpp) basic_machine=i586-pc basic_os=msdosdjgpp ;; ebmon29k) basic_machine=a29k-amd basic_os=ebmon ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson basic_os=ose ;; gmicro) basic_machine=tron-gmicro basic_os=sysv ;; go32) basic_machine=i386-pc basic_os=go32 ;; h8300hms) basic_machine=h8300-hitachi basic_os=hms ;; h8300xray) basic_machine=h8300-hitachi basic_os=xray ;; h8500hms) basic_machine=h8500-hitachi basic_os=hms ;; harris) basic_machine=m88k-harris basic_os=sysv3 ;; hp300 | hp300hpux) basic_machine=m68k-hp basic_os=hpux ;; hp300bsd) basic_machine=m68k-hp basic_os=bsd ;; hppaosf) basic_machine=hppa1.1-hp basic_os=osf ;; hppro) basic_machine=hppa1.1-hp basic_os=proelf ;; i386mach) basic_machine=i386-mach basic_os=mach ;; isi68 | isi) basic_machine=m68k-isi basic_os=sysv ;; m68knommu) basic_machine=m68k-unknown basic_os=linux ;; magnum | m3230) basic_machine=mips-mips basic_os=sysv ;; merlin) basic_machine=ns32k-utek basic_os=sysv ;; mingw64) basic_machine=x86_64-pc basic_os=mingw64 ;; mingw32) basic_machine=i686-pc basic_os=mingw32 ;; mingw32ce) basic_machine=arm-unknown basic_os=mingw32ce ;; monitor) basic_machine=m68k-rom68k basic_os=coff ;; morphos) basic_machine=powerpc-unknown basic_os=morphos ;; moxiebox) basic_machine=moxie-unknown basic_os=moxiebox ;; msdos) basic_machine=i386-pc basic_os=msdos ;; msys) basic_machine=i686-pc basic_os=msys ;; mvs) basic_machine=i370-ibm basic_os=mvs ;; nacl) basic_machine=le32-unknown basic_os=nacl ;; ncr3000) basic_machine=i486-ncr basic_os=sysv4 ;; netbsd386) basic_machine=i386-pc basic_os=netbsd ;; netwinder) basic_machine=armv4l-rebel basic_os=linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony basic_os=newsos ;; news1000) basic_machine=m68030-sony basic_os=newsos ;; necv70) basic_machine=v70-nec basic_os=sysv ;; nh3000) basic_machine=m68k-harris basic_os=cxux ;; nh[45]000) basic_machine=m88k-harris basic_os=cxux ;; nindy960) basic_machine=i960-intel basic_os=nindy ;; mon960) basic_machine=i960-intel basic_os=mon960 ;; nonstopux) basic_machine=mips-compaq basic_os=nonstopux ;; os400) basic_machine=powerpc-ibm basic_os=os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson basic_os=ose ;; os68k) basic_machine=m68k-none basic_os=os68k ;; paragon) basic_machine=i860-intel basic_os=osf ;; parisc) basic_machine=hppa-unknown basic_os=linux ;; psp) basic_machine=mipsallegrexel-sony basic_os=psp ;; pw32) basic_machine=i586-unknown basic_os=pw32 ;; rdos | rdos64) basic_machine=x86_64-pc basic_os=rdos ;; rdos32) basic_machine=i386-pc basic_os=rdos ;; rom68k) basic_machine=m68k-rom68k basic_os=coff ;; sa29200) basic_machine=a29k-amd basic_os=udi ;; sei) basic_machine=mips-sei basic_os=seiux ;; sequent) basic_machine=i386-sequent basic_os= ;; sps7) basic_machine=m68k-bull basic_os=sysv2 ;; st2000) basic_machine=m68k-tandem basic_os= ;; stratus) basic_machine=i860-stratus basic_os=sysv4 ;; sun2) basic_machine=m68000-sun basic_os= ;; sun2os3) basic_machine=m68000-sun basic_os=sunos3 ;; sun2os4) basic_machine=m68000-sun basic_os=sunos4 ;; sun3) basic_machine=m68k-sun basic_os= ;; sun3os3) basic_machine=m68k-sun basic_os=sunos3 ;; sun3os4) basic_machine=m68k-sun basic_os=sunos4 ;; sun4) basic_machine=sparc-sun basic_os= ;; sun4os3) basic_machine=sparc-sun basic_os=sunos3 ;; sun4os4) basic_machine=sparc-sun basic_os=sunos4 ;; sun4sol2) basic_machine=sparc-sun basic_os=solaris2 ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun basic_os= ;; sv1) basic_machine=sv1-cray basic_os=unicos ;; symmetry) basic_machine=i386-sequent basic_os=dynix ;; t3e) basic_machine=alphaev5-cray basic_os=unicos ;; t90) basic_machine=t90-cray basic_os=unicos ;; toad1) basic_machine=pdp10-xkl basic_os=tops20 ;; tpf) basic_machine=s390x-ibm basic_os=tpf ;; udi29k) basic_machine=a29k-amd basic_os=udi ;; ultra3) basic_machine=a29k-nyu basic_os=sym1 ;; v810 | necv810) basic_machine=v810-nec basic_os=none ;; vaxv) basic_machine=vax-dec basic_os=sysv ;; vms) basic_machine=vax-dec basic_os=vms ;; vsta) basic_machine=i386-pc basic_os=vsta ;; vxworks960) basic_machine=i960-wrs basic_os=vxworks ;; vxworks68) basic_machine=m68k-wrs basic_os=vxworks ;; vxworks29k) basic_machine=a29k-wrs basic_os=vxworks ;; xbox) basic_machine=i686-pc basic_os=mingw32 ;; ymp) basic_machine=ymp-cray basic_os=unicos ;; *) basic_machine=$1 basic_os= ;; esac ;; esac # Decode 1-component or ad-hoc basic machines case $basic_machine in # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) cpu=hppa1.1 vendor=winbond ;; op50n) cpu=hppa1.1 vendor=oki ;; op60c) cpu=hppa1.1 vendor=oki ;; ibm*) cpu=i370 vendor=ibm ;; orion105) cpu=clipper vendor=highlevel ;; mac | mpw | mac-mpw) cpu=m68k vendor=apple ;; pmac | pmac-mpw) cpu=powerpc vendor=apple ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) cpu=m68000 vendor=att ;; 3b*) cpu=we32k vendor=att ;; bluegene*) cpu=powerpc vendor=ibm basic_os=cnk ;; decsystem10* | dec10*) cpu=pdp10 vendor=dec basic_os=tops10 ;; decsystem20* | dec20*) cpu=pdp10 vendor=dec basic_os=tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) cpu=m68k vendor=motorola ;; dpx2*) cpu=m68k vendor=bull basic_os=sysv3 ;; encore | umax | mmax) cpu=ns32k vendor=encore ;; elxsi) cpu=elxsi vendor=elxsi basic_os=${basic_os:-bsd} ;; fx2800) cpu=i860 vendor=alliant ;; genix) cpu=ns32k vendor=ns ;; h3050r* | hiux*) cpu=hppa1.1 vendor=hitachi basic_os=hiuxwe2 ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) cpu=m68000 vendor=hp ;; hp9k3[2-9][0-9]) cpu=m68k vendor=hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) cpu=hppa1.1 vendor=hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp cpu=hppa1.1 vendor=hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp cpu=hppa1.1 vendor=hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) cpu=hppa1.1 vendor=hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; i*86v32) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv32 ;; i*86v4*) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv4 ;; i*86v) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv ;; i*86sol2) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=solaris2 ;; j90 | j90-cray) cpu=j90 vendor=cray basic_os=${basic_os:-unicos} ;; iris | iris4d) cpu=mips vendor=sgi case $basic_os in irix*) ;; *) basic_os=irix4 ;; esac ;; miniframe) cpu=m68000 vendor=convergent ;; *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) cpu=m68k vendor=atari basic_os=mint ;; news-3600 | risc-news) cpu=mips vendor=sony basic_os=newsos ;; next | m*-next) cpu=m68k vendor=next case $basic_os in openstep*) ;; nextstep*) ;; ns2*) basic_os=nextstep2 ;; *) basic_os=nextstep3 ;; esac ;; np1) cpu=np1 vendor=gould ;; op50n-* | op60c-*) cpu=hppa1.1 vendor=oki basic_os=proelf ;; pa-hitachi) cpu=hppa1.1 vendor=hitachi basic_os=hiuxwe2 ;; pbd) cpu=sparc vendor=tti ;; pbb) cpu=m68k vendor=tti ;; pc532) cpu=ns32k vendor=pc532 ;; pn) cpu=pn vendor=gould ;; power) cpu=power vendor=ibm ;; ps2) cpu=i386 vendor=ibm ;; rm[46]00) cpu=mips vendor=siemens ;; rtpc | rtpc-*) cpu=romp vendor=ibm ;; sde) cpu=mipsisa32 vendor=sde basic_os=${basic_os:-elf} ;; simso-wrs) cpu=sparclite vendor=wrs basic_os=vxworks ;; tower | tower-32) cpu=m68k vendor=ncr ;; vpp*|vx|vx-*) cpu=f301 vendor=fujitsu ;; w65) cpu=w65 vendor=wdc ;; w89k-*) cpu=hppa1.1 vendor=winbond basic_os=proelf ;; none) cpu=none vendor=none ;; leon|leon[3-9]) cpu=sparc vendor=$basic_machine ;; leon-*|leon[3-9]-*) cpu=sparc vendor=`echo "$basic_machine" | sed 's/-.*//'` ;; *-*) # shellcheck disable=SC2162 saved_IFS=$IFS IFS="-" read cpu vendor <&2 exit 1 ;; esac ;; esac # Here we canonicalize certain aliases for manufacturers. case $vendor in digital*) vendor=dec ;; commodore*) vendor=cbm ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if test x$basic_os != x then # First recognize some ad-hoc cases, or perhaps split kernel-os, or else just # set os. case $basic_os in gnu/linux*) kernel=linux os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'` ;; os2-emx) kernel=os2 os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'` ;; nto-qnx*) kernel=nto os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'` ;; *-*) # shellcheck disable=SC2162 saved_IFS=$IFS IFS="-" read kernel os <&2 exit 1 ;; esac # As a final step for OS-related things, validate the OS-kernel combination # (given a valid OS), if there is a kernel. case $kernel-$os in linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \ | linux-musl* | linux-relibc* | linux-uclibc* ) ;; uclinux-uclibc* ) ;; -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* ) # These are just libc implementations, not actual OSes, and thus # require a kernel. echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 exit 1 ;; kfreebsd*-gnu* | kopensolaris*-gnu*) ;; vxworks-simlinux | vxworks-simwindows | vxworks-spe) ;; nto-qnx*) ;; os2-emx) ;; *-eabi* | *-gnueabi*) ;; -*) # Blank kernel with real OS is always fine. ;; *-*) echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 exit 1 ;; esac # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. case $vendor in unknown) case $cpu-$os in *-riscix*) vendor=acorn ;; *-sunos*) vendor=sun ;; *-cnk* | *-aix*) vendor=ibm ;; *-beos*) vendor=be ;; *-hpux*) vendor=hp ;; *-mpeix*) vendor=hp ;; *-hiux*) vendor=hitachi ;; *-unos*) vendor=crds ;; *-dgux*) vendor=dg ;; *-luna*) vendor=omron ;; *-genix*) vendor=ns ;; *-clix*) vendor=intergraph ;; *-mvs* | *-opened*) vendor=ibm ;; *-os400*) vendor=ibm ;; s390-* | s390x-*) vendor=ibm ;; *-ptx*) vendor=sequent ;; *-tpf*) vendor=ibm ;; *-vxsim* | *-vxworks* | *-windiss*) vendor=wrs ;; *-aux*) vendor=apple ;; *-hms*) vendor=hitachi ;; *-mpw* | *-macos*) vendor=apple ;; *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) vendor=atari ;; *-vos*) vendor=stratus ;; esac ;; esac echo "$cpu-$vendor-${kernel:+$kernel-}$os" exit # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: mathicgb-1.1/build/autotools/missing0000755000175000017500000001533615117247651013362 #! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1996-2021 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program 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 2, or (at your option) # any later version. # This program 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 this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=https://www.perl.org/ flex_URL=https://github.com/westes/flex gnu_software_URL=https://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: mathicgb-1.1/build/autotools/ltmain.sh0000755000175000017500000121237515117247645013614 #! /usr/bin/env sh ## DO NOT EDIT - This file generated from ./build-aux/ltmain.in ## by inline-source v2019-02-19.15 # libtool (GNU libtool) 2.4.7 # Provide generalized library-building support services. # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996-2019, 2021-2022 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool 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 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 this program. If not, see . PROGRAM=libtool PACKAGE=libtool VERSION="2.4.7 Debian-2.4.7-7build1" package_revision=2.4.7 ## ------ ## ## Usage. ## ## ------ ## # Run './libtool --help' for help with using this script from the # command line. ## ------------------------------- ## ## User overridable command paths. ## ## ------------------------------- ## # After configure completes, it has a better idea of some of the # shell tools we need than the defaults used by the functions shared # with bootstrap, so set those here where they can still be over- # ridden by the user, but otherwise take precedence. : ${AUTOCONF="autoconf"} : ${AUTOMAKE="automake"} ## -------------------------- ## ## Source external libraries. ## ## -------------------------- ## # Much of our low-level functionality needs to be sourced from external # libraries, which are installed to $pkgauxdir. # Set a version string for this script. scriptversion=2019-02-19.15; # UTC # General shell script boiler plate, and helper functions. # Written by Gary V. Vaughan, 2004 # This is free software. There is NO warranty; not even for # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # Copyright (C) 2004-2019, 2021 Bootstrap Authors # # This file is dual licensed under the terms of the MIT license # , and GPL version 2 or later # . You must apply one of # these licenses when using or redistributing this software or any of # the files within it. See the URLs above, or the file `LICENSE` # included in the Bootstrap distribution for the full license texts. # Please report bugs or propose patches to: # ## ------ ## ## Usage. ## ## ------ ## # Evaluate this file near the top of your script to gain access to # the functions and variables defined here: # # . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh # # If you need to override any of the default environment variable # settings, do that before evaluating this file. ## -------------------- ## ## Shell normalisation. ## ## -------------------- ## # Some shells need a little help to be as Bourne compatible as possible. # Before doing anything else, make sure all that help has been provided! DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # NLS nuisances: We save the old values in case they are required later. _G_user_locale= _G_safe_locale= for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test set = \"\${$_G_var+set}\"; then save_$_G_var=\$$_G_var $_G_var=C export $_G_var _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" fi" done # These NLS vars are set unconditionally (bootstrap issue #24). Unset those # in case the environment reset is needed later and the $save_* variant is not # defined (see the code above). LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL # Make sure IFS has a sensible default sp=' ' nl=' ' IFS="$sp $nl" # There are apparently some retarded systems that use ';' as a PATH separator! if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # func_unset VAR # -------------- # Portably unset VAR. # In some shells, an 'unset VAR' statement leaves a non-zero return # status if VAR is already unset, which might be problematic if the # statement is used at the end of a function (thus poisoning its return # value) or when 'set -e' is active (causing even a spurious abort of # the script in this case). func_unset () { { eval $1=; (eval unset $1) >/dev/null 2>&1 && eval unset $1 || : ; } } # Make sure CDPATH doesn't cause `cd` commands to output the target dir. func_unset CDPATH # Make sure ${,E,F}GREP behave sanely. func_unset GREP_OPTIONS ## ------------------------- ## ## Locate command utilities. ## ## ------------------------- ## # func_executable_p FILE # ---------------------- # Check that FILE is an executable regular file. func_executable_p () { test -f "$1" && test -x "$1" } # func_path_progs PROGS_LIST CHECK_FUNC [PATH] # -------------------------------------------- # Search for either a program that responds to --version with output # containing "GNU", or else returned by CHECK_FUNC otherwise, by # trying all the directories in PATH with each of the elements of # PROGS_LIST. # # CHECK_FUNC should accept the path to a candidate program, and # set $func_check_prog_result if it truncates its output less than # $_G_path_prog_max characters. func_path_progs () { _G_progs_list=$1 _G_check_func=$2 _G_PATH=${3-"$PATH"} _G_path_prog_max=0 _G_path_prog_found=false _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} for _G_dir in $_G_PATH; do IFS=$_G_save_IFS test -z "$_G_dir" && _G_dir=. for _G_prog_name in $_G_progs_list; do for _exeext in '' .EXE; do _G_path_prog=$_G_dir/$_G_prog_name$_exeext func_executable_p "$_G_path_prog" || continue case `"$_G_path_prog" --version 2>&1` in *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; *) $_G_check_func $_G_path_prog func_path_progs_result=$func_check_prog_result ;; esac $_G_path_prog_found && break 3 done done done IFS=$_G_save_IFS test -z "$func_path_progs_result" && { echo "no acceptable sed could be found in \$PATH" >&2 exit 1 } } # We want to be able to use the functions in this file before configure # has figured out where the best binaries are kept, which means we have # to search for them ourselves - except when the results are already set # where we skip the searches. # Unless the user overrides by setting SED, search the path for either GNU # sed, or the sed that truncates its output the least. test -z "$SED" && { _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for _G_i in 1 2 3 4 5 6 7; do _G_sed_script=$_G_sed_script$nl$_G_sed_script done echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed _G_sed_script= func_check_prog_sed () { _G_path_prog=$1 _G_count=0 printf 0123456789 >conftest.in while : do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo '' >> conftest.nl "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break diff conftest.out conftest.nl >/dev/null 2>&1 || break _G_count=`expr $_G_count + 1` if test "$_G_count" -gt "$_G_path_prog_max"; then # Best one so far, save it but keep looking for a better one func_check_prog_result=$_G_path_prog _G_path_prog_max=$_G_count fi # 10*(2^10) chars as input seems more than enough test 10 -lt "$_G_count" && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out } func_path_progs "sed gsed" func_check_prog_sed "$PATH:/usr/xpg4/bin" rm -f conftest.sed SED=$func_path_progs_result } # Unless the user overrides by setting GREP, search the path for either GNU # grep, or the grep that truncates its output the least. test -z "$GREP" && { func_check_prog_grep () { _G_path_prog=$1 _G_count=0 _G_path_prog_max=0 printf 0123456789 >conftest.in while : do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo 'GREP' >> conftest.nl "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break diff conftest.out conftest.nl >/dev/null 2>&1 || break _G_count=`expr $_G_count + 1` if test "$_G_count" -gt "$_G_path_prog_max"; then # Best one so far, save it but keep looking for a better one func_check_prog_result=$_G_path_prog _G_path_prog_max=$_G_count fi # 10*(2^10) chars as input seems more than enough test 10 -lt "$_G_count" && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out } func_path_progs "grep ggrep" func_check_prog_grep "$PATH:/usr/xpg4/bin" GREP=$func_path_progs_result } ## ------------------------------- ## ## User overridable command paths. ## ## ------------------------------- ## # All uppercase variable names are used for environment variables. These # variables can be overridden by the user before calling a script that # uses them if a suitable command of that name is not already available # in the command search PATH. : ${CP="cp -f"} : ${ECHO="printf %s\n"} : ${EGREP="$GREP -E"} : ${FGREP="$GREP -F"} : ${LN_S="ln -s"} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} ## -------------------- ## ## Useful sed snippets. ## ## -------------------- ## sed_dirname='s|/[^/]*$||' sed_basename='s|^.*/||' # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='s|\([`"$\\]\)|\\\1|g' # Same as above, but do not quote variable references. sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' # Sed substitution that converts a w32 file name or path # that contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-'\' parameter expansions in output of sed_double_quote_subst that # were '\'-ed in input to the same. If an odd number of '\' preceded a # '$' in input to sed_double_quote_subst, that '$' was protected from # expansion. Since each input '\' is now two '\'s, look for any number # of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. _G_bs='\\' _G_bs2='\\\\' _G_bs4='\\\\\\\\' _G_dollar='\$' sed_double_backslash="\ s/$_G_bs4/&\\ /g s/^$_G_bs2$_G_dollar/$_G_bs&/ s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g s/\n//g" # require_check_ifs_backslash # --------------------------- # Check if we can use backslash as IFS='\' separator, and set # $check_ifs_backshlash_broken to ':' or 'false'. require_check_ifs_backslash=func_require_check_ifs_backslash func_require_check_ifs_backslash () { _G_save_IFS=$IFS IFS='\' _G_check_ifs_backshlash='a\\b' for _G_i in $_G_check_ifs_backshlash do case $_G_i in a) check_ifs_backshlash_broken=false ;; '') break ;; *) check_ifs_backshlash_broken=: break ;; esac done IFS=$_G_save_IFS require_check_ifs_backslash=: } ## ----------------- ## ## Global variables. ## ## ----------------- ## # Except for the global variables explicitly listed below, the following # functions in the '^func_' namespace, and the '^require_' namespace # variables initialised in the 'Resource management' section, sourcing # this file will not pollute your global namespace with anything # else. There's no portable way to scope variables in Bourne shell # though, so actually running these functions will sometimes place # results into a variable named after the function, and often use # temporary variables in the '^_G_' namespace. If you are careful to # avoid using those namespaces casually in your sourcing script, things # should continue to work as you expect. And, of course, you can freely # overwrite any of the functions or variables defined here before # calling anything to customize them. EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. # Allow overriding, eg assuming that you follow the convention of # putting '$debug_cmd' at the start of all your functions, you can get # bash to show function call trace with: # # debug_cmd='echo "${FUNCNAME[0]} $*" >&2' bash your-script-name debug_cmd=${debug_cmd-":"} exit_cmd=: # By convention, finish your script with: # # exit $exit_status # # so that you can set exit_status to non-zero if you want to indicate # something went wrong during execution without actually bailing out at # the point of failure. exit_status=$EXIT_SUCCESS # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath=$0 # The name of this program. progname=`$ECHO "$progpath" |$SED "$sed_basename"` # Make sure we have an absolute progpath for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` progdir=`cd "$progdir" && pwd` progpath=$progdir/$progname ;; *) _G_IFS=$IFS IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS=$_G_IFS test -x "$progdir/$progname" && break done IFS=$_G_IFS test -n "$progdir" || progdir=`pwd` progpath=$progdir/$progname ;; esac ## ----------------- ## ## Standard options. ## ## ----------------- ## # The following options affect the operation of the functions defined # below, and should be set appropriately depending on run-time para- # meters passed on the command line. opt_dry_run=false opt_quiet=false opt_verbose=false # Categories 'all' and 'none' are always available. Append any others # you will pass as the first argument to func_warning from your own # code. warning_categories= # By default, display warnings according to 'opt_warning_types'. Set # 'warning_func' to ':' to elide all warnings, or func_fatal_error to # treat the next displayed warning as a fatal error. warning_func=func_warn_and_continue # Set to 'all' to display all warnings, 'none' to suppress all # warnings, or a space delimited list of some subset of # 'warning_categories' to display only the listed warnings. opt_warning_types=all ## -------------------- ## ## Resource management. ## ## -------------------- ## # This section contains definitions for functions that each ensure a # particular resource (a file, or a non-empty configuration variable for # example) is available, and if appropriate to extract default values # from pertinent package files. Call them using their associated # 'require_*' variable to ensure that they are executed, at most, once. # # It's entirely deliberate that calling these functions can set # variables that don't obey the namespace limitations obeyed by the rest # of this file, in order that that they be as useful as possible to # callers. # require_term_colors # ------------------- # Allow display of bold text on terminals that support it. require_term_colors=func_require_term_colors func_require_term_colors () { $debug_cmd test -t 1 && { # COLORTERM and USE_ANSI_COLORS environment variables take # precedence, because most terminfo databases neglect to describe # whether color sequences are supported. test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} if test 1 = "$USE_ANSI_COLORS"; then # Standard ANSI escape sequences tc_reset='' tc_bold=''; tc_standout='' tc_red=''; tc_green='' tc_blue=''; tc_cyan='' else # Otherwise trust the terminfo database after all. test -n "`tput sgr0 2>/dev/null`" && { tc_reset=`tput sgr0` test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` tc_standout=$tc_bold test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` } fi } require_term_colors=: } ## ----------------- ## ## Function library. ## ## ----------------- ## # This section contains a variety of useful functions to call in your # scripts. Take note of the portable wrappers for features provided by # some modern shells, which will fall back to slower equivalents on # less featureful shells. # func_append VAR VALUE # --------------------- # Append VALUE onto the existing contents of VAR. # _G_HAVE_PLUSEQ_OP # Can be empty, in which case the shell is probed, "yes" if += is # useable or anything else if it does not work. if test -z "$_G_HAVE_PLUSEQ_OP" && \ __PLUSEQ_TEST="a" && \ __PLUSEQ_TEST+=" b" 2>/dev/null && \ test "a b" = "$__PLUSEQ_TEST"; then _G_HAVE_PLUSEQ_OP=yes fi if test yes = "$_G_HAVE_PLUSEQ_OP" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_append () { $debug_cmd eval "$1+=\$2" }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_append () { $debug_cmd eval "$1=\$$1\$2" } fi # func_append_quoted VAR VALUE # ---------------------------- # Quote VALUE and append to the end of shell variable VAR, separated # by a space. if test yes = "$_G_HAVE_PLUSEQ_OP"; then eval 'func_append_quoted () { $debug_cmd func_quote_arg pretty "$2" eval "$1+=\\ \$func_quote_arg_result" }' else func_append_quoted () { $debug_cmd func_quote_arg pretty "$2" eval "$1=\$$1\\ \$func_quote_arg_result" } fi # func_append_uniq VAR VALUE # -------------------------- # Append unique VALUE onto the existing contents of VAR, assuming # entries are delimited by the first character of VALUE. For example: # # func_append_uniq options " --another-option option-argument" # # will only append to $options if " --another-option option-argument " # is not already present somewhere in $options already (note spaces at # each end implied by leading space in second argument). func_append_uniq () { $debug_cmd eval _G_current_value='`$ECHO $'$1'`' _G_delim=`expr "$2" : '\(.\)'` case $_G_delim$_G_current_value$_G_delim in *"$2$_G_delim"*) ;; *) func_append "$@" ;; esac } # func_arith TERM... # ------------------ # Set func_arith_result to the result of evaluating TERMs. test -z "$_G_HAVE_ARITH_OP" \ && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ && _G_HAVE_ARITH_OP=yes if test yes = "$_G_HAVE_ARITH_OP"; then eval 'func_arith () { $debug_cmd func_arith_result=$(( $* )) }' else func_arith () { $debug_cmd func_arith_result=`expr "$@"` } fi # func_basename FILE # ------------------ # Set func_basename_result to FILE with everything up to and including # the last / stripped. if test yes = "$_G_HAVE_XSI_OPS"; then # If this shell supports suffix pattern removal, then use it to avoid # forking. Hide the definitions single quotes in case the shell chokes # on unsupported syntax... _b='func_basename_result=${1##*/}' _d='case $1 in */*) func_dirname_result=${1%/*}$2 ;; * ) func_dirname_result=$3 ;; esac' else # ...otherwise fall back to using sed. _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` if test "X$func_dirname_result" = "X$1"; then func_dirname_result=$3 else func_append func_dirname_result "$2" fi' fi eval 'func_basename () { $debug_cmd '"$_b"' }' # func_dirname FILE APPEND NONDIR_REPLACEMENT # ------------------------------------------- # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. eval 'func_dirname () { $debug_cmd '"$_d"' }' # func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT # -------------------------------------------------------- # Perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # For efficiency, we do not delegate to the functions above but instead # duplicate the functionality here. eval 'func_dirname_and_basename () { $debug_cmd '"$_b"' '"$_d"' }' # func_echo ARG... # ---------------- # Echo program name prefixed message. func_echo () { $debug_cmd _G_message=$* func_echo_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_IFS $ECHO "$progname: $_G_line" done IFS=$func_echo_IFS } # func_echo_all ARG... # -------------------- # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_echo_infix_1 INFIX ARG... # ------------------------------ # Echo program name, followed by INFIX on the first line, with any # additional lines not showing INFIX. func_echo_infix_1 () { $debug_cmd $require_term_colors _G_infix=$1; shift _G_indent=$_G_infix _G_prefix="$progname: $_G_infix: " _G_message=$* # Strip color escape sequences before counting printable length for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" do test -n "$_G_tc" && { _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` } done _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes func_echo_infix_1_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_infix_1_IFS $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 _G_prefix=$_G_indent done IFS=$func_echo_infix_1_IFS } # func_error ARG... # ----------------- # Echo program name prefixed message to standard error. func_error () { $debug_cmd $require_term_colors func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 } # func_fatal_error ARG... # ----------------------- # Echo program name prefixed message to standard error, and exit. func_fatal_error () { $debug_cmd func_error "$*" exit $EXIT_FAILURE } # func_grep EXPRESSION FILENAME # ----------------------------- # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $debug_cmd $GREP "$1" "$2" >/dev/null 2>&1 } # func_len STRING # --------------- # Set func_len_result to the length of STRING. STRING may not # start with a hyphen. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ && _G_HAVE_XSI_OPS=yes if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_len () { $debug_cmd func_len_result=${#1} }' else func_len () { $debug_cmd func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` } fi # func_mkdir_p DIRECTORY-PATH # --------------------------- # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { $debug_cmd _G_directory_path=$1 _G_dir_list= if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then # Protect directory names starting with '-' case $_G_directory_path in -*) _G_directory_path=./$_G_directory_path ;; esac # While some portion of DIR does not yet exist... while test ! -d "$_G_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. _G_dir_list=$_G_directory_path:$_G_dir_list # If the last portion added has no slash in it, the list is done case $_G_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` done _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` func_mkdir_p_IFS=$IFS; IFS=: for _G_dir in $_G_dir_list; do IFS=$func_mkdir_p_IFS # mkdir can fail with a 'File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$_G_dir" 2>/dev/null || : done IFS=$func_mkdir_p_IFS # Bail out if we (or some other process) failed to create a directory. test -d "$_G_directory_path" || \ func_fatal_error "Failed to create '$1'" fi } # func_mktempdir [BASENAME] # ------------------------- # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, BASENAME is the basename for that directory. func_mktempdir () { $debug_cmd _G_template=${TMPDIR-/tmp}/${1-$progname} if test : = "$opt_dry_run"; then # Return a directory name, but don't create it in dry-run mode _G_tmpdir=$_G_template-$$ else # If mktemp works, use that first and foremost _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` if test ! -d "$_G_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race _G_tmpdir=$_G_template-${RANDOM-0}$$ func_mktempdir_umask=`umask` umask 0077 $MKDIR "$_G_tmpdir" umask $func_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$_G_tmpdir" || \ func_fatal_error "cannot create temporary directory '$_G_tmpdir'" fi $ECHO "$_G_tmpdir" } # func_normal_abspath PATH # ------------------------ # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. func_normal_abspath () { $debug_cmd # These SED scripts presuppose an absolute path with a trailing slash. _G_pathcar='s|^/\([^/]*\).*$|\1|' _G_pathcdr='s|^/[^/]*||' _G_removedotparts=':dotsl s|/\./|/|g t dotsl s|/\.$|/|' _G_collapseslashes='s|/\{1,\}|/|g' _G_finalslash='s|/*$|/|' # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` while :; do # Processed it all yet? if test / = "$func_normal_abspath_tpath"; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result"; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_notquiet ARG... # -------------------- # Echo program name prefixed message only when not in quiet mode. func_notquiet () { $debug_cmd $opt_quiet || func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_relative_path SRCDIR DSTDIR # -------------------------------- # Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. func_relative_path () { $debug_cmd func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=$func_dirname_result if test -z "$func_relative_path_tlibdir"; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test -n "$func_stripname_result"; then func_append func_relative_path_result "/$func_stripname_result" fi # Normalisation. If bindir is libdir, return '.' else relative path. if test -n "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result" func_relative_path_result=$func_stripname_result fi test -n "$func_relative_path_result" || func_relative_path_result=. : } # func_quote_portable EVAL ARG # ---------------------------- # Internal function to portably implement func_quote_arg. Note that we still # keep attention to performance here so we as much as possible try to avoid # calling sed binary (so far O(N) complexity as long as func_append is O(1)). func_quote_portable () { $debug_cmd $require_check_ifs_backslash func_quote_portable_result=$2 # one-time-loop (easy break) while true do if $1; then func_quote_portable_result=`$ECHO "$2" | $SED \ -e "$sed_double_quote_subst" -e "$sed_double_backslash"` break fi # Quote for eval. case $func_quote_portable_result in *[\\\`\"\$]*) # Fallback to sed for $func_check_bs_ifs_broken=:, or when the string # contains the shell wildcard characters. case $check_ifs_backshlash_broken$func_quote_portable_result in :*|*[\[\*\?]*) func_quote_portable_result=`$ECHO "$func_quote_portable_result" \ | $SED "$sed_quote_subst"` break ;; esac func_quote_portable_old_IFS=$IFS for _G_char in '\' '`' '"' '$' do # STATE($1) PREV($2) SEPARATOR($3) set start "" "" func_quote_portable_result=dummy"$_G_char$func_quote_portable_result$_G_char"dummy IFS=$_G_char for _G_part in $func_quote_portable_result do case $1 in quote) func_append func_quote_portable_result "$3$2" set quote "$_G_part" "\\$_G_char" ;; start) set first "" "" func_quote_portable_result= ;; first) set quote "$_G_part" "" ;; esac done done IFS=$func_quote_portable_old_IFS ;; *) ;; esac break done func_quote_portable_unquoted_result=$func_quote_portable_result case $func_quote_portable_result in # double-quote args containing shell metacharacters to delay # word splitting, command substitution and variable expansion # for a subsequent eval. # many bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_portable_result=\"$func_quote_portable_result\" ;; esac } # func_quotefast_eval ARG # ----------------------- # Quote one ARG (internal). This is equivalent to 'func_quote_arg eval ARG', # but optimized for speed. Result is stored in $func_quotefast_eval. if test xyes = `(x=; printf -v x %q yes; echo x"$x") 2>/dev/null`; then printf -v _GL_test_printf_tilde %q '~' if test '\~' = "$_GL_test_printf_tilde"; then func_quotefast_eval () { printf -v func_quotefast_eval_result %q "$1" } else # Broken older Bash implementations. Make those faster too if possible. func_quotefast_eval () { case $1 in '~'*) func_quote_portable false "$1" func_quotefast_eval_result=$func_quote_portable_result ;; *) printf -v func_quotefast_eval_result %q "$1" ;; esac } fi else func_quotefast_eval () { func_quote_portable false "$1" func_quotefast_eval_result=$func_quote_portable_result } fi # func_quote_arg MODEs ARG # ------------------------ # Quote one ARG to be evaled later. MODEs argument may contain zero or more # specifiers listed below separated by ',' character. This function returns two # values: # i) func_quote_arg_result # double-quoted (when needed), suitable for a subsequent eval # ii) func_quote_arg_unquoted_result # has all characters that are still active within double # quotes backslashified. Available only if 'unquoted' is specified. # # Available modes: # ---------------- # 'eval' (default) # - escape shell special characters # 'expand' # - the same as 'eval'; but do not quote variable references # 'pretty' # - request aesthetic output, i.e. '"a b"' instead of 'a\ b'. This might # be used later in func_quote to get output like: 'echo "a b"' instead # of 'echo a\ b'. This is slower than default on some shells. # 'unquoted' # - produce also $func_quote_arg_unquoted_result which does not contain # wrapping double-quotes. # # Examples for 'func_quote_arg pretty,unquoted string': # # string | *_result | *_unquoted_result # ------------+-----------------------+------------------- # " | \" | \" # a b | "a b" | a b # "a b" | "\"a b\"" | \"a b\" # * | "*" | * # z="${x-$y}" | "z=\"\${x-\$y}\"" | z=\"\${x-\$y}\" # # Examples for 'func_quote_arg pretty,unquoted,expand string': # # string | *_result | *_unquoted_result # --------------+---------------------+-------------------- # z="${x-$y}" | "z=\"${x-$y}\"" | z=\"${x-$y}\" func_quote_arg () { _G_quote_expand=false case ,$1, in *,expand,*) _G_quote_expand=: ;; esac case ,$1, in *,pretty,*|*,expand,*|*,unquoted,*) func_quote_portable $_G_quote_expand "$2" func_quote_arg_result=$func_quote_portable_result func_quote_arg_unquoted_result=$func_quote_portable_unquoted_result ;; *) # Faster quote-for-eval for some shells. func_quotefast_eval "$2" func_quote_arg_result=$func_quotefast_eval_result ;; esac } # func_quote MODEs ARGs... # ------------------------ # Quote all ARGs to be evaled later and join them into single command. See # func_quote_arg's description for more info. func_quote () { $debug_cmd _G_func_quote_mode=$1 ; shift func_quote_result= while test 0 -lt $#; do func_quote_arg "$_G_func_quote_mode" "$1" if test -n "$func_quote_result"; then func_append func_quote_result " $func_quote_arg_result" else func_append func_quote_result "$func_quote_arg_result" fi shift done } # func_stripname PREFIX SUFFIX NAME # --------------------------------- # strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_stripname () { $debug_cmd # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary variable first. func_stripname_result=$3 func_stripname_result=${func_stripname_result#"$1"} func_stripname_result=${func_stripname_result%"$2"} }' else func_stripname () { $debug_cmd case $2 in .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; esac } fi # func_show_eval CMD [FAIL_EXP] # ----------------------------- # Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { $debug_cmd _G_cmd=$1 _G_fail_exp=${2-':'} func_quote_arg pretty,expand "$_G_cmd" eval "func_notquiet $func_quote_arg_result" $opt_dry_run || { eval "$_G_cmd" _G_status=$? if test 0 -ne "$_G_status"; then eval "(exit $_G_status); $_G_fail_exp" fi } } # func_show_eval_locale CMD [FAIL_EXP] # ------------------------------------ # Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { $debug_cmd _G_cmd=$1 _G_fail_exp=${2-':'} $opt_quiet || { func_quote_arg expand,pretty "$_G_cmd" eval "func_echo $func_quote_arg_result" } $opt_dry_run || { eval "$_G_user_locale $_G_cmd" _G_status=$? eval "$_G_safe_locale" if test 0 -ne "$_G_status"; then eval "(exit $_G_status); $_G_fail_exp" fi } } # func_tr_sh # ---------- # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { $debug_cmd case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_verbose ARG... # ------------------- # Echo program name prefixed message in verbose mode only. func_verbose () { $debug_cmd $opt_verbose && func_echo "$*" : } # func_warn_and_continue ARG... # ----------------------------- # Echo program name prefixed warning message to standard error. func_warn_and_continue () { $debug_cmd $require_term_colors func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 } # func_warning CATEGORY ARG... # ---------------------------- # Echo program name prefixed warning message to standard error. Warning # messages can be filtered according to CATEGORY, where this function # elides messages where CATEGORY is not listed in the global variable # 'opt_warning_types'. func_warning () { $debug_cmd # CATEGORY must be in the warning_categories list! case " $warning_categories " in *" $1 "*) ;; *) func_internal_error "invalid warning category '$1'" ;; esac _G_category=$1 shift case " $opt_warning_types " in *" $_G_category "*) $warning_func ${1+"$@"} ;; esac } # func_sort_ver VER1 VER2 # ----------------------- # 'sort -V' is not generally available. # Note this deviates from the version comparison in automake # in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a # but this should suffice as we won't be specifying old # version formats or redundant trailing .0 in bootstrap.conf. # If we did want full compatibility then we should probably # use m4_version_compare from autoconf. func_sort_ver () { $debug_cmd printf '%s\n%s\n' "$1" "$2" \ | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n } # func_lt_ver PREV CURR # --------------------- # Return true if PREV and CURR are in the correct order according to # func_sort_ver, otherwise false. Use it like this: # # func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." func_lt_ver () { $debug_cmd test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` } # Local variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: #! /bin/sh # A portable, pluggable option parser for Bourne shell. # Written by Gary V. Vaughan, 2010 # This is free software. There is NO warranty; not even for # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # Copyright (C) 2010-2019, 2021 Bootstrap Authors # # This file is dual licensed under the terms of the MIT license # , and GPL version 2 or later # . You must apply one of # these licenses when using or redistributing this software or any of # the files within it. See the URLs above, or the file `LICENSE` # included in the Bootstrap distribution for the full license texts. # Please report bugs or propose patches to: # # Set a version string for this script. scriptversion=2019-02-19.15; # UTC ## ------ ## ## Usage. ## ## ------ ## # This file is a library for parsing options in your shell scripts along # with assorted other useful supporting features that you can make use # of too. # # For the simplest scripts you might need only: # # #!/bin/sh # . relative/path/to/funclib.sh # . relative/path/to/options-parser # scriptversion=1.0 # func_options ${1+"$@"} # eval set dummy "$func_options_result"; shift # ...rest of your script... # # In order for the '--version' option to work, you will need to have a # suitably formatted comment like the one at the top of this file # starting with '# Written by ' and ending with '# Copyright'. # # For '-h' and '--help' to work, you will also need a one line # description of your script's purpose in a comment directly above the # '# Written by ' line, like the one at the top of this file. # # The default options also support '--debug', which will turn on shell # execution tracing (see the comment above debug_cmd below for another # use), and '--verbose' and the func_verbose function to allow your script # to display verbose messages only when your user has specified # '--verbose'. # # After sourcing this file, you can plug in processing for additional # options by amending the variables from the 'Configuration' section # below, and following the instructions in the 'Option parsing' # section further down. ## -------------- ## ## Configuration. ## ## -------------- ## # You should override these variables in your script after sourcing this # file so that they reflect the customisations you have added to the # option parser. # The usage line for option parsing errors and the start of '-h' and # '--help' output messages. You can embed shell variables for delayed # expansion at the time the message is displayed, but you will need to # quote other shell meta-characters carefully to prevent them being # expanded when the contents are evaled. usage='$progpath [OPTION]...' # Short help message in response to '-h' and '--help'. Add to this or # override it after sourcing this library to reflect the full set of # options your script accepts. usage_message="\ --debug enable verbose shell tracing -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] -v, --verbose verbosely report processing --version print version information and exit -h, --help print short or long help message and exit " # Additional text appended to 'usage_message' in response to '--help'. long_help_message=" Warning categories include: 'all' show all warnings 'none' turn off all the warnings 'error' warnings are treated as fatal errors" # Help message printed before fatal option parsing errors. fatal_help="Try '\$progname --help' for more information." ## ------------------------- ## ## Hook function management. ## ## ------------------------- ## # This section contains functions for adding, removing, and running hooks # in the main code. A hook is just a list of function names that can be # run in order later on. # func_hookable FUNC_NAME # ----------------------- # Declare that FUNC_NAME will run hooks added with # 'func_add_hook FUNC_NAME ...'. func_hookable () { $debug_cmd func_append hookable_fns " $1" } # func_add_hook FUNC_NAME HOOK_FUNC # --------------------------------- # Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must # first have been declared "hookable" by a call to 'func_hookable'. func_add_hook () { $debug_cmd case " $hookable_fns " in *" $1 "*) ;; *) func_fatal_error "'$1' does not accept hook functions." ;; esac eval func_append ${1}_hooks '" $2"' } # func_remove_hook FUNC_NAME HOOK_FUNC # ------------------------------------ # Remove HOOK_FUNC from the list of hook functions to be called by # FUNC_NAME. func_remove_hook () { $debug_cmd eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' } # func_propagate_result FUNC_NAME_A FUNC_NAME_B # --------------------------------------------- # If the *_result variable of FUNC_NAME_A _is set_, assign its value to # *_result variable of FUNC_NAME_B. func_propagate_result () { $debug_cmd func_propagate_result_result=: if eval "test \"\${${1}_result+set}\" = set" then eval "${2}_result=\$${1}_result" else func_propagate_result_result=false fi } # func_run_hooks FUNC_NAME [ARG]... # --------------------------------- # Run all hook functions registered to FUNC_NAME. # It's assumed that the list of hook functions contains nothing more # than a whitespace-delimited list of legal shell function names, and # no effort is wasted trying to catch shell meta-characters or preserve # whitespace. func_run_hooks () { $debug_cmd _G_rc_run_hooks=false case " $hookable_fns " in *" $1 "*) ;; *) func_fatal_error "'$1' does not support hook functions." ;; esac eval _G_hook_fns=\$$1_hooks; shift for _G_hook in $_G_hook_fns; do func_unset "${_G_hook}_result" eval $_G_hook '${1+"$@"}' func_propagate_result $_G_hook func_run_hooks if $func_propagate_result_result; then eval set dummy "$func_run_hooks_result"; shift fi done } ## --------------- ## ## Option parsing. ## ## --------------- ## # In order to add your own option parsing hooks, you must accept the # full positional parameter list from your hook function. You may remove # or edit any options that you action, and then pass back the remaining # unprocessed options in '_result', escaped # suitably for 'eval'. # # The '_result' variable is automatically unset # before your hook gets called; for best performance, only set the # *_result variable when necessary (i.e. don't call the 'func_quote' # function unnecessarily because it can be an expensive operation on some # machines). # # Like this: # # my_options_prep () # { # $debug_cmd # # # Extend the existing usage message. # usage_message=$usage_message' # -s, --silent don'\''t print informational messages # ' # # No change in '$@' (ignored completely by this hook). Leave # # my_options_prep_result variable intact. # } # func_add_hook func_options_prep my_options_prep # # # my_silent_option () # { # $debug_cmd # # args_changed=false # # # Note that, for efficiency, we parse as many options as we can # # recognise in a loop before passing the remainder back to the # # caller on the first unrecognised argument we encounter. # while test $# -gt 0; do # opt=$1; shift # case $opt in # --silent|-s) opt_silent=: # args_changed=: # ;; # # Separate non-argument short options: # -s*) func_split_short_opt "$_G_opt" # set dummy "$func_split_short_opt_name" \ # "-$func_split_short_opt_arg" ${1+"$@"} # shift # args_changed=: # ;; # *) # Make sure the first unrecognised option "$_G_opt" # # is added back to "$@" in case we need it later, # # if $args_changed was set to 'true'. # set dummy "$_G_opt" ${1+"$@"}; shift; break ;; # esac # done # # # Only call 'func_quote' here if we processed at least one argument. # if $args_changed; then # func_quote eval ${1+"$@"} # my_silent_option_result=$func_quote_result # fi # } # func_add_hook func_parse_options my_silent_option # # # my_option_validation () # { # $debug_cmd # # $opt_silent && $opt_verbose && func_fatal_help "\ # '--silent' and '--verbose' options are mutually exclusive." # } # func_add_hook func_validate_options my_option_validation # # You'll also need to manually amend $usage_message to reflect the extra # options you parse. It's preferable to append if you can, so that # multiple option parsing hooks can be added safely. # func_options_finish [ARG]... # ---------------------------- # Finishing the option parse loop (call 'func_options' hooks ATM). func_options_finish () { $debug_cmd func_run_hooks func_options ${1+"$@"} func_propagate_result func_run_hooks func_options_finish } # func_options [ARG]... # --------------------- # All the functions called inside func_options are hookable. See the # individual implementations for details. func_hookable func_options func_options () { $debug_cmd _G_options_quoted=false for my_func in options_prep parse_options validate_options options_finish do func_unset func_${my_func}_result func_unset func_run_hooks_result eval func_$my_func '${1+"$@"}' func_propagate_result func_$my_func func_options if $func_propagate_result_result; then eval set dummy "$func_options_result"; shift _G_options_quoted=: fi done $_G_options_quoted || { # As we (func_options) are top-level options-parser function and # nobody quoted "$@" for us yet, we need to do it explicitly for # caller. func_quote eval ${1+"$@"} func_options_result=$func_quote_result } } # func_options_prep [ARG]... # -------------------------- # All initialisations required before starting the option parse loop. # Note that when calling hook functions, we pass through the list of # positional parameters. If a hook function modifies that list, and # needs to propagate that back to rest of this script, then the complete # modified list must be put in 'func_run_hooks_result' before returning. func_hookable func_options_prep func_options_prep () { $debug_cmd # Option defaults: opt_verbose=false opt_warning_types= func_run_hooks func_options_prep ${1+"$@"} func_propagate_result func_run_hooks func_options_prep } # func_parse_options [ARG]... # --------------------------- # The main option parsing loop. func_hookable func_parse_options func_parse_options () { $debug_cmd _G_parse_options_requote=false # this just eases exit handling while test $# -gt 0; do # Defer to hook functions for initial option parsing, so they # get priority in the event of reusing an option name. func_run_hooks func_parse_options ${1+"$@"} func_propagate_result func_run_hooks func_parse_options if $func_propagate_result_result; then eval set dummy "$func_parse_options_result"; shift # Even though we may have changed "$@", we passed the "$@" array # down into the hook and it quoted it for us (because we are in # this if-branch). No need to quote it again. _G_parse_options_requote=false fi # Break out of the loop if we already parsed every option. test $# -gt 0 || break # We expect that one of the options parsed in this function matches # and thus we remove _G_opt from "$@" and need to re-quote. _G_match_parse_options=: _G_opt=$1 shift case $_G_opt in --debug|-x) debug_cmd='set -x' func_echo "enabling shell trace mode" >&2 $debug_cmd ;; --no-warnings|--no-warning|--no-warn) set dummy --warnings none ${1+"$@"} shift ;; --warnings|--warning|-W) if test $# = 0 && func_missing_arg $_G_opt; then _G_parse_options_requote=: break fi case " $warning_categories $1" in *" $1 "*) # trailing space prevents matching last $1 above func_append_uniq opt_warning_types " $1" ;; *all) opt_warning_types=$warning_categories ;; *none) opt_warning_types=none warning_func=: ;; *error) opt_warning_types=$warning_categories warning_func=func_fatal_error ;; *) func_fatal_error \ "unsupported warning category: '$1'" ;; esac shift ;; --verbose|-v) opt_verbose=: ;; --version) func_version ;; -\?|-h) func_usage ;; --help) func_help ;; # Separate optargs to long options (plugins may need this): --*=*) func_split_equals "$_G_opt" set dummy "$func_split_equals_lhs" \ "$func_split_equals_rhs" ${1+"$@"} shift ;; # Separate optargs to short options: -W*) func_split_short_opt "$_G_opt" set dummy "$func_split_short_opt_name" \ "$func_split_short_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-v*|-x*) func_split_short_opt "$_G_opt" set dummy "$func_split_short_opt_name" \ "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) _G_parse_options_requote=: ; break ;; -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; *) set dummy "$_G_opt" ${1+"$@"}; shift _G_match_parse_options=false break ;; esac if $_G_match_parse_options; then _G_parse_options_requote=: fi done if $_G_parse_options_requote; then # save modified positional parameters for caller func_quote eval ${1+"$@"} func_parse_options_result=$func_quote_result fi } # func_validate_options [ARG]... # ------------------------------ # Perform any sanity checks on option settings and/or unconsumed # arguments. func_hookable func_validate_options func_validate_options () { $debug_cmd # Display all warnings if -W was not given. test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" func_run_hooks func_validate_options ${1+"$@"} func_propagate_result func_run_hooks func_validate_options # Bail if the options were screwed! $exit_cmd $EXIT_FAILURE } ## ----------------- ## ## Helper functions. ## ## ----------------- ## # This section contains the helper functions used by the rest of the # hookable option parser framework in ascii-betical order. # func_fatal_help ARG... # ---------------------- # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { $debug_cmd eval \$ECHO \""Usage: $usage"\" eval \$ECHO \""$fatal_help"\" func_error ${1+"$@"} exit $EXIT_FAILURE } # func_help # --------- # Echo long help message to standard output and exit. func_help () { $debug_cmd func_usage_message $ECHO "$long_help_message" exit 0 } # func_missing_arg ARGNAME # ------------------------ # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $debug_cmd func_error "Missing argument for '$1'." exit_cmd=exit } # func_split_equals STRING # ------------------------ # Set func_split_equals_lhs and func_split_equals_rhs shell variables # after splitting STRING at the '=' sign. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ && _G_HAVE_XSI_OPS=yes if test yes = "$_G_HAVE_XSI_OPS" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_split_equals () { $debug_cmd func_split_equals_lhs=${1%%=*} func_split_equals_rhs=${1#*=} if test "x$func_split_equals_lhs" = "x$1"; then func_split_equals_rhs= fi }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_split_equals () { $debug_cmd func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` func_split_equals_rhs= test "x$func_split_equals_lhs=" = "x$1" \ || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` } fi #func_split_equals # func_split_short_opt SHORTOPT # ----------------------------- # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. if test yes = "$_G_HAVE_XSI_OPS" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_split_short_opt () { $debug_cmd func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"} }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_split_short_opt () { $debug_cmd func_split_short_opt_name=`expr "x$1" : 'x\(-.\)'` func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` } fi #func_split_short_opt # func_usage # ---------- # Echo short help message to standard output and exit. func_usage () { $debug_cmd func_usage_message $ECHO "Run '$progname --help |${PAGER-more}' for full usage" exit 0 } # func_usage_message # ------------------ # Echo short help message to standard output. func_usage_message () { $debug_cmd eval \$ECHO \""Usage: $usage"\" echo $SED -n 's|^# || /^Written by/{ x;p;x } h /^Written by/q' < "$progpath" echo eval \$ECHO \""$usage_message"\" } # func_version # ------------ # Echo version message to standard output and exit. # The version message is extracted from the calling file's header # comments, with leading '# ' stripped: # 1. First display the progname and version # 2. Followed by the header comment line matching /^# Written by / # 3. Then a blank line followed by the first following line matching # /^# Copyright / # 4. Immediately followed by any lines between the previous matches, # except lines preceding the intervening completely blank line. # For example, see the header comments of this file. func_version () { $debug_cmd printf '%s\n' "$progname $scriptversion" $SED -n ' /^# Written by /!b s|^# ||; p; n :fwd2blnk /./ { n b fwd2blnk } p; n :holdwrnt s|^# || s|^# *$|| /^Copyright /!{ /./H n b holdwrnt } s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| G s|\(\n\)\n*|\1|g p; q' < "$progpath" exit $? } # Local variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-pattern: "30/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: # Set a version string. scriptversion='(GNU libtool) 2.4.7' # func_echo ARG... # ---------------- # Libtool also displays the current mode in messages, so override # funclib.sh func_echo with this custom definition. func_echo () { $debug_cmd _G_message=$* func_echo_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_IFS $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" done IFS=$func_echo_IFS } # func_warning ARG... # ------------------- # Libtool warnings are not categorized, so override funclib.sh # func_warning with this simpler definition. func_warning () { $debug_cmd $warning_func ${1+"$@"} } ## ---------------- ## ## Options parsing. ## ## ---------------- ## # Hook in the functions to make sure our own options are parsed during # the option parsing loop. usage='$progpath [OPTION]... [MODE-ARG]...' # Short help message in response to '-h'. usage_message="Options: --config show all configuration variables --debug enable verbose shell tracing -n, --dry-run display commands without modifying any files --features display basic configuration information and exit --mode=MODE use operation mode MODE --no-warnings equivalent to '-Wnone' --preserve-dup-deps don't remove duplicate dependency libraries --quiet, --silent don't print informational messages --tag=TAG use configuration variables from tag TAG -v, --verbose print more informational messages than default --version print version information -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] -h, --help, --help-all print short, long, or detailed help message " # Additional text appended to 'usage_message' in response to '--help'. func_help () { $debug_cmd func_usage_message $ECHO "$long_help_message MODE must be one of the following: clean remove files from the build directory compile compile a source file into a libtool object execute automatically set library path, then run a program finish complete the installation of libtool libraries install install libraries or executables link create a library or an executable uninstall remove libraries from an installed directory MODE-ARGS vary depending on the MODE. When passed as first option, '--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. Try '$progname --help --mode=MODE' for a more detailed description of MODE. When reporting a bug, please describe a test case to reproduce it and include the following information: host-triplet: $host shell: $SHELL compiler: $LTCC compiler flags: $LTCFLAGS linker: $LD (gnu? $with_gnu_ld) version: $progname $scriptversion Debian-2.4.7-7build1 automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` Report bugs to . GNU libtool home page: . General help using GNU software: ." exit 0 } # func_lo2o OBJECT-NAME # --------------------- # Transform OBJECT-NAME from a '.lo' suffix to the platform specific # object suffix. lo2o=s/\\.lo\$/.$objext/ o2lo=s/\\.$objext\$/.lo/ if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_lo2o () { case $1 in *.lo) func_lo2o_result=${1%.lo}.$objext ;; * ) func_lo2o_result=$1 ;; esac }' # func_xform LIBOBJ-OR-SOURCE # --------------------------- # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) # suffix to a '.lo' libtool-object suffix. eval 'func_xform () { func_xform_result=${1%.*}.lo }' else # ...otherwise fall back to using sed. func_lo2o () { func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` } func_xform () { func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` } fi # func_fatal_configuration ARG... # ------------------------------- # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_fatal_error ${1+"$@"} \ "See the $PACKAGE documentation for more information." \ "Fatal configuration error." } # func_config # ----------- # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # ------------- # Display the features supported by this script. func_features () { echo "host: $host" if test yes = "$build_libtool_libs"; then echo "enable shared libraries" else echo "disable shared libraries" fi if test yes = "$build_old_libs"; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag TAGNAME # ----------------------- # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname=$1 re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf=/$re_begincf/,/$re_endcf/p # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # ------------------------ # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # libtool_options_prep [ARG]... # ----------------------------- # Preparation for options parsed by libtool. libtool_options_prep () { $debug_mode # Option defaults: opt_config=false opt_dlopen= opt_dry_run=false opt_help=false opt_mode= opt_preserve_dup_deps=false opt_quiet=false nonopt= preserve_args= _G_rc_lt_options_prep=: _G_rc_lt_options_prep=: # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; *) _G_rc_lt_options_prep=false ;; esac if $_G_rc_lt_options_prep; then # Pass back the list of options. func_quote eval ${1+"$@"} libtool_options_prep_result=$func_quote_result fi } func_add_hook func_options_prep libtool_options_prep # libtool_parse_options [ARG]... # --------------------------------- # Provide handling for libtool specific options. libtool_parse_options () { $debug_cmd _G_rc_lt_parse_options=false # Perform our own loop to consume as many options as possible in # each iteration. while test $# -gt 0; do _G_match_lt_parse_options=: _G_opt=$1 shift case $_G_opt in --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) func_config ;; --dlopen|-dlopen) opt_dlopen="${opt_dlopen+$opt_dlopen }$1" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) func_features ;; --finish) set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $_G_opt && break opt_mode=$1 case $1 in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $_G_opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_quiet=false func_append preserve_args " $_G_opt" ;; --no-warnings|--no-warning|--no-warn) opt_warning=false func_append preserve_args " $_G_opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $_G_opt" ;; --silent|--quiet) opt_quiet=: opt_verbose=false func_append preserve_args " $_G_opt" ;; --tag) test $# = 0 && func_missing_arg $_G_opt && break opt_tag=$1 func_append preserve_args " $_G_opt $1" func_enable_tag "$1" shift ;; --verbose|-v) opt_quiet=false opt_verbose=: func_append preserve_args " $_G_opt" ;; # An option not handled by this hook function: *) set dummy "$_G_opt" ${1+"$@"} ; shift _G_match_lt_parse_options=false break ;; esac $_G_match_lt_parse_options && _G_rc_lt_parse_options=: done if $_G_rc_lt_parse_options; then # save modified positional parameters for caller func_quote eval ${1+"$@"} libtool_parse_options_result=$func_quote_result fi } func_add_hook func_parse_options libtool_parse_options # libtool_validate_options [ARG]... # --------------------------------- # Perform any sanity checks on option settings and/or unconsumed # arguments. libtool_validate_options () { # save first non-option argument if test 0 -lt $#; then nonopt=$1 shift fi # preserve --debug test : = "$debug_cmd" || func_append preserve_args " --debug" case $host in # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match test yes != "$build_libtool_libs" \ && test yes != "$build_old_libs" \ && func_fatal_configuration "not configured to build any kind of library" # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test execute != "$opt_mode"; then func_error "unrecognized option '-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help=$help help="Try '$progname --help --mode=$opt_mode' for more information." } # Pass back the unparsed argument list func_quote eval ${1+"$@"} libtool_validate_options_result=$func_quote_result } func_add_hook func_validate_options libtool_validate_options # Process options as early as possible so that --help and --version # can return quickly. func_options ${1+"$@"} eval set dummy "$func_options_result"; shift ## ----------- ## ## Main. ## ## ----------- ## magic='%%%MAGIC variable%%%' magic_exe='%%%MAGIC EXE variable%%%' # Global variables. extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # func_generated_by_libtool # True iff stdin has been generated by Libtool. This function is only # a basic sanity check; it will hardly flush out determined imposters. func_generated_by_libtool_p () { $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_p file # True iff FILE is a libtool '.la' library or '.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p } # func_lalib_unsafe_p file # True iff FILE is a libtool '.la' library or '.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if 'file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case $lalib_p_line in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test yes = "$lalib_p" } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { test -f "$1" && $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $debug_cmd save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$sp$nl eval cmd=\"$cmd\" IFS=$save_ifs func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # 'FILE.' does not work on cygwin managed mounts. func_source () { $debug_cmd case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case $lt_sysroot:$1 in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result='='$func_stripname_result ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $debug_cmd if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with '--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=$1 if test yes = "$build_libtool_libs"; then write_lobj=\'$2\' else write_lobj=none fi if test yes = "$build_old_libs"; then write_oldobj=\'$3\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $debug_cmd # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result= if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result"; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $debug_cmd if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $debug_cmd # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $debug_cmd if test -z "$2" && test -n "$1"; then func_error "Could not determine host file name corresponding to" func_error " '$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result=$1 fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $debug_cmd if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " '$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result=$3 fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $debug_cmd case $4 in $1 ) func_to_host_path_result=$3$func_to_host_path_result ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via '$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $debug_cmd $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $debug_cmd case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result=$1 } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result=$func_convert_core_msys_to_w32_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result=$func_convert_core_file_wine_to_w32_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result=$func_cygpath_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result=$func_cygpath_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via '$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $debug_cmd if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd=func_convert_path_$func_stripname_result fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $debug_cmd func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result=$1 } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result=$func_convert_core_msys_to_w32_result func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result=$func_convert_core_path_wine_to_w32_result func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result=$func_cygpath_result func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result=$func_cygpath_result func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_dll_def_p FILE # True iff FILE is a Windows DLL '.def' file. # Keep in sync with _LT_DLL_DEF_P in libtool.m4 func_dll_def_p () { $debug_cmd func_dll_def_p_tmp=`$SED -n \ -e 's/^[ ]*//' \ -e '/^\(;.*\)*$/d' \ -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ -e q \ "$1"` test DEF = "$func_dll_def_p_tmp" } # func_mode_compile arg... func_mode_compile () { $debug_cmd # Get the compilation command and the source file. base_compile= srcfile=$nonopt # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg=$arg arg_mode=normal ;; target ) libobj=$arg arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify '-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs=$IFS; IFS=, for arg in $args; do IFS=$save_ifs func_append_quoted lastarg "$arg" done IFS=$save_ifs func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg=$srcfile srcfile=$arg ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with '-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj=$func_basename_result } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from '$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test yes = "$build_libtool_libs" \ || func_fatal_configuration "cannot build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_arg pretty "$libobj" test "X$libobj" != "X$func_quote_arg_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name '$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname=$func_basename_result xdir=$func_dirname_result lobj=$xdir$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test yes = "$build_old_libs"; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test no = "$compiler_c_o"; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext lockfile=$output_obj.lock else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test yes = "$need_locks"; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test warn = "$need_locks"; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_arg pretty "$srcfile" qsrcfile=$func_quote_arg_result # Only build a PIC object if we are building libtool libraries. if test yes = "$build_libtool_libs"; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test no != "$pic_mode"; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test warn = "$need_locks" && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test yes = "$suppress_opt"; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test yes = "$build_old_libs"; then if test yes != "$pic_mode"; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test yes = "$compiler_c_o"; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test warn = "$need_locks" && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test no != "$need_locks"; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test compile = "$opt_mode" && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a '.o' file suitable for static linking -static only build a '.o' file suitable for static linking -Wc,FLAG -Xcompiler FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a 'standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix '.c' with the library object suffix, '.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to '-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the '--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the 'install' or 'cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE use a list of object files found in FILE to specify objects -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wa,FLAG -Xassembler FLAG pass linker-specific FLAG directly to the assembler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with '-') are ignored. Every other argument is treated as a filename. Files ending in '.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in '.la', then a libtool library is created, only library objects ('.lo' files) may be specified, and '-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created using 'ar' and 'ranlib', or on Windows using 'lib'. If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode '$opt_mode'" ;; esac echo $ECHO "Try '$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test : = "$opt_help"; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | $SED -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | $SED '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $debug_cmd # The first argument is the command name. cmd=$nonopt test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "'$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "'$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "'$file' was not linked with '-export-dynamic'" continue fi func_dirname "$file" "" "." dir=$func_dirname_result if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir=$func_dirname_result ;; *) func_warning "'-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir=$absdir # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic=$magic # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file=$progdir/$program elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file=$progdir/$program fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if $opt_dry_run; then # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS else if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd=\$cmd$args fi } test execute = "$opt_mode" && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $debug_cmd libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "'$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument '$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and '=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_quiet && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the '-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the '$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the '$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the '$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test finish = "$opt_mode" && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $debug_cmd # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac then # Aesthetically quote it. func_quote_arg pretty "$nonopt" install_prog="$func_quote_arg_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_arg pretty "$arg" func_append install_prog "$func_quote_arg_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=false stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=: ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test X-m = "X$prev" && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_arg pretty "$arg" func_append install_prog " $func_quote_arg_result" if test -n "$arg2"; then func_quote_arg pretty "$arg2" fi func_append install_shared_prog " $func_quote_arg_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the '$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_arg pretty "$install_override_mode" func_append install_shared_prog " -m $func_quote_arg_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=: if $isdir; then destdir=$dest destname= else func_dirname_and_basename "$dest" "" "." destdir=$func_dirname_result destname=$func_basename_result # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "'$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "'$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic=$magic staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "'$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir=$func_dirname_result func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking '$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname=$1 shift srcname=$realname test -n "$relink_command" && srcname=${realname}T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme=$stripme case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme= ;; esac ;; os2*) case $realname in *_dll.a) tstripme= ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try 'ln -sf' first, because the 'ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib=$destdir/$realname func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name=$func_basename_result instname=$dir/${name}i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile=$destdir/$destname else func_basename "$file" destfile=$func_basename_result destfile=$destdir/$destfile fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest=$destfile destfile= ;; *) func_fatal_help "cannot copy a libtool object to '$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test yes = "$build_old_libs"; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile=$destdir/$destname else func_basename "$file" destfile=$func_basename_result destfile=$destdir/$destfile fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext= case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=.exe fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script '$wrapper'" finalize=: for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` if test -n "$libdir" && test ! -f "$libfile"; then func_warning "'$lib' has not been installed in '$libdir'" finalize=false fi done relink_command= func_source "$wrapper" outputname= if test no = "$fast_install" && test -n "$relink_command"; then $opt_dry_run || { if $finalize; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file=$func_basename_result outputname=$tmpdir/$file # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_quiet || { func_quote_arg expand,pretty "$relink_command" eval "func_echo $func_quote_arg_result" } if eval "$relink_command"; then : else func_error "error: relink '$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file=$outputname else func_warning "cannot relink '$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name=$func_basename_result # Set up the ranlib parameters. oldlib=$destdir/$name func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run '$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test install = "$opt_mode" && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $debug_cmd my_outputname=$1 my_originator=$2 my_pic_p=${3-false} my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms=${my_outputname}S.c else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist=$output_objdir/$my_outputname.nm func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) /* External symbol declarations for the compiler. */\ " if test yes = "$dlself"; then func_verbose "generating symbol list for '$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from '$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols=$output_objdir/$outputname.exp $opt_dry_run || { $RM $export_symbols eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from '$dlprefile'" func_basename "$dlprefile" name=$func_basename_result case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename= if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname"; then func_basename "$dlprefile_dlname" dlprefile_dlbasename=$func_basename_result else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename"; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi func_show_eval '$RM "${nlist}I"' if test -n "$global_symbol_to_import"; then eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[];\ " if test -s "$nlist"I; then echo >> "$output_objdir/$my_dlsyms" "\ static void lt_syminit(void) { LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; for (; symbol->name; ++symbol) {" $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" echo >> "$output_objdir/$my_dlsyms" "\ } }" fi echo >> "$output_objdir/$my_dlsyms" "\ LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = { {\"$my_originator\", (void *) 0}," if test -s "$nlist"I; then echo >> "$output_objdir/$my_dlsyms" "\ {\"@INIT@\", (void *) <_syminit}," fi case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) $my_pic_p && pic_flag_for_symtable=" $pic_flag" ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' # Transform the symbol file into the correct name. symfileobj=$output_objdir/${my_outputname}S.$objext case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for '$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $debug_cmd func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $debug_cmd func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $debug_cmd win32_libid_type=unknown win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then case $nm_interface in "MS dumpbin") if func_cygming_ms_implib_p "$1" || func_cygming_gnu_implib_p "$1" then win32_nmres=import else win32_nmres= fi ;; *) func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s|.*|import| p q } }'` ;; esac case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $debug_cmd sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $debug_cmd match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive that possess that section. Heuristic: eliminate # all those that have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $debug_cmd if func_cygming_gnu_implib_p "$1"; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1"; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result= fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $debug_cmd f_ex_an_ar_dir=$1; shift f_ex_an_ar_oldlib=$1 if test yes = "$lock_old_archive_extraction"; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test yes = "$lock_old_archive_extraction"; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $debug_cmd my_gentop=$1; shift my_oldlibs=${1+"$@"} my_oldobjs= my_xlib= my_xabs= my_xdir= for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib=$func_basename_result my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir=$my_gentop/$my_xlib_u func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` func_basename "$darwin_archive" darwin_base_archive=$func_basename_result darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches; do func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" cd "unfat-$$/$darwin_base_archive-$darwin_arch" func_extract_an_archive "`pwd`" "$darwin_base_archive" cd "$darwin_curdir" $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result=$my_oldobjs } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory where it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" func_quote_arg pretty "$ECHO" qECHO=$func_quote_arg_result $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=$qECHO fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ that is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options that match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test yes = "$fast_install"; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else \$ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) /* declarations of non-ANSI functions */ #if defined __MINGW32__ # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined __CYGWIN__ # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined other_platform || defined ... */ #endif /* portability defines, excluding path handling macros */ #if defined _MSC_VER # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC #elif defined __MINGW32__ # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined __CYGWIN__ # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined other platforms ... */ #endif #if defined PATH_MAX # define LT_PATHMAX PATH_MAX #elif defined MAXPATHLEN # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ defined __OS2__ # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free (stale); stale = 0; } \ } while (0) #if defined LT_DEBUGWRAPPER static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; size_t tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined HAVE_DOS_BASED_FILE_SYSTEM if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined HAVE_DOS_BASED_FILE_SYSTEM } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = (size_t) (q - p); p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (STREQ (str, pat)) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else size_t len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { size_t orig_value_len = strlen (orig_value); size_t add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ size_t len = strlen (new_value); while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[--len] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $debug_cmd case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_suncc_cstd_abi # !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! # Several compiler flags select an ABI that is incompatible with the # Cstd library. Avoid specifying it if any are in CXXFLAGS. func_suncc_cstd_abi () { $debug_cmd case " $compile_command " in *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) suncc_use_cstd_abi=no ;; *) suncc_use_cstd_abi=yes ;; esac } # func_mode_link arg... func_mode_link () { $debug_cmd case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # what system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll that has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= os2dllname= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=false prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module=$wl-single_module func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test yes != "$build_libtool_libs" \ && func_fatal_configuration "cannot build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg=$1 shift func_quote_arg pretty,unquoted "$arg" qarg=$func_quote_arg_unquoted_result func_append libtool_args " $func_quote_arg_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir=$arg prev= continue ;; dlfiles|dlprefiles) $preload || { # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=: } case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test no = "$dlself"; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test dlprefiles = "$prev"; then dlself=yes elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test dlfiles = "$prev"; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols=$arg test -f "$arg" \ || func_fatal_error "symbol file '$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex=$arg prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir=$arg prev= continue ;; mllvm) # Clang does not use LLVM to link, so we can simply discard any # '-mllvm $arg' options when doing the link step. prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test none = "$pic_object" && test none = "$non_pic_object"; then func_fatal_error "cannot find name of object for '$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result if test none != "$pic_object"; then # Prepend the subdirectory the object is found in. pic_object=$xdir$pic_object if test dlfiles = "$prev"; then if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test dlprefiles = "$prev"; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg=$pic_object fi # Non-PIC object. if test none != "$non_pic_object"; then # Prepend the subdirectory the object is found in. non_pic_object=$xdir$non_pic_object # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test none = "$pic_object"; then arg=$non_pic_object fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object=$pic_object func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "'$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file '$arg' does not exist" fi arg=$save_arg prev= continue ;; os2dllname) os2dllname=$arg prev= continue ;; precious_regex) precious_files_regex=$arg prev= continue ;; release) release=-$arg prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test rpath = "$prev"; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds=$arg prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xassembler) func_append compiler_flags " -Xassembler $qarg" prev= func_append compile_command " -Xassembler $qarg" func_append finalize_command " -Xassembler $qarg" continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg=$arg case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "'-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test X-export-symbols = "X$arg"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between '-L' and '$1'" else func_fatal_error "need path for '-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of '$dir'" dir=$absdir ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test X-lc = "X$arg" || test X-lm = "X$arg"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test X-lc = "X$arg" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig* | *-*-midnightbsd*) # Do not include libc due to us having libc/libc_r. test X-lc = "X$arg" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test X-lc = "X$arg" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test X-lc = "X$arg" && continue ;; esac elif test X-lc_r = "X$arg"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig* | *-*-midnightbsd*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -mllvm) prev=mllvm continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; # Solaris ld rejects as of 11.4. Refer to Oracle bug 22985199. -pthread) case $host in *solaris2*) ;; *) case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac ;; esac continue ;; -mt|-mthreads|-kthread|-Kthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module=$wl-multi_module continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "'-no-install' is ignored for $host" func_warning "assuming '-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -os2dllname) prev=os2dllname continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs=$IFS; IFS=, for flag in $args; do IFS=$save_ifs func_quote_arg pretty "$flag" func_append arg " $func_quote_arg_result" func_append compiler_flags " $func_quote_arg_result" done IFS=$save_ifs func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs=$IFS; IFS=, for flag in $args; do IFS=$save_ifs func_quote_arg pretty "$flag" func_append arg " $wl$func_quote_arg_result" func_append compiler_flags " $wl$func_quote_arg_result" func_append linker_flags " $func_quote_arg_result" done IFS=$save_ifs func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xassembler) prev=xassembler continue ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_arg pretty "$arg" arg=$func_quote_arg_result ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # -fstack-protector* stack protector flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization # -specs=* GCC specs files # -stdlib=* select c++ std lib with clang # -fsanitize=* Clang/GCC memory and address sanitizer # -fuse-ld=* Linker select flags for GCC # -static-* direct GCC to link specific libraries statically # -fcilkplus Cilk Plus language extension features for C/C++ # -Wa,* Pass flags directly to the assembler -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \ -specs=*|-fsanitize=*|-fuse-ld=*|-static-*|-fcilkplus|-Wa,*) func_quote_arg pretty "$arg" arg=$func_quote_arg_result func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; -Z*) if test os2 = "`expr $host : '.*\(os2\)'`"; then # OS/2 uses -Zxxx to specify OS/2-specific options compiler_flags="$compiler_flags $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case $arg in -Zlinker | -Zstack) prev=xcompiler ;; esac continue else # Otherwise treat like 'Some other compiler flag' below func_quote_arg pretty "$arg" arg=$func_quote_arg_result fi ;; # Some other compiler flag. -* | +*) func_quote_arg pretty "$arg" arg=$func_quote_arg_result ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test none = "$pic_object" && test none = "$non_pic_object"; then func_fatal_error "cannot find name of object for '$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result test none = "$pic_object" || { # Prepend the subdirectory the object is found in. pic_object=$xdir$pic_object if test dlfiles = "$prev"; then if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test dlprefiles = "$prev"; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg=$pic_object } # Non-PIC object. if test none != "$non_pic_object"; then # Prepend the subdirectory the object is found in. non_pic_object=$xdir$non_pic_object # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test none = "$pic_object"; then arg=$non_pic_object fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object=$pic_object func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "'$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test dlfiles = "$prev"; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test dlprefiles = "$prev"; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_arg pretty "$arg" arg=$func_quote_arg_result ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the '$prevarg' option requires an argument" if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname=$func_basename_result libobjs_save=$libobjs if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" # Definition is injected by LT_CONFIG during libtool generation. func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" func_dirname "$output" "/" "" output_objdir=$func_dirname_result$objdir func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test lib = "$linkmode"; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=false newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test lib,link = "$linkmode,$pass"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs=$tmp_deplibs fi if test lib,link = "$linkmode,$pass" || test prog,scan = "$linkmode,$pass"; then libs=$deplibs deplibs= fi if test prog = "$linkmode"; then case $pass in dlopen) libs=$dlfiles ;; dlpreopen) libs=$dlprefiles ;; link) libs="$deplibs %DEPLIBS%" test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" ;; esac fi if test lib,dlpreopen = "$linkmode,$pass"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs=$dlprefiles fi if test dlopen = "$pass"; then # Collect dlpreopened libraries save_deplibs=$deplibs deplibs= fi for deplib in $libs; do lib= found=false case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test lib = "$linkmode"; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test lib != "$linkmode" && test prog != "$linkmode"; then func_warning "'-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test lib = "$linkmode"; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib=$searchdir/lib$name$search_ext if test -f "$lib"; then if test .la = "$search_ext"; then found=: else found=false fi break 2 fi done done if $found; then # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll=$l done if test "X$ll" = "X$old_library"; then # only static version available found=false func_dirname "$lib" "" "." ladir=$func_dirname_result lib=$ladir/$old_library if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi else # deplib doesn't seem to be a libtool library if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" fi continue fi ;; # -l *.ltframework) if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test lib = "$linkmode"; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test conv = "$pass" && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test conv = "$pass"; then deplibs="$deplib $deplibs" continue fi if test scan = "$pass"; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "'-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test link = "$pass"; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test conv = "$pass"; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=false case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=: fi ;; pass_all) valid_a_lib=: ;; esac if $valid_a_lib; then echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" else echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." fi ;; esac continue ;; prog) if test link != "$pass"; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test conv = "$pass"; then deplibs="$deplib $deplibs" elif test prog = "$linkmode"; then if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=: continue ;; esac # case $deplib $found || test -f "$lib" \ || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "'$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir=$func_dirname_result dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test lib,link = "$linkmode,$pass" || test prog,scan = "$linkmode,$pass" || { test prog != "$linkmode" && test lib != "$linkmode"; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test conv = "$pass"; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for '$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done elif test prog != "$linkmode" && test lib != "$linkmode"; then func_fatal_error "'$lib' is not a convenience library" fi continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test yes = "$prefer_static_libs" || test built,no = "$prefer_static_libs,$installed"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib=$l done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for '$lib'" fi # This library was specified with -dlopen. if test dlopen = "$pass"; then test -z "$libdir" \ && func_fatal_error "cannot -dlopen a convenience library: '$lib'" if test -z "$dlname" || test yes != "$dlopen_support" || test no = "$build_libtool_libs" then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of '$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir=$ladir fi ;; esac func_basename "$lib" laname=$func_basename_result # Find the relevant object directory and library name. if test yes = "$installed"; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library '$lib' was moved." dir=$ladir absdir=$abs_ladir libdir=$abs_ladir else dir=$lt_sysroot$libdir absdir=$lt_sysroot$libdir fi test yes = "$hardcode_automatic" && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir=$ladir absdir=$abs_ladir # Remove this search path later func_append notinst_path " $abs_ladir" else dir=$ladir/$objdir absdir=$abs_ladir/$objdir # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test dlpreopen = "$pass"; then if test -z "$libdir" && test prog = "$linkmode"; then func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" fi case $host in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test lib = "$linkmode"; then deplibs="$dir/$old_library $deplibs" elif test prog,link = "$linkmode,$pass"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test prog = "$linkmode" && test link != "$pass"; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=false if test no != "$link_all_deplibs" || test -z "$library_names" || test no = "$build_libtool_libs"; then linkalldeplibs=: fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if $linkalldeplibs; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test prog,link = "$linkmode,$pass"; then if test -n "$library_names" && { { test no = "$prefer_static_libs" || test built,yes = "$prefer_static_libs,$installed"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then # Make sure the rpath contains only unique directories. case $temp_rpath: in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if $alldeplibs && { test pass_all = "$deplibs_check_method" || { test yes = "$build_libtool_libs" && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test built = "$use_static_libs" && test yes = "$installed"; then use_static_libs=no fi if test -n "$library_names" && { test no = "$use_static_libs" || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc* | *os2*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test no = "$installed"; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule= for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule=$dlpremoduletest break fi done if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then echo if test prog = "$linkmode"; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test lib = "$linkmode" && test yes = "$hardcode_into_libs"; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname=$1 shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname=$dlname elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc* | *os2*) func_arith $current - $age major=$func_arith_result versuffix=-$major ;; esac eval soname=\"$soname_spec\" else soname=$realname fi # Make a new name for the extract_expsyms_cmds to use soroot=$soname func_basename "$soroot" soname=$func_basename_result func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from '$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for '$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test prog = "$linkmode" || test relink != "$opt_mode"; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test no = "$hardcode_direct"; then add=$dir/$linklib case $host in *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; *-*-sysv4*uw2*) add_dir=-L$dir ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir=-L$dir ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we cannot # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library"; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add=$dir/$old_library fi elif test -n "$old_library"; then add=$dir/$old_library fi fi esac elif test no = "$hardcode_minus_L"; then case $host in *-*-sunos*) add_shlibpath=$dir ;; esac add_dir=-L$dir add=-l$name elif test no = "$hardcode_shlibpath_var"; then add_shlibpath=$dir add=-l$name else lib_linked=no fi ;; relink) if test yes = "$hardcode_direct" && test no = "$hardcode_direct_absolute"; then add=$dir/$linklib elif test yes = "$hardcode_minus_L"; then add_dir=-L$absdir # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add=-l$name elif test yes = "$hardcode_shlibpath_var"; then add_shlibpath=$dir add=-l$name else lib_linked=no fi ;; *) lib_linked=no ;; esac if test yes != "$lib_linked"; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test prog = "$linkmode"; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test yes != "$hardcode_direct" && test yes != "$hardcode_minus_L" && test yes = "$hardcode_shlibpath_var"; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test prog = "$linkmode" || test relink = "$opt_mode"; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test yes = "$hardcode_direct" && test no = "$hardcode_direct_absolute"; then add=$libdir/$linklib elif test yes = "$hardcode_minus_L"; then add_dir=-L$libdir add=-l$name elif test yes = "$hardcode_shlibpath_var"; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add=-l$name elif test yes = "$hardcode_automatic"; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib"; then add=$inst_prefix_dir$libdir/$linklib else add=$libdir/$linklib fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir=-L$libdir # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add=-l$name fi if test prog = "$linkmode"; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test prog = "$linkmode"; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test unsupported != "$hardcode_direct"; then test -n "$old_library" && linklib=$old_library compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test yes = "$build_libtool_libs"; then # Not a shared library if test pass_all != "$deplibs_check_method"; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system cannot link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test yes = "$module"; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using 'nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** 'nm' from GNU binutils and a full rebuild may help." fi if test no = "$build_old_libs"; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test lib = "$linkmode"; then if test -n "$dependency_libs" && { test yes != "$hardcode_into_libs" || test yes = "$build_old_libs" || test yes = "$link_static"; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs=$temp_deplibs fi func_append newlib_search_path " $absdir" # Link against this library test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test no != "$link_all_deplibs"; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path=$deplib ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of '$dir'" absdir=$dir fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names"; then for tmp in $deplibrary_names; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl"; then depdepl=$absdir/$objdir/$depdepl darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" path= fi fi ;; *) path=-L$absdir/$objdir ;; esac else eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "'$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "'$deplib' seems to be moved" path=-L$absdir fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test link = "$pass"; then if test prog = "$linkmode"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs=$newdependency_libs if test dlpreopen = "$pass"; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test dlopen != "$pass"; then test conv = "$pass" || { # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= } if test prog,link = "$linkmode,$pass"; then vars="compile_deplibs finalize_deplibs" else vars=deplibs fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Add Sun CC postdeps if required: test CXX = "$tagname" && { case $host_os in linux*) case `$CC -V 2>&1 | $SED 5q` in *Sun\ C*) # Sun C++ 5.9 func_suncc_cstd_abi if test no != "$suncc_use_cstd_abi"; then func_append postdeps ' -library=Cstd -library=Crun' fi ;; esac ;; solaris*) func_cc_basename "$CC" case $func_cc_basename_result in CC* | sunCC*) func_suncc_cstd_abi if test no != "$suncc_use_cstd_abi"; then func_append postdeps ' -library=Cstd -library=Crun' fi ;; esac ;; esac } # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i= ;; esac if test -n "$i"; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test prog = "$linkmode"; then dlfiles=$newdlfiles fi if test prog = "$linkmode" || test lib = "$linkmode"; then dlprefiles=$newdlprefiles fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then func_warning "'-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "'-l' and '-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "'-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "'-R' is ignored for archives" test -n "$vinfo" && \ func_warning "'-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "'-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "'-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs=$output func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form 'libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test no = "$module" \ && func_fatal_help "libtool library '$output' must begin with 'lib'" if test no != "$need_lib_prefix"; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test pass_all != "$deplibs_check_method"; then func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test no = "$dlself" \ || func_warning "'-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test 1 -lt "$#" \ && func_warning "ignoring multiple '-rpath's for a libtool library" install_libdir=$1 oldlibs= if test -z "$rpath"; then if test yes = "$build_libtool_libs"; then # Building a libtool convenience library. # Some compilers have problems with a '.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "'-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "'-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs=$IFS; IFS=: set dummy $vinfo 0 0 0 shift IFS=$save_ifs test -n "$7" && \ func_fatal_help "too many parameters to '-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major=$1 number_minor=$2 number_revision=$3 # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # that has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|freebsd-elf|linux|midnightbsd-elf|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age=$number_minor revision=$number_revision ;; freebsd-aout|qnx|sunos) current=$number_major revision=$number_minor age=0 ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age=$number_minor revision=$number_minor lt_irix_increment=no ;; *) func_fatal_configuration "$modename: unknown library version type '$version_type'" ;; esac ;; no) current=$1 revision=$2 age=$3 ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT '$current' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION '$revision' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE '$age' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE '$age' is greater than the current interface number '$current'" func_fatal_error "'$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" # On Darwin other compilers case $CC in nagfor*) verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" ;; *) verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; esac ;; freebsd-aout) major=.$current versuffix=.$current.$revision ;; freebsd-elf | midnightbsd-elf) func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision ;; irix | nonstopux) if test no = "$lt_irix_increment"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring=$verstring_prefix$major.$revision # Add in all the interfaces that we are compatible with. loop=$revision while test 0 -ne "$loop"; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring=$verstring_prefix$major.$iface:$verstring done # Before this point, $major must not contain '.'. major=.$major versuffix=$major.$revision ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=.$current.$age.$revision verstring=$current.$age.$revision # Add in all the interfaces that we are compatible with. loop=$age while test 0 -ne "$loop"; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring=$verstring:$iface.0 done # Make executables depend on our current version. func_append verstring ":$current.0" ;; qnx) major=.$current versuffix=.$current ;; sco) major=.$current versuffix=.$current ;; sunos) major=.$current versuffix=.$current.$revision ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 file systems. func_arith $current - $age major=$func_arith_result versuffix=-$major ;; *) func_fatal_configuration "unknown library version type '$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring=0.0 ;; esac if test no = "$need_version"; then versuffix= else versuffix=.0.0 fi fi # Remove version info from name if versioning should be avoided if test yes,no = "$avoid_version,$need_version"; then major= versuffix= verstring= fi # Check to see if the archive will have undefined symbols. if test yes = "$allow_undefined"; then if test unsupported = "$allow_undefined_flag"; then if test yes = "$build_old_libs"; then func_warning "undefined symbols not allowed in $host shared libraries; building static only" build_libtool_libs=no else func_fatal_error "can't build $host shared library unless -no-undefined is specified" fi fi else # Don't allow undefined symbols. allow_undefined_flag=$no_undefined_flag fi fi func_generate_dlsyms "$libname" "$libname" : func_append libobjs " $symfileobj" test " " = "$libobjs" && libobjs= if test relink != "$opt_mode"; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) if test -n "$precious_files_regex"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles=$dlfiles dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles=$dlprefiles dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test yes = "$build_libtool_libs"; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test yes = "$build_libtool_need_lc"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release= versuffix= major= newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib=$potent_lib while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | $SED 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib= break 2 fi done done fi if test -n "$a_deplib"; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib"; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib= ;; esac fi if test -n "$a_deplib"; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib=$potent_lib # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib= break 2 fi done done fi if test -n "$a_deplib"; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib"; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs= tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test yes = "$allow_libtool_libs_with_static_runtimes"; then for i in $predeps $postdeps; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test none = "$deplibs_check_method"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test yes = "$droppeddeps"; then if test yes = "$module"; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using 'nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** 'nm' from GNU binutils and a full rebuild may help." fi if test no = "$build_old_libs"; then oldlibs=$output_objdir/$libname.$libext build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test no = "$allow_undefined"; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test no = "$build_old_libs"; then oldlibs=$output_objdir/$libname.$libext build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs=$new_libs # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test yes = "$build_libtool_libs"; then # Remove $wl instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test yes = "$hardcode_into_libs"; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath=$finalize_rpath test relink = "$opt_mode" || rpath=$compile_rpath$rpath for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir=$hardcode_libdirs eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath=$finalize_shlibpath test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname=$1 shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname=$realname fi if test -z "$dlname"; then dlname=$soname fi lib=$output_objdir/$realname linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols=$output_objdir/$libname.uexp func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile func_dll_def_p "$export_symbols" || { # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols=$export_symbols export_symbols= always_export_symbols=yes } fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for '$libname.la'" export_symbols=$output_objdir/$libname.exp $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs=$IFS; IFS='~' for cmd1 in $cmds; do IFS=$save_ifs # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test yes = "$try_normal_branch" \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=$output_objdir/$output_la.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS=$save_ifs if test -n "$export_symbols_regex" && test : != "$skipped_export"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols=$export_symbols test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test : != "$skipped_export" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for '$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands, which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs=$tmp_deplibs if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test yes = "$compiler_needs_object" && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test relink = "$opt_mode"; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test yes = "$module" && test -n "$module_cmds"; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test : != "$skipped_export" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then output=$output_objdir/$output_la.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then output=$output_objdir/$output_la.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test yes = "$compiler_needs_object"; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-$k.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test -z "$objlist" || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test 1 -eq "$k"; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-$k.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-$k.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi ${skipped_export-false} && { func_verbose "generating symbol list for '$libname.la'" export_symbols=$output_objdir/$libname.exp $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi } test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs=$IFS; IFS='~' for cmd in $concat_cmds; do IFS=$save_ifs $opt_quiet || { func_quote_arg expand,pretty "$cmd" eval "func_echo $func_quote_arg_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test relink = "$opt_mode"; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS=$save_ifs if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi ${skipped_export-false} && { if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols=$export_symbols test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for '$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands, which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi } libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test yes = "$module" && test -n "$module_cmds"; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs=$IFS; IFS='~' for cmd in $cmds; do IFS=$sp$nl eval cmd=\"$cmd\" IFS=$save_ifs $opt_quiet || { func_quote_arg expand,pretty "$cmd" eval "func_echo $func_quote_arg_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test relink = "$opt_mode"; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS=$save_ifs # Restore the uninstalled library and exit if test relink = "$opt_mode"; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test yes = "$module" || test yes = "$export_dynamic"; then # On all known operating systems, these are identical. dlname=$soname fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then func_warning "'-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "'-l' and '-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "'-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "'-R' is ignored for objects" test -n "$vinfo" && \ func_warning "'-version-info' is ignored for objects" test -n "$release" && \ func_warning "'-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object '$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj=$output ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # if reload_cmds runs $LD directly, get rid of -Wl from # whole_archive_flag_spec and hope we can get by with turning comma # into space. case $reload_cmds in *\$LD[\ \$]*) wl= ;; esac if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags else gentop=$output_objdir/${obj}x func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test yes = "$build_libtool_libs" || libobjs=$non_pic_objects # Create the old-style object. reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs output=$obj func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi test yes = "$build_libtool_libs" || { if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS } if test -n "$pic_flag" || test default != "$pic_mode"; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output=$libobj func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "'-version-info' is ignored for programs" test -n "$release" && \ func_warning "'-release' is ignored for programs" $preload \ && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test CXX = "$tagname"; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " $wl-bind_at_load" func_append finalize_command " $wl-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs=$new_libs func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir=$hardcode_libdirs eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath=$rpath rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir=$hardcode_libdirs eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath=$rpath if test -n "$libobjs" && test yes = "$build_old_libs"; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" false # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=: case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=false ;; *cygwin* | *mingw* ) test yes = "$build_libtool_libs" || wrappers_required=false ;; *) if test no = "$need_relink" || test yes != "$build_libtool_libs"; then wrappers_required=false fi ;; esac $wrappers_required || { # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command=$compile_command$compile_rpath # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.$objext"; then func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' fi exit $exit_status } if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test yes = "$no_install"; then # We don't need to create a wrapper script. link_command=$compile_var$compile_command$compile_rpath # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi case $hardcode_action,$fast_install in relink,*) # Fast installation is not supported link_command=$compile_var$compile_command$compile_rpath relink_command=$finalize_var$finalize_command$finalize_rpath func_warning "this platform does not like uninstalled shared libraries" func_warning "'$output' will be relinked during installation" ;; *,yes) link_command=$finalize_var$compile_command$finalize_rpath relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` ;; *,no) link_command=$compile_var$compile_command$compile_rpath relink_command=$finalize_var$finalize_command$finalize_rpath ;; *,needless) link_command=$finalize_var$compile_command$finalize_rpath relink_command= ;; esac # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_arg pretty "$var_value" relink_command="$var=$func_quote_arg_result; export $var; $relink_command" fi done func_quote eval cd "`pwd`" func_quote_arg pretty,unquoted "($func_quote_result; $relink_command)" relink_command=$func_quote_arg_unquoted_result fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource=$output_path/$objdir/lt-$output_name.c cwrapper=$output_path/$output_name.exe $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host"; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do case $build_libtool_libs in convenience) oldobjs="$libobjs_save $symfileobj" addlibs=$convenience build_libtool_libs=no ;; module) oldobjs=$libobjs_save addlibs=$old_convenience build_libtool_libs=no ;; *) oldobjs="$old_deplibs $non_pic_objects" $preload && test -f "$symfileobj" \ && func_append oldobjs " $symfileobj" addlibs=$old_convenience ;; esac if test -n "$addlibs"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase=$func_basename_result case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj"; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test -z "$oldobjs"; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test yes = "$build_old_libs" && old_library=$libname.$libext func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_arg pretty,unquoted "$var_value" relink_command="$var=$func_quote_arg_unquoted_result; export $var; $relink_command" fi done # Quote the link command for shipping. func_quote eval cd "`pwd`" relink_command="($func_quote_result; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" func_quote_arg pretty,unquoted "$relink_command" relink_command=$func_quote_arg_unquoted_result if test yes = "$hardcode_automatic"; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test yes = "$installed"; then if test -z "$install_libdir"; then break fi output=$output_objdir/${outputname}i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name=$func_basename_result func_resolve_sysroot "$deplib" eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "'$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs=$newdependency_libs newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name=$func_basename_result eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "'$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles=$newdlfiles newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name=$func_basename_result eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "'$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles=$newdlprefiles else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles=$newdlfiles newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles=$newdlprefiles fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test -n "$bindir"; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result/$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that cannot go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test no,yes = "$installed,$need_relink"; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } if test link = "$opt_mode" || test relink = "$opt_mode"; then func_mode_link ${1+"$@"} fi # func_mode_uninstall arg... func_mode_uninstall () { $debug_cmd RM=$nonopt files= rmforce=false exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic=$magic for arg do case $arg in -f) func_append RM " $arg"; rmforce=: ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir=$func_dirname_result if test . = "$dir"; then odir=$objdir else odir=$dir/$objdir fi func_basename "$file" name=$func_basename_result test uninstall = "$opt_mode" && odir=$dir # Remember odir for removal later, being careful to avoid duplicates if test clean = "$opt_mode"; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif $rmforce; then continue fi rmfiles=$file case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case $opt_mode in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test none != "$pic_object"; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test none != "$non_pic_object"; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test clean = "$opt_mode"; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.$objext" if test yes = "$fast_install" && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name"; then func_append rmfiles " $odir/lt-$noexename.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the $objdir's in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then func_mode_uninstall ${1+"$@"} fi test -z "$opt_mode" && { help=$generic_help func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode '$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # where we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: mathicgb-1.1/build/autotools/compile0000755000175000017500000001635015117247651013336 #! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1999-2021 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program 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 2, or (at your option) # any later version. # # This program 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 this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN* | MSYS*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/* | msys/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: mathicgb-1.1/build/autotools/config.guess0000755000175000017500000014051215117247651014276 #! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2022 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale timestamp='2022-01-09' # This file 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. # # This program 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 this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # https://git.savannah.gnu.org/cgit/config.git/plain/config.guess # # Please send patches to . # The "shellcheck disable" line above the timestamp inhibits complaints # about features and limitations of the classic Bourne shell that were # superseded or lifted in POSIX. However, this script identifies a wide # variety of pre-POSIX systems that do not have POSIX shells at all, and # even some reasonably current systems (Solaris 10 as case-in-point) still # have a pre-POSIX /bin/sh. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2022 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi # Just in case it came from the environment. GUESS= # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. tmp= # shellcheck disable=SC2172 trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 set_cc_for_build() { # prevent multiple calls if $tmp is already set test "$tmp" && return 0 : "${TMPDIR=/tmp}" # shellcheck disable=SC2039,SC3028 { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } dummy=$tmp/dummy case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in ,,) echo "int x;" > "$dummy.c" for driver in cc gcc c89 c99 ; do if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then CC_FOR_BUILD=$driver break fi done if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac } # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if test -f /.attbin/uname ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case $UNAME_SYSTEM in Linux|GNU|GNU/*) LIBC=unknown set_cc_for_build cat <<-EOF > "$dummy.c" #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #elif defined(__GLIBC__) LIBC=gnu #else #include /* First heuristic to detect musl libc. */ #ifdef __DEFINED_va_list LIBC=musl #endif #endif EOF cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` eval "$cc_set_libc" # Second heuristic to detect musl libc. if [ "$LIBC" = unknown ] && command -v ldd >/dev/null && ldd --version 2>&1 | grep -q ^musl; then LIBC=musl fi # If the system lacks a compiler, then just pick glibc. # We could probably try harder. if [ "$LIBC" = unknown ]; then LIBC=gnu fi ;; esac # Note: order is significant - the case branches are not exclusive. case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ /sbin/sysctl -n hw.machine_arch 2>/dev/null || \ /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \ echo unknown)` case $UNAME_MACHINE_ARCH in aarch64eb) machine=aarch64_be-unknown ;; armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; earmv*) arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` machine=${arch}${endian}-unknown ;; *) machine=$UNAME_MACHINE_ARCH-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently (or will in the future) and ABI. case $UNAME_MACHINE_ARCH in earm*) os=netbsdelf ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # Determine ABI tags. case $UNAME_MACHINE_ARCH in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case $UNAME_VERSION in Debian*) release='-gnu' ;; *) release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. GUESS=$machine-${os}${release}${abi-} ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE ;; *:SecBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE ;; *:LibertyBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE ;; *:MidnightBSD:*:*) GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE ;; *:ekkoBSD:*:*) GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE ;; *:SolidBSD:*:*) GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE ;; *:OS108:*:*) GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE ;; macppc:MirBSD:*:*) GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE ;; *:MirBSD:*:*) GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE ;; *:Sortix:*:*) GUESS=$UNAME_MACHINE-unknown-sortix ;; *:Twizzler:*:*) GUESS=$UNAME_MACHINE-unknown-twizzler ;; *:Redox:*:*) GUESS=$UNAME_MACHINE-unknown-redox ;; mips:OSF1:*.*) GUESS=mips-dec-osf1 ;; alpha:OSF1:*:*) # Reset EXIT trap before exiting to avoid spurious non-zero exit code. trap '' 0 case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case $ALPHA_CPU_TYPE in "EV4 (21064)") UNAME_MACHINE=alpha ;; "EV4.5 (21064)") UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") UNAME_MACHINE=alpha ;; "EV5 (21164)") UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` GUESS=$UNAME_MACHINE-dec-osf$OSF_REL ;; Amiga*:UNIX_System_V:4.0:*) GUESS=m68k-unknown-sysv4 ;; *:[Aa]miga[Oo][Ss]:*:*) GUESS=$UNAME_MACHINE-unknown-amigaos ;; *:[Mm]orph[Oo][Ss]:*:*) GUESS=$UNAME_MACHINE-unknown-morphos ;; *:OS/390:*:*) GUESS=i370-ibm-openedition ;; *:z/VM:*:*) GUESS=s390-ibm-zvmoe ;; *:OS400:*:*) GUESS=powerpc-ibm-os400 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) GUESS=arm-acorn-riscix$UNAME_RELEASE ;; arm*:riscos:*:*|arm*:RISCOS:*:*) GUESS=arm-unknown-riscos ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) GUESS=hppa1.1-hitachi-hiuxmpp ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. case `(/bin/universe) 2>/dev/null` in att) GUESS=pyramid-pyramid-sysv3 ;; *) GUESS=pyramid-pyramid-bsd ;; esac ;; NILE*:*:*:dcosx) GUESS=pyramid-pyramid-svr4 ;; DRS?6000:unix:4.0:6*) GUESS=sparc-icl-nx6 ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) GUESS=sparc-icl-nx7 ;; esac ;; s390x:SunOS:*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL ;; sun4H:SunOS:5.*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=sparc-hal-solaris2$SUN_REL ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=sparc-sun-solaris2$SUN_REL ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) GUESS=i386-pc-auroraux$UNAME_RELEASE ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) set_cc_for_build SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH=x86_64 fi fi SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=$SUN_ARCH-pc-solaris2$SUN_REL ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=sparc-sun-solaris3$SUN_REL ;; sun4*:SunOS:*:*) case `/usr/bin/arch -k` in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` GUESS=sparc-sun-sunos$SUN_REL ;; sun3*:SunOS:*:*) GUESS=m68k-sun-sunos$UNAME_RELEASE ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 case `/bin/arch` in sun3) GUESS=m68k-sun-sunos$UNAME_RELEASE ;; sun4) GUESS=sparc-sun-sunos$UNAME_RELEASE ;; esac ;; aushp:SunOS:*:*) GUESS=sparc-auspex-sunos$UNAME_RELEASE ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) GUESS=m68k-atari-mint$UNAME_RELEASE ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) GUESS=m68k-atari-mint$UNAME_RELEASE ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) GUESS=m68k-atari-mint$UNAME_RELEASE ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) GUESS=m68k-milan-mint$UNAME_RELEASE ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) GUESS=m68k-hades-mint$UNAME_RELEASE ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) GUESS=m68k-unknown-mint$UNAME_RELEASE ;; m68k:machten:*:*) GUESS=m68k-apple-machten$UNAME_RELEASE ;; powerpc:machten:*:*) GUESS=powerpc-apple-machten$UNAME_RELEASE ;; RISC*:Mach:*:*) GUESS=mips-dec-mach_bsd4.3 ;; RISC*:ULTRIX:*:*) GUESS=mips-dec-ultrix$UNAME_RELEASE ;; VAX*:ULTRIX*:*:*) GUESS=vax-dec-ultrix$UNAME_RELEASE ;; 2020:CLIX:*:* | 2430:CLIX:*:*) GUESS=clipper-intergraph-clix$UNAME_RELEASE ;; mips:*:*:UMIPS | mips:*:*:RISCos) set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`"$dummy" "$dummyarg"` && { echo "$SYSTEM_NAME"; exit; } GUESS=mips-mips-riscos$UNAME_RELEASE ;; Motorola:PowerMAX_OS:*:*) GUESS=powerpc-motorola-powermax ;; Motorola:*:4.3:PL8-*) GUESS=powerpc-harris-powermax ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) GUESS=powerpc-harris-powermax ;; Night_Hawk:Power_UNIX:*:*) GUESS=powerpc-harris-powerunix ;; m88k:CX/UX:7*:*) GUESS=m88k-harris-cxux7 ;; m88k:*:4*:R4*) GUESS=m88k-motorola-sysv4 ;; m88k:*:3*:R3*) GUESS=m88k-motorola-sysv3 ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 then if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ test "$TARGET_BINARY_INTERFACE"x = x then GUESS=m88k-dg-dgux$UNAME_RELEASE else GUESS=m88k-dg-dguxbcs$UNAME_RELEASE fi else GUESS=i586-dg-dgux$UNAME_RELEASE fi ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) GUESS=m88k-dolphin-sysv3 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 GUESS=m88k-motorola-sysv3 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) GUESS=m88k-tektronix-sysv3 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) GUESS=m68k-tektronix-bsd ;; *:IRIX*:*:*) IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'` GUESS=mips-sgi-irix$IRIX_REL ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) GUESS=i386-ibm-aix ;; ia64:AIX:*:*) if test -x /usr/bin/oslevel ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` then GUESS=$SYSTEM_NAME else GUESS=rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then GUESS=rs6000-ibm-aix3.2.4 else GUESS=rs6000-ibm-aix3.2 fi ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if test -x /usr/bin/lslpp ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \ awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi GUESS=$IBM_ARCH-ibm-aix$IBM_REV ;; *:AIX:*:*) GUESS=rs6000-ibm-aix ;; ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) GUESS=romp-ibm-bsd4.4 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) GUESS=rs6000-bull-bosx ;; DPX/2?00:B.O.S.:*:*) GUESS=m68k-bull-sysv3 ;; 9000/[34]??:4.3bsd:1.*:*) GUESS=m68k-hp-bsd ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) GUESS=m68k-hp-bsd4.4 ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` case $UNAME_MACHINE in 9000/31?) HP_ARCH=m68000 ;; 9000/[34]??) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if test -x /usr/bin/getconf; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case $sc_cpu_version in 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case $sc_kernel_bits in 32) HP_ARCH=hppa2.0n ;; 64) HP_ARCH=hppa2.0w ;; '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi if test "$HP_ARCH" = ""; then set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if test "$HP_ARCH" = hppa2.0w then set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH=hppa2.0w else HP_ARCH=hppa64 fi fi GUESS=$HP_ARCH-hp-hpux$HPUX_REV ;; ia64:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` GUESS=ia64-hp-hpux$HPUX_REV ;; 3050*:HI-UX:*:*) set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } GUESS=unknown-hitachi-hiuxwe2 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) GUESS=hppa1.1-hp-bsd ;; 9000/8??:4.3bsd:*:*) GUESS=hppa1.0-hp-bsd ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) GUESS=hppa1.0-hp-mpeix ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) GUESS=hppa1.1-hp-osf ;; hp8??:OSF1:*:*) GUESS=hppa1.0-hp-osf ;; i*86:OSF1:*:*) if test -x /usr/sbin/sysversion ; then GUESS=$UNAME_MACHINE-unknown-osf1mk else GUESS=$UNAME_MACHINE-unknown-osf1 fi ;; parisc*:Lites*:*:*) GUESS=hppa1.1-hp-lites ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) GUESS=c1-convex-bsd ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) GUESS=c34-convex-bsd ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) GUESS=c38-convex-bsd ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) GUESS=c4-convex-bsd ;; CRAY*Y-MP:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=ymp-cray-unicos$CRAY_REL ;; CRAY*[A-Z]90:*:*:*) echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=t90-cray-unicos$CRAY_REL ;; CRAY*T3E:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=alphaev5-cray-unicosmk$CRAY_REL ;; CRAY*SV1:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=sv1-cray-unicos$CRAY_REL ;; *:UNICOS/mp:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=craynv-cray-unicosmp$CRAY_REL ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE ;; sparc*:BSD/OS:*:*) GUESS=sparc-unknown-bsdi$UNAME_RELEASE ;; *:BSD/OS:*:*) GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE ;; arm:FreeBSD:*:*) UNAME_PROCESSOR=`uname -p` set_cc_for_build if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi else FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf fi ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case $UNAME_PROCESSOR in amd64) UNAME_PROCESSOR=x86_64 ;; i386) UNAME_PROCESSOR=i586 ;; esac FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL ;; i*:CYGWIN*:*) GUESS=$UNAME_MACHINE-pc-cygwin ;; *:MINGW64*:*) GUESS=$UNAME_MACHINE-pc-mingw64 ;; *:MINGW*:*) GUESS=$UNAME_MACHINE-pc-mingw32 ;; *:MSYS*:*) GUESS=$UNAME_MACHINE-pc-msys ;; i*:PW*:*) GUESS=$UNAME_MACHINE-pc-pw32 ;; *:SerenityOS:*:*) GUESS=$UNAME_MACHINE-pc-serenity ;; *:Interix*:*) case $UNAME_MACHINE in x86) GUESS=i586-pc-interix$UNAME_RELEASE ;; authenticamd | genuineintel | EM64T) GUESS=x86_64-unknown-interix$UNAME_RELEASE ;; IA64) GUESS=ia64-unknown-interix$UNAME_RELEASE ;; esac ;; i*:UWIN*:*) GUESS=$UNAME_MACHINE-pc-uwin ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) GUESS=x86_64-pc-cygwin ;; prep*:SunOS:5.*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=powerpcle-unknown-solaris2$SUN_REL ;; *:GNU:*:*) # the GNU system GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'` GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'` GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL ;; *:GNU/*:*:*) # other systems with GNU libc and userland GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"` GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC ;; *:Minix:*:*) GUESS=$UNAME_MACHINE-unknown-minix ;; aarch64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC=gnulibc1 ; fi GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; arm*:Linux:*:*) set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then GUESS=$UNAME_MACHINE-unknown-linux-$LIBC else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi else GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf fi fi ;; avr32*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; cris:Linux:*:*) GUESS=$UNAME_MACHINE-axis-linux-$LIBC ;; crisv32:Linux:*:*) GUESS=$UNAME_MACHINE-axis-linux-$LIBC ;; e2k:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; frv:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; hexagon:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; i*86:Linux:*:*) GUESS=$UNAME_MACHINE-pc-linux-$LIBC ;; ia64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; k1om:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; m32r*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; m68*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; mips:Linux:*:* | mips64:Linux:*:*) set_cc_for_build IS_GLIBC=0 test x"${LIBC}" = xgnu && IS_GLIBC=1 sed 's/^ //' << EOF > "$dummy.c" #undef CPU #undef mips #undef mipsel #undef mips64 #undef mips64el #if ${IS_GLIBC} && defined(_ABI64) LIBCABI=gnuabi64 #else #if ${IS_GLIBC} && defined(_ABIN32) LIBCABI=gnuabin32 #else LIBCABI=${LIBC} #endif #endif #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 CPU=mipsisa64r6 #else #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 CPU=mipsisa32r6 #else #if defined(__mips64) CPU=mips64 #else CPU=mips #endif #endif #endif #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) MIPS_ENDIAN=el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) MIPS_ENDIAN= #else MIPS_ENDIAN= #endif #endif EOF cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'` eval "$cc_set_vars" test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } ;; mips64el:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; openrisc*:Linux:*:*) GUESS=or1k-unknown-linux-$LIBC ;; or32:Linux:*:* | or1k*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; padre:Linux:*:*) GUESS=sparc-unknown-linux-$LIBC ;; parisc64:Linux:*:* | hppa64:Linux:*:*) GUESS=hppa64-unknown-linux-$LIBC ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;; PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;; *) GUESS=hppa-unknown-linux-$LIBC ;; esac ;; ppc64:Linux:*:*) GUESS=powerpc64-unknown-linux-$LIBC ;; ppc:Linux:*:*) GUESS=powerpc-unknown-linux-$LIBC ;; ppc64le:Linux:*:*) GUESS=powerpc64le-unknown-linux-$LIBC ;; ppcle:Linux:*:*) GUESS=powerpcle-unknown-linux-$LIBC ;; riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; s390:Linux:*:* | s390x:Linux:*:*) GUESS=$UNAME_MACHINE-ibm-linux-$LIBC ;; sh64*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; sh*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; sparc:Linux:*:* | sparc64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; tile*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; vax:Linux:*:*) GUESS=$UNAME_MACHINE-dec-linux-$LIBC ;; x86_64:Linux:*:*) set_cc_for_build LIBCABI=$LIBC if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_X32 >/dev/null then LIBCABI=${LIBC}x32 fi fi GUESS=$UNAME_MACHINE-pc-linux-$LIBCABI ;; xtensa*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. GUESS=i386-sequent-sysv4 ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. GUESS=$UNAME_MACHINE-pc-os2-emx ;; i*86:XTS-300:*:STOP) GUESS=$UNAME_MACHINE-unknown-stop ;; i*86:atheos:*:*) GUESS=$UNAME_MACHINE-unknown-atheos ;; i*86:syllable:*:*) GUESS=$UNAME_MACHINE-pc-syllable ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) GUESS=i386-unknown-lynxos$UNAME_RELEASE ;; i*86:*DOS:*:*) GUESS=$UNAME_MACHINE-pc-msdosdjgpp ;; i*86:*:4.*:*) UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL else GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL fi ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL else GUESS=$UNAME_MACHINE-pc-sysv32 fi ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. GUESS=i586-pc-msdosdjgpp ;; Intel:Mach:3*:*) GUESS=i386-pc-mach3 ;; paragon:*:*:*) GUESS=i860-intel-osf1 ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4 fi ;; mini*:CTIX:SYS*5:*) # "miniframe" GUESS=m68010-convergent-sysv ;; mc68k:UNIX:SYSTEM5:3.51m) GUESS=m68k-convergent-sysv ;; M680?0:D-NIX:5.3:*) GUESS=m68k-diab-dnix ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) GUESS=m68k-unknown-lynxos$UNAME_RELEASE ;; mc68030:UNIX_System_V:4.*:*) GUESS=m68k-atari-sysv4 ;; TSUNAMI:LynxOS:2.*:*) GUESS=sparc-unknown-lynxos$UNAME_RELEASE ;; rs6000:LynxOS:2.*:*) GUESS=rs6000-unknown-lynxos$UNAME_RELEASE ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) GUESS=powerpc-unknown-lynxos$UNAME_RELEASE ;; SM[BE]S:UNIX_SV:*:*) GUESS=mips-dde-sysv$UNAME_RELEASE ;; RM*:ReliantUNIX-*:*:*) GUESS=mips-sni-sysv4 ;; RM*:SINIX-*:*:*) GUESS=mips-sni-sysv4 ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` GUESS=$UNAME_MACHINE-sni-sysv4 else GUESS=ns32k-sni-sysv fi ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says GUESS=i586-unisys-sysv4 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm GUESS=hppa1.1-stratus-sysv4 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. GUESS=i860-stratus-sysv4 ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. GUESS=$UNAME_MACHINE-stratus-vos ;; *:VOS:*:*) # From Paul.Green@stratus.com. GUESS=hppa1.1-stratus-vos ;; mc68*:A/UX:*:*) GUESS=m68k-apple-aux$UNAME_RELEASE ;; news*:NEWS-OS:6*:*) GUESS=mips-sony-newsos6 ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if test -d /usr/nec; then GUESS=mips-nec-sysv$UNAME_RELEASE else GUESS=mips-unknown-sysv$UNAME_RELEASE fi ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. GUESS=powerpc-be-beos ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. GUESS=powerpc-apple-beos ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. GUESS=i586-pc-beos ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. GUESS=i586-pc-haiku ;; x86_64:Haiku:*:*) GUESS=x86_64-unknown-haiku ;; SX-4:SUPER-UX:*:*) GUESS=sx4-nec-superux$UNAME_RELEASE ;; SX-5:SUPER-UX:*:*) GUESS=sx5-nec-superux$UNAME_RELEASE ;; SX-6:SUPER-UX:*:*) GUESS=sx6-nec-superux$UNAME_RELEASE ;; SX-7:SUPER-UX:*:*) GUESS=sx7-nec-superux$UNAME_RELEASE ;; SX-8:SUPER-UX:*:*) GUESS=sx8-nec-superux$UNAME_RELEASE ;; SX-8R:SUPER-UX:*:*) GUESS=sx8r-nec-superux$UNAME_RELEASE ;; SX-ACE:SUPER-UX:*:*) GUESS=sxace-nec-superux$UNAME_RELEASE ;; Power*:Rhapsody:*:*) GUESS=powerpc-apple-rhapsody$UNAME_RELEASE ;; *:Rhapsody:*:*) GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE ;; arm64:Darwin:*:*) GUESS=aarch64-apple-darwin$UNAME_RELEASE ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac if command -v xcode-select > /dev/null 2> /dev/null && \ ! xcode-select --print-path > /dev/null 2> /dev/null ; then # Avoid executing cc if there is no toolchain installed as # cc will be a stub that puts up a graphical alert # prompting the user to install developer tools. CC_FOR_BUILD=no_compiler_found else set_cc_for_build fi if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_PPC >/dev/null then UNAME_PROCESSOR=powerpc fi elif test "$UNAME_PROCESSOR" = i386 ; then # uname -m returns i386 or x86_64 UNAME_PROCESSOR=$UNAME_MACHINE fi GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE ;; *:QNX:*:4*) GUESS=i386-pc-qnx ;; NEO-*:NONSTOP_KERNEL:*:*) GUESS=neo-tandem-nsk$UNAME_RELEASE ;; NSE-*:NONSTOP_KERNEL:*:*) GUESS=nse-tandem-nsk$UNAME_RELEASE ;; NSR-*:NONSTOP_KERNEL:*:*) GUESS=nsr-tandem-nsk$UNAME_RELEASE ;; NSV-*:NONSTOP_KERNEL:*:*) GUESS=nsv-tandem-nsk$UNAME_RELEASE ;; NSX-*:NONSTOP_KERNEL:*:*) GUESS=nsx-tandem-nsk$UNAME_RELEASE ;; *:NonStop-UX:*:*) GUESS=mips-compaq-nonstopux ;; BS2000:POSIX*:*:*) GUESS=bs2000-siemens-sysv ;; DS/*:UNIX_System_V:*:*) GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "${cputype-}" = 386; then UNAME_MACHINE=i386 elif test "x${cputype-}" != x; then UNAME_MACHINE=$cputype fi GUESS=$UNAME_MACHINE-unknown-plan9 ;; *:TOPS-10:*:*) GUESS=pdp10-unknown-tops10 ;; *:TENEX:*:*) GUESS=pdp10-unknown-tenex ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) GUESS=pdp10-dec-tops20 ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) GUESS=pdp10-xkl-tops20 ;; *:TOPS-20:*:*) GUESS=pdp10-unknown-tops20 ;; *:ITS:*:*) GUESS=pdp10-unknown-its ;; SEI:*:*:SEIUX) GUESS=mips-sei-seiux$UNAME_RELEASE ;; *:DragonFly:*:*) DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case $UNAME_MACHINE in A*) GUESS=alpha-dec-vms ;; I*) GUESS=ia64-dec-vms ;; V*) GUESS=vax-dec-vms ;; esac ;; *:XENIX:*:SysV) GUESS=i386-pc-xenix ;; i*86:skyos:*:*) SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'` GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL ;; i*86:rdos:*:*) GUESS=$UNAME_MACHINE-pc-rdos ;; i*86:Fiwix:*:*) GUESS=$UNAME_MACHINE-pc-fiwix ;; *:AROS:*:*) GUESS=$UNAME_MACHINE-unknown-aros ;; x86_64:VMkernel:*:*) GUESS=$UNAME_MACHINE-unknown-esx ;; amd64:Isilon\ OneFS:*:*) GUESS=x86_64-unknown-onefs ;; *:Unleashed:*:*) GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE ;; esac # Do we have a guess based on uname results? if test "x$GUESS" != x; then echo "$GUESS" exit fi # No uname command or uname output not recognized. set_cc_for_build cat > "$dummy.c" < #include #endif #if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) #if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) #include #if defined(_SIZE_T_) || defined(SIGLOST) #include #endif #endif #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) #if !defined (ultrix) #include #if defined (BSD) #if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); #else #if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); #else printf ("vax-dec-bsd\n"); exit (0); #endif #endif #else printf ("vax-dec-bsd\n"); exit (0); #endif #else #if defined(_SIZE_T_) || defined(SIGLOST) struct utsname un; uname (&un); printf ("vax-dec-ultrix%s\n", un.release); exit (0); #else printf ("vax-dec-ultrix\n"); exit (0); #endif #endif #endif #if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) #if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) #if defined(_SIZE_T_) || defined(SIGLOST) struct utsname *un; uname (&un); printf ("mips-dec-ultrix%s\n", un.release); exit (0); #else printf ("mips-dec-ultrix\n"); exit (0); #endif #endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } echo "$0: unable to guess system type" >&2 case $UNAME_MACHINE:$UNAME_SYSTEM in mips:Linux | mips64:Linux) # If we got here on MIPS GNU/Linux, output extra information. cat >&2 <&2 <&2 </dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = "$UNAME_MACHINE" UNAME_RELEASE = "$UNAME_RELEASE" UNAME_SYSTEM = "$UNAME_SYSTEM" UNAME_VERSION = "$UNAME_VERSION" EOF fi exit 1 # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: mathicgb-1.1/build/autotools/ar-lib0000755000175000017500000001336315117247651013055 #! /bin/sh # Wrapper for Microsoft lib.exe me=ar-lib scriptversion=2019-07-04.01; # UTC # Copyright (C) 2010-2021 Free Software Foundation, Inc. # Written by Peter Rosin . # # This program 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 2, or (at your option) # any later version. # # This program 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 this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . # func_error message func_error () { echo "$me: $1" 1>&2 exit 1 } file_conv= # func_file_conv build_file # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN* | MSYS*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv in mingw) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin | msys) file=`cygpath -m "$file" || echo "$file"` ;; wine) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_at_file at_file operation archive # Iterate over all members in AT_FILE performing OPERATION on ARCHIVE # for each of them. # When interpreting the content of the @FILE, do NOT use func_file_conv, # since the user would need to supply preconverted file names to # binutils ar, at least for MinGW. func_at_file () { operation=$2 archive=$3 at_file_contents=`cat "$1"` eval set x "$at_file_contents" shift for member do $AR -NOLOGO $operation:"$member" "$archive" || exit $? done } case $1 in '') func_error "no command. Try '$0 --help' for more information." ;; -h | --h*) cat <. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: mathicgb-1.1/build/autotools/mathicgb.pc.in0000664000175000017500000000045614560325357014472 prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: mathicgb Description: C++ library for Groebner basis computation URL: https://github.com/broune/mathicgb Requires: memtailor mathic Version: @PACKAGE_VERSION@ Libs: -L${libdir} -lmathicgb Cflags: -I${includedir}/ mathicgb-1.1/build/autotools/test-driver0000755000175000017500000001141715117247651014155 #! /bin/sh # test-driver - basic testsuite driver script. scriptversion=2018-03-07.03; # UTC # Copyright (C) 2011-2021 Free Software Foundation, Inc. # # This program 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 2, or (at your option) # any later version. # # This program 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 this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . # Make unconditional expansion of undefined variables an error. This # helps a lot in preventing typo-related bugs. set -u usage_error () { echo "$0: $*" >&2 print_usage >&2 exit 2 } print_usage () { cat <"$log_file" "$@" >>"$log_file" 2>&1 estatus=$? if test $enable_hard_errors = no && test $estatus -eq 99; then tweaked_estatus=1 else tweaked_estatus=$estatus fi case $tweaked_estatus:$expect_failure in 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; 0:*) col=$grn res=PASS recheck=no gcopy=no;; 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; *:*) col=$red res=FAIL recheck=yes gcopy=yes;; esac # Report the test outcome and exit status in the logs, so that one can # know whether the test passed or failed simply by looking at the '.log' # file, without the need of also peaking into the corresponding '.trs' # file (automake bug#11814). echo "$res $test_name (exit status: $estatus)" >>"$log_file" # Report outcome to console. echo "${col}${res}${std}: $test_name" # Register the test result, and other relevant metadata. echo ":test-result: $res" > $trs_file echo ":global-test-result: $res" >> $trs_file echo ":recheck: $recheck" >> $trs_file echo ":copy-in-global-log: $gcopy" >> $trs_file # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: mathicgb-1.1/src/0000775000175000017500000000000015117247676007503 5mathicgb-1.1/src/test/0000775000175000017500000000000015117247675010461 5mathicgb-1.1/src/test/poly-test.cpp0000664000175000017500000004765214570075453013056 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "mathicgb/stdinc.h" #include "mathicgb/Poly.hpp" #include "mathicgb/Basis.hpp" #include "mathicgb/ModuleMonoSet.hpp" #include "mathicgb/io-util.hpp" #include "mathicgb/SigPolyBasis.hpp" #include "mathicgb/SignatureGB.hpp" #include "mathicgb/MathicIO.hpp" #include #include #include #include #include using namespace mgb; std::string ideal1 = "32003 4 1 1 1 1 1 \ 2 \ ab+3d2+2d \ c3+a-b+1 \ "; std::string ideal2 = " \ 32003 4 \ 1 1 1 1 1 \ 7 \ bc2-ad2 \ abc-d3 \ b3-acd \ a2d2-cd3 \ ac3d-ab2d2 \ a2c2d-b2d3 \ c3d3-b2d4 \ "; bool testPolyParse(PolyRing* R, std::string s, bool withComponent) { // parse poly, then see if it matches the orig string std::istringstream i(s); Scanner in(i); auto f = MathicIO<>().readPolyDoNotOrder(*R, withComponent, in); std::ostringstream o; MathicIO<>().writePoly(f, withComponent, o); // std::cout << "orig = " << s << std::endl; // std::cout << "f = " << o.str() << std::endl; return o.str() == s; } bool testPolyParse2(PolyRing* R, std::string s, std::string answer) { // parse poly, then see if it matches the orig string std::istringstream i(s); Scanner scanner(i); auto f = MathicIO<>().readPolyDoNotOrder(*R, false, scanner); std::ostringstream o; MathicIO<>().writePoly(f, false, o); // std::cout << "orig = " << s << std::endl; // std::cout << "f = " << o.str() << std::endl; return o.str() == answer; } TEST(Poly,parse) { std::unique_ptr R(ringFromString("32003 6 1\n1 1 1 1 1 1")); EXPECT_TRUE(testPolyParse(R.get(), "3a<1>+1<0>", true)); EXPECT_TRUE(testPolyParse(R.get(), "3a+1", false)); EXPECT_TRUE(testPolyParse(R.get(), "3a<1>+13af3<0>+14cde<0>", true)); EXPECT_TRUE(testPolyParse(R.get(), "1<1>+13af3<0>+14cde<0>", true)); } bool testMonomialParse(PolyRing* R, std::string s) { Monomial m = stringToMonomial(R, s); std::string str2 = monomialToString(R,m); return s == str2; } TEST(Monomial, parse) { std::unique_ptr R(ringFromString("32003 6 1\n1 1 1 1 1 1")); EXPECT_TRUE(testMonomialParse(R.get(), "ab2d<2>")); EXPECT_TRUE(testMonomialParse(R.get(), "ab2d<0>")); EXPECT_TRUE(testMonomialParse(R.get(), "<13>")); EXPECT_TRUE(testMonomialParse(R.get(), "abcdef<0>")); EXPECT_TRUE(testMonomialParse(R.get(), "a10b3d4<0>")); } TEST(Monomial,compare) { std::unique_ptr R(ringFromString("32003 6 1\n1 1 1 1 1 1")); Monomial mone = stringToMonomial(R.get(), "<0>"); Monomial mone2 = stringToMonomial(R.get(), "1"); Monomial m1 = stringToMonomial(R.get(), "ab2<0>"); Monomial m2 = stringToMonomial(R.get(), "a2b<0>"); EXPECT_TRUE(R->monomialEQ(mone, mone2)); // monomial mone = monomialFromString(R, "0 0"); // monomial m1 = monomialFromString(R, "0 2 1 2 0 1"); // monomial m2 = monomialFromString(R, "0 2 1 1 0 2"); bool a = R->monomialLT(m1,m2); EXPECT_TRUE(a); EXPECT_FALSE(R->monomialEQ(m1,m2)); EXPECT_EQ(LT, R->monomialCompare(m1,m2)); a = R->monomialLT(mone,m1); EXPECT_TRUE(a); EXPECT_FALSE(R->monomialEQ(mone,m1)); EXPECT_EQ(GT, R->monomialCompare(m1,mone)); a = R->monomialLT(mone,mone); EXPECT_FALSE(a); EXPECT_TRUE(R->monomialEQ(mone,mone)); EXPECT_EQ(EQ, R->monomialCompare(mone,mone)); Monomial b = stringToMonomial(R.get(), "b<0>"); Monomial c = stringToMonomial(R.get(), "c<0>"); a = R->monomialLT(b,c); EXPECT_FALSE(a); } TEST(Monomial,mult) { std::unique_ptr R(ringFromString("32003 6 1\n1 1 1 1 1 1")); Monomial m1 = stringToMonomial(R.get(), "ab2<0>"); Monomial m2 = stringToMonomial(R.get(), "a2b<0>"); Monomial m3ans = stringToMonomial(R.get(), "a3b3<0>"); Monomial m3 = R->allocMonomial(); R->monomialMult(m1,m2,m3); EXPECT_TRUE(R->monomialEQ(m3ans,m3)); R->freeMonomial(m1); R->freeMonomial(m2); R->freeMonomial(m3); R->freeMonomial(m3ans); } TEST(Monomial,multTo) { std::unique_ptr R(ringFromString("32003 6 1\n1 1 1 1 1 1")); Monomial m1 = stringToMonomial(R.get(), "ab2<0>"); Monomial m2 = stringToMonomial(R.get(), "a2b<0>"); Monomial m3ans = stringToMonomial(R.get(), "a3b3<0>"); R->monomialMultTo(m1,m2); EXPECT_TRUE(R->monomialEQ(m3ans,m1)); R->freeMonomial(m1); R->freeMonomial(m2); R->freeMonomial(m3ans); } TEST(Monomial, divide) { // test of monomialDivide, monomialIsDivisibleBy, monomialQuotientAndMult std::unique_ptr R(ringFromString("32003 6 1\n1 1 1 1 1 1")); Monomial m1 = stringToMonomial(R.get(), "ab2<0>"); Monomial m2 = stringToMonomial(R.get(), "a2b<0>"); Monomial m3ans = stringToMonomial(R.get(), "a3b3<0>"); Monomial m3 = R->allocMonomial(); Monomial m1a = R->allocMonomial(); R->monomialMult(m1,m2,m3); EXPECT_TRUE(R->monomialIsDivisibleBy(m3,m2)); EXPECT_FALSE(R->monomialIsDivisibleBy(m2,m3)); R->monomialDivide(m3,m2,m1a); EXPECT_TRUE(R->monomialEQ(m1,m1a)); R->freeMonomial(m1); R->freeMonomial(m2); R->freeMonomial(m3); R->freeMonomial(m3ans); R->freeMonomial(m1a); } TEST(Monomial, monomialQuotientAndMult) { // test of monomialQuotientAndMult std::unique_ptr R(ringFromString("32003 6 1\n1 1 1 1 1 1")); Monomial m1 = stringToMonomial(R.get(), "ab2f2<0>"); Monomial m2 = stringToMonomial(R.get(), "af<0>"); Monomial m3 = stringToMonomial(R.get(), "<2>"); Monomial n = R->allocMonomial(); Monomial n1 = R->allocMonomial(); Monomial na = R->allocMonomial(); R->monomialQuotientAndMult(m1,m2,m3,n); R->monomialDivide(m1,m2,n1); // m1//m2 R->monomialMult(n1,m3,na); // m1//m2 * m3 should be n EXPECT_TRUE(R->monomialEQ(n, na)); R->freeMonomial(m1); R->freeMonomial(m2); R->freeMonomial(m3); R->freeMonomial(n); R->freeMonomial(n1); R->freeMonomial(na); } void testMonomialOps(const PolyRing* R, std::string s1, std::string s2) { Monomial m1 = stringToMonomial(R, s1); Monomial m2 = stringToMonomial(R, s2); // Monomial m3 = stringToMonomial(R, "abcdef<0>"); Monomial m4 = R->allocMonomial(); Monomial lcm = R->allocMonomial(); Monomial m8 = R->allocMonomial(); Monomial m1a = R->allocMonomial(); Monomial m2a = R->allocMonomial(); Monomial m1b = R->allocMonomial(); Monomial m2b = R->allocMonomial(); R->monomialMult(m1,m2,m4); R->monomialLeastCommonMultiple(m1,m2,lcm); // lcm(m1,m2)/m1, lcm(m1,m2)/m2: relatively prime EXPECT_TRUE(R->monomialIsDivisibleBy(lcm, m1)); EXPECT_TRUE(R->monomialIsDivisibleBy(lcm, m2)); R->monomialDivide(lcm, m1, m1a); R->monomialDivide(lcm, m2, m2a); EXPECT_TRUE(R->monomialRelativelyPrime(m1a,m2a)); EXPECT_TRUE(R->monomialIsDivisibleBy(lcm, m1a)); EXPECT_TRUE(R->monomialIsDivisibleBy(lcm, m2a)); R->monomialDivide(lcm, m1a, m1b); R->monomialDivide(lcm, m2a, m2b); EXPECT_TRUE(R->monomialEQ(m1, m1b)); EXPECT_TRUE(R->monomialEQ(m2, m2b)); R->monomialMult(m1a, m2a, m8); size_t supp1 = R->monomialSizeOfSupport(m1a); size_t supp2 = R->monomialSizeOfSupport(m2a); size_t supp = R->monomialSizeOfSupport(m8); EXPECT_EQ(supp1+supp2, supp) << monomialToString(R,m1) << " " << monomialToString(R,m2) << "\n" << monomialToString(R,m1a) << " " << monomialToString(R,m2a) << " " << monomialToString(R,m8); } TEST(Monomial, ops) { std::unique_ptr R(ringFromString("32003 6 1\n1 1 1 1 1 1")); testMonomialOps(R.get(), "ab2f2<0>", "bc2df3<0>"); testMonomialOps(R.get(), "ab2f2<0>", "<0>"); testMonomialOps(R.get(), "<0>", "<0>"); testMonomialOps(R.get(), "a<0>", "a<0>"); testMonomialOps(R.get(), "a<0>", "b<0>"); testMonomialOps(R.get(), "a10b10c10d10e10f10<0>", "b2f5<0>"); } TEST(Monomial, ei) { std::unique_ptr R(ringFromString("32003 6 1\n1 1 1 1 1 1")); Monomial m1 = stringToMonomial(R.get(), "<1>"); Monomial m1a = R->allocMonomial(); R->monomialEi(1, m1a); EXPECT_TRUE(R->monomialEQ(m1,m1a)); m1 = stringToMonomial(R.get(), "<0>"); R->monomialEi(0, m1a); EXPECT_TRUE(R->monomialEQ(m1,m1a)); m1 = stringToMonomial(R.get(), "<1>"); R->monomialEi(1, m1a); EXPECT_TRUE(R->monomialEQ(m1,m1a)); m1 = stringToMonomial(R.get(), "<10000>"); R->monomialEi(10000, m1a); EXPECT_TRUE(R->monomialEQ(m1,m1a)); } TEST(Monomial, strict) { std::unique_ptr R(ringFromString("32003 6 1\n1 1 1 1 1 1")); Monomial m1 = stringToMonomial(R.get(), "ab2c3d4e"); Monomial m2 = stringToMonomial(R.get(), "ab2c3d4"); Monomial m3 = stringToMonomial(R.get(), "ab2c3d4"); Monomial m4 = stringToMonomial(R.get(), "ab2c3d3e"); EXPECT_TRUE(R->monomialHasStrictlyLargerExponent(m1,m2,m3)); EXPECT_FALSE(R->monomialHasStrictlyLargerExponent(m1,m2,m4)); } TEST(Monomial, divideToNegative) { std::unique_ptr R(ringFromString("32003 6 1\n1 1 1 1 1 1")); Monomial m1 = stringToMonomial(R.get(), "ab100<0>"); Monomial m2 = stringToMonomial(R.get(), "ab2c3d4<0>"); Monomial m3 = R->allocMonomial(); Monomial m4 = R->allocMonomial(); Monomial m5 = R->allocMonomial(); Monomial mone = stringToMonomial(R.get(), "<0>"); R->monomialDivideToNegative(m1,m2,m3); R->monomialDivideToNegative(m2,m1,m4); R->monomialMult(m3,m4,m5); EXPECT_TRUE(R->monomialEQ(m5,mone)); m3 = stringToMonomial(R.get(), "ab2c3d4"); m4 = stringToMonomial(R.get(), "ab2c3d3e"); EXPECT_TRUE(R->monomialHasStrictlyLargerExponent(m1,m2,m3)); EXPECT_FALSE(R->monomialHasStrictlyLargerExponent(m2,m2,m4)); } TEST(Monomial, findSignature) { std::unique_ptr R(ringFromString("32003 6 1\n1 1 1 1 1 1")); Monomial v1 = stringToMonomial(R.get(), "abef"); Monomial v2 = stringToMonomial(R.get(), "acdf2"); Monomial u1 = stringToMonomial(R.get(), "f5<13>"); Monomial t1 = R->allocMonomial(); Monomial t1ans = stringToMonomial(R.get(), "cdf6<13>"); R->monomialFindSignature(v1,v2,u1,t1); EXPECT_TRUE(R->monomialEQ(t1,t1ans)); } //#warning "remove this code" #if 0 bool testMonomialOldParse(PolyRing *R, std::string s) { monomial m = monomialParseFromString(R, s); std::string str2 = monomialDisplay(R,m); return s == str2; } TEST(OldMonomial, parse) { PolyRing *R = ringFromString("32003 6 1\n1 1 1 1 1 1"); EXPECT_TRUE(testMonomialOldParse(R, "ab2d<2>")); EXPECT_TRUE(testMonomialOldParse(R, "ab2d<0>")); EXPECT_TRUE(testMonomialOldParse(R, "<13>")); EXPECT_TRUE(testMonomialOldParse(R, "abcdef<0>")); EXPECT_TRUE(testMonomialOldParse(R, "a10b3d4<0>")); } TEST(OldMonomial,compare) { PolyRing *R = ringFromString("32003 6 1\n1 1 1 1 1 1"); monomial mone = monomialFromString(R, "0 0"); monomial m1 = monomialFromString(R, "0 2 1 2 0 1"); monomial m2 = monomialFromString(R, "0 2 1 1 0 2"); bool a = R->monomialLT(m1,m2); EXPECT_TRUE(a); EXPECT_FALSE(R->monomialEQ(m1,m2)); EXPECT_EQ(LT, R->monomialCompare(m1,m2)); a = R->monomialLT(mone,m1); EXPECT_TRUE(a); EXPECT_FALSE(R->monomialEQ(mone,m1)); EXPECT_EQ(GT, R->monomialCompare(m1,mone)); a = R->monomialLT(mone,mone); EXPECT_FALSE(a); EXPECT_TRUE(R->monomialEQ(mone,mone)); EXPECT_EQ(EQ, R->monomialCompare(mone,mone)); monomial b = monomialFromString(R, "0 1 1 1"); monomial c = monomialFromString(R, "0 1 2 1"); a = R->monomialLT(b,c); EXPECT_FALSE(a); } TEST(OldMonomial,mult) { PolyRing *R = ringFromString("32003 6 1\n1 1 1 1 1 1"); monomial m1 = monomialFromString(R, "0 2 1 2 0 1"); // ab2 monomial m2 = monomialFromString(R, "0 2 1 1 0 2"); // a2b // std::cout << "m1 is " << monomialToString(R,m1) << std::endl; //std::cout << "m2 is " << monomialToString(R,m2) << std::endl; monomial m3 = new int[R->maxMonomialSize()]; R->monomialMult(m1,m2,m3); monomial m3ans = monomialFromString(R, "0 2 1 3 0 3"); // a3b3 //std::cout << "answer is " << monomialToString(R,m3) << std::endl; EXPECT_TRUE(R->monomialEQ(m3ans,m3)); } TEST(OldMonomial,multTo) { PolyRing *R = ringFromString("32003 6 1\n1 1 1 1 1 1"); monomial m1 = monomialFromString(R, "0 3 5 2 1 2 0 1"); // ab2 monomial m2 = monomialFromString(R, "0 2 1 1 0 2"); // a2b R->monomialMultTo(m1,m2); monomial m3ans = monomialFromString(R, "0 3 5 2 1 3 0 3"); // a3b3 EXPECT_TRUE(R->monomialEQ(m3ans,m1)); } TEST(OldMonomial, divide) { // test of monomialDivide, monomialIsDivisibleBy, monomialQuotientAndMult PolyRing *R = ringFromString("32003 6 1\n1 1 1 1 1 1"); monomial m1 = monomialFromString(R, "0 3 5 2 1 2 0 1"); // ab2 monomial m2 = monomialFromString(R, "0 2 1 1 0 2"); // a2b monomial m3 = new int[R->maxMonomialSize()]; monomial m1a = new int[R->maxMonomialSize()]; R->monomialMult(m1,m2,m3); EXPECT_TRUE(R->monomialIsDivisibleBy(m3,m2)); EXPECT_FALSE(R->monomialIsDivisibleBy(m2,m3)); R->monomialDivide(m3,m2,m1a); EXPECT_TRUE(R->monomialEQ(m1,m1a)); } TEST(OldMonomial, monomialQuotientAndMult) { // test of monomialQuotientAndMult PolyRing *R = ringFromString("32003 6 1\n1 1 1 1 1 1"); monomial m1 = monomialFromString(R, "0 3 5 2 1 2 0 1"); // ab2f2 monomial m2 = monomialFromString(R, "0 2 5 1 0 1"); // af monomial m3 = monomialFromString(R, "2 0"); // e_2 monomial n = new int[R->maxMonomialSize()]; monomial n1 = new int[R->maxMonomialSize()]; monomial na = new int[R->maxMonomialSize()]; R->monomialQuotientAndMult(m1,m2,m3,n); R->monomialDivide(m1,m2,n1); // m1//m2 R->monomialMult(n1,m3,na); // m1//m2 * m3 should be n // std::cout << "n is " << monomialToString(R,n) << std::endl; // std::cout << "na is " << monomialToString(R,na) << std::endl; EXPECT_TRUE(R->monomialEQ(n, na)); } #endif TEST(Coeff, reciprocal) { std::unique_ptr R(ringFromString("11 6 1\n1 1 1 1 1 1")); coefficient vals[10] = {1,2,3,4,5,6,7,8,9,10}; coefficient ans[10] = {1,6,4,3,9,2,8,7,5,10}; for (int i=0; i<10; i++) { coefficient a = vals[i]; R->coefficientReciprocalTo(a); EXPECT_EQ(ans[i], a); } } TEST(Coeff, reciprocal2) { std::unique_ptr R(ringFromString("32003 6 1\n1 1 1 1 1 1")); for (int i=1; i<32002; i++) { coefficient a1; coefficient a = i; R->coefficientReciprocalTo(a); R->coefficientDivide(1,i,a1); EXPECT_EQ(a,a1); R->coefficientMultTo(a,i); EXPECT_TRUE(a > 0); EXPECT_TRUE(a < 32003); EXPECT_TRUE(a == 1); } } TEST(Coeff, negate) { std::unique_ptr R(ringFromString("32003 6 1\n1 1 1 1 1 1")); for (int i=1; i<32002; i++) { coefficient a1 = i; coefficient a = i; R->coefficientNegateTo(a); EXPECT_TRUE(a > 0); EXPECT_TRUE(a < 32003); R->coefficientAddTo(a1,a); EXPECT_EQ(0,a1); } } TEST(Coeff, addone) { std::unique_ptr R(ringFromString("32003 6 1\n1 1 1 1 1 1")); for (int i=0; i<32002; i++) { coefficient a1 = i; coefficient a = i; R->coefficientAddOneTo(a); EXPECT_TRUE(a > 0); EXPECT_TRUE(a < 32003); R->coefficientAddTo(a1,1); EXPECT_EQ(a,a1); } } TEST(MTArray,DivList1) { // We create a table here std::unique_ptr R(ringFromString("32003 6 1\n1 1 1 1 1 1")); auto M = ModuleMonoSet::make(R->monoid(), 1, 6, false); std::string mons[2] = { "abc<1>", "a2d<1>" }; for (int i=0; i<2; i++) { monomial m = monomialParseFromString(R.get(), mons[i]); M->insert(m); } // M.display(std::cout); // Now we test membership EXPECT_TRUE(M->member(monomialParseFromString(R.get(), "abc4d<1>"))); EXPECT_TRUE(M->member(monomialParseFromString(R.get(), "a2d2<1>"))); EXPECT_TRUE(M->member(monomialParseFromString(R.get(), "abc<1>"))); EXPECT_TRUE(M->member(monomialParseFromString(R.get(), "a2d<1>"))); EXPECT_FALSE(M->member(monomialParseFromString(R.get(), "a2d<2>"))); EXPECT_FALSE(M->member(monomialParseFromString(R.get(), "ad<1>"))); } TEST(MTArray,KDTree1) { // We create a table here std::unique_ptr R(ringFromString("32003 6 1\n1 1 1 1 1 1")); std::unique_ptr M(ModuleMonoSet::make(R->monoid(), 2, 6, false)); std::string mons[2] = { "abc<1>", "a2d<1>" }; for (int i=0; i<2; i++) { monomial m = monomialParseFromString(R.get(), mons[i]); M->insert(m); } // M.display(std::cout); // Now we test membership EXPECT_TRUE(M->member(monomialParseFromString(R.get(), "abc4d<1>"))); EXPECT_TRUE(M->member(monomialParseFromString(R.get(), "a2d2<1>"))); EXPECT_TRUE(M->member(monomialParseFromString(R.get(), "abc<1>"))); EXPECT_TRUE(M->member(monomialParseFromString(R.get(), "a2d<1>"))); EXPECT_FALSE(M->member(monomialParseFromString(R.get(), "a2d<2>"))); EXPECT_FALSE(M->member(monomialParseFromString(R.get(), "ad<1>"))); } //#warning "remove this code" #if 0 bool test_find_signatures(const PolyRing *R, const_monomial u1, const_monomial u2, const_monomial v1, const_monomial v2) { monomial g = new int[R->maxMonomialSize()]; monomial t1 = new int[R->maxMonomialSize()]; monomial t2 = new int[R->maxMonomialSize()]; monomial x1 = new int[R->maxMonomialSize()]; monomial x2 = new int[R->maxMonomialSize()]; monomial y1 = new int[R->maxMonomialSize()]; monomial y2 = new int[R->maxMonomialSize()]; monomial v1v2 = new int[R->maxMonomialSize()]; monomial x1g = new int[R->maxMonomialSize()]; monomial p = new int[R->maxMonomialSize()]; monomial m = new int[R->maxMonomialSize()]; R->monomialFindSignature(v1,v2,u1,t1); R->monomialFindSignature(v2,v1,u2,t2); R->monomialMult(v1, v2, p); R->monomialLeastCommonMultiple(v1, v2, m); R->monomialDivide(p, m, g); //R->monomialGreatestCommonDivisor(v1, v2, g); // check that v1*t1 == v2*t2 // v1*v2 == g * (v1*t1) R->monomialDivide(t1,u1,y1); R->monomialDivide(t2,u2,y2); // remove mult by signatures R->monomialMult(v1,y1,x1); R->monomialMult(v2,y2,x2); R->monomialMult(v1,v2,v1v2); R->monomialMult(x1,g,x1g); #if 0 std::cout << "v1 is " << monomialToString(R,v1) << std::endl; std::cout << "v2 is " << monomialToString(R,v2) << std::endl; std::cout << "u1 is " << monomialToString(R,u1) << std::endl; std::cout << "u2 is " << monomialToString(R,u2) << std::endl; std::cout << "t1 is " << monomialToString(R,t1) << std::endl; std::cout << "22 is " << monomialToString(R,t2) << std::endl; std::cout << "x1 is " << monomialToString(R,x1) << std::endl; std::cout << "x2 is " << monomialToString(R,x2) << std::endl; std::cout << "y1 is " << monomialToString(R,y1) << std::endl; std::cout << "y2 is " << monomialToString(R,y2) << std::endl; std::cout << "g is " << monomialToString(R,g) << std::endl; std::cout << "v1v2 is " << monomialToString(R,v1v2) << std::endl; std::cout << "x1g is " << monomialToString(R,x1g) << std::endl; #endif if (!R->monomialEQ(x1,x2)) return false; if (!R->monomialEQ(v1v2,x1g)) return false; return true; } TEST(OldMonomial, findSignatures) { PolyRing *R = ringFromString("32003 6 1\n1 1 1 1 1 1"); monomial v1 = monomialFromString(R, "0 3 5 2 1 2 0 1"); // ab2f2 monomial v2 = monomialFromString(R, "0 3 2 3 1 1 0 1"); // abc3 monomial u1 = monomialFromString(R, "2 3 4 1 1 2 0 1"); // monomial u2 = monomialFromString(R, "3 2 1 1 0 2"); // EXPECT_TRUE(test_find_signatures(R,u1,u2,v1,v2)); } #endif TEST(Ideal,readwrite) { // This also tests Poly::iterator std::unique_ptr I = basisParseFromString(ideal1); size_t ngens = I->viewGenerators().size(); EXPECT_TRUE(2 == ngens); // now read and write each generator for (size_t i=0; igetPoly(i); std::ostringstream o; MathicIO<>().writePoly(*f, false, o); std::stringstream ifil(o.str()); Scanner scanner(ifil); EXPECT_TRUE(MathicIO<>().readPoly(f->ring(), false, scanner) == *f); } } TEST(Poly,lead) { // This also tests Poly::iterator, Poly::read, Poly::write std::unique_ptr I = basisParseFromString(ideal1); std::unique_ptr R(I->getPolyRing()); const auto& monoid = R->monoid(); monomial lm = stringToMonomial(R.get(), "ab"); EXPECT_TRUE(monoid.equal(lm, I->getPoly(0)->leadMono())); auto val = I->getPoly(0)->leadCoef(); EXPECT_EQ(static_cast(1), val); EXPECT_EQ(0, monoid.component(I->getPoly(0)->leadMono())); R->freeMonomial(lm); } mathicgb-1.1/src/test/F4MatrixReducer.cpp0000664000175000017500000001006314560325357014050 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "mathicgb/stdinc.h" #include "mathicgb/F4MatrixReducer.hpp" #include "mathicgb/SparseMatrix.hpp" #include "mathicgb/QuadMatrix.hpp" #include "mathicgb/io-util.hpp" #include "mathicgb/Poly.hpp" #include "mathicgb/MathicIO.hpp" #include #include using namespace mgb; TEST(F4MatrixReducer, Reduce) { auto ring = ringFromString("101 6 1\n10 1 1 1 1 1"); QuadMatrix m(*ring); std::istringstream in("a4+a3+a2+a1+b5+b4+b3+b2+b1"); Scanner scanner(in); auto p = MathicIO<>().readPoly(*ring, false, scanner); size_t count = 0; for (auto it = p.begin(); it != p.end(); ++it) { if (count < 4) m.leftColumnMonomials.push_back(it.mono()); else m.rightColumnMonomials.push_back(it.mono()); ++count; } // top left m.topLeft.clear(); m.topLeft.appendEntry(0, 1); m.topLeft.appendEntry(1, 2); m.topLeft.appendEntry(3, 3); m.topLeft.rowDone(); m.topLeft.appendEntry(1, 1); m.topLeft.appendEntry(2, 3); m.topLeft.rowDone(); m.topLeft.appendEntry(2, 1); m.topLeft.appendEntry(3, 7); m.topLeft.rowDone(); m.topLeft.appendEntry(3, 1); m.topLeft.rowDone(); // top right m.topRight.clear(); m.topRight.appendEntry(2,8); m.topRight.rowDone(); m.topRight.appendEntry(3,9); m.topRight.rowDone(); m.topRight.appendEntry(4,10); m.topRight.rowDone(); m.topRight.rowDone(); // bottom left m.bottomLeft.clear(); m.bottomLeft.rowDone(); m.bottomLeft.appendEntry(1, 9); m.bottomLeft.rowDone(); m.bottomLeft.appendEntry(0, 2); m.bottomLeft.appendEntry(1, 99); // 100 = -2 mod 101 m.bottomLeft.appendEntry(2, 83); // 83 = -18 mod 101 m.bottomLeft.appendEntry(3, 6); m.bottomLeft.rowDone(); m.bottomLeft.appendEntry(0, 1); m.bottomLeft.appendEntry(1, 1); m.bottomLeft.appendEntry(3, 24); m.bottomLeft.rowDone(); m.bottomLeft.rowDone(); m.bottomLeft.appendEntry(3, 100); m.bottomLeft.rowDone(); // bottom right m.bottomRight.clear(); m.bottomRight.rowDone(); m.bottomRight.appendEntry(1, 2); m.bottomRight.appendEntry(3, 11); m.bottomRight.rowDone(); m.bottomRight.appendEntry(2, 16); m.bottomRight.appendEntry(3, 47); m.bottomRight.rowDone(); m.bottomRight.appendEntry(0, 1); m.bottomRight.appendEntry(2, 12); m.bottomRight.appendEntry(3, 13); m.bottomRight.appendEntry(4, 41); m.bottomRight.rowDone(); m.bottomRight.appendEntry(0, 2); m.bottomRight.appendEntry(1, 2); m.bottomRight.appendEntry(2, 8); m.bottomRight.appendEntry(3, 75); m.bottomRight.appendEntry(4, 90); m.bottomRight.rowDone(); m.bottomRight.appendEntry(0, 1); m.bottomRight.appendEntry(1, 1); m.bottomRight.appendEntry(2, 4); m.bottomRight.appendEntry(3, 88); m.bottomRight.appendEntry(4, 45); m.bottomRight.rowDone(); MATHICGB_ASSERT(m.debugAssertValid()); const char* origStr = "Left columns: a4 a3 a2 a\n" "Right columns: b5 b4 b3 b2 b\n" "0: 0#1 1#2 3#3 | 0: 2#8 \n" "1: 1#1 2#3 | 1: 3#9 \n" "2: 2#1 3#7 | 2: 4#10 \n" "3: 3#1 | 3: \n" " | \n" "0: | 0: \n" // zero row "1: 1#9 | 1: 1#2 3#11 \n" // becomes second row "2: 0#2 1#99 2#83 3#6 | 2: 2#16 3#47 \n" // zero on left red. "3: 0#1 1#1 3#24 | 3: 0#1 2#12 3#13 4#41 \n" // becomes first row "4: | 4: 0#2 1#2 2#8 3#75 4#90\n" // zero on right red. "5: 3#100 | 5: 0#1 1#1 2#4 3#88 4#45\n"; // zero on right red. ASSERT_EQ(origStr, m.toString()) << "Printed m:\n" << m; SparseMatrix reduced (F4MatrixReducer(ring->charac()).reducedRowEchelonFormBottomRight(m)); const char* redStr = "0: 0#1 2#4 3#22 4#11\n" "1: 1#1 3#66 4#34\n"; reduced.sortRowsByIncreasingPivots(); ASSERT_EQ(redStr, reduced.toString()) << "Printed reduced:\n" << reduced; } mathicgb-1.1/src/test/Scanner.cpp0000664000175000017500000000646714560325357012506 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "mathicgb/stdinc.h" #include "mathicgb/Scanner.hpp" #include using namespace mgb; namespace { const char* const alpha = "abcdefghijkl"; const char* const alphaSpaced = "a bc def ghij kl"; const char* const alphas[] = {"a", "bc", "def", "ghij", "kl"}; } TEST(Scanner, NoOp) { std::istringstream in; Scanner sc(in); } TEST(Scanner, PeekAndGet) { std::stringstream s(alphaSpaced); Scanner in(s); for (size_t i = 0; alpha[i] != '\0'; ++i) { ASSERT_EQ(alphaSpaced[i], in.peek()); ASSERT_EQ(alphaSpaced[i], in.get()); } } TEST(Scanner, Match) { std::stringstream s(alphaSpaced); Scanner in(s); for (size_t i = 0; alpha[i] != '\0'; ++i) { ASSERT_FALSE(in.match('!')); ASSERT_FALSE(in.matchEOF()); ASSERT_TRUE(in.match(alpha[i])); } ASSERT_TRUE(in.matchEOF()); } TEST(Scanner, ExpectChar) { std::stringstream s(alphaSpaced); Scanner in(s); for (size_t i = 0; alpha[i] != '\0'; ++i) in.expect(alpha[i]); in.expectEOF(); } TEST(Scanner, ExpectTwoChars) { Scanner in(alphaSpaced); for (size_t i = 0; alpha[i] != '\0'; ++i) { if (i % 2 == 0) in.expect('!', alpha[i]); else in.expect(alpha[i], '!'); } in.expectEOF(); } TEST(Scanner, ExpectString) { Scanner in(alphaSpaced); const auto size = sizeof(alphas) / sizeof(*alphas); for (size_t i = 0; i < size; ++i) { if (i % 2 == 0) in.expect(alphas[i]); else in.expect(std::string(alphas[i])); } } TEST(Scanner, MatchString) { Scanner in(alphaSpaced); const auto size = sizeof(alphas) / sizeof(*alphas); for (size_t i = 0; i < size; ++i) { ASSERT_FALSE(in.match("ef")); ASSERT_FALSE(in.match("deq")); ASSERT_TRUE(in.match(alphas[i])); } } TEST(Scanner, readModular) { PrimeField f(11); std::stringstream s("0 1 1 +0 -0 +1 -1 15 255 -255"); Scanner in(s); ASSERT_EQ(f.zero(), in.readModular(f)); ASSERT_EQ(f.one(), in.readModular(f)); ASSERT_EQ(f.minusOne(), in.readModular(f, true)); ASSERT_EQ(f.zero(), in.readModular(f)); ASSERT_EQ(f.zero(), in.readModular(f)); ASSERT_EQ(f.one(), in.readModular(f)); ASSERT_EQ(f.minusOne(), in.readModular(f)); ASSERT_EQ(f.toElement(4), in.readModular(f)); ASSERT_EQ(f.toElement(2), in.readModular(f)); ASSERT_EQ(f.toElement(9), in.readModular(f)); } TEST(Scanner, readInteger) { std::stringstream s("0 1 +0 -0 +1 -1 127 -128 128"); Scanner in(s); ASSERT_EQ(0, in.readInteger()); ASSERT_EQ(1, in.readInteger()); ASSERT_EQ(0, in.readInteger()); ASSERT_EQ(0, in.readInteger()); ASSERT_EQ(1, in.readInteger()); ASSERT_EQ(-1, in.readInteger()); ASSERT_EQ(127, in.readInteger()); ASSERT_EQ(-128, in.readInteger()); ASSERT_EQ(-128, in.readInteger(true)); } TEST(Scanner, WhiteAndLineCount) { std::stringstream s(" \t\n\rx\n\n\ny"); Scanner in(s); ASSERT_EQ(1, in.lineCount()); ASSERT_TRUE(in.peek() == ' '); ASSERT_TRUE(in.peekWhite()); in.eatWhite(); ASSERT_TRUE(in.peek() == 'x'); ASSERT_TRUE(in.match('x')); ASSERT_EQ(2, in.lineCount()); ASSERT_TRUE(in.match('y')); in.expectEOF(); ASSERT_EQ(5, in.lineCount()); } mathicgb-1.1/src/test/ideals.hpp0000664000175000017500000000432514560325357012352 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_IDEALS_GUARD #define MATHICGB_IDEALS_GUARD #include namespace mgb {} // small std::string smallIdealComponentLastDescending(); extern const char* idealSmallBasis; extern const char* idealSmallSyzygies; extern const char* idealSmallInitial; // liu std::string liuIdealComponentLastDescending(); extern const char* liu_gb_strat0_free1; extern const char* liu_syzygies_strat0_free1; extern const char* liu_initial_strat0_free1; // weispfennig97 std::string weispfennig97IdealComponentLast(bool componentsAscending); extern const char* weispfennig97_gb_strat0_free4; extern const char* weispfennig97_syzygies_strat0_free4; extern const char* weispfennig97_initial_strat0_free4; extern const char* weispfennig97_gb_strat0_free5; extern const char* weispfennig97_syzygies_strat0_free5; extern const char* weispfennig97_initial_strat0_free5; // gerdt93 std::string gerdt93IdealComponentFirst(bool componentsAscending); std::string gerdt93IdealComponentMiddle(bool componentsAscending); std::string gerdt93IdealComponentLast(bool componentsAscending, bool schreyer); extern const char* gerdt93_gb_strat0_free1; extern const char* gerdt93_syzygies_strat0_free1; extern const char* gerdt93_initial_strat0_free1; extern const char* gerdt93_gb_strat0_free2; extern const char* gerdt93_syzygies_strat0_free2; extern const char* gerdt93_initial_strat0_free2; extern const char* gerdt93_gb_strat0_free3; extern const char* gerdt93_syzygies_strat0_free3; extern const char* gerdt93_initial_strat0_free3; extern const char* gerdt93_gb_strat0_free4; extern const char* gerdt93_syzygies_strat0_free4; extern const char* gerdt93_initial_strat0_free4; extern const char* gerdt93_gb_strat0_free5; extern const char* gerdt93_syzygies_strat0_free5; extern const char* gerdt93_initial_strat0_free5; extern const char* gerdt93_gb_strat0_free6; extern const char* gerdt93_syzygies_strat0_free6; extern const char* gerdt93_initial_strat0_free6; extern const char* gerdt93_gb_strat0_free7; extern const char* gerdt93_syzygies_strat0_free7; extern const char* gerdt93_initial_strat0_free7; #endif mathicgb-1.1/src/test/mathicgb.cpp0000664000175000017500000007174514560325357012674 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "mathicgb/stdinc.h" #include "mathicgb.h" #include using namespace mgb; namespace { template void makeBasis(Stream& s) { MATHICGB_ASSERT(s.varCount() >= 3); MATHICGB_ASSERT(s.comCount() >= 1); s.idealBegin(); s.appendPolynomialBegin(); // x^2 - y s.appendTermBegin(0); s.appendExponent(0,2); s.appendTermDone(1); s.appendTermBegin(0); s.appendExponent(1,1); s.appendTermDone(s.modulus() - 1); s.appendPolynomialDone(); s.appendPolynomialBegin(2); // x^3-z s.appendTermBegin(0); s.appendExponent(0,3); s.appendTermDone(1); s.appendTermBegin(0); s.appendExponent(2,1); s.appendTermDone(s.modulus() - 1); s.appendPolynomialDone(); s.idealDone(); } template void makeGroebnerBasis(Stream& s) { s.idealBegin(3); s.appendPolynomialBegin(2); // x^2 - y s.appendTermBegin(0); s.appendExponent(0, 2); s.appendExponent(1, 0); s.appendExponent(2, 0); s.appendTermDone(1); s.appendTermBegin(0); s.appendExponent(0, 0); s.appendExponent(1, 1); s.appendExponent(2, 0); s.appendTermDone(s.modulus() - 1); s.appendPolynomialDone(); s.appendPolynomialBegin(2); // xy - z s.appendTermBegin(0); s.appendExponent(0, 1); s.appendExponent(1, 1); s.appendExponent(2, 0); s.appendTermDone(1); s.appendTermBegin(0); s.appendExponent(0, 0); s.appendExponent(1, 0); s.appendExponent(2, 1); s.appendTermDone(s.modulus() - 1); s.appendPolynomialDone(); s.appendPolynomialBegin(2); // y^2 - xz s.appendTermBegin(0); s.appendExponent(0, 0); s.appendExponent(1, 2); s.appendExponent(2, 0); s.appendTermDone(1); s.appendTermBegin(0); s.appendExponent(0, 1); s.appendExponent(1, 0); s.appendExponent(2, 1); s.appendTermDone(s.modulus() - 1); s.appendPolynomialDone(); s.idealDone(); } template void makeCyclic5Basis(Stream& s) { s.idealBegin(5); // polyCount s.appendPolynomialBegin(5); s.appendTermBegin(0); s.appendExponent(0, 1); // index, exponent s.appendTermDone(1); // coefficient s.appendTermBegin(0); s.appendExponent(1, 1); // index, exponent s.appendTermDone(1); // coefficient s.appendTermBegin(0); s.appendExponent(2, 1); // index, exponent s.appendTermDone(1); // coefficient s.appendTermBegin(0); s.appendExponent(3, 1); // index, exponent s.appendTermDone(1); // coefficient s.appendTermBegin(0); s.appendExponent(4, 1); // index, exponent s.appendTermDone(1); // coefficient s.appendPolynomialDone(); s.appendPolynomialBegin(5); s.appendTermBegin(0); s.appendExponent(0, 1); // index, exponent s.appendExponent(1, 1); // index, exponent s.appendTermDone(1); // coefficient s.appendTermBegin(0); s.appendExponent(1, 1); // index, exponent s.appendExponent(2, 1); // index, exponent s.appendTermDone(1); // coefficient s.appendTermBegin(0); s.appendExponent(2, 1); // index, exponent s.appendExponent(3, 1); // index, exponent s.appendTermDone(1); // coefficient s.appendTermBegin(0); s.appendExponent(0, 1); // index, exponent s.appendExponent(4, 1); // index, exponent s.appendTermDone(1); // coefficient s.appendTermBegin(0); s.appendExponent(3, 1); // index, exponent s.appendExponent(4, 1); // index, exponent s.appendTermDone(1); // coefficient s.appendPolynomialDone(); s.appendPolynomialBegin(5); s.appendTermBegin(0); s.appendExponent(0, 1); // index, exponent s.appendExponent(1, 1); // index, exponent s.appendExponent(2, 1); // index, exponent s.appendTermDone(1); // coefficient s.appendTermBegin(0); s.appendExponent(1, 1); // index, exponent s.appendExponent(2, 1); // index, exponent s.appendExponent(3, 1); // index, exponent s.appendTermDone(1); // coefficient s.appendTermBegin(0); s.appendExponent(0, 1); // index, exponent s.appendExponent(1, 1); // index, exponent s.appendExponent(4, 1); // index, exponent s.appendTermDone(1); // coefficient s.appendTermBegin(0); s.appendExponent(0, 1); // index, exponent s.appendExponent(3, 1); // index, exponent s.appendExponent(4, 1); // index, exponent s.appendTermDone(1); // coefficient s.appendTermBegin(0); s.appendExponent(2, 1); // index, exponent s.appendExponent(3, 1); // index, exponent s.appendExponent(4, 1); // index, exponent s.appendTermDone(1); // coefficient s.appendPolynomialDone(); s.appendPolynomialBegin(5); s.appendTermBegin(0); s.appendExponent(0, 1); // index, exponent s.appendExponent(1, 1); // index, exponent s.appendExponent(2, 1); // index, exponent s.appendExponent(3, 1); // index, exponent s.appendTermDone(1); // coefficient s.appendTermBegin(0); s.appendExponent(0, 1); // index, exponent s.appendExponent(1, 1); // index, exponent s.appendExponent(2, 1); // index, exponent s.appendExponent(4, 1); // index, exponent s.appendTermDone(1); // coefficient s.appendTermBegin(0); s.appendExponent(0, 1); // index, exponent s.appendExponent(1, 1); // index, exponent s.appendExponent(3, 1); // index, exponent s.appendExponent(4, 1); // index, exponent s.appendTermDone(1); // coefficient s.appendTermBegin(0); s.appendExponent(0, 1); // index, exponent s.appendExponent(2, 1); // index, exponent s.appendExponent(3, 1); // index, exponent s.appendExponent(4, 1); // index, exponent s.appendTermDone(1); // coefficient s.appendTermBegin(0); s.appendExponent(1, 1); // index, exponent s.appendExponent(2, 1); // index, exponent s.appendExponent(3, 1); // index, exponent s.appendExponent(4, 1); // index, exponent s.appendTermDone(1); // coefficient s.appendPolynomialDone(); s.appendPolynomialBegin(2); s.appendTermBegin(0); s.appendExponent(0, 1); // index, exponent s.appendExponent(1, 1); // index, exponent s.appendExponent(2, 1); // index, exponent s.appendExponent(3, 1); // index, exponent s.appendExponent(4, 1); // index, exponent s.appendTermDone(1); // coefficient s.appendTermBegin(0); s.appendTermDone(100); // coefficient s.appendPolynomialDone(); s.idealDone(); } template void makeSimpleIdeal(Stream& s) { // variables a,b,c,d. a2-bc, ab-cd. s.idealBegin(); s.appendPolynomialBegin(); // a^2-b*c s.appendTermBegin(0); s.appendExponent(0,2); s.appendTermDone(1); s.appendTermBegin(0); s.appendExponent(1,1); s.appendExponent(2,1); s.appendTermDone(s.modulus() - 1); s.appendPolynomialDone(); s.appendPolynomialBegin(2); // a*b-c*d s.appendTermBegin(0); s.appendExponent(0,1); s.appendExponent(1,1); s.appendTermDone(1); s.appendTermBegin(0); s.appendExponent(2,1); s.appendExponent(3,1); s.appendTermDone(s.modulus() - 1); s.appendPolynomialDone(); s.idealDone(); } template void makeSimpleIdealGroebnerBasis(Stream& s) { // variables a,b,c,d. a2-bc, ab-cd. // Groebner basis is {a^2-b*c,a*b-c*d,a*c*d-b^2*c,b^3*c-c^2*d^2} // (order: eliminate 1 variable: [1 0 0 0; 1 1 1 1]). s.idealBegin(4); // polyCount s.appendPolynomialBegin(2); s.appendTermBegin(0); s.appendExponent(0, 2); // index, exponent s.appendExponent(1, 0); // index, exponent s.appendExponent(2, 0); // index, exponent s.appendExponent(3, 0); // index, exponent s.appendTermDone(1); // coefficient s.appendTermBegin(0); s.appendExponent(0, 0); // index, exponent s.appendExponent(1, 1); // index, exponent s.appendExponent(2, 1); // index, exponent s.appendExponent(3, 0); // index, exponent s.appendTermDone(100); // coefficient s.appendPolynomialDone(); s.appendPolynomialBegin(2); s.appendTermBegin(0); s.appendExponent(0, 1); // index, exponent s.appendExponent(1, 1); // index, exponent s.appendExponent(2, 0); // index, exponent s.appendExponent(3, 0); // index, exponent s.appendTermDone(1); // coefficient s.appendTermBegin(0); s.appendExponent(0, 0); // index, exponent s.appendExponent(1, 0); // index, exponent s.appendExponent(2, 1); // index, exponent s.appendExponent(3, 1); // index, exponent s.appendTermDone(100); // coefficient s.appendPolynomialDone(); s.appendPolynomialBegin(2); s.appendTermBegin(0); s.appendExponent(0, 1); // index, exponent s.appendExponent(1, 0); // index, exponent s.appendExponent(2, 1); // index, exponent s.appendExponent(3, 1); // index, exponent s.appendTermDone(1); // coefficient s.appendTermBegin(0); s.appendExponent(0, 0); // index, exponent s.appendExponent(1, 2); // index, exponent s.appendExponent(2, 1); // index, exponent s.appendExponent(3, 0); // index, exponent s.appendTermDone(100); // coefficient s.appendPolynomialDone(); s.appendPolynomialBegin(2); s.appendTermBegin(0); s.appendExponent(0, 0); // index, exponent s.appendExponent(1, 3); // index, exponent s.appendExponent(2, 1); // index, exponent s.appendExponent(3, 0); // index, exponent s.appendTermDone(1); // coefficient s.appendTermBegin(0); s.appendExponent(0, 0); // index, exponent s.appendExponent(1, 0); // index, exponent s.appendExponent(2, 2); // index, exponent s.appendExponent(3, 2); // index, exponent s.appendTermDone(100); // coefficient s.appendPolynomialDone(); s.idealDone(); } template void makeSimpleModuleBasis(Stream& s) { MATHICGB_ASSERT(s.varCount() >= 4); MATHICGB_ASSERT(s.comCount() >= 4); // The basis is // c2<0>-b<1>+d<2> // bd<0>-a<1>+c<2> // ac<0>-b<2>-d<3> // b2<0>-a<2>-c<3> const auto minusOne = s.modulus() - 1; s.idealBegin(4); s.appendPolynomialBegin(3); // c2<0>-b<1>+d<2> s.appendTermBegin(0); s.appendExponent(2, 2); s.appendTermDone(1); s.appendTermBegin(1); s.appendExponent(1, 1); s.appendTermDone(minusOne); s.appendTermBegin(2); s.appendExponent(3, 1); s.appendTermDone(1); s.appendPolynomialDone(); s.appendPolynomialBegin(3); // bd<0>-a<1>+c<2> s.appendTermBegin(0); s.appendExponent(1, 1); s.appendExponent(3, 1); s.appendTermDone(1); s.appendTermBegin(1); s.appendExponent(0, 1); s.appendTermDone(minusOne); s.appendTermBegin(2); s.appendExponent(2, 1); s.appendTermDone(1); s.appendPolynomialDone(); s.appendPolynomialBegin(3); // ac<0>-b<2>-d<3> s.appendTermBegin(0); s.appendExponent(0, 1); s.appendExponent(2, 1); s.appendTermDone(1); s.appendTermBegin(2); s.appendExponent(1, 1); s.appendTermDone(minusOne); s.appendTermBegin(3); s.appendExponent(3, 1); s.appendTermDone(minusOne); s.appendPolynomialDone(); s.appendPolynomialBegin(3); // b2<0>-a<2>-c<3> s.appendTermBegin(0); s.appendExponent(1, 2); s.appendTermDone(1); s.appendTermBegin(2); s.appendExponent(0, 1); s.appendTermDone(minusOne); s.appendTermBegin(3); s.appendExponent(2, 1); s.appendTermDone(minusOne); s.appendPolynomialDone(); s.idealDone(); } template void makeSimpleModuleGroebnerBasis(Stream& s) { s.idealBegin(5); // polyCount s.appendPolynomialBegin(3); s.appendTermBegin(0); s.appendExponent(0, 0); // index, exponent s.appendExponent(1, 0); // index, exponent s.appendExponent(2, 2); // index, exponent s.appendExponent(3, 0); // index, exponent s.appendExponent(4, 0); // index, exponent s.appendTermDone(1); // coefficient s.appendTermBegin(1); s.appendExponent(0, 0); // index, exponent s.appendExponent(1, 1); // index, exponent s.appendExponent(2, 0); // index, exponent s.appendExponent(3, 0); // index, exponent s.appendExponent(4, 0); // index, exponent s.appendTermDone(100); // coefficient s.appendTermBegin(2); s.appendExponent(0, 0); // index, exponent s.appendExponent(1, 0); // index, exponent s.appendExponent(2, 0); // index, exponent s.appendExponent(3, 1); // index, exponent s.appendExponent(4, 0); // index, exponent s.appendTermDone(1); // coefficient s.appendPolynomialDone(); s.appendPolynomialBegin(3); s.appendTermBegin(0); s.appendExponent(0, 0); // index, exponent s.appendExponent(1, 1); // index, exponent s.appendExponent(2, 0); // index, exponent s.appendExponent(3, 1); // index, exponent s.appendExponent(4, 0); // index, exponent s.appendTermDone(1); // coefficient s.appendTermBegin(1); s.appendExponent(0, 1); // index, exponent s.appendExponent(1, 0); // index, exponent s.appendExponent(2, 0); // index, exponent s.appendExponent(3, 0); // index, exponent s.appendExponent(4, 0); // index, exponent s.appendTermDone(100); // coefficient s.appendTermBegin(2); s.appendExponent(0, 0); // index, exponent s.appendExponent(1, 0); // index, exponent s.appendExponent(2, 1); // index, exponent s.appendExponent(3, 0); // index, exponent s.appendExponent(4, 0); // index, exponent s.appendTermDone(1); // coefficient s.appendPolynomialDone(); s.appendPolynomialBegin(3); s.appendTermBegin(0); s.appendExponent(0, 1); // index, exponent s.appendExponent(1, 0); // index, exponent s.appendExponent(2, 1); // index, exponent s.appendExponent(3, 0); // index, exponent s.appendExponent(4, 0); // index, exponent s.appendTermDone(1); // coefficient s.appendTermBegin(2); s.appendExponent(0, 0); // index, exponent s.appendExponent(1, 1); // index, exponent s.appendExponent(2, 0); // index, exponent s.appendExponent(3, 0); // index, exponent s.appendExponent(4, 0); // index, exponent s.appendTermDone(100); // coefficient s.appendTermBegin(3); s.appendExponent(0, 0); // index, exponent s.appendExponent(1, 0); // index, exponent s.appendExponent(2, 0); // index, exponent s.appendExponent(3, 1); // index, exponent s.appendExponent(4, 0); // index, exponent s.appendTermDone(100); // coefficient s.appendPolynomialDone(); s.appendPolynomialBegin(3); s.appendTermBegin(0); s.appendExponent(0, 0); // index, exponent s.appendExponent(1, 2); // index, exponent s.appendExponent(2, 0); // index, exponent s.appendExponent(3, 0); // index, exponent s.appendExponent(4, 0); // index, exponent s.appendTermDone(1); // coefficient s.appendTermBegin(2); s.appendExponent(0, 1); // index, exponent s.appendExponent(1, 0); // index, exponent s.appendExponent(2, 0); // index, exponent s.appendExponent(3, 0); // index, exponent s.appendExponent(4, 0); // index, exponent s.appendTermDone(100); // coefficient s.appendTermBegin(3); s.appendExponent(0, 0); // index, exponent s.appendExponent(1, 0); // index, exponent s.appendExponent(2, 1); // index, exponent s.appendExponent(3, 0); // index, exponent s.appendExponent(4, 0); // index, exponent s.appendTermDone(100); // coefficient s.appendPolynomialDone(); s.appendPolynomialBegin(4); s.appendTermBegin(1); s.appendExponent(0, 1); // index, exponent s.appendExponent(1, 1); // index, exponent s.appendExponent(2, 0); // index, exponent s.appendExponent(3, 0); // index, exponent s.appendExponent(4, 0); // index, exponent s.appendTermDone(1); // coefficient s.appendTermBegin(2); s.appendExponent(0, 0); // index, exponent s.appendExponent(1, 1); // index, exponent s.appendExponent(2, 1); // index, exponent s.appendExponent(3, 0); // index, exponent s.appendExponent(4, 0); // index, exponent s.appendTermDone(100); // coefficient s.appendTermBegin(2); s.appendExponent(0, 1); // index, exponent s.appendExponent(1, 0); // index, exponent s.appendExponent(2, 0); // index, exponent s.appendExponent(3, 1); // index, exponent s.appendExponent(4, 0); // index, exponent s.appendTermDone(100); // coefficient s.appendTermBegin(3); s.appendExponent(0, 0); // index, exponent s.appendExponent(1, 0); // index, exponent s.appendExponent(2, 1); // index, exponent s.appendExponent(3, 1); // index, exponent s.appendExponent(4, 0); // index, exponent s.appendTermDone(100); // coefficient s.appendPolynomialDone(); s.idealDone(); } } TEST(MathicGBLib, NullIdealStream) { { mgb::NullIdealStream stream(2, 3, 1); ASSERT_EQ(2, stream.modulus()); ASSERT_EQ(3, stream.varCount()); ASSERT_EQ(1, stream.comCount()); makeBasis(stream); } { mgb::NullIdealStream stream(2, 3, 4); ASSERT_EQ(2, stream.modulus()); ASSERT_EQ(3, stream.varCount()); ASSERT_EQ(4, stream.comCount()); makeBasis(stream); } { mgb::NullIdealStream stream(101, 0, 0); ASSERT_EQ(101, stream.modulus()); ASSERT_EQ(0, stream.varCount()); ASSERT_EQ(0, stream.comCount()); } } TEST(MathicGBLib, IdealStreamLog) { { const char* const idealStr = "s.idealBegin();\n" "s.appendPolynomialBegin();\n" "s.appendTermBegin(0);\n" "s.appendExponent(0, 2); // index, exponent\n" "s.appendTermDone(1); // coefficient\n" "s.appendTermBegin(0);\n" "s.appendExponent(1, 1); // index, exponent\n" "s.appendTermDone(6); // coefficient\n" "s.appendPolynomialDone();\n" "s.appendPolynomialBegin(2);\n" "s.appendTermBegin(0);\n" "s.appendExponent(0, 3); // index, exponent\n" "s.appendTermDone(1); // coefficient\n" "s.appendTermBegin(0);\n" "s.appendExponent(2, 1); // index, exponent\n" "s.appendTermDone(6); // coefficient\n" "s.appendPolynomialDone();\n" "s.idealDone();\n"; std::ostringstream out1; mgb::IdealStreamLog<> stream1(out1, 7, 3, 1); mgb::IdealStreamChecker checker(stream1); std::ostringstream out2; mgb::IdealStreamLog stream2(out2, checker); std::ostringstream out3; mgb::IdealStreamLog stream3(out3, stream2); ASSERT_EQ(7, stream1.modulus()); ASSERT_EQ(3, stream1.varCount()); ASSERT_EQ(7, checker.modulus()); ASSERT_EQ(3, checker.varCount()); ASSERT_EQ(7, stream2.modulus()); ASSERT_EQ(3, stream2.varCount()); ASSERT_EQ(7, stream3.modulus()); ASSERT_EQ(3, stream3.varCount()); makeBasis(stream3); const auto str1 = std::string( "IdealStreamLog s(stream, 7, 3, 1);\n" ) + idealStr; ASSERT_EQ(str1, out1.str()) << "Displayed expected:\n" << out1.str() << "Displayed actual:\n" << str1 << std::endl; const auto str2 = std::string( "IdealStreamLog s(stream, log); // modulus=7, varCount=3, comCount=1\n" ) + idealStr; ASSERT_EQ(str2, out2.str()) << "Displayed expected:\n" << out2.str(); ASSERT_EQ(str2, out3.str()) << "Displayed expected:\n" << out3.str(); } // The ideal <> in no variables and no components { std::ostringstream out; mgb::IdealStreamLog<> stream(out, 101, 0, 0); ASSERT_EQ(101, stream.modulus()); ASSERT_EQ(0, stream.varCount()); stream.idealBegin(0); stream.idealDone(); } // The ideal <0> in no variables and no components { std::ostringstream out; mgb::IdealStreamLog<> stream(out, 101, 0, 0); ASSERT_EQ(101, stream.modulus()); ASSERT_EQ(0, stream.varCount()); stream.idealBegin(1); stream.appendPolynomialBegin(0); // 0 stream.appendPolynomialDone(); stream.idealDone(); } // The ideal <1, 0> in no variables and 1 component { std::ostringstream out; mgb::IdealStreamLog<> stream(out, 101, 0, 0); ASSERT_EQ(101, stream.modulus()); ASSERT_EQ(0, stream.varCount()); stream.idealBegin(2); stream.appendPolynomialBegin(0); // 1 stream.appendTermBegin(0); stream.appendTermDone(1); stream.appendPolynomialDone(); stream.appendPolynomialBegin(0); // 0 stream.appendPolynomialDone(); stream.idealDone(); } } TEST(MathicGBLib, ZeroIdealGB) { mgb::GroebnerConfiguration configuration(2, 0, 0); mgb::GroebnerInputIdealStream input(configuration); std::ostringstream out; mgb::IdealStreamLog<> logStream(out, 2, 0, 0); input.idealBegin(0); input.idealDone(); mgb::computeGroebnerBasis(input, logStream); const auto msg = "IdealStreamLog s(stream, 2, 0, 0);\n" "s.idealBegin(0); // polyCount\n" "s.idealDone();\n"; EXPECT_EQ(msg, out.str()); } TEST(MathicGBLib, OneIdealGB) { mgb::GroebnerConfiguration configuration(2, 0, 1); mgb::GroebnerInputIdealStream input(configuration); std::ostringstream out; mgb::IdealStreamLog<> logStream(out, 2, 0, 1); input.idealBegin(1); input.appendPolynomialBegin(1); input.appendTermBegin(0); input.appendTermDone(1); input.appendPolynomialDone(); input.idealDone(); mgb::computeGroebnerBasis(input, logStream); const auto msg = "IdealStreamLog s(stream, 2, 0, 1);\n" "s.idealBegin(1); // polyCount\n" "s.appendPolynomialBegin(1);\n" "s.appendTermBegin(0);\n" "s.appendTermDone(1); // coefficient\n" "s.appendPolynomialDone();\n" "s.idealDone();\n"; EXPECT_EQ(msg, out.str()); } TEST(MathicGBLib, EasyGB) { mgb::GroebnerConfiguration configuration(101, 3, 1); mgb::GroebnerInputIdealStream input(configuration); std::ostringstream computedStr; mgb::IdealStreamLog<> computed(computedStr, 101, 3, 1); mgb::IdealStreamChecker checked(computed); makeBasis(input); mgb::computeGroebnerBasis(input, checked); std::ostringstream correctStr; mgb::IdealStreamLog<> correct(correctStr, 101, 3, 1); mgb::IdealStreamChecker correctChecked(correct); makeGroebnerBasis(correctChecked); EXPECT_EQ(correctStr.str(), computedStr.str()) << "\nDisplayed expected:\n" << correctStr.str() << "\nDisplayed computed:\n" << computedStr.str(); } TEST(MathicGBLib, EasyReGB) { mgb::GroebnerConfiguration configuration(101, 3, 1); mgb::GroebnerInputIdealStream input(configuration); std::ostringstream computedStr; mgb::IdealStreamLog<> computed(computedStr, 101, 3, 1); mgb::IdealStreamChecker checked(computed); makeGroebnerBasis(input); mgb::computeGroebnerBasis(input, checked); std::ostringstream correctStr; mgb::IdealStreamLog<> correct(correctStr, 101, 3, 1); mgb::IdealStreamChecker correctChecked(correct); makeGroebnerBasis(correctChecked); EXPECT_EQ(correctStr.str(), computedStr.str()) << "\nDisplayed expected:\n" << correctStr.str() << "\nDisplayed computed:\n" << computedStr.str(); } TEST(MathicGBLib, Cyclic5) { for (int i = 0; i < 2; ++i) { mgb::GroebnerConfiguration configuration(101, 5, 1); const auto reducer = i == 0 ? mgb::GroebnerConfiguration::ClassicReducer : mgb::GroebnerConfiguration::MatrixReducer; configuration.setReducer(reducer); mgb::GroebnerInputIdealStream input(configuration); makeCyclic5Basis(input); mgb::NullIdealStream computed (input.modulus(), input.varCount(), input.comCount()); mgb::computeGroebnerBasis(input, computed); } } TEST(MathicGBLib, SimpleModuleIdeal) { for (int i = 0; i < 2; ++i) { mgb::GroebnerConfiguration configuration(101, 5, 4); const auto reducer = i == 0 ? mgb::GroebnerConfiguration::ClassicReducer : mgb::GroebnerConfiguration::MatrixReducer; configuration.setReducer(reducer); mgb::GroebnerInputIdealStream input(configuration); std::ostringstream computedStr; mgb::IdealStreamLog<> computed(computedStr, 101, 5, 4); mgb::IdealStreamChecker checked(computed); makeSimpleModuleBasis(input); mgb::computeGroebnerBasis(input, checked); std::ostringstream correctStr; mgb::IdealStreamLog<> correct(correctStr, 101, 5, 4); mgb::IdealStreamChecker correctChecked(correct); makeSimpleModuleGroebnerBasis(correctChecked); EXPECT_EQ(correctStr.str(), computedStr.str()) << "\nDisplayed expected:\n" << correctStr.str() << "\nDisplayed computed:\n" << computedStr.str(); } } namespace { class TestCallback : public mgb::GroebnerConfiguration::Callback { public: TestCallback(int count, Action action): mCount(count), mAction(action) {} virtual Action call() { --mCount; return mCount == 0 ? mAction : ContinueAction; } private: int mCount; const Action mAction; }; } TEST(MathicGBLib, EarlyExit) { typedef mgb::GroebnerConfiguration::Callback::Action Action; auto check = [](bool useClassic, int count, Action action) { mgb::GroebnerConfiguration configuration(101, 5, 1); const auto reducer = useClassic ? mgb::GroebnerConfiguration::ClassicReducer : mgb::GroebnerConfiguration::MatrixReducer; configuration.setReducer(reducer); TestCallback callback(count, action); configuration.setCallback(&callback); mgb::GroebnerInputIdealStream input(configuration); makeCyclic5Basis(input); std::ostringstream strOut; mgb::IdealStreamLog<> out(strOut, 101, 5, 1); mgb::computeGroebnerBasis(input, out); return strOut.str().size(); }; for (int useClassic = 0; useClassic < 2; ++useClassic) { size_t none = check(useClassic, 5, Action::StopWithNoOutputAction); size_t minSize = check(useClassic, 1, Action::StopWithPartialOutputAction); size_t midSize = check(useClassic, 4, Action::StopWithPartialOutputAction); size_t maxSize = check(useClassic, 1, Action::ContinueAction); ASSERT_LT(none, 38u); // the stream writes a header even for no output ASSERT_LT(none, minSize); ASSERT_LT(minSize, midSize); ASSERT_LT(midSize, maxSize); } } TEST(MathicGBLib, SimpleEliminationGB) { typedef mgb::GroebnerConfiguration::Exponent Exponent; Exponent v[] = {1,0,0,0, 1,1,1,1}; std::vector gradings(v, v + sizeof(v)/sizeof(*v)); for (int i = 0; i < 2; ++i) { mgb::GroebnerConfiguration configuration(101, 4, 1); const auto reducer = i == 0 ? mgb::GroebnerConfiguration::ClassicReducer : mgb::GroebnerConfiguration::MatrixReducer; configuration.setReducer(reducer); configuration.setMonomialOrder( mgb::GroebnerConfiguration::BaseOrder::RevLexDescendingBaseOrder, gradings ); mgb::GroebnerInputIdealStream input(configuration); std::ostringstream computedStr; mgb::IdealStreamLog<> computed(computedStr, 101, 4, 1); mgb::IdealStreamChecker checked(computed); makeSimpleIdeal(input); mgb::computeGroebnerBasis(input, checked); std::ostringstream correctStr; mgb::IdealStreamLog<> correct(correctStr, 101, 4, 1); mgb::IdealStreamChecker correctChecked(correct); makeSimpleIdealGroebnerBasis(correctChecked); EXPECT_EQ(correctStr.str(), computedStr.str()) << "\nDisplayed expected:\n" << correctStr.str() << "\nDisplayed computed:\n" << computedStr.str(); #if 0 mgb::GroebnerInputIdealStream input(configuration); makeSimpleIdeal(input); mgb::NullIdealStream computed(input.modulus(), input.varCount()); mgb::computeGroebnerBasis(input, computed); #endif } } TEST(MathicGBLib, GlobalOrderOrNot) { mgb::GroebnerConfiguration conf(101, 4, 1); const auto lex = mgb::GroebnerConfiguration::BaseOrder::LexAscendingBaseOrder; const auto revLex = mgb::GroebnerConfiguration::BaseOrder::RevLexDescendingBaseOrder; typedef mgb::GroebnerConfiguration::Exponent Exponent; std::vector mat; mat.clear(); ASSERT_TRUE(conf.setMonomialOrder(lex, mat)); ASSERT_FALSE(conf.setMonomialOrder(revLex, mat)); Exponent mat2[] = {1,2,3,0}; mat.assign(mat2, mat2 + sizeof(mat2)/sizeof(*mat2)); ASSERT_TRUE(conf.setMonomialOrder(lex, mat)); ASSERT_FALSE(conf.setMonomialOrder(revLex, mat)); Exponent mat3[] = {1,0,0,0, -3,0,1,2}; mat.assign(mat3, mat3 + sizeof(mat3)/sizeof(*mat3)); ASSERT_TRUE(conf.setMonomialOrder(lex, mat)); ASSERT_FALSE(conf.setMonomialOrder(revLex, mat)); Exponent mat4[] = {1,1,0,0, 3,0,1,2}; mat.assign(mat4, mat4 + sizeof(mat4)/sizeof(*mat4)); ASSERT_TRUE(conf.setMonomialOrder(lex, mat)); ASSERT_TRUE(conf.setMonomialOrder(revLex, mat)); Exponent mat5[] = {1,0,0,0, 3,1,1,-2}; mat.assign(mat5, mat5 + sizeof(mat5)/sizeof(*mat5)); ASSERT_FALSE(conf.setMonomialOrder(lex, mat)); ASSERT_FALSE(conf.setMonomialOrder(revLex, mat)); } mathicgb-1.1/src/test/PrimeField.cpp0000664000175000017500000002006014560325357013116 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "mathicgb/stdinc.h" #include "mathicgb/PrimeField.hpp" #include #include using namespace mgb; namespace { template std::string toString(T&& t) { std::ostringstream out; out << static_cast(t.value()); return out.str(); } } TEST(PrimeField, Charac) { const PrimeField pf(11); ASSERT_EQ(pf.charac(), 11); } TEST(PrimeField, OneZero) { const PrimeField pfChar(11); ASSERT_EQ("0", toString(pfChar.zero())); ASSERT_EQ("1", toString(pfChar.one())); ASSERT_TRUE(pfChar.isOne(pfChar.one())); ASSERT_FALSE(pfChar.isOne(pfChar.zero())); ASSERT_FALSE(pfChar.isZero(pfChar.one())); ASSERT_TRUE(pfChar.isZero(pfChar.zero())); const PrimeField pfLong(11); ASSERT_EQ("0", toString(pfLong.zero())); ASSERT_EQ("1", toString(pfLong.one())); ASSERT_TRUE(pfLong.isOne(pfLong.one())); ASSERT_FALSE(pfLong.isOne(pfLong.zero())); ASSERT_FALSE(pfLong.isZero(pfLong.one())); ASSERT_TRUE(pfLong.isZero(pfLong.zero())); } TEST(PrimeField, toElement) { const auto max32BitUnsignedPrime = 4294967291u; const PrimeField pf(max32BitUnsignedPrime); // Same number of bits (32) ASSERT_EQ("0", toString(pf.toElement(0))); ASSERT_EQ("1", toString(pf.toElement(1))); ASSERT_EQ("4294967290", toString(pf.toElement(-1))); ASSERT_EQ("0", toString(pf.toElement(max32BitUnsignedPrime))); ASSERT_EQ("1", toString(pf.toElement(max32BitUnsignedPrime + 1u))); ASSERT_EQ("4294967290", toString(pf.toElement(max32BitUnsignedPrime - 1u))); ASSERT_EQ("4", toString(pf.toElement(std::numeric_limits::max()))); ASSERT_EQ("2147483643", toString(pf.toElement(std::numeric_limits::min()))); // Fewer number of bits (8) ASSERT_EQ("127", toString(pf.toElement(std::numeric_limits::max()))); ASSERT_EQ("4294967163", toString(pf.toElement(std::numeric_limits::min()))); ASSERT_EQ("255", toString(pf.toElement(std::numeric_limits::max()))); ASSERT_EQ("0", toString(pf.toElement(std::numeric_limits::min()))); // More bits (64) ASSERT_EQ("24", toString(pf.toElement(std::numeric_limits::max()))); ASSERT_EQ("2147483657", toString(pf.toElement(std::numeric_limits::max()))); ASSERT_EQ("2147483633", toString(pf.toElement(std::numeric_limits::min()))); } TEST(PrimeField, Sum) { const PrimeField pf2(2); ASSERT_EQ(pf2.zero(), pf2.sum(pf2.zero(), pf2.zero())); ASSERT_EQ(pf2.one(), pf2.sum(pf2.one(), pf2.zero())); ASSERT_EQ(pf2.one(), pf2.sum(pf2.zero(), pf2.one())); ASSERT_EQ(pf2.zero(), pf2.sum(pf2.one(), pf2.one())); const PrimeField pf251(251); ASSERT_EQ(pf251.one(), pf251.sum(pf251.zero(), pf251.one())); ASSERT_EQ(pf251.toElement(-3), pf251.sum(pf251.toElement(-1), pf251.toElement(-2))); const PrimeField pf101(101); ASSERT_EQ(pf101.toElement(100), pf101.sum(pf101.toElement(40), pf101.toElement(60))); ASSERT_EQ(pf101.toElement(9), pf101.sum(pf101.toElement(50), pf101.toElement(60))); } TEST(PrimeField, Negative) { const PrimeField pf2(2); ASSERT_EQ(pf2.zero(), pf2.negative(pf2.zero())); ASSERT_EQ(pf2.one(), pf2.negative(pf2.one())); ASSERT_EQ(pf2.one(), pf2.negativeNonZero(pf2.one())); const PrimeField pf251(251); ASSERT_EQ(pf251.zero(), pf251.negative(pf251.zero())); ASSERT_EQ(pf251.toElement(100), pf251.negative(pf251.toElement(151))); ASSERT_EQ(pf251.toElement(100), pf251.negativeNonZero(pf251.toElement(151))); } TEST(PrimeField, Difference) { const PrimeField pf2(2); ASSERT_EQ(pf2.zero(), pf2.difference(pf2.zero(), pf2.zero())); ASSERT_EQ(pf2.one(), pf2.difference(pf2.one(), pf2.zero())); ASSERT_EQ(pf2.one(), pf2.difference(pf2.zero(), pf2.one())); ASSERT_EQ(pf2.zero(), pf2.difference(pf2.one(), pf2.one())); const PrimeField pf251(251); ASSERT_EQ(pf251.one(), pf251.difference(pf251.one(), pf251.zero())); ASSERT_EQ(pf251.toElement(-3), pf251.difference(pf251.toElement(1), pf251.toElement(4))); const PrimeField pf101(101); ASSERT_EQ(pf101.toElement(20), pf101.difference(pf101.toElement(60), pf101.toElement(40))); ASSERT_EQ(pf101.toElement(-20), pf101.difference(pf101.toElement(40), pf101.toElement(60))); } TEST(PrimeField, Product) { const PrimeField pf2(2); ASSERT_EQ(pf2.zero(), pf2.product(pf2.zero(), pf2.zero())); ASSERT_EQ(pf2.zero(), pf2.product(pf2.one(), pf2.zero())); ASSERT_EQ(pf2.zero(), pf2.product(pf2.zero(), pf2.one())); ASSERT_EQ(pf2.one(), pf2.product(pf2.one(), pf2.one())); const PrimeField pf251(251); ASSERT_EQ(pf251.zero(), pf251.product(pf251.one(), pf251.zero())); ASSERT_EQ(pf251.one(), pf251.product(pf251.one(), pf251.one())); ASSERT_EQ(pf251.one(), pf251.product(pf251.toElement(-1), pf251.toElement(-1))); ASSERT_EQ(pf251.one(), pf251.product(pf251.toElement(2), pf251.toElement(126))); const PrimeField pf101(101); ASSERT_EQ(pf101.toElement(20), pf101.product(pf101.toElement(5), pf101.toElement(4))); ASSERT_EQ(pf101.toElement(-20), pf101.product(pf101.toElement(-2), pf101.toElement(10))); const PrimeField pf16(65521); ASSERT_EQ(pf16.toElement(-20), pf16.product(pf16.toElement(-2), pf16.toElement(10))); const PrimeField pf32(4294967291u); ASSERT_EQ(pf32.toElement(-20), pf32.product(pf32.toElement(-2), pf32.toElement(10))); } TEST(PrimeField, Inverse) { const PrimeField pf2(2); ASSERT_EQ(pf2.one(), pf2.inverse(pf2.one())); const PrimeField pf251(251); ASSERT_EQ(pf251.one(), pf2.inverse(pf251.one())); ASSERT_EQ(pf251.toElement(-1), pf251.inverse(pf251.toElement(-1))); ASSERT_EQ(pf251.toElement(235), pf251.inverse(pf251.toElement(47))); const PrimeField pf16(65521); ASSERT_EQ(pf16.one(), pf16.inverse(pf16.one())); ASSERT_EQ(pf16.toElement(-1), pf16.inverse(pf16.toElement(-1))); ASSERT_EQ(pf16.toElement(43216), pf16.inverse(pf16.toElement(47))); const PrimeField pf32(4294967291u); ASSERT_EQ(pf32.one(), pf32.inverse(pf32.one())); ASSERT_EQ(pf32.toElement(-1), pf32.inverse(pf32.toElement(-1))); ASSERT_EQ(pf32.toElement(3015615332u), pf32.inverse(pf32.toElement(47))); } TEST(PrimeField, Quotient) { const PrimeField pf2(2); ASSERT_EQ(pf2.one(), pf2.quotient(pf2.one(), pf2.one())); ASSERT_EQ(pf2.zero(), pf2.quotient(pf2.zero(), pf2.one())); const PrimeField pf251(251); ASSERT_EQ(pf251.one(), pf2.quotient(pf251.one(), pf251.one())); ASSERT_EQ (pf251.toElement(-1), pf251.quotient(pf251.one(), pf251.toElement(-1))); ASSERT_EQ (pf251.toElement(-1), pf251.quotient(pf251.toElement(-1), pf251.one())); ASSERT_EQ( pf251.one(), pf251.quotient(pf251.toElement(-1), pf251.toElement(-1)) ); ASSERT_EQ( pf251.toElement(203), pf251.quotient(pf251.toElement(3), pf251.toElement(47)) ); const PrimeField pf16(65521); ASSERT_EQ( pf16.toElement(20911), pf16.quotient(pf16.toElement(2), pf16.toElement(47)) ); const PrimeField pf32(4294967291u); ASSERT_EQ( pf32.toElement(3015615332u), pf32.quotient(pf32.toElement(1), pf32.toElement(47)) ); } TEST(PrimeField, PlusOne) { const PrimeField pf2(2); ASSERT_EQ(pf2.zero(), pf2.plusOne(pf2.one())); ASSERT_EQ(pf2.one(), pf2.plusOne(pf2.zero())); const PrimeField pf251(251); ASSERT_EQ(pf251.one(), pf251.plusOne(pf251.zero())); ASSERT_EQ(pf251.zero(), pf251.plusOne(pf251.toElement(-1))); ASSERT_EQ(pf251.toElement(250), pf251.plusOne(pf251.toElement(249))); const PrimeField pf16(65521); ASSERT_EQ(pf16.toElement(20911), pf16.plusOne(pf16.toElement(20910))); const PrimeField pf32(4294967291u); ASSERT_EQ (pf32.toElement(3015615332u), pf32.plusOne(pf32.toElement(3015615331u))); } mathicgb-1.1/src/test/gb-test.cpp0000664000175000017500000003023414560325357012447 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "mathicgb/stdinc.h" #include "mathicgb/Poly.hpp" #include "mathicgb/Basis.hpp" #include "mathicgb/ModuleMonoSet.hpp" #include "mathicgb/io-util.hpp" #include "mathicgb/SigPolyBasis.hpp" #include "mathicgb/SignatureGB.hpp" #include "mathicgb/ClassicGBAlg.hpp" #include "mathicgb/mtbb.hpp" #include "mathicgb/MathicIO.hpp" #include "mathicgb/Scanner.hpp" #include "test/ideals.hpp" #include #include #include #include #include #include using namespace mgb; TEST(IO, ideal) { const char* idealA_fromStr_format = "32003 6 \ 1 1 1 1 1 1 1 \ 3 \ -bc+ad \ -b2+af \ -bc2+a2e \ "; std::unique_ptr I = basisParseFromString(idealA_fromStr_format); EXPECT_EQ(" -bc+ad\n -b2+af\n -bc2+a2e\n", toString(I.get())); } void testGB( std::string idealStr, std::string sigBasisStr, std::string syzygiesStr, std::string initialIdealStr, size_t nonSingularReductions ) { // Put the contents of pict.out into allPairsTest as a string. This // works because pict.out does not have any commas and we do not // care about whitespace. pict.out contains a set of tests such that // all pairs of parameters are covered by at least one test. See // pict.in for details. #define MATHICGB_ESCAPE_MULTILINE_STRING(str) #str char const allPairsTests[] = MATHICGB_ESCAPE_MULTILINE_STRING( spairQueue reducerType divLookup monTable buchberger postponeKoszul useBaseDivisors autoTailReduce autoTopReduce preferSparseReducers useSingularCriterionEarly sPairGroupSize threadCount 0 25 4 1 1 0 0 0 0 0 0 1 1 3 11 3 2 0 1 1 0 0 1 1 100 2 1 9 1 4 1 0 0 1 1 1 0 2 8 2 21 2 3 1 0 0 1 1 0 0 10 2 1 9 2 4 0 1 1 0 0 0 1 1 2 2 7 1 3 0 0 1 0 0 1 1 1 8 0 21 4 1 0 1 0 0 0 1 1 100 1 3 26 3 2 1 0 0 0 1 1 0 10 1 3 26 3 1 1 0 0 1 1 0 0 1 8 0 25 4 2 1 0 0 1 1 1 0 0 8 0 14 1 1 0 1 1 0 0 0 1 10 8 2 22 4 4 1 0 0 1 0 0 0 10 1 1 14 4 3 0 1 1 0 0 1 0 2 1 2 10 2 2 0 1 1 0 0 0 1 2 2 3 17 2 1 0 1 1 0 0 0 1 0 2 0 18 1 2 0 1 1 0 0 1 1 1 2 0 23 2 3 1 0 0 1 1 1 0 10 1 1 10 3 4 1 0 0 1 1 0 0 100 8 2 19 3 3 0 1 1 0 0 0 1 0 1 0 26 4 1 1 0 0 0 0 1 0 2 2 3 13 1 4 1 0 0 1 0 1 0 2 1 1 15 2 1 1 0 0 1 0 0 0 10 8 0 21 3 4 1 0 0 1 1 0 0 2 8 3 10 4 3 0 0 1 0 0 1 1 1 1 1 12 1 2 0 0 1 0 0 0 1 10 8 2 19 1 1 1 0 0 1 1 1 0 100 8 1 19 4 2 1 0 0 0 1 1 0 10 2 1 16 1 4 1 0 0 0 1 1 0 0 1 1 26 2 3 1 0 0 1 0 0 0 100 8 2 16 4 3 0 1 1 0 0 0 1 1 2 0 7 2 1 1 0 0 1 1 0 0 10 2 3 9 4 2 0 1 0 0 0 0 1 10 1 1 17 3 3 1 0 0 1 1 1 0 10 1 1 23 1 2 0 1 1 0 0 0 1 1 2 2 14 3 4 1 0 0 1 1 1 0 100 2 1 7 4 4 1 0 0 1 1 0 0 2 1 1 13 4 3 0 1 1 0 0 0 1 1 2 3 23 4 1 0 0 1 0 0 0 1 0 8 3 7 3 2 0 1 1 0 0 1 1 0 2 0 17 1 2 1 0 0 1 1 0 0 100 8 0 10 1 1 0 1 1 0 0 1 0 10 8 0 12 2 4 1 0 0 1 1 1 0 1 2 2 12 4 1 1 0 0 1 1 1 0 0 1 1 18 4 1 1 0 0 1 1 0 0 2 8 1 22 1 1 0 1 1 0 0 1 1 2 2 1 21 1 2 0 0 1 0 0 0 1 0 1 2 11 4 4 1 0 0 1 1 0 0 10 8 0 15 3 3 0 1 1 0 0 1 1 1 2 2 23 3 4 1 0 0 0 0 0 0 2 8 2 17 4 4 0 1 0 0 0 0 1 2 1 0 13 2 2 1 0 0 1 1 1 0 0 8 2 13 3 1 0 1 1 0 0 0 1 100 2 0 9 3 1 1 0 0 1 0 1 0 0 8 0 20 1 3 0 1 0 0 0 1 1 2 8 0 11 1 3 1 0 0 0 1 1 0 1 1 2 8 1 4 1 0 0 1 0 1 0 2 1 1 20 2 1 1 0 0 1 1 0 0 100 2 0 22 2 3 0 0 0 0 0 0 1 100 8 1 13 4 4 1 0 0 0 0 1 0 10 8 0 16 3 2 0 1 0 0 0 1 1 2 8 3 22 3 2 0 0 0 0 0 1 1 0 8 1 8 2 1 0 1 1 0 0 0 1 10 8 0 19 2 4 0 1 1 0 0 0 1 1 8 1 11 2 1 1 0 0 1 0 0 0 0 2 3 15 1 2 1 0 0 0 1 0 0 100 1 1 17 4 3 0 1 0 0 0 1 1 1 1 3 24 2 4 0 1 1 0 0 1 1 1 8 2 24 3 3 1 0 0 1 1 0 0 2 1 3 8 3 2 1 0 0 1 1 0 0 100 2 3 21 3 4 0 0 0 0 0 0 0 1 8 2 26 1 4 1 0 0 1 1 0 0 0 2 3 14 2 2 0 1 1 0 0 1 1 0 1 0 8 4 3 0 0 1 0 0 0 1 1 1 2 9 1 3 1 0 0 1 0 1 0 100 2 3 12 3 3 0 1 1 0 0 0 1 100 8 0 7 1 4 1 0 0 1 1 1 0 100 8 0 10 4 2 0 0 1 0 0 0 1 0 2 1 24 4 1 0 0 1 0 0 0 1 0 2 3 16 2 1 0 0 0 0 0 1 1 10 1 3 18 2 3 0 1 1 0 0 1 1 0 1 2 16 3 4 0 1 1 0 0 0 1 100 8 0 11 1 3 0 0 1 0 0 0 1 2 1 2 14 2 2 0 1 0 0 0 0 1 1 8 2 12 4 3 1 0 0 1 1 1 0 2 8 0 8 1 4 0 0 1 0 0 0 1 0 1 3 25 2 3 1 0 0 1 0 1 0 2 2 2 15 4 4 1 0 0 1 1 0 0 2 1 3 20 3 2 1 0 0 1 1 0 0 0 1 3 23 4 4 0 1 1 0 0 0 1 100 2 2 25 3 4 1 0 0 0 0 1 0 100 2 1 25 1 2 1 0 0 0 1 1 0 10 8 0 24 1 2 0 0 1 0 0 1 1 10 1 1 15 4 3 1 0 0 1 1 1 0 0 2 1 24 3 4 0 1 0 0 0 0 1 100 1 2 20 4 4 0 1 1 0 0 1 0 1 1 1 22 4 3 1 0 0 0 1 0 0 1 2 2 18 3 4 0 0 0 0 0 0 0 100 8 3 19 2 4 0 0 0 0 0 0 1 2 1 2 18 1 1 1 0 0 0 1 0 0 10 1 3 16 2 3 1 0 0 1 1 1 0 10 8 2 20 4 1 0 1 1 0 0 0 1 10 8 ); std::istringstream tests(allPairsTests); // skip the initial line with the parameter names. { char const* params[] = { "spairQueue", "reducerType", "divLookup", "monTable", "buchberger", "postponeKoszul", "useBaseDivisors", "autoTailReduce", "autoTopReduce", "preferSparseReducers", "useSingularCriterionEarly", "sPairGroupSize", "threadCount"}; std::string paramName; size_t const paramCount = sizeof(params) / sizeof(*params); for (size_t i = 0; i < paramCount; ++i) { tests >> paramName; // This assert will fire if you changed the order of the // parameters, renamed a parameter, removed a parameter or added // a parameter. Unless all you did was to rename a parameter, // don't just update the params array that the assert is based // on - you also need to update the code below that parses the // pict output because it depends on the order of the // parameters. MATHICGB_ASSERT(paramName == params[i]); } } while (true) { // parse a line of the pict file int spairQueue; tests >> spairQueue; if (!tests) break; // no more tests MATHICGB_ASSERT(0 <= spairQueue && spairQueue <= 3); int reducerType; tests >> reducerType; MATHICGB_ASSERT(0 <= reducerType && reducerType <= 30); int divLookup; tests >> divLookup; MATHICGB_ASSERT(1 <= divLookup && divLookup <= 4); int monTable; tests >> monTable; MATHICGB_ASSERT(1 <= monTable && monTable <= 4); int buchberger; tests >> buchberger; MATHICGB_ASSERT(0 <= buchberger && buchberger <= 1); int postponeKoszul; tests >> postponeKoszul; MATHICGB_ASSERT(0 <= postponeKoszul && postponeKoszul <= 1); int useBaseDivisors; tests >> useBaseDivisors; MATHICGB_ASSERT(0 <= useBaseDivisors && useBaseDivisors <= 1); int autoTailReduce; tests >> autoTailReduce; MATHICGB_ASSERT(0 <= autoTailReduce && autoTailReduce <= 1); int autoTopReduce; tests >> autoTopReduce; MATHICGB_ASSERT(0 <= autoTopReduce && autoTopReduce <= 1); int preferSparseReducers; tests >> preferSparseReducers; MATHICGB_ASSERT(0 <= preferSparseReducers && preferSparseReducers <= 1); int useSingularCriterionEarly; tests >> useSingularCriterionEarly; MATHICGB_ASSERT(0 <= useSingularCriterionEarly); MATHICGB_ASSERT(useSingularCriterionEarly <= 1); int sPairGroupSize; tests >> sPairGroupSize; MATHICGB_ASSERT(0 <= sPairGroupSize); int threadCount; tests >> threadCount; MATHICGB_ASSERT(0 <= threadCount); // Rule out combinations of parameter values that do not make sense. // These are asserts because pict should have already removed these // combinations. MATHICGB_ASSERT(buchberger || !autoTopReduce); MATHICGB_ASSERT(buchberger || !autoTailReduce); MATHICGB_ASSERT(buchberger || reducerType != 25); MATHICGB_ASSERT(buchberger || reducerType != 26); MATHICGB_ASSERT(!buchberger || !postponeKoszul); MATHICGB_ASSERT(!buchberger || !useBaseDivisors); MATHICGB_ASSERT(!buchberger || !useSingularCriterionEarly); // check that we have a valid reducer type #ifdef MATHICGB_DEBUG Reducer::ReducerType red = Reducer::ReducerType(reducerType); MATHICGB_ASSERT(static_cast(red) == reducerType); #endif std::istringstream inStream(idealStr); Scanner in(inStream); auto p = MathicIO<>().readRing(true, in); auto& ring = *p.first; auto& processor = p.second; auto basis = MathicIO<>().readBasis(ring, false, in); if (processor.schreyering()) processor.setSchreyerMultipliers(basis); MATHICGB_ASSERT(Reducer::makeReducerNullOnUnknown(red, ring).get() != 0); mtbb::task_arena scheduler(threadCount); if (buchberger) { const auto reducer = Reducer::makeReducer (Reducer::reducerType(reducerType), ring); ClassicGBAlgParams params; params.reducer = reducer.get(); params.monoLookupType = divLookup; params.preferSparseReducers = preferSparseReducers; params.sPairQueueType = spairQueue; params.breakAfter = 0; params.printInterval = 0; params.sPairGroupSize = sPairGroupSize; params.reducerMemoryQuantum = 100 * 1024; params.useAutoTopReduction = autoTopReduce; params.useAutoTailReduction = autoTailReduce; params.callback = nullptr; auto gb = scheduler.execute([&]{return computeGBClassicAlg(std::move(basis), params);}); Basis initialIdeal(gb.ring()); for (size_t i = 0; i < gb.size(); ++i) { auto poly = make_unique(gb.ring()); auto leadTerm = gb.getPoly(i)->leadTerm(); leadTerm.coef = gb.ring().field().one(); poly->append(leadTerm); initialIdeal.insert(std::move(poly)); } initialIdeal.sort(); EXPECT_EQ(initialIdealStr, toString(&initialIdeal)) << reducerType << ' ' << divLookup << ' ' << monTable << ' ' << postponeKoszul << ' ' << useBaseDivisors; } else { SignatureGB alg( std::move(basis), std::move(processor), Reducer::reducerType(reducerType), divLookup, monTable, postponeKoszul, useBaseDivisors, preferSparseReducers, useSingularCriterionEarly, spairQueue ); alg.computeGrobnerBasis(); EXPECT_EQ(sigBasisStr, toString(alg.getGB(), 1)) << reducerType << ' ' << divLookup << ' ' << monTable << ' ' << ' ' << postponeKoszul << ' ' << useBaseDivisors; EXPECT_EQ(syzygiesStr, toString(alg.getSyzTable())) << reducerType << ' ' << divLookup << ' ' << monTable << ' ' << ' ' << postponeKoszul << ' ' << useBaseDivisors; /*EXPECT_EQ(nonSingularReductions, alg.getSigReductionCount() - alg.getSingularReductionCount()) << reducerType << ' ' << divLookup << ' ' << monTable << ' ' << ' ' << postponeKoszul << ' ' << useBaseDivisors;*/ } } } TEST(GB, small) { testGB(smallIdealComponentLastDescending(), idealSmallBasis, idealSmallSyzygies, idealSmallInitial, 7); } TEST(GB, liu_0_1) { testGB(liuIdealComponentLastDescending(), liu_gb_strat0_free1, liu_syzygies_strat0_free1, liu_initial_strat0_free1, 13); } TEST(GB, weispfennig97_0_4) { testGB(weispfennig97IdealComponentLast(true), weispfennig97_gb_strat0_free4, weispfennig97_syzygies_strat0_free4, weispfennig97_initial_strat0_free4, 31); } TEST(GB, weispfennig97_0_5) { testGB(weispfennig97IdealComponentLast(false), weispfennig97_gb_strat0_free5, weispfennig97_syzygies_strat0_free5, weispfennig97_initial_strat0_free5, 27); } TEST(GB, gerdt93_0_1) { testGB(gerdt93IdealComponentLast(false, false), gerdt93_gb_strat0_free1, gerdt93_syzygies_strat0_free1, gerdt93_initial_strat0_free1, 9); } TEST(GB, gerdt93_0_2) { testGB(gerdt93IdealComponentMiddle(true), gerdt93_gb_strat0_free2, gerdt93_syzygies_strat0_free2, gerdt93_initial_strat0_free2, 7); } TEST(GB, gerdt93_0_3) { testGB(gerdt93IdealComponentMiddle(false), gerdt93_gb_strat0_free3, gerdt93_syzygies_strat0_free3, gerdt93_initial_strat0_free3, 9); } TEST(GB, gerdt93_0_4) { testGB(gerdt93IdealComponentLast(true, true), gerdt93_gb_strat0_free4, gerdt93_syzygies_strat0_free4, gerdt93_initial_strat0_free4, 7); } TEST(GB, gerdt93_0_5) { testGB(gerdt93IdealComponentLast(false, true), gerdt93_gb_strat0_free5, gerdt93_syzygies_strat0_free5, gerdt93_initial_strat0_free5, 7); } TEST(GB, gerdt93_0_6) { testGB(gerdt93IdealComponentFirst(true), gerdt93_gb_strat0_free6, gerdt93_syzygies_strat0_free6, gerdt93_initial_strat0_free6, 7); } TEST(GB, gerdt93_0_7) { testGB(gerdt93IdealComponentFirst(false), gerdt93_gb_strat0_free7, gerdt93_syzygies_strat0_free7, gerdt93_initial_strat0_free7, 9); } mathicgb-1.1/src/test/testMain.cpp0000664000175000017500000000051414560325357012664 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "mathicgb/stdinc.h" #include using namespace mgb; int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } mathicgb-1.1/src/test/ideals.cpp0000664000175000017500000006416614560325357012356 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "mathicgb/stdinc.h" #include "test/ideals.hpp" #include using namespace mgb; std::string smallIdealComponentLastDescending() { return "32003 6\n" "1 1 1 1 1 1 1\n" "_revlex revcomponent\n" "3\n" "-bc+ad\n" "-b2+af\n" "-bc2+a2e\n"; } const char* idealSmallBasis = "\ 0 <0> bc-ad\n\ 1 <1> b2-af\n\ 2 <2> bc2-a2e\n\ 3 c<0> acd-a2e\n\ 4 b<0> abd-acf\n\ 5 c2<1> a2be-ac2f\n\ 6 bc<0> a2d2-ac2f\n\ 7 c3<1> a3de-ac3f\n\ 8 c4<1> a4e2-ac4f\n\ "; const char* idealSmallSyzygies = " 0: b2 bc2 \n 1: c2d bc2 \n"; const char* idealSmallInitial = " bc\n b2\n acd\n abd\n a2be\n a2d2\n a3de\n a4e2\n"; std::string liuIdealComponentLastDescending() { return "2 6\n" "1 1 1 1 1 1 1\n" "_revlex revcomponent\n" "4\n" "bc+bd+af+ef\n" "ac+cd+bf+ef\n" "ad+bd+cf+ef\n" "ab+ac+df+ef\n"; } const char* liu_gb_strat0_free1 = "\ 0 <0> bc+bd+af+ef\n\ 1 <1> ac+cd+bf+ef\n\ 2 <2> ad+bd+cf+ef\n\ 3 <3> ab+ac+df+ef\n\ 4 c<2> bd2+cd2+c2f+cef+cf2+ef2\n\ 5 b<2> b2d+cd2+d2f+bef+af2+ef2\n\ 6 b<1> c2d+cd2+b2f+c2f+cdf+bef+cef+def+af2+ef2\n\ 7 a<0> a2f+b2f+c2f+d2f+aef+bef+cef+def\n\ 8 ad<0> cd2f+d3f+cdef+d2ef+b2f2+c2f2+bdf2+aef2+def2+e2f2+bf3+ef3\n\ 9 c2<2> c3f+d3f+c2ef+bdef+cdef+d2ef+b2f2+c2f2+d2f2+aef2+bef2+e2f2+af3+bf3\n\ 10 b2<1> b3f+d3f+b2ef+d2ef+b2f2+c2f2+bef2+cef2+bf3+df3\n\ 11 c2d<2> b2ef2+d2ef2+be2f2+de2f2+b2f3+d2f3+aef3+cef3+af4+bf4+cf4+df4\n\ 12 c2d2<2> bde2f2+cde2f2+c2ef3+d2ef3+ae2f3+e3f3+c2f4+bdf4+cdf4+d2f4+aef4+def4+df5+ef5\n\ 13 c2d3<2> c2e2f3+d2e2f3+ce3f3+de3f3+c2ef4+d2ef4+be2f4+ce2f4+aef5+cef5+af6+bf6+cf6+df6\n\ 14 c2d4<2> cde2f4+d2e2f4+ae3f4+be3f4+ce3f4+e4f4+ce2f5+e3f5+cdf6+d2f6+aef6+bef6+cef6+e2f6+cf7+ef7\n\ 15 c2d5<2> d2e3f4+de4f4+ae3f5+be3f5+d2ef6+be2f6+aef7+bef7+bf8+df8\n\ "; const char* liu_syzygies_strat0_free1 = " 0: ac ab a2d \n 1: ab b2d b2c \n 2: bc ac ab c3d \n"; const char* liu_initial_strat0_free1 = " ad\n bc\n ac\n ab\n a2f\n bd2\n c2d\n b2d\n cd2f\n c3f\n b3f\n b2ef2\n bde2f2\n c2e2f3\n cde2f4\n d2e3f4\n"; std::string weispfennig97IdealComponentLast(bool componentsAscending) { std::ostringstream out; out << "7583 4 schreyer revlex 1\n"; if (componentsAscending) out << "1 1 1 1 _revlex component\n"; else out << "1 1 1 1 _revlex revcomponent\n"; out << "3\n" "b4+ab2c+a2d2-2abd2+b2d2+c2d2 \n" "a2b2c-bc4+a3d2+ab2d2+ac2d2+3d5 \n" "a3b2-abc3+a2d3+b2d3+c2d3\n"; return out.str(); } const char* weispfennig97_gb_strat0_free4 = "\ 0 <0> b4+ab2c+a2d2-2abd2+b2d2+c2d2\n\ 1 <1> a2b2c-bc4+a3d2+ab2d2+ac2d2+3d5\n\ 2 <2> a3b2-abc3+a2d3+b2d3+c2d3\n\ 3 c<2> a4d2+a2b2d2+a2c2d2-a2cd3-b2cd3-c3d3+3ad5\n\ 4 b2<1> b3c4+abc5-2a3bcd2-ab2c2d2-abc3d2+bc4d2-2a2bd4+a2d5-2b2d5-3acd5+c2d5-3d7\n\ 5 b2<2> ab3c3+a2bc4+2a2b3d2+2a2bc2d2-a2b2d3-2a2bcd3+ab2cd3-2b3cd3-b2c2d3-2bc3d3-2a2d5+4abd5+b2d5+c2d5\n\ 6 b3<1> ab3c2d2+ab2c3d2+a2c4d2+c6d2+2a2b2d4-a2bd5+2b3d5-2a2cd5+3abcd5-2b2cd5-bc2d5-2c3d5+3bd7\n\ 7 b2c<2> a2bc3d2-abc4d2+bc5d2+ab2c2d3-b2c3d3-bc4d3+2a3bd4-a3cd4-ab2cd4-ac3d4+3ab2d5+a2cd5-2abcd5+b2cd5+c3d5+3ad7-3cd7+3d8\n\ 8 b3<2> a3c3d2+ab2c3d2+ac5d2+a2b3d3-ab3cd3+b3c2d3-2a3d5+2a2bd5-b3d5-2ac2d5-bc2d5\n\ 9 ab2<2> a3bc4+b2c6+a3bc2d2+3ab2c3d2+a2c4d2-abc4d2+c6d2-2a3bcd3-2ab3cd3-ab2c2d3-3abc3d3+bc4d3+2a2b2d4-3a3d5+a2bd5-2a2cd5+3abcd5-2b2cd5-6bc2d5-2c3d5+a2d6+b2d6+c2d6+3bd7-3d8\n\ 10 b3c<1> a2bc4d2-ab2c4d2-a2c5d2-c7d2+2a2b3d4+2a2bc2d4-2bc4d4-a2b2d5-a2bcd5+ab2cd5-4b3cd5+2a2c2d5-3abc2d5+b2c2d5-bc3d5+2c4d5+2a3d6+2ab2d6+2ac2d6-2a2d7+4abd7+b2d7-3bcd7+c2d7+6d9\n\ 11 b2c2<2> ab2c4d2+a2c5d2-abc5d2+bc6d2+c7d2+ab2c3d3-b2c4d3-bc5d3-2a2b3d4+2a3bcd4-a3c2d4-2a2bc2d4-ab2c2d4-ac4d4+2bc4d4+a2b2d5+a2bcd5+2ab2cd5+4b3cd5-a2c2d5+abc2d5+bc3d5-c4d5-2a3d6-2ab2d6-2ac2d6+2a2d7-4abd7-b2d7+3acd7+3bcd7-4c2d7+3cd8-6d9\n\ 12 ab3<1> a3c4d2+b2c5d2+ac6d2+bc6d2-a3bcd4-ab3cd4-a3c2d4-ab2c2d4+abc3d4-ac4d4-a3bd5+2ab3d5-2a3cd5+3a2bcd5-2ab2cd5-abc2d5-2ac3d5-2a2d7+3abd7-2b2d7-3bcd7-5c2d7\n\ 13 b3c<2> a2c5d2-abc5d2+b2c5d2+2bc6d2+c7d2-b3c3d3-a2c4d3-2b2c4d3-bc5d3-c6d3-2a2b3d4+a3bcd4-ab3cd4-2a3c2d4-2a2bc2d4-2ab2c2d4+abc3d4-2ac4d4+2bc4d4-a2b2d5+3ab3d5+2a2bcd5+5b3cd5-a2c2d5+abc2d5+2bc3d5-c4d5-2a3d6+a2bd6-2ab2d6-2b3d6+2a2cd6-3abcd6+2b2cd6-2ac2d6+bc2d6+2c3d6-abd7-3b2d7+3acd7-9c2d7+3cd8-6d9\n\ 14 a2b2<1> a3bc5+b2c7+2b2c5d2-2a3bc2d3-2ab2c3d3-2b3c3d3-2abc4d3+2bc5d3+4a2b3d4-6a3bcd4-2ab3cd4+4a2bc2d4+2abc3d4-4a2b2d5+6ab3d5-3a3cd5+2a2bcd5-9ab2cd5-4b3cd5-a2c2d5+4abc2d5-2b2c2d5-7bc3d5-c4d5+a2cd6+b2cd6+c3d6-9a2d7+16abd7-3b2d7-6acd7-6bcd7-3c2d7-3ad8+6bd8-6cd8\n\ 15 ab3<2> a3bd5-ac3d5-b3d6-abcd6+2ad8\n\ 16 ab2c2<2> b2c6d2-bc7d2+abc5d3+b2c5d3-a3bc2d4+3ab2c3d4+a2c4d4+abc4d4+2b2c4d4-2bc5d4+c6d4-a2b3d5-2a3bcd5-ab3cd5-6ab2c2d5-3b3c2d5-abc3d5+2b2c3d5-2bc4d5+2a2b2d6-2ab3d6+2a3cd6+2ab2cd6-2abc2d6-4ac3d6+2a3d7-a2bd7-3ab2d7-5b3d7-7a2cd7+7abcd7-4b2cd7+2ac2d7-5bc2d7-c3d7+a2d8+b2d8-3acd8+c2d8+6ad9-3bd9+6cd9\n\ 17 a2b3<1> abc6d2+bc7d2-2b2c5d3-bc6d3-ab2c3d4+b3c3d4+a2c4d4+2abc4d4-b2c4d4+c6d4+4a2b3d5+4a3bcd5+5ab3cd5+a3c2d5+2ab2c2d5+3b3c2d5-a2c3d5-abc3d5-b2c3d5-2ac4d5+3bc4d5-c5d5+2a2b2d6-ab3d6-a2bcd6+2ab2cd6-4b3cd6-abc2d6+2ac3d6-bc3d6-2a3d7-3ab2d7+5b3d7-a2cd7+2abcd7-4b2cd7-2ac2d7-7c3d7+2a2d8-b2d8+6acd8+3bcd8+5c2d8-4ad9+6bd9-3d10\n\ 18 a2b3<2> a2b3d5+a2bc2d5+a2c3d5+ab3d6-b3cd6-bc3d6-2a2d8+3abd8\n\ 19 bc5<2> a2bc6d2-ab2c6d2+b2c7d2+2abc5d4+2b2c5d4-4bc6d4-5ab2c3d5-2b3c3d5-a2c4d5+b2c4d5+4bc5d5-c6d5-4ab3cd6+3a3c2d6+a2bc2d6+6ab2c2d6+3b3c2d6-3abc3d6+b2c3d6-4ac4d6+2bc4d6+c5d6-3a2b2d7+4ab3d7-a3cd7-3a2bcd7-8ab2cd7-5b3cd7-6a2c2d7+5abc2d7-4b2c2d7-3ac3d7-bc3d7-3c4d7-3a3d8+3a2bd8-ab2d8-5b3d8+6a2cd8-11abcd8+3b2cd8-3ac2d8+3c3d8+a2d9-2abd9-b2d9+8acd9-9bcd9+11c2d9+ad10-15cd10\n\ 20 b3c3<1> a2c7d2+b2c7d2+c9d2-4ab2c3d5+2b3c3d5-3a2c4d5+4abc4d5-2b2c4d5+3bc5d5-3c6d5-2ab3cd6-a3c2d6+a2bc2d6+ab2c2d6+3b3c2d6-abc3d6+2b2c3d6-2ac4d6+3bc4d6+c5d6-3a2b2d7+4ab3d7-a3cd7-3a2bcd7-2ab2cd7+b3cd7-2a2c2d7+3abc2d7-3b2c2d7-5ac3d7+2bc3d7-2c4d7-3a3d8+3a2bd8-4ab2d8-7b3d8+5a2cd8-11abcd8+2b2cd8-3ac2d8+2c3d8+a2d9-2abd9-b2d9+2acd9-3bcd9-c2d9+2ad10-9cd10-3d11\n\ 21 b3c3<2> abc7d2-2bc8d2-abc5d4+2b2c5d4-3bc6d4+2a3bc2d5-7ab2c3d5-4b3c3d5-2a2c4d5+abc4d5-2b2c4d5+3bc5d5-2c6d5-3ab3cd6+3a3c2d6-a2bc2d6+12ab2c2d6+b3c2d6+2a2c3d6-2b2c3d6+3ac4d6+6ab3d7+2a3cd7-6a2bcd7-4ab2cd7+2b3cd7-4a2c2d7+9abc2d7-2b2c2d7+ac3d7+2bc3d7+5c4d7+a2bd8+2b3d8+9a2cd8-14abcd8+9b2cd8+6bc2d8+6c3d8-2a2d9-2abd9+2b2d9+3acd9-9bcd9+8c2d9-ad10+3bd10-15cd10+3d11\n\ 22 a2b3c<1> bc8d2-bc7d3-2526abc5d4-b2c5d4+2531ab2c3d5+3b3c3d5+4b2c4d5-ac5d5-bc5d5+ab3cd6+a2bc2d6-6ab2c2d6-4b3c2d6-2528a2c3d6-2529abc3d6+2b2c3d6-2bc4d6-a2b2d7-2534ab3d7+a2bcd7+2530ab2cd7-2b3cd7+2529a2c2d7-6abc2d7+2527b2c2d7-5ac3d7-2bc3d7+2524c4d7+2a3d8-2ab2d8-7b3d8-5a2cd8+5abcd8-4b2cd8+4ac2d8-3bc2d8+c3d8+a2d9+abd9+2530b2d9-3acd9+6bcd9+2530c2d9+7ad10-12bd10+7cd10\n\ 23 a3b3<1> a2c4d5+abc4d5+b2c4d5-bc5d5+ab3cd6-ab2c2d6-b3c2d6+b2c3d6-ab3d7+a3cd7+ab2cd7-abc2d7-2ac3d7-3ab2d8-3b3d8-3a2cd8+2abcd8-b2cd8-c3d8+3ad10-3bd10+3cd10-3d11\n\ 24 abc5<2> abc8d2-2bc9d2+abc5d5-11b2c5d5-3bc6d5+12ab2c3d6+7b3c3d6-8abc4d6-11b2c4d6+2ac5d6+12bc5d6+7c6d6+12ab3cd7+8a3c2d7-9a2bc2d7+21ab2c2d7+19b3c2d7-8a2c3d7+3abc3d7-17b2c3d7+9ac4d7+16bc4d7+4c5d7+10a2b2d8-6ab3d8-14a3cd8-3a2bcd8-4ab2cd8+5b3cd8+7a2c2d8+9abc2d8+9b2c2d8+29ac3d8+bc3d8+4c4d8-4a3d9-20a2bd9+29ab2d9+63b3d9+23a2cd9-8abcd9-5ac2d9-4bc2d9-3c3d9+18a2d10-20abd10-3b2d10-11acd10+27bcd10+15c2d10-50ad11+48bd11-33cd11+3d12\n\ 25 ab3c3<2> ac6d5+bc6d5+b3c3d6-b2c4d6-a3c2d7-ab2c2d7+2a2c3d7+ac4d7+3a2b2d8+2ab3d8+3ab2cd8+2b3cd8-2ac3d8-a2d10-acd10-3c2d10+3ad11\n\ 26 a3b3c<1> abc5d5+3790bc6d5+3791c7d5-ab2c3d6-3790b2c4d6+3792bc5d6-3790a3c2d7-3790ab2c2d7-a2c3d7-abc3d7+3791ac4d7-bc4d7+3791a2b2d8+3789ab3d8-a2bcd8+3790ab2cd8+3788b3cd8-a2c2d8+3791b2c2d8+a3d9+ab2d9+ac2d9+2a2d10+3789abd10-3790b2d10+acd10+3790bcd10+6c2d10+3790bd11-3cd11+3d12\n\ 27 a2bc5<2> bc10d2+2540bc7d5+2521b2c5d6-2535bc6d6-846c7d6+2511ab2c3d7+2523b3c3d7+2509abc4d7-17b2c4d7+3ac5d7+852bc5d7-2525c6d7+3ab3cd8+2534a3c2d8-2536a2bc2d8+2570ab2c2d8+2569b3c2d8+1669a2c3d8-3371abc3d8-2554b2c3d8-3372ac4d8-1668bc4d8-3c5d8-3357a2b2d9-841ab3d9-2548a3cd9+856a2bcd9+1663ab2cd9+1675b3cd9+2518a2c2d9+2566abc2d9+845b2c2d9-2473ac3d9+2538bc3d9+1688c4d9-3392a3d10-2530a2bd10-792ab2d10+85b3d10+40a2cd10+2517abcd10+2536b2cd10-3395ac2d10+2528bc2d10-2559c3d10-1654a2d11+793abd11-855b2d11-830acd11-2537bcd11-819c2d11-75ad12-2444bd12-53cd12-2507d13\n\ 28 a2b3c3<1> ac7d5+bc7d5-b2c5d6+3790bc6d6+3791c7d6-ab2c3d7-2abc4d7+3791b2c4d7+2ac5d7-3789bc5d7-ab3cd8-3790a3c2d8-a2bc2d8-3784ab2c2d8+5b3c2d8-2a2c3d8-2b2c3d8+3791ac4d8+bc4d8+3791a2b2d9+3790ab3d9-2a3cd9-a2bcd9+3788ab2cd9+3791b3cd9-a2c2d9+4abc2d9+3791b2c2d9+4ac3d9+bc3d9-4a3d10+4a2bd10+4ab2d10+5b3d10+5a2cd10-4abcd10+2b2cd10-5ac2d10-bc2d10-c3d10+3a2d11+3786abd11-3788b2d11+3acd11+3790bcd11+5c2d11-6ad12-3787bd12-9cd12+3d13\n\ 29 a3b3c2<1> bc7d5-3033c8d5-b2c5d6+3033bc6d6-3034ab2c3d7+3034abc4d7+3032b2c4d7+3034ac5d7+3034bc5d7-1515ab3cd8-3035a2bc2d8+1518ab2c2d8-1513b3c2d8+3031a2c3d8+1516b2c3d8+1518bc4d8-1517c5d8-ab3d9-3034a3cd9-3034ab2cd9-3031b3cd9-3032abc2d9-3032ac3d9-3031bc3d9+3031a3d10-1515a2bd10+3033ab2d10+3035b3d10+3034a2cd10+3033abcd10-b2cd10+1514ac2d10+1517bc2d10-4c3d10+1521a2d11-1522abd11+3032b2d11-1516bcd11-3032c2d11-3036ad12-1513bd12-1519cd12+1516d13\n\ 30 a3b3c3<1> c9d5-3033c8d6-b2c5d7+3030bc6d7+2528c7d7-3032ab2c3d8+3b3c3d8+3040abc4d8+3036b2c4d8+3034ac5d8+507bc5d8-c6d8-1516ab3cd9+3a3c2d9-3035a2bc2d9+1520ab2c2d9-1512b3c2d9-2025a2c3d9+2527abc3d9+1517b2c3d9+2528ac4d9-1007bc4d9-1517c5d9+2523a2b2d10+2525ab3d10-3034a3cd10-2528a2bcd10-511ab2cd10-505b3cd10-2a2c2d10-3029abc2d10-2529b2c2d10-3043ac3d10-3028bc3d10+2526c4d10-2025a3d11-1516a2bd11-2031ab2d11+3025b3d11+3033a2cd11+3024abcd11-3542ac2d11+1514bc2d11-c3d11-1006a2d12+3533abd12-2023b2d12+2529acd12-1515bcd12-495c2d12-3032ad13-1521bd13-1522cd13+1511d14\n\ "; const char* weispfennig97_syzygies_strat0_free4 = " 1: b4 a4b3 \n 2: b4 a2b2c a3b3 b3c4 a3bc5 \n"; const char* weispfennig97_initial_strat0_free4 = " b4\n a2b2c\n a3b2\n a4d2\n b3c4\n ab3c3\n a2bc3d2\n a3c3d2\n ab3c2d2\n a3bc4\n a3bd5\n a2c5d2\n ab2c4d2\n a2b3d5\n b2c6d2\n abc6d2\n a2c4d5\n bc8d2\n ac6d5\n abc5d5\n bc7d5\n c9d5\n"; const char* weispfennig97_gb_strat0_free5 = "\ 0 <0> b4+ab2c+a2d2-2abd2+b2d2+c2d2\n\ 1 <1> a2b2c-bc4+a3d2+ab2d2+ac2d2+3d5\n\ 2 <2> a3b2-abc3+a2d3+b2d3+c2d3\n\ 3 a<1> a4d2+a2b2d2+a2c2d2-a2cd3-b2cd3-c3d3+3ad5\n\ 4 a2c<0> b3c4+abc5-2a3bcd2-ab2c2d2-abc3d2+bc4d2-2a2bd4+a2d5-2b2d5-3acd5+c2d5-3d7\n\ 5 a3<0> ab3c3+a2bc4+2a2b3d2+2a2bc2d2-a2b2d3-2a2bcd3+ab2cd3-2b3cd3-b2c2d3-2bc3d3-2a2d5+4abd5+b2d5+c2d5\n\ 6 a2bc<0> ab3c2d2+ab2c3d2+a2c4d2+c6d2+2a2b2d4-a2bd5+2b3d5-2a2cd5+3abcd5-2b2cd5-bc2d5-2c3d5+3bd7\n\ 7 ab2<1> a2bc3d2-abc4d2+bc5d2+ab2c2d3-b2c3d3-bc4d3+2a3bd4-a3cd4-ab2cd4-ac3d4+3ab2d5+a2cd5-2abcd5+b2cd5+c3d5+3ad7-3cd7+3d8\n\ 8 a3b<0> a3c3d2+ab2c3d2+ac5d2+a2b3d3-ab3cd3+b3c2d3-2a3d5+2a2bd5-b3d5-2ac2d5-bc2d5\n\ 9 a4<0> a3bc4+b2c6+a3bc2d2+3ab2c3d2+a2c4d2-abc4d2+c6d2-2a3bcd3-2ab3cd3-ab2c2d3-3abc3d3+bc4d3+2a2b2d4-3a3d5+a2bd5-2a2cd5+3abcd5-2b2cd5-6bc2d5-2c3d5+a2d6+b2d6+c2d6+3bd7-3d8\n\ 10 a2bc2<0> a2bc4d2-ab2c4d2-a2c5d2-c7d2+2a2b3d4+2a2bc2d4-2bc4d4-a2b2d5-a2bcd5+ab2cd5-4b3cd5+2a2c2d5-3abc2d5+b2c2d5-bc3d5+2c4d5+2a3d6+2ab2d6+2ac2d6-2a2d7+4abd7+b2d7-3bcd7+c2d7+6d9\n\ 11 ab2c<1> ab2c4d2+a2c5d2-abc5d2+bc6d2+c7d2+ab2c3d3-b2c4d3-bc5d3-2a2b3d4+2a3bcd4-a3c2d4-2a2bc2d4-ab2c2d4-ac4d4+2bc4d4+a2b2d5+a2bcd5+2ab2cd5+4b3cd5-a2c2d5+abc2d5+bc3d5-c4d5-2a3d6-2ab2d6-2ac2d6+2a2d7-4abd7-b2d7+3acd7+3bcd7-4c2d7+3cd8-6d9\n\ 12 ab3<1> a2c5d2-abc5d2+b2c5d2+2bc6d2+c7d2-b3c3d3-a2c4d3-2b2c4d3-bc5d3-c6d3-2a2b3d4+a3bcd4-ab3cd4-2a3c2d4-2a2bc2d4-2ab2c2d4+abc3d4-2ac4d4+2bc4d4-a2b2d5+3ab3d5+2a2bcd5+5b3cd5-a2c2d5+abc2d5+2bc3d5-c4d5-2a3d6+a2bd6-2ab2d6-2b3d6+2a2cd6-3abcd6+2b2cd6-2ac2d6+bc2d6+2c3d6-abd7-3b2d7+3acd7-9c2d7+3cd8-6d9\n\ 13 a4b<0> a3bd5-ac3d5-b3d6-abcd6+2ad8\n\ 14 a2b2c<1> b2c6d2-bc7d2+abc5d3+b2c5d3-a3bc2d4+3ab2c3d4+a2c4d4+abc4d4+2b2c4d4-2bc5d4+c6d4-a2b3d5-2a3bcd5-ab3cd5-6ab2c2d5-3b3c2d5-abc3d5+2b2c3d5-2bc4d5+2a2b2d6-2ab3d6+2a3cd6+2ab2cd6-2abc2d6-4ac3d6+2a3d7-a2bd7-3ab2d7-5b3d7-7a2cd7+7abcd7-4b2cd7+2ac2d7-5bc2d7-c3d7+a2d8+b2d8-3acd8+c2d8+6ad9-3bd9+6cd9\n\ 15 a2b3<1> abc6d2+bc7d2-2b2c5d3-bc6d3-ab2c3d4+b3c3d4+a2c4d4+2abc4d4-b2c4d4+c6d4+4a2b3d5+a3bcd5+5ab3cd5+a3c2d5+2ab2c2d5+3b3c2d5-a2c3d5-abc3d5-b2c3d5+ac4d5+3bc4d5-c5d5+2a2b2d6-ab3d6-a2bcd6+2ab2cd6-b3cd6+2abc2d6+2ac3d6-bc3d6-2a3d7-3ab2d7+5b3d7-a2cd7+2abcd7-4b2cd7-2ac2d7-7c3d7+2a2d8-b2d8+3bcd8+5c2d8-4ad9+6bd9-3d10\n\ 16 a5b<0> a2b3d5+a2bc2d5+a2c3d5+ab3d6-b3cd6-bc3d6-2a2d8+3abd8\n\ 17 abc4<1> a2bc6d2-ab2c6d2+b2c7d2+2abc5d4+2b2c5d4-4bc6d4-5ab2c3d5-2b3c3d5-a2c4d5+b2c4d5+4bc5d5-c6d5-4ab3cd6+3a3c2d6+a2bc2d6+6ab2c2d6+3b3c2d6-3abc3d6+b2c3d6-4ac4d6+2bc4d6+c5d6-3a2b2d7+4ab3d7-a3cd7-3a2bcd7-8ab2cd7-5b3cd7-6a2c2d7+5abc2d7-4b2c2d7-3ac3d7-bc3d7-3c4d7-3a3d8+3a2bd8-ab2d8-5b3d8+6a2cd8-11abcd8+3b2cd8-3ac2d8+3c3d8+a2d9-2abd9-b2d9+8acd9-9bcd9+11c2d9+ad10-15cd10\n\ 18 a2bc4<0> a2c7d2+b2c7d2+c9d2-4ab2c3d5+2b3c3d5-3a2c4d5+4abc4d5-2b2c4d5+3bc5d5-3c6d5-2ab3cd6-a3c2d6+a2bc2d6+ab2c2d6+3b3c2d6-abc3d6+2b2c3d6-2ac4d6+3bc4d6+c5d6-3a2b2d7+4ab3d7-a3cd7-3a2bcd7-2ab2cd7+b3cd7-2a2c2d7+3abc2d7-3b2c2d7-5ac3d7+2bc3d7-2c4d7-3a3d8+3a2bd8-4ab2d8-7b3d8+5a2cd8-11abcd8+2b2cd8-3ac2d8+2c3d8+a2d9-2abd9-b2d9+2acd9-3bcd9-c2d9+2ad10-9cd10-3d11\n\ 19 ab3c2<1> abc7d2-2bc8d2-abc5d4+2b2c5d4-3bc6d4+2a3bc2d5-7ab2c3d5-4b3c3d5-2a2c4d5+abc4d5-2b2c4d5+3bc5d5-2c6d5-3ab3cd6+3a3c2d6-a2bc2d6+12ab2c2d6+b3c2d6+2a2c3d6-2b2c3d6+3ac4d6+6ab3d7+2a3cd7-6a2bcd7-4ab2cd7+2b3cd7-4a2c2d7+9abc2d7-2b2c2d7+ac3d7+2bc3d7+5c4d7+a2bd8+2b3d8+9a2cd8-14abcd8+9b2cd8+6bc2d8+6c3d8-2a2d9-2abd9+2b2d9+3acd9-9bcd9+8c2d9-ad10+3bd10-15cd10+3d11\n\ 20 a2b3c<1> bc8d2-bc7d3-2526abc5d4-b2c5d4-a3bc2d5+2531ab2c3d5+3b3c3d5+4b2c4d5-bc5d5+ab3cd6+a2bc2d6-6ab2c2d6-3b3c2d6-2528a2c3d6-2528abc3d6+2b2c3d6-2bc4d6-a2b2d7-2534ab3d7+a2bcd7+2530ab2cd7-2b3cd7+2529a2c2d7-6abc2d7+2527b2c2d7-5ac3d7-2bc3d7+2524c4d7+2a3d8-2ab2d8-7b3d8-5a2cd8+5abcd8-4b2cd8+2ac2d8-3bc2d8+c3d8+a2d9+abd9+2530b2d9-3acd9+6bcd9+2530c2d9+7ad10-12bd10+7cd10\n\ 21 a5bc<0> a2c4d5+abc4d5+b2c4d5-bc5d5+ab3cd6-ab2c2d6-b3c2d6+b2c3d6-ab3d7+a3cd7+ab2cd7-abc2d7-2ac3d7-3ab2d8-3b3d8-3a2cd8+2abcd8-b2cd8-c3d8+3ad10-3bd10+3cd10-3d11\n\ 22 a2bc4<1> abc8d2-2bc9d2+abc5d5-11b2c5d5-3bc6d5+12ab2c3d6+7b3c3d6-8abc4d6-11b2c4d6+2ac5d6+12bc5d6+7c6d6+12ab3cd7+8a3c2d7-9a2bc2d7+21ab2c2d7+19b3c2d7-8a2c3d7+3abc3d7-17b2c3d7+9ac4d7+16bc4d7+4c5d7+10a2b2d8-6ab3d8-14a3cd8-3a2bcd8-4ab2cd8+5b3cd8+7a2c2d8+9abc2d8+9b2c2d8+29ac3d8+bc3d8+4c4d8-4a3d9-20a2bd9+29ab2d9+63b3d9+23a2cd9-8abcd9-5ac2d9-4bc2d9-3c3d9+18a2d10-20abd10-3b2d10-11acd10+27bcd10+15c2d10-50ad11+48bd11-33cd11+3d12\n\ 23 a4bc3<0> ac6d5+bc6d5+b3c3d6-b2c4d6-a3c2d7-ab2c2d7+2a2c3d7+ac4d7+3a2b2d8+2ab3d8+3ab2cd8+2b3cd8-2ac3d8-a2d10-acd10-3c2d10+3ad11\n\ 24 a5bc2<0> abc5d5+3790bc6d5+3791c7d5-ab2c3d6-3790b2c4d6+3792bc5d6-3790a3c2d7-3790ab2c2d7-a2c3d7-abc3d7+3791ac4d7-bc4d7+3791a2b2d8+3789ab3d8-a2bcd8+3790ab2cd8+3788b3cd8-a2c2d8+3791b2c2d8+a3d9+ab2d9+ac2d9+2a2d10+3789abd10-3790b2d10+acd10+3790bcd10+6c2d10+3790bd11-3cd11+3d12\n\ 25 a3bc4<1> bc10d2+2540bc7d5+2521b2c5d6-2535bc6d6-846c7d6+2511ab2c3d7+2523b3c3d7+2509abc4d7-17b2c4d7+3ac5d7+852bc5d7-2525c6d7+3ab3cd8+2534a3c2d8-2536a2bc2d8+2570ab2c2d8+2569b3c2d8+1669a2c3d8-3371abc3d8-2554b2c3d8-3372ac4d8-1668bc4d8-3c5d8-3357a2b2d9-841ab3d9-2548a3cd9+856a2bcd9+1663ab2cd9+1675b3cd9+2518a2c2d9+2566abc2d9+845b2c2d9-2473ac3d9+2538bc3d9+1688c4d9-3392a3d10-2530a2bd10-792ab2d10+85b3d10+40a2cd10+2517abcd10+2536b2cd10-3395ac2d10+2528bc2d10-2559c3d10-1654a2d11+793abd11-855b2d11-830acd11-2537bcd11-819c2d11-75ad12-2444bd12-53cd12-2507d13\n\ 26 a5bc3<0> bc7d5-3033c8d5-b2c5d6+3033bc6d6-3034ab2c3d7+3034abc4d7+3032b2c4d7+3034ac5d7+3034bc5d7-1515ab3cd8-3035a2bc2d8+1518ab2c2d8-1513b3c2d8+3031a2c3d8+1516b2c3d8+1518bc4d8-1517c5d8-ab3d9-3034a3cd9-3034ab2cd9-3031b3cd9-3032abc2d9-3032ac3d9-3031bc3d9+3031a3d10-1515a2bd10+3033ab2d10+3035b3d10+3034a2cd10+3033abcd10-b2cd10+1514ac2d10+1517bc2d10-4c3d10+1521a2d11-1522abd11+3032b2d11-1516bcd11-3032c2d11-3036ad12-1513bd12-1519cd12+1516d13\n\ 27 a5bc4<0> c9d5-3033c8d6-b2c5d7+3030bc6d7+2528c7d7-3032ab2c3d8+3b3c3d8+3040abc4d8+3036b2c4d8+3034ac5d8+507bc5d8-c6d8-1516ab3cd9+3a3c2d9-3035a2bc2d9+1520ab2c2d9-1512b3c2d9-2025a2c3d9+2527abc3d9+1517b2c3d9+2528ac4d9-1007bc4d9-1517c5d9+2523a2b2d10+2525ab3d10-3034a3cd10-2528a2bcd10-511ab2cd10-505b3cd10-2a2c2d10-3029abc2d10-2529b2c2d10-3043ac3d10-3028bc3d10+2526c4d10-2025a3d11-1516a2bd11-2031ab2d11+3025b3d11+3033a2cd11+3024abcd11-3542ac2d11+1514bc2d11-c3d11-1006a2d12+3533abd12-2023b2d12+2529acd12-1515bcd12-495c2d12-3032ad13-1521bd13-1522cd13+1511d14\n\ "; const char* weispfennig97_syzygies_strat0_free5 = " 0: a2b2c a3b2 a6b \n 1: ab4 a3b2 ab3c3 a4bc4 \n"; const char* weispfennig97_initial_strat0_free5 = " b4\n a2b2c\n a3b2\n a4d2\n b3c4\n ab3c3\n a2bc3d2\n a3c3d2\n ab3c2d2\n a3bc4\n a3bd5\n a2c5d2\n ab2c4d2\n a2b3d5\n b2c6d2\n abc6d2\n a2c4d5\n bc8d2\n ac6d5\n abc5d5\n bc7d5\n c9d5\n"; const char* Gert93RawIdeal = "3\n" "ab-b2-4bc+ae\n" "a2c-6bc2+a2f\n" "a3+b2c-a2d\n"; std::string gerdt93IdealComponentLast(bool componentsAscending, bool schreyer) { std::ostringstream out; out << "7583 6\n"; if (schreyer) out << "schreyer "; out << "revlex 1\n"; if (componentsAscending) out << " 1 1 1 1 1 1 _revlex component\n"; else out << " 1 1 1 1 1 1 _revlex revcomponent\n"; out << Gert93RawIdeal; return out.str(); } std::string gerdt93IdealComponentFirst(bool componentsAscending) { std::ostringstream out; out << "7583 6 schreyer revlex 2\n"; if (componentsAscending) out << " component\n 1 1 1 1 1 1\n"; else out << " revcomponent\n 1 1 1 1 1 1\n"; out << Gert93RawIdeal; return out.str(); } std::string gerdt93IdealComponentMiddle(bool componentsAscending) { std::ostringstream out; out << "7583 6 schreyer revlex 2\n"; if (componentsAscending) out << "1 1 1 1 1 1\n component\n"; else out << "1 1 1 1 1 1\n revcomponent\n"; out << Gert93RawIdeal; return out.str(); } const char* gerdt93_gb_strat0_free1 = "\ 0 <0> ab-b2-4bc+ae\n\ 1 <1> a2c-6bc2+a2f\n\ 2 <2> a3+b2c-a2d\n\ 3 a<1> abc2+1264b2c2-bc2d+1264b2cf\n\ 4 c2<0> b2c2+2170bc3+3249bc2d+3249ac2e+3250b2cf\n\ 5 ac<0> b3c+3259bc3+1085bc2d-b2ce+1081ac2e-10bc2e+ace2+b3f+1091b2cf+16bc2f-b2ef-4acef-4bcef+ae2f\n\ 6 a2<1> b3c2-216b2c3-12b2c2d+36bc2d2-6ab2cf+b3cf+216b2c2f-6b2cdf-36a2bf2\n\ 7 a2<0> b4-2386bc3-b3d-8b2cd-3247bc2d-2b3e-6b2ce-3195ac2e+58bc2e+b2de+4acde+4bcde+a2e2+2b2e2-ace2+8bce2-ade2-2ae3-13b3f-3357b2cf-208bc2f+4a2ef+13b2ef+52acef+52bcef-13ae2f\n\ 8 bc2<0> bc4-563bc3d-2577bc2d2-1896ac3e-469bc3e-2229ac2de+3088bc2de+2013ac2e2-1829bc3f-3362b2cdf-2179bc2df+3088b2cef+2353ac2ef+3515bc2ef-1075ace2f-785b3f2+2930b2cf2+2606bc2f2-348a2ef2+785b2ef2+3140acef2+3140bcef2-785ae2f2\n\ 9 ac2<0> bc3e-3140ac2de-1718bc2de+2814ac2e2-1718b2cef+947bc2ef-3051ace2f+3140a2ef2\n\ 10 ac3<0> ac3de+1155ac2d2e-2873bc2d2e+3790ac3e2-1570ac2de2+3362bc2de2-3088ac2e3+2814b2cdef+2370bc2def+3362b2ce2f-3790ac2e2f-1659bc2e2f-3599acde2f+1133ace3f-1896b3ef2-1898b2cef2-10bc2ef2-1155a2def2+2681a2e2f2+1896b2e2f2+ace2f2+bce2f2-1896ae3f2+a2ef3\n\ "; const char* gerdt93_syzygies_strat0_free1 = "\ 0: a2c a3 b2c2 abc2 \n\ 1: a3 \n\ "; const char* gerdt93_initial_strat0_free1 = " ab\n a2c\n a3\n b2c2\n b3c\n b4\n bc3e\n bc4\n ac3de\n"; const char* gerdt93_gb_strat0_free2 = "\ 0 <0> ab-b2-4bc+ae\n\ 1 <1> a2c-6bc2+a2f\n\ 2 <2> a3+b2c-a2d\n\ 3 b<1> b3c+2b2c2+16bc3-b2ce-4ac2e-10bc2e+ace2+b3f+8b2cf+16bc2f-b2ef-4acef-4bcef+ae2f\n\ 4 c<2> b2c2+2170bc3+3249bc2d+3249ac2e+3250b2cf\n\ 5 b<2> b4-2386bc3-b3d-8b2cd-3247bc2d-2b3e-6b2ce-3195ac2e+58bc2e+b2de+4acde+4bcde+a2e2+2b2e2-ace2+8bce2-ade2-2ae3-13b3f-3357b2cf-208bc2f+4a2ef+13b2ef+52acef+52bcef-13ae2f\n\ 6 bc<2> bc4-563bc3d-2577bc2d2-1896ac3e-2681bc3e-2577ac2de-3362bc2de+3088ac2e2-1829bc3f-3362b2cdf-2179bc2df-3362b2cef+2353ac2ef+1659bc2ef-1133ace2f-785b3f2+2930b2cf2+2606bc2f2+785b2ef2+3140acef2+3140bcef2-785ae2f2\n\ 7 ac<2> bc3e-3140ac2de-1718bc2de+2814ac2e2-1718b2cef+947bc2ef-3051ace2f+3140a2ef2\n\ 8 ac2<2> ac3de+1155ac2d2e-2873bc2d2e+3790ac3e2-1570ac2de2+3362bc2de2-3088ac2e3+2814b2cdef+2370bc2def+3362b2ce2f-3790ac2e2f-1659bc2e2f-3599acde2f+1133ace3f-1896b3ef2-1898b2cef2-10bc2ef2-1155a2def2+2681a2e2f2+1896b2e2f2+ace2f2+bce2f2-1896ae3f2+a2ef3\n\ "; const char* gerdt93_syzygies_strat0_free2 = "\ 1: ab \n\ 2: ab b2c a2c \n\ "; const char* gerdt93_initial_strat0_free2 = " ab\n a2c\n a3\n b2c2\n b3c\n b4\n bc3e\n bc4\n ac3de\n"; const char* gerdt93_gb_strat0_free3 = "\ 0 <0> ab-b2-4bc+ae\n\ 1 <1> a2c-6bc2+a2f\n\ 2 <2> a3+b2c-a2d\n\ 3 a<1> abc2+1264b2c2-bc2d+1264b2cf\n\ 4 c2<0> b2c2+2170bc3+3249bc2d+3249ac2e+3250b2cf\n\ 5 ac<0> b3c+3259bc3+1085bc2d-b2ce+1081ac2e-10bc2e+ace2+b3f+1091b2cf+16bc2f-b2ef-4acef-4bcef+ae2f\n\ 6 a2<0> b4-2386bc3-b3d-8b2cd-3247bc2d-2b3e-6b2ce-3195ac2e+58bc2e+b2de+4acde+4bcde+a2e2+2b2e2-ace2+8bce2-ade2-2ae3-13b3f-3357b2cf-208bc2f+4a2ef+13b2ef+52acef+52bcef-13ae2f\n\ 7 a2<1> b3c2-216b2c3-12b2c2d+36bc2d2-6ab2cf+b3cf+216b2c2f-6b2cdf-36a2bf2\n\ 8 bc2<0> bc4-563bc3d-2577bc2d2-1896ac3e-469bc3e-2229ac2de+3088bc2de+2013ac2e2-1829bc3f-3362b2cdf-2179bc2df+3088b2cef+2353ac2ef+3515bc2ef-1075ace2f-785b3f2+2930b2cf2+2606bc2f2-348a2ef2+785b2ef2+3140acef2+3140bcef2-785ae2f2\n\ 9 ac2<0> bc3e-3140ac2de-1718bc2de+2814ac2e2-1718b2cef+947bc2ef-3051ace2f+3140a2ef2\n\ 10 ac3<0> ac3de+1155ac2d2e-2873bc2d2e+3790ac3e2-1570ac2de2+3362bc2de2-3088ac2e3+2814b2cdef+2370bc2def+3362b2ce2f-3790ac2e2f-1659bc2e2f-3599acde2f+1133ace3f-1896b3ef2-1898b2cef2-10bc2ef2-1155a2def2+2681a2e2f2+1896b2e2f2+ace2f2+bce2f2-1896ae3f2+a2ef3\n\ "; const char* gerdt93_syzygies_strat0_free3 = "\ 0: a2c a3 b2c2 abc2 \n\ 1: a3 \n\ "; const char* gerdt93_initial_strat0_free3 = " ab\n a2c\n a3\n b2c2\n b3c\n b4\n bc3e\n bc4\n ac3de\n"; const char* gerdt93_gb_strat0_free4 = "\ 0 <0> ab-b2-4bc+ae\n\ 1 <1> a2c-6bc2+a2f\n\ 2 <2> a3+b2c-a2d\n\ 3 b<1> b3c+2b2c2+16bc3-b2ce-4ac2e-10bc2e+ace2+b3f+8b2cf+16bc2f-b2ef-4acef-4bcef+ae2f\n\ 4 c<2> b2c2+2170bc3+3249bc2d+3249ac2e+3250b2cf\n\ 5 b<2> b4-2386bc3-b3d-8b2cd-3247bc2d-2b3e-6b2ce-3195ac2e+58bc2e+b2de+4acde+4bcde+a2e2+2b2e2-ace2+8bce2-ade2-2ae3-13b3f-3357b2cf-208bc2f+4a2ef+13b2ef+52acef+52bcef-13ae2f\n\ 6 bc<2> bc4-563bc3d-2577bc2d2-1896ac3e-2681bc3e-2577ac2de-3362bc2de+3088ac2e2-1829bc3f-3362b2cdf-2179bc2df-3362b2cef+2353ac2ef+1659bc2ef-1133ace2f-785b3f2+2930b2cf2+2606bc2f2+785b2ef2+3140acef2+3140bcef2-785ae2f2\n\ 7 ac<2> bc3e-3140ac2de-1718bc2de+2814ac2e2-1718b2cef+947bc2ef-3051ace2f+3140a2ef2\n\ 8 ac2<2> ac3de+1155ac2d2e-2873bc2d2e+3790ac3e2-1570ac2de2+3362bc2de2-3088ac2e3+2814b2cdef+2370bc2def+3362b2ce2f-3790ac2e2f-1659bc2e2f-3599acde2f+1133ace3f-1896b3ef2-1898b2cef2-10bc2ef2-1155a2def2+2681a2e2f2+1896b2e2f2+ace2f2+bce2f2-1896ae3f2+a2ef3\n\ "; const char* gerdt93_syzygies_strat0_free4 = "\ 1: ab \n\ 2: ab b2c a2c \n\ "; const char* gerdt93_initial_strat0_free4 = " ab\n a2c\n a3\n b2c2\n b3c\n b4\n bc3e\n bc4\n ac3de\n"; const char* gerdt93_gb_strat0_free5 = "\ 0 <0> ab-b2-4bc+ae\n\ 1 <1> a2c-6bc2+a2f\n\ 2 <2> a3+b2c-a2d\n\ 3 ac<0> b3c+2b2c2+16bc3-b2ce-4ac2e-10bc2e+ace2+b3f+8b2cf+16bc2f-b2ef-4acef-4bcef+ae2f\n\ 4 a<1> b2c2+2170bc3+3249bc2d+3249ac2e+3250b2cf\n\ 5 a2<0> b4-2386bc3-b3d-8b2cd-3247bc2d-2b3e-6b2ce-3195ac2e+58bc2e+b2de+4acde+4bcde+a2e2+2b2e2-ace2+8bce2-ade2-2ae3-13b3f-3357b2cf-208bc2f+4a2ef+13b2ef+52acef+52bcef-13ae2f\n\ 6 ab<1> bc4-563bc3d-2577bc2d2-1896ac3e-2681bc3e-2577ac2de-3362bc2de+3088ac2e2-1829bc3f-3362b2cdf-2179bc2df-3362b2cef+2353ac2ef+1659bc2ef-1133ace2f-785b3f2+2930b2cf2+2606bc2f2+785b2ef2+3140acef2+3140bcef2-785ae2f2\n\ 7 a2<1> bc3e-3140ac2de-1718bc2de+2814ac2e2-1718b2cef+947bc2ef-3051ace2f+3140a2ef2\n\ 8 a2c<1> ac3de+1155ac2d2e-2873bc2d2e+3790ac3e2-1570ac2de2+3362bc2de2-3088ac2e3+2814b2cdef+2370bc2def+3362b2ce2f-3790ac2e2f-1659bc2e2f-3599acde2f+1133ace3f-1896b3ef2-1898b2cef2-10bc2ef2-1155a2def2+2681a2e2f2+1896b2e2f2+ace2f2+bce2f2-1896ae3f2+a2ef3\n\ "; const char* gerdt93_syzygies_strat0_free5 = "\ 0: a2c a3 \n\ 1: ab2 a2b a3 \n\ "; const char* gerdt93_initial_strat0_free5 = " ab\n a2c\n a3\n b2c2\n b3c\n b4\n bc3e\n bc4\n ac3de\n"; const char* gerdt93_gb_strat0_free6 = "0 <0> ab-b2-4bc+ae\n1 <1> a2c-6bc2+a2f\n2 <2> a3+b2c-a2d\n3 b<1> b3c+2b2c2+16bc3-b2ce-4ac2e-10bc2e+ace2+b3f+8b2cf+16bc2f-b2ef-4acef-4bcef+ae2f\n4 c<2> b2c2+2170bc3+3249bc2d+3249ac2e+3250b2cf\n5 b<2> b4-2386bc3-b3d-8b2cd-3247bc2d-2b3e-6b2ce-3195ac2e+58bc2e+b2de+4acde+4bcde+a2e2+2b2e2-ace2+8bce2-ade2-2ae3-13b3f-3357b2cf-208bc2f+4a2ef+13b2ef+52acef+52bcef-13ae2f\n6 bc<2> bc4-563bc3d-2577bc2d2-1896ac3e-2681bc3e-2577ac2de-3362bc2de+3088ac2e2-1829bc3f-3362b2cdf-2179bc2df-3362b2cef+2353ac2ef+1659bc2ef-1133ace2f-785b3f2+2930b2cf2+2606bc2f2+785b2ef2+3140acef2+3140bcef2-785ae2f2\n7 ac<2> bc3e-3140ac2de-1718bc2de+2814ac2e2-1718b2cef+947bc2ef-3051ace2f+3140a2ef2\n8 ac2<2> ac3de+1155ac2d2e-2873bc2d2e+3790ac3e2-1570ac2de2+3362bc2de2-3088ac2e3+2814b2cdef+2370bc2def+3362b2ce2f-3790ac2e2f-1659bc2e2f-3599acde2f+1133ace3f-1896b3ef2-1898b2cef2-10bc2ef2-1155a2def2+2681a2e2f2+1896b2e2f2+ace2f2+bce2f2-1896ae3f2+a2ef3\n"; const char* gerdt93_syzygies_strat0_free6 = " 1: ab \n 2: ab b2c a2c \n"; const char* gerdt93_initial_strat0_free6 = " ab\n a2c\n a3\n b2c2\n b3c\n b4\n bc3e\n bc4\n ac3de\n"; const char* gerdt93_gb_strat0_free7 = "\ 0 <0> ab-b2-4bc+ae\n\ 1 <1> a2c-6bc2+a2f\n\ 2 <2> a3+b2c-a2d\n\ 3 a<1> abc2+1264b2c2-bc2d+1264b2cf\n\ 4 a2<1> b3c2-216b2c3-12b2c2d+36bc2d2-6ab2cf+b3cf+216b2c2f-6b2cdf-36a2bf2\n\ 5 c2<0> b2c2+2170bc3+3249bc2d+3249ac2e+3250b2cf\n\ 6 ac<0> b3c+3259bc3+1085bc2d-b2ce+1081ac2e-10bc2e+ace2+b3f+1091b2cf+16bc2f-b2ef-4acef-4bcef+ae2f\n\ 7 a2<0> b4-2386bc3-b3d-8b2cd-3247bc2d-2b3e-6b2ce-3195ac2e+58bc2e+b2de+4acde+4bcde+a2e2+2b2e2-ace2+8bce2-ade2-2ae3-13b3f-3357b2cf-208bc2f+4a2ef+13b2ef+52acef+52bcef-13ae2f\n\ 8 bc2<0> bc4-563bc3d-2577bc2d2-1896ac3e-469bc3e-2229ac2de+3088bc2de+2013ac2e2-1829bc3f-3362b2cdf-2179bc2df+3088b2cef+2353ac2ef+3515bc2ef-1075ace2f-785b3f2+2930b2cf2+2606bc2f2-348a2ef2+785b2ef2+3140acef2+3140bcef2-785ae2f2\n\ 9 ac2<0> bc3e-3140ac2de-1718bc2de+2814ac2e2-1718b2cef+947bc2ef-3051ace2f+3140a2ef2\n\ 10 ac3<0> ac3de+1155ac2d2e-2873bc2d2e+3790ac3e2-1570ac2de2+3362bc2de2-3088ac2e3+2814b2cdef+2370bc2def+3362b2ce2f-3790ac2e2f-1659bc2e2f-3599acde2f+1133ace3f-1896b3ef2-1898b2cef2-10bc2ef2-1155a2def2+2681a2e2f2+1896b2e2f2+ace2f2+bce2f2-1896ae3f2+a2ef3\n\ "; const char* gerdt93_syzygies_strat0_free7 = " 0: a2c a3 b2c2 abc2 \n 1: a3 \n"; const char* gerdt93_initial_strat0_free7 = " ab\n a2c\n a3\n b2c2\n b3c\n b4\n bc3e\n bc4\n ac3de\n"; mathicgb-1.1/src/test/MonoMonoid.cpp0000664000175000017500000007112414560325357013163 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "mathicgb/stdinc.h" #include "mathicgb/MonoMonoid.hpp" #include "mathicgb/MonoArena.hpp" #include "mathicgb/MathicIO.hpp" #include #include using namespace mgb; // Do all-pairs testing -- see monoidPict.in. Especially see that file before // editing this list of types. typedef ::testing::Types< MonoMonoid, MonoMonoid, MonoMonoid, MonoMonoid, MonoMonoid, MonoMonoid, MonoMonoid, MonoMonoid, MonoMonoid, MonoMonoid, MonoMonoid > MonoidTypes; template class Monoids : public ::testing::Test {}; TYPED_TEST_SUITE(Monoids, MonoidTypes); // expect(i,j) encodes a matrix with interesting bit patterns that // are supposed to be likely to surface errors in how monomials are // stored inside a vector. uint32 expect(size_t mono, size_t var, size_t varCount) { const auto unique = (static_cast(var + varCount * mono + 1) % 127); while (true) { // 000 if (mono == 0) return 0; --mono; // 100 // 010 // 001 if (mono < varCount) return var == mono ? unique : 0; mono -= varCount; // 000 // 100 // 110 // 111 if (mono < varCount + 1) return var < mono ? unique : 0; mono -= varCount + 1; // 111 // 011 // 001 // 000 if (mono < varCount + 1) return var >= mono ? unique : 0; mono -= varCount + 1; // 101 // 010 if (mono < 4) return (var % 2) == (mono % 2) ? unique : 0; mono -= 4; // 100100 // 010010 // 001001 if (mono < 6) return (var % 3) == (mono % 3) ? unique : 0; mono -= 6; // mix the patterns mono += var % 17; } }; TYPED_TEST(Monoids, VarCount) { typedef TypeParam Monoid; ASSERT_EQ(0, Monoid(0).varCount()); ASSERT_EQ(1000 * 1000, Monoid(1000 * 1000).varCount()); ASSERT_EQ(1, Monoid(1).varCount()); ASSERT_EQ(2, Monoid(2).varCount()); ASSERT_EQ(12, Monoid(12).varCount()); } template void testMonoVector() { typedef typename Monoid::VarIndex VarIndex; Monoid monoid(13); MonoVector v(monoid); MonoVector v2(monoid); ASSERT_EQ(v2.monoid(), monoid); const auto varCount = monoid.varCount(); ASSERT_TRUE(v.empty()); size_t count = 1000; // Not a correctness error, but empty vectors should preferably not // use any memory. ASSERT_EQ(0, v.memoryBytesUsed()); for (size_t i = 0; i < count; ++i) { ASSERT_EQ(i, v.size()); v.push_back(); // push_back, no param ASSERT_GT(v.memoryBytesUsed(), 0u); ASSERT_FALSE(v.empty()); // empty ASSERT_EQ(i + 1, v.size()); // size ASSERT_TRUE(monoid.isIdentity(v.back())); // isIdentity true, back non-const bool allZero = true; for (VarIndex var = 0; var < varCount; ++var) { const auto exponent = expect(i, var, varCount); if (exponent != 0) { allZero = false; monoid.setExponent(var, exponent, v.back()); } } ASSERT_EQ(allZero, monoid.isIdentity(v.back())); // isIdentity false v2.push_back(v.back()); // push_back with param ASSERT_TRUE(monoid.equal(v.back(), v2.back())); } auto it = v.begin(); ASSERT_EQ(it, v.cbegin()); for (size_t i = 0; i < count; ++i, ++it) { typename MonoVector::const_iterator tmp; tmp = it; ASSERT_EQ(tmp, it); ASSERT_TRUE(v.end() != it); for (VarIndex var = 0; var < monoid.varCount(); ++var) { ASSERT_EQ(expect(i, var, varCount), monoid.exponent(*it, var)); } } ASSERT_EQ(v.end(), it); ASSERT_EQ(v.cend(), it); ASSERT_EQ(v, v2); // operator== true monoid.setExponent(0, 1 + monoid.exponent(v2.back(), 0), v2.back()); ASSERT_TRUE(v != v2); // operator!=, true, same length auto& vc = const_cast(v); ASSERT_TRUE(monoid.equal(v.front(), *v2.begin())); // front, non-const ASSERT_TRUE(monoid.equal(vc.front(), *v2.begin())); // front, const ASSERT_TRUE(monoid.equal(vc.back(), v.back())); // back, non-const auto v3(v2); // copy constructor ASSERT_EQ(v3.monoid(), monoid); ASSERT_TRUE(v != v3 && v2 == v3); v2.swap(v); // member swap ASSERT_TRUE(v == v3 && v2 != v3); std::swap(v, v2); // std::swap ASSERT_TRUE(v != v3 && v2 == v3); using std::swap; swap(v, v2); // let compiler decide which swap to use ASSERT_TRUE(v == v3 && v2 != v3); swap(v, v2); // get back to original state ASSERT_TRUE(v != v3 && v2 == v3); ASSERT_FALSE(v3 != v2); // operator!=, false, same length v3.push_back(); ASSERT_TRUE(v3 != v2); // operator!=, true, different length ASSERT_FALSE(v3 == v); v3 = v; // copy assignment ASSERT_EQ(v3.monoid(), monoid); ASSERT_EQ(v3, v); ASSERT_FALSE(v3.empty()); v2 = std::move(v3); // move assignment ASSERT_EQ(v2.monoid(), monoid); ASSERT_EQ(v2, v); ASSERT_TRUE(v3.empty()); ASSERT_FALSE(v2.empty()); auto v4(std::move(v2)); // move constructor ASSERT_EQ(v4.monoid(), monoid); ASSERT_TRUE(v2.empty()); ASSERT_EQ(v4, v); ASSERT_FALSE(v.empty()); v.clear(); ASSERT_TRUE(v.empty()); } TYPED_TEST(Monoids, MonoVector) { typedef TypeParam Monoid; typedef typename Monoid::MonoVector MonoVector; testMonoVector(); } TYPED_TEST(Monoids, MonoArena) { typedef TypeParam Monoid; typedef MonoArena Arena; Monoid monoid(15); Arena a(monoid); a.push_back(); return; testMonoVector>(); } TYPED_TEST(Monoids, ReadWriteMonoid) { typedef TypeParam Monoid; typedef typename Monoid::VarIndex VarIndex; const auto check = []( const char* const inStr, const char* const outStr, const VarIndex varCount, const VarIndex gradingCount ) -> void { for (int i = 0; i < 2; ++i) { const char* str = i == 0 ? inStr : outStr; if (str == 0) continue; std::istringstream inStream(str); Scanner in(inStream); const auto order = MathicIO(). readOrderWithVarCount(Monoid::HasComponent, in); const Monoid monoid(order); const auto constructedOrder = monoid.makeOrder (order.componentsAscendingDesired(), order.schreyering()); std::ostringstream out; MathicIO().writeOrderWithVarCount (constructedOrder, Monoid::HasComponent, out); ASSERT_EQ(outStr, out.str()); ASSERT_EQ(varCount, order.varCount()); ASSERT_EQ(varCount, monoid.varCount()); ASSERT_EQ(varCount, constructedOrder.varCount()); ASSERT_EQ(gradingCount, monoid.gradingCount()); } }; check("0 0\n", "0\nrevlex 0\n", 0, 0); check("1 1\n 2\n", "1\nrevlex 1\n 2\n", 1, 1); check("1 2\n 3\n 4\n", "1\nrevlex 2\n 3\n 4\n", 1, 2); check("2 2\n 3 4\n 5 6\n", "2\nrevlex 2\n 3 4\n 5 6\n", 2, 2); check("4 1\n 1 1 1 1\n", "4\nrevlex 1\n 1 1 1 1\n", 4, 1); check("0 lex 0", "0\nlex 0\n", 0, 0); check("1 lex 1 2", "1\nlex 1\n 2\n", 1, 1); check("1 lex 2 3 4", "1\nlex 2\n 3\n 4\n", 1, 2); check("2 lex 2 3 4 5 6", "2\nlex 2\n 3 4\n 5 6\n", 2, 2); check("4 lex 1 1 1 1 1", "4\nlex 1\n 1 1 1 1\n", 4, 1); if (Monoid::HasComponent) { check("2 2\n component\n 5 6\n", "2\nrevlex 2\n component\n 5 6\n", 2, 2); check ("2 2\n 3 4\n revcomponent\n","2\nrevlex 2\n 3 4\n revcomponent\n", 2, 2); check("0 lex 1 component", "0\nlex 1\n component\n", 0, 1); check("1 lex 1 revcomponent", "1\nlex 1\n revcomponent\n", 1, 1); check("5 lex 1 revcomponent", "5\nlex 1\n revcomponent\n", 5, 1); } } TYPED_TEST(Monoids, MonoPool) { typedef TypeParam Monoid; typedef typename Monoid::VarIndex VarIndex; typedef typename Monoid::Mono Mono; for (int q = 0; q < 2; ++q) { Monoid monoid(13); typename Monoid::MonoPool pool(monoid); const auto varCount = monoid.varCount(); const auto count = 1000; std::vector monos; for (int i = 0; i < count; ++i) { pool.alloc(); pool.free(pool.alloc()); auto m1 = pool.alloc(); ASSERT_TRUE(monoid.isIdentity(*m1)); auto m2 = pool.alloc(); ASSERT_TRUE(monoid.isIdentity(*m2)); for (VarIndex var = 0; var < varCount; ++var) { monoid.setExponent(var, 1, *m1); monoid.setExponent(var, 1, *m2); } if (i > 10) { using std::swap; swap(m2, monos[i - 10]); } monos.emplace_back(std::move(m1)); } // This ensures that we get to each entry in monos exactly once. MATHICGB_ASSERT((count % 17) != 0); int i = 0; do { MATHICGB_ASSERT(!monos[i].isNull()); ASSERT_FALSE(monoid.isIdentity(*monos[i])); pool.free(std::move(monos[i])); ASSERT_TRUE(monos[i].isNull()); pool.free(std::move(monos[i])); ASSERT_TRUE(monos[i].isNull()); i = (i + 17) % count; } while (i != 0); // If the ordering of monomials inside the pool has anything to do with // allocation and deallocation order, then the monomials inside the // pool are at this point all jumbled around. All the entries were also // non-zero before, so we test that new allocations are the identity. for (int i = 0; i < count; ++i) { monos[i] = pool.alloc(); ASSERT_TRUE(monoid.isIdentity(*monos[i])); for (VarIndex var = 0; var < varCount; ++var) monoid.setExponent(var, expect(i, var, varCount), *monos[i]); } for (int i = 0; i < count; ++i) { for (VarIndex var = 0; var < varCount; ++var) { ASSERT_EQ(expect(i, var, varCount), monoid.exponent(*monos[i], var)); } } // everything should be free'd now. Let's do all that again. } } namespace { template typename M::MonoVector parseVector( M& monoid, const char* str, const bool readComponent ) { typename M::MonoVector v(monoid); Scanner in(str); MathicIO().readMonomialVector(readComponent, in, v); return v; } } TYPED_TEST(Monoids, setExponentAndComponent) { typedef TypeParam Monoid; Monoid m(100); const std::string str = Monoid::HasComponent ? "1<0> a<0> z<0> A<0> Z<0> ab<0> a2<0> a2b<0> ab2<0> " "a20b30<0> 1<1> a<2> a2<3> ab<11>\n" : "1 a z A Z ab a2 a2b ab2 a20b30\n"; auto v2 = parseVector(m, str.c_str(), Monoid::HasComponent); std::ostringstream v2Out; MathicIO().writeMonomialVector(v2, Monoid::HasComponent, v2Out); ASSERT_EQ(str, v2Out.str()); decltype(v2) v(m); v.push_back(); // 1 v.push_back(); // a m.setExponent(0, 1, v.back()); v.push_back(); // z m.setExponent(25, 1, v.back()); v.push_back(); // A m.setExponent(26, 1, v.back()); v.push_back(); // Z m.setExponent(51, 1, v.back()); v.push_back(); // ab m.setExponent(0, 1, v.back()); m.setExponent(1, 1, v.back()); v.push_back(); // a2 m.setExponent(0, 2, v.back()); v.push_back(); // a2b m.setExponent(0, 2, v.back()); m.setExponent(1, 1, v.back()); v.push_back(); // ab2 m.setExponent(0, 1, v.back()); m.setExponent(1, 2, v.back()); v.push_back(); // a20b30 m.setExponent(0, 20, v.back()); m.setExponent(1, 30, v.back()); if (Monoid::HasComponent) { v.push_back(); // 1<1> m.setComponent(1, v.back()); v.push_back(); // a<2> m.setComponent(2, v.back()); m.setExponent(0, 1, v.back()); v.push_back(); // a2<3> m.setComponent(3, v.back()); m.setExponent(0, 2, v.back()); v.push_back(); // ab<11> m.setComponent(11, v.back()); m.setExponent(0, 1, v.back()); m.setExponent(1, 1, v.back()); } std::ostringstream vOut; MathicIO().writeMonomialVector(v, Monoid::HasComponent, vOut); ASSERT_EQ(str, vOut.str()); ASSERT_EQ(v, v2); } TYPED_TEST(Monoids, MultiplyDivide) { typedef TypeParam Monoid; Monoid m(49); typename Monoid::MonoPool pool(m); auto monoOwner = pool.alloc(); auto mono = *monoOwner; auto check = [&](const char* const str, const bool component) -> void { if (component && !Monoid::HasComponent) return; auto v = parseVector(m, str, component); MATHICGB_ASSERT(v.size() == 3); const auto& a = v.front(); const auto& b = *++v.begin(); const auto& c = v.back(); ASSERT_EQ(m.hashOfProduct(a, b), m.hash(c)); ASSERT_EQ(m.hashOfProduct(a, b), m.hashOfProduct(b, a)); // isProductOf ASSERT_TRUE(m.isProductOf(a, b, c)); ASSERT_TRUE(m.isProductOfHintTrue(a, b, c)); ASSERT_TRUE(m.isTwoProductsOfHintTrue(a, a, b, c, c)); // a*b == c using multiply m.multiply(a, b, mono); ASSERT_TRUE(m.equal(c, mono)); ASSERT_TRUE(m.compare(c, mono) == Monoid::EqualTo); ASSERT_EQ(m.hash(c), m.hash(mono)); // c/a == b using divide m.divide(a, c, mono); ASSERT_TRUE(m.equal(b, mono)); ASSERT_TRUE(m.compare(b, mono) == Monoid::EqualTo); ASSERT_EQ(m.hash(b), m.hash(mono)); // c/b == a using divideInPlace m.copy(c, mono); m.divideInPlace(b, mono); ASSERT_TRUE(m.equal(a, mono)); ASSERT_TRUE(m.compare(a, mono) == Monoid::EqualTo); ASSERT_EQ(m.hash(a), m.hash(mono)); // a*b == c using multiplyInPlace m.copy(a, mono); m.multiplyInPlace(b, mono); ASSERT_TRUE(m.equal(c, mono)); ASSERT_TRUE(m.compare(c, mono) == Monoid::EqualTo); ASSERT_EQ(m.hash(c), m.hash(mono)); // divides, check properties that mono=a*b should have ASSERT_TRUE(m.divides(mono, c)); ASSERT_TRUE(m.divides(c, mono)); ASSERT_TRUE(m.divides(a, mono)); ASSERT_TRUE(m.divides(b, mono)); // divides, general ASSERT_TRUE(m.divides(m, mono, c)); ASSERT_TRUE(m.divides(m, c, mono)); ASSERT_TRUE(m.divides(m, a, mono)); ASSERT_TRUE(m.divides(m, b, mono)); if (!m.isIdentity(a)) { ASSERT_TRUE(m.lessThan(b, mono)); ASSERT_FALSE(m.lessThan(mono, b)); ASSERT_TRUE(m.compare(mono, b) == Monoid::GreaterThan); ASSERT_FALSE(m.divides(mono, b)); ASSERT_FALSE(m.divides(m, mono, b)); ASSERT_FALSE(m.isProductOf(a, c, b)); ASSERT_FALSE(m.isProductOfHintTrue(a, c, b)); ASSERT_FALSE(m.isTwoProductsOfHintTrue(c, c, a, b, b)); ASSERT_FALSE(m.isTwoProductsOfHintTrue(b, c, a, c, b)); ASSERT_FALSE(m.isTwoProductsOfHintTrue(c, b, a, b, c)); } else { ASSERT_TRUE(m.equal(b, mono)); ASSERT_TRUE(m.compare(b, mono) == Monoid::EqualTo); ASSERT_TRUE(m.divides(mono, b)); ASSERT_TRUE(m.divides(m, mono, b)); } if (!m.isIdentity(b)) { ASSERT_TRUE(m.lessThan(a, mono)); ASSERT_FALSE(m.lessThan(mono, a)); ASSERT_TRUE(m.compare(mono, a) == Monoid::GreaterThan); ASSERT_FALSE(m.divides(mono, a)); ASSERT_FALSE(m.divides(m, mono, a)); ASSERT_FALSE(m.isProductOf(c, b, a)); ASSERT_FALSE(m.isProductOfHintTrue(b, c, a)); ASSERT_FALSE(m.isTwoProductsOfHintTrue(c, c, b, a, a)); ASSERT_FALSE(m.isTwoProductsOfHintTrue(a, c, b, c, a)); ASSERT_FALSE(m.isTwoProductsOfHintTrue(c, a, b, a, c)); } else { ASSERT_TRUE(m.equal(a, mono)); ASSERT_TRUE(m.compare(a, mono) == Monoid::EqualTo); ASSERT_TRUE(m.divides(m, mono, a)); } // Check that aliased parameters work. m.multiply(mono, mono, mono); m.divide(mono, mono, mono); MATHICGB_ASSERT(m.isIdentity(mono)); // Check that negative exponents work. if (Monoid::HasComponent && m.component(a) != m.component(b)) return; m.divideToNegative(a, b, mono); m.multiply(a, mono, mono); ASSERT_TRUE(m.equal(mono, b)); m.divideToNegative(b, a, mono); m.multiply(b, mono, mono); ASSERT_TRUE(m.equal(mono, a)); }; check("1 1 1", false); check("a<5> 1<0> a<5>", true); check("1 Vx Vx", false); check("aV bx abxV", false); check("a a2 a3", false); check("V<2> V2<0> V3<2>", true); check("arlgh svug arlg2hsvu", false); check ("abcdefghiV<7> ab2c3d4e5f6g7h8i9V11<0> a2b3c4d5e6f7g8h9i10V12<7>", true); } TYPED_TEST(Monoids, LcmColon) { typedef TypeParam Monoid; Monoid mNonConst(49); auto& m = mNonConst; typename Monoid::MonoPool pool(m); auto monoOwner = pool.alloc(); auto mono = *monoOwner; auto mono2Owner = pool.alloc(); auto mono2 = *mono2Owner; auto check = [&](const char* const str, const bool component) -> void { if (component && !Monoid::HasComponent) return; auto v = parseVector(m, str, component); MATHICGB_ASSERT(v.size() == 3); const auto& a = v.front(); const auto& b = *++v.begin(); const auto& lcm = v.back(); // isLcm (+general) ASSERT_TRUE(m.isLcm(a, b, lcm)); ASSERT_TRUE(m.isLcm(m, a, m, b, lcm)); m.copy(lcm, mono); m.setExponent(1, m.exponent(mono, 1) + 1, mono); ASSERT_FALSE(m.isLcm(a, b, mono)); ASSERT_FALSE(m.isLcm(m, a, m, b, mono)); // dividesLcm ASSERT_TRUE(m.dividesLcm(lcm, a, b)); ASSERT_FALSE(m.dividesLcm(mono, a, b)); ASSERT_TRUE(m.dividesLcm(a, a, a)); ASSERT_TRUE(m.dividesLcm(a, a, b)); ASSERT_TRUE(m.dividesLcm(b, b, b)); ASSERT_TRUE(m.dividesLcm(b, b, a)); // dividesLcm, general ASSERT_TRUE(m.dividesLcm(m, lcm, m, a, b)); ASSERT_FALSE(m.dividesLcm(m, mono, m, a, b)); ASSERT_TRUE(m.dividesLcm(m, a, m, a, a)); ASSERT_TRUE(m.dividesLcm(m, a, m, a, b)); ASSERT_TRUE(m.dividesLcm(m, b, m, b, b)); ASSERT_TRUE(m.dividesLcm(m, b, m, b, a)); // lcm(a, b) m.lcm(a, b, mono); ASSERT_TRUE(m.equal(mono, lcm)); ASSERT_TRUE(m.compare(mono, lcm) == Monoid::EqualTo); ASSERT_EQ(m.hash(lcm), m.hash(mono)); // lcm(b, a), general m.lcm(m, b, m, a, mono); ASSERT_TRUE(m.equal(mono, lcm)); ASSERT_TRUE(m.compare(mono, lcm) == Monoid::EqualTo); ASSERT_EQ(m.hash(lcm), m.hash(mono)); // colons m.colons(a, b, mono, mono2); m.multiply(b, mono, mono); m.multiply(a, mono2, mono2); ASSERT_TRUE(m.equal(mono, lcm)); ASSERT_TRUE(m.compare(mono, lcm) == Monoid::EqualTo); ASSERT_TRUE(m.equal(mono2, lcm)); ASSERT_TRUE(m.compare(mono2, lcm) == Monoid::EqualTo); }; check("1 1 1", false); check("a<2> 1<2> a<2>", true); check("1 Vx Vx", false); check("aV bx abxV", false); check("a a2 a2", false); check("V<3> V2<3> V2<3>", true); check("arlgh svug arlghsvu", false); check("a6b7c8d9efghiV ab2c3d4e5f6g7h8i9V11 a6b7c8d9e5f6g7h8i9V11", false); } TYPED_TEST(Monoids, Order) { typedef TypeParam Monoid; typedef typename Monoid::Order Order; typedef typename Monoid::Exponent Exponent; typedef typename Monoid::ConstMonoRef ConstMonoRef; auto check = []( const Monoid& m, const char* const sorted ) -> void { auto toStr = [&](ConstMonoRef mono) { std::ostringstream out; MathicIO().writeMonomial(m, false, mono, out); return out.str(); }; auto v = parseVector(m, sorted, false); for (auto greater = v.begin(); greater != v.end(); ++greater) { ASSERT_EQ(m.compare(*greater, *greater), Monoid::EqualTo); ASSERT_TRUE(m.equal(*greater, *greater)); ASSERT_FALSE(m.lessThan(*greater, *greater)); for (auto lesser = v.begin(); lesser != greater; ++lesser) { ASSERT_FALSE(m.equal(*lesser, *greater)); ASSERT_TRUE(m.lessThan(*lesser, *greater)) << "String = " << sorted << '\n' << "*lesser = " << toStr(*lesser) << '\n' << "*greater = " << toStr(*greater) << '\n'; ASSERT_FALSE(m.lessThan(*greater, *lesser)); ASSERT_EQ(m.compare(*lesser, *greater), Monoid::LessThan); ASSERT_EQ(m.compare(*greater, *lesser), Monoid::GreaterThan); } } }; const auto sortedTotalDegreeRevLex = "1 Z A z c b a c2 bc ac b2 ab a2 c3 abc b3 a3"; check(Monoid(52), sortedTotalDegreeRevLex); check( Monoid( Order(52, std::vector(52, 1), Order::RevLexBaseOrderFromRight) ), sortedTotalDegreeRevLex ); check( Monoid( Order(52, std::vector(52, 7), Order::RevLexBaseOrderFromRight) ), sortedTotalDegreeRevLex ); std::vector revLexGradings(52, 1); for (size_t grading = 51; grading != static_cast(-1); --grading) for (size_t var = 0; var < 52; ++var) revLexGradings.push_back(var == grading ? -1 : 0); check( Monoid( Order(52, std::vector(revLexGradings), Order::RevLexBaseOrderFromRight) ), sortedTotalDegreeRevLex ); check( Monoid( Order(52, std::move(revLexGradings), Order::LexBaseOrderFromRight) ), sortedTotalDegreeRevLex ); Exponent dupGradingsArray[] = { 5, 2, 3, 10, 4, 6, // duplicate, just multiplied by 2 -6, 9, 4, -6, 9, 4, -6, 9, 4, -6, 9, 4, -6, 9, 4 }; std::vector dupGradings( dupGradingsArray, dupGradingsArray + sizeof(dupGradingsArray)/sizeof(*dupGradingsArray) ); // b: 2 9 // c: 3 4 // a: 5 -7 // bc: 5 20 // c2: 6 8 // b3: 6 27 // bc3: 11 21 // ab3: 11 21 const auto sortedDupGradingsRevLex = "1 b c a bc c2 b3 bc3 ab3"; check( Monoid(Order(3, std::move(dupGradings), Order::RevLexBaseOrderFromRight)), sortedDupGradingsRevLex ); Exponent lexGradingsArray[] = { 0, 0, 1, 0, 1, 0, 1, 0, 0 }; std::vector lexGradings( lexGradingsArray, lexGradingsArray + sizeof(lexGradingsArray) / sizeof(*lexGradingsArray) ); const auto sortedLexFromRight = "1 a a2 a3 b ab a2b b2 ab2 b3 c ac bc abc c2 ac2 bc2 c3"; auto lexGradingsCheck = [&](typename Order::BaseOrder baseOrder) { check( Monoid(Order(3, std::vector(lexGradings), baseOrder)), sortedLexFromRight ); }; lexGradingsCheck(Order::LexBaseOrderFromRight); lexGradingsCheck(Order::RevLexBaseOrderFromRight); lexGradingsCheck(Order::LexBaseOrderFromLeft); lexGradingsCheck(Order::RevLexBaseOrderFromLeft); check( Monoid(Order(3, std::vector(), Order::LexBaseOrderFromRight)), sortedLexFromRight ); const auto sortedLexFromLeft = "1 c c2 c3 b cb bc2 b2 b2c b3 a ac ab abc a2 a2c a2b a3"; check( Monoid(Order(3, std::vector(), Order::LexBaseOrderFromLeft)), sortedLexFromLeft ); } TYPED_TEST(Monoids, RelativelyPrime) { typedef TypeParam Monoid; Monoid m(49); typename Monoid::MonoPool pool(m); auto mono = pool.alloc(); auto mono2 = pool.alloc(); auto check = [&](const char* str, bool relativelyPrime) -> void { auto v = parseVector(m, str, false); MATHICGB_ASSERT(v.size() == 2); ASSERT_EQ(relativelyPrime, m.relativelyPrime(v.front(), v.back())); ASSERT_EQ(relativelyPrime, m.relativelyPrime(v.back(), v.front())); }; check("1 1", true); check("1 abcdefgh", true); check("abc defgh", true); check("bdfh aceg", true); check("bdefh aceg", false); check("abcdefgh abcdefgh", false); check("fgh abcdef", false); } TYPED_TEST(Monoids, SetExponents) { typedef TypeParam Monoid; typedef typename Monoid::VarIndex VarIndex; typedef typename Monoid::MonoVector MonoVector; Monoid m(5); MonoVector v(m); v.push_back(); typename Monoid::Exponent exponents[] = {1, 2, 3, 4, 5}; m.setExternalExponents(exponents, v.back()); for (VarIndex var = 0; var < m.varCount(); ++var) { ASSERT_EQ(exponents[var], m.externalExponent(v.back(), var)); } } TYPED_TEST(Monoids, HasAmpleCapacityTotalDegree) { typedef TypeParam Monoid; typedef typename Monoid::Order Order; typedef typename Monoid::Exponent Exponent; typedef typename Monoid::VarIndex VarIndex; for (VarIndex varCount = 1; varCount < 33; ++varCount) { Monoid monoidTotalDegree(varCount); std::vector ones(varCount, 1); Monoid monoidTotalDegreeImplicit (Order(varCount, std::move(ones), Order::RevLexBaseOrderFromRight)); std::vector mostlyOnes(varCount, 1); mostlyOnes[0] = 7; Monoid monoidGeneral( Order(varCount, std::move(mostlyOnes), Order::RevLexBaseOrderFromRight) ); Monoid* monoids[] = { &monoidTotalDegree, &monoidTotalDegreeImplicit, &monoidGeneral }; for (int j = 0; j < 3; ++j) { auto& m = *monoids[j]; const auto firstDeg = (j == 2 ? 7 : 1); ASSERT_EQ(varCount, m.varCount()); typename Monoid::MonoPool p(m); auto monoOwner = p.alloc(); auto mono = *monoOwner; const auto last = m.varCount() - 1; const auto max = std::numeric_limits::max() / 2; // pure power, first variable m.setIdentity(mono); m.setExponent(0, max / firstDeg, mono); ASSERT_TRUE(m.hasAmpleCapacity(mono)); m.setExponent(0, max / firstDeg + 1, mono); ASSERT_FALSE(m.hasAmpleCapacity(mono)); if (varCount == 1) continue; // pure power, last variable m.setIdentity(mono); m.setExponent(last, max, mono); ASSERT_TRUE(m.hasAmpleCapacity(mono)); m.setExponent(last, max + 1, mono); ASSERT_FALSE(m.hasAmpleCapacity(mono)); // no exponent is too high but the degree is m.setIdentity(mono); m.setExponent(0, 12, mono); m.setExponent(last, max - 12 * firstDeg, mono); ASSERT_TRUE(m.hasAmpleCapacity(mono)); m.setExponent(0, 13, mono); ASSERT_FALSE(m.hasAmpleCapacity(mono)); } } } TYPED_TEST(Monoids, CopyEqualConversion) { typedef TypeParam Monoid; typedef typename Monoid::Order Order; typedef typename Monoid::Exponent Exponent; typedef typename Monoid::VarIndex VarIndex; static const bool HasComponent = Monoid::HasComponent; typedef MonoMonoid MonoidNone; typedef MonoMonoid MonoidAll; for (VarIndex varCount = 1; varCount < 33; ++varCount) { const Order order( varCount, std::vector(varCount, 1), Order::RevLexBaseOrderFromRight ); MonoidNone none(order); Monoid some(Monoid::create(none)); MonoidAll all(MonoidAll::create(some)); auto none1Owner = none.alloc(); auto none2Owner = none.alloc(); auto none3Owner = none.alloc(); auto some1Owner = some.alloc(); auto some2Owner = some.alloc(); auto some3Owner = some.alloc(); auto all1Owner = all.alloc(); auto all2Owner = all.alloc(); auto all3Owner = all.alloc(); auto none1 = *none1Owner; auto none2 = *none2Owner; auto none3 = *none3Owner; auto some1 = *some1Owner; auto some2 = *some2Owner; auto some3 = *some3Owner; auto all1 = *all1Owner; auto all2 = *all2Owner; auto all3 = *all3Owner; none.setExponent(0, 1, none1); none.setExponent(varCount / 2, 2, none1); none.setExponent(varCount - 1, 3, none1); none.copy(none1, none2); none.setExponent(0, 4, none2); some.setExponent(0, 1, some1); some.setExponent(varCount / 2, 2, some1); some.setExponent(varCount - 1, 3, some1); some.copy(some1, some2); some.setExponent(0, 4, some2); all.setExponent(0, 1, all1); all.setExponent(varCount / 2, 2, all1); all.setExponent(varCount - 1, 3, all1); all.copy(all1, all2); all.setExponent(0, 4, all2); // compare on none ASSERT_TRUE(none.equal(none, none1, none1)); ASSERT_TRUE(none.equal(some, some1, none1)); ASSERT_TRUE(none.equal(all, all1, none1)); ASSERT_FALSE(none.equal(none, none1, none2)); ASSERT_FALSE(none.equal(some, some1, none2)); ASSERT_FALSE(none.equal(all, all1, none2)); // compare on some ASSERT_TRUE(some.equal(none, none1, some1)); ASSERT_TRUE(some.equal(some, some1, some1)); ASSERT_TRUE(some.equal(all, all1, some1)); ASSERT_FALSE(some.equal(none, none1, some2)); ASSERT_FALSE(some.equal(some, some1, some2)); ASSERT_FALSE(some.equal(all, all1, some2)); // compare on all ASSERT_TRUE(all.equal(none, none1, all1)); ASSERT_TRUE(all.equal(some, some1, all1)); ASSERT_TRUE(all.equal(all, all1, all1)); ASSERT_FALSE(all.equal(none, none1, all2)); ASSERT_FALSE(all.equal(some, some1, all2)); ASSERT_FALSE(all.equal(all, all1, all2)); // convert some->none none.copy(some, some1, none3); ASSERT_TRUE(none.equal(none1, none3)); ASSERT_FALSE(none.equal(none2, none3)); none.copy(some, some2, none3); ASSERT_FALSE(none.equal(none1, none3)); ASSERT_TRUE(none.equal(none2, none3)); /// convert some->all all.copy(some, some1, all3); ASSERT_TRUE(all.equal(all1, all3)); ASSERT_FALSE(all.equal(all2, all3)); all.copy(some, some2, all3); ASSERT_FALSE(all.equal(all1, all3)); ASSERT_TRUE(all.equal(all2, all3)); // convert none->some some.copy(none, none1, some3); ASSERT_TRUE(some.equal(some1, some3)); ASSERT_FALSE(some.equal(some2, some3)); some.copy(none, none2, some3); ASSERT_FALSE(some.equal(some1, some3)); ASSERT_TRUE(some.equal(some2, some3)); // convert Y->some some.copy(none, none1, some3); ASSERT_TRUE(some.equal(some1, some3)); ASSERT_FALSE(some.equal(some2, some3)); some.copy(none, none2, some3); ASSERT_FALSE(some.equal(some1, some3)); ASSERT_TRUE(some.equal(some2, some3)); } } mathicgb-1.1/src/test/Range.cpp0000664000175000017500000001373014560325357012140 #include #include #include // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "mathicgb/stdinc.h" #include "mathicgb/Range.hpp" #include #include #include #include #include using namespace mgb; namespace { template void checkRange(const Range1& r1, const Range2& r2) { const auto d1 = std::distance(std::begin(r1), std::end(r1)); const auto d2 = std::distance(std::begin(r2), std::end(r2)); ASSERT_EQ(d1, d2); ASSERT_TRUE(std::equal(std::begin(r1), std::end(r1), std::begin(r2))); } } TEST(Range, Simple) { int intArray[] = {1, 5, 3, 7}; const std::vector intVector(std::begin(intArray), std::end(intArray)); const std::list intList(std::begin(intArray), std::end(intArray)); std::vector v; auto checkClear = [&]() { checkRange(intVector, v); v.clear(); }; // Let's try the pattern without using range just to make sure everything // is OK. for (const auto& i : intArray) v.push_back(i); checkClear(); // *** check using intArray. for (const auto& i : range(intArray)) v.push_back(i); checkClear(); for (const auto& i : range(std::begin(intArray), std::end(intArray))) v.push_back(i); checkClear(); // *** check using intVector for (const auto& i : range(intVector)) v.push_back(i); checkClear(); for (const auto& i : range(std::begin(intVector), std::end(intVector))) v.push_back(i); checkClear(); // *** check using intList for (const auto& i : range(intList)) v.push_back(i); checkClear(); for (const auto& i : range(std::begin(intList), std::end(intList))) v.push_back(i); checkClear(); // *** check using iterated range for (const auto& i : range(range(std::begin(intArray), std::end(intArray)))) v.push_back(i); checkClear(); for (const auto& i : range(range(intVector))) v.push_back(i); checkClear(); for (const auto& i : range(range(range(range(intList))))) v.push_back(i); checkClear(); } TEST(Range, rangeToVector) { int intArray[] = {1, 5, 3, 7}; const std::vector intVector(std::begin(intArray), std::end(intArray)); ASSERT_EQ(intVector, rangeToVector(std::begin(intArray), std::end(intArray))); ASSERT_EQ(intVector, rangeToVector(intArray)); ASSERT_EQ(intVector, rangeToVector(range(intArray))); } TEST(Range, zip) { const std::string a[] = {"hello", "world"}; const int b[] = {4, 2, 1, 0}; std::ostringstream out; // Put a range() around b just to test something other than a built-in for (const auto& p : zip(a, range(b))) out << p.first << p.second << ' '; ASSERT_EQ("hello4 world2 ", out.str()); // Now try the version on iterators and put the range around a instead. out.str(""); for ( const auto& p : zip(std::begin(range(a)), std::end(range(a)), std::begin(b), std::end(b)) ) out << p.first << p.second << ' '; ASSERT_EQ("hello4 world2 ", out.str()); } TEST(Range, intRange) { const int int05[] = {0, 1, 2, 3, 4}; ASSERT_EQ(rangeToVector(int05), rangeToVector(intRange(0, 5))); ASSERT_EQ(rangeToVector(int05), rangeToVector(intRange(5))); // gcc 4.7.3 won't parse "const signed char" here, but it will parse // it like this with the typedef. typedef signed char C; const C scharm2p5[] = {-2, -1, 0, 1, 2, 3, 4}; ASSERT_EQ( rangeToVector(range(scharm2p5)), rangeToVector(intRange(C(-2), C(5))) ); // Normally we should not dereference an end() iterator, but for the case // of intRange() it is OK. ASSERT_EQ(std::numeric_limits::max(), *intRange().end()); ASSERT_EQ(size_t(0), *intRange().begin()); } TEST(Range, indexRange) { typedef std::pair Pair; Pair indexed[] = {Pair(-2, 0), Pair(-1, 1), Pair(0, 2)}; ASSERT_EQ( rangeToVector(indexed), rangeToVector(indexRange(intRange(-2, 1))) ); } TEST(Range, oppositePairRange) { const std::string elems[] {"hello", "world", "!"}; const auto r = zip(elems, intRange(10)); const auto opR = zip(intRange(3), elems); auto val1 = rangeToVector(r); auto val2a = oppositePairRange(opR); auto val3a = std::begin(val2a); auto val3b = std::end(val2a); auto val3 = rangeToVector(val3a,val3b); auto val2 = rangeToVector(val2a); ASSERT_EQ(val1, val2); ASSERT_EQ(rangeToVector(r), rangeToVector(oppositePairRange(opR))); ASSERT_EQ( rangeToVector(opR), rangeToVector(oppositePairRange(std::begin(r), std::end(r))) ); } TEST(Range, adjPairRange) { typedef std::pair Pair; std::vector none; ASSERT_EQ(rangeToVector(none), rangeToVector(adjPairRange(intRange(0)))); ASSERT_EQ(rangeToVector(none), rangeToVector(adjPairRange(intRange(1)))); Pair adj2[] = {Pair(0, 1)}; ASSERT_EQ(rangeToVector(adj2), rangeToVector(adjPairRange(intRange(2)))); Pair adj4[] = {Pair(0, 1), Pair(1, 2), Pair(2, 3)}; ASSERT_EQ(rangeToVector(adj4), rangeToVector(adjPairRange(intRange(4)))); } TEST(Range, flatten) { std::vector> v(3); v[0].push_back(1); v[2].push_back(2); v[2].push_back(3); std::ostringstream out; for (const auto& i : flatten(v)) out << i << ' '; ASSERT_EQ("1 2 3 ", out.str()); } TEST(Range, flattenRecursive) { std::list>> outer; outer.emplace_back(); outer.emplace_back(); outer.back().emplace_back(); outer.back().emplace_back(); outer.back().back().insert(1); outer.back().emplace_back(); outer.back().back().insert(2); outer.back().emplace_back(); outer.back().emplace_back(); outer.back().back().insert(3); outer.back().back().insert(4); outer.back().back().insert(5); outer.back().back().insert(6); outer.back().emplace_back(); outer.back().back().insert(7); outer.back().emplace_back(); outer.back().emplace_back(); std::ostringstream out; for (const auto& i : flatten(flatten(outer))) out << i << ' '; ASSERT_EQ("1 2 3 4 5 6 7 ", out.str()); } mathicgb-1.1/src/test/F4MatrixBuilder.cpp0000664000175000017500000001405214560325357014047 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "mathicgb/stdinc.h" #include "mathicgb/Poly.hpp" #include "mathicgb/PolyRing.hpp" #include "mathicgb/F4MatrixBuilder.hpp" #include "mathicgb/Basis.hpp" #include "mathicgb/PolyBasis.hpp" #include "mathicgb/io-util.hpp" #include "mathicgb/mtbb.hpp" #include "mathicgb/MathicIO.hpp" #include #include using namespace mgb; namespace { // We need a struct to keep the ring and so on alive after // construction - we cannot just return an object. // // @todo: This whole thing is fairly ridiculous - some kind of more // general dependency injection mechanism might be nice here. struct BuilderMaker { BuilderMaker(): mRing(ringFromString("101 6 1\n1 1 1 1 1 1")), mIdeal(*mRing), mBasis( *mRing, MonoLookup::makeFactory(mRing->monoid(), 1)->make(true, true) ) {} const Poly& addBasisElement(const std::string& str) { std::istringstream in(str); Scanner scanner(in); auto p = make_unique (MathicIO<>().readPoly(*mRing, false, scanner)); mBasis.insert(std::move(p)); return mBasis.poly(mBasis.size() - 1); } F4MatrixBuilder& create() { MATHICGB_ASSERT(mBuilder.get() == 0); mBuilder.reset(new F4MatrixBuilder(mBasis)); return *mBuilder; } const PolyRing& ring() const {return *mRing;} private: std::unique_ptr mRing; Basis mIdeal; PolyBasis mBasis; std::unique_ptr mBuilder; }; } // TODO: fix the setting of number of threads. TEST(F4MatrixBuilder, Empty) { for (int threadCount = 1; threadCount < 4; ++threadCount) { mtbb::task_arena scheduler(threadCount); BuilderMaker maker; F4MatrixBuilder& builder = maker.create(); QuadMatrix matrix(maker.ring()); scheduler.execute([&builder,&matrix]{ builder.buildMatrixAndClear(matrix); }); ASSERT_EQ(0, matrix.topLeft.rowCount()); ASSERT_EQ(0, matrix.bottomLeft.rowCount()); ASSERT_EQ(0, matrix.topLeft.computeColCount()); ASSERT_EQ(0, matrix.topRight.computeColCount()); ASSERT_EQ(0, matrix.leftColumnMonomials.size()); ASSERT_EQ(0, matrix.rightColumnMonomials.size()); } } TEST(F4MatrixBuilder, SPair) { for (int threadCount = 1; threadCount < 4; ++threadCount) { mtbb::task_arena scheduler(threadCount); BuilderMaker maker; const Poly& p1 = maker.addBasisElement("a4c2-d"); const Poly& p2 = maker.addBasisElement("a4b+d"); // S-pair of p1 and p2 is -c2d-bd maker.addBasisElement("c2d+3"); F4MatrixBuilder& builder = maker.create(); builder.addSPolynomialToMatrix(p1, p2); QuadMatrix qm(builder.ring()); scheduler.execute([&builder,&qm]{ builder.buildMatrixAndClear(qm); }); const char* const str1 = "Left columns: c2d\n" "Right columns: bd 1\n" "0: 0#1 | 0: 1#3 \n" " | \n" "0: 0#100 | 0: 0#100\n"; const char* const str2 = "Left columns: c2d\n" "Right columns: bd 1\n" "0: 0#1 | 0: 0#1\n" " | \n" "0: 0#1 | 0: 1#3\n"; std::string qmStr = qm.toString(); ASSERT_TRUE(str1 == qmStr || str2 == qmStr) << "\n** str1: " << str1 << "\n** qm: " << qmStr; } } TEST(F4MatrixBuilder, OneByOne) { for (int threadCount = 1; threadCount < 4; ++threadCount) { mtbb::task_arena scheduler(threadCount); BuilderMaker maker; const Poly& p = maker.addBasisElement("a"); F4MatrixBuilder& builder = maker.create(); builder.addPolynomialToMatrix(p.leadMono(), p); QuadMatrix qm(builder.ring()); scheduler.execute([&builder, &qm]{ builder.buildMatrixAndClear(qm); }); const char* str = "Left columns: a2\n" "Right columns:\n" "0: 0#1 | 0:\n" " | \n" "0: 0#1 | 0:\n"; ASSERT_EQ(str, qm.toString()) << "** qm:\n" << qm; } } TEST(F4MatrixBuilder, DirectReducers) { for (int threadCount = 1; threadCount < 4; ++threadCount) { BuilderMaker maker; maker.addBasisElement("a6"); // reducer == to lead term maker.addBasisElement("a3b2+a3c"); // reducer == to lower order term maker.addBasisElement("c"); // reducer divides maker.addBasisElement("d2"); // does not divide F4MatrixBuilder& builder = maker.create(); Poly p1(builder.ring()); { std::istringstream in("a3+b2+c+d"); Scanner scanner(in); p1 = MathicIO<>().readPoly(builder.ring(), false, scanner); builder.addPolynomialToMatrix(p1.leadMono(), p1); } Poly p2(builder.ring()); { std::istringstream in("a3+2b2+3c+4d"); Scanner scanner(in); p2 = MathicIO<>().readPoly(builder.ring(), false, scanner); builder.addPolynomialToMatrix(p2.leadMono(), p2); } QuadMatrix qm(builder.ring()); builder.buildMatrixAndClear(qm); const char* str = "Left columns: a6 a3b2 a3c\n" "Right columns: a3d\n" "0: 2#1 | 0: \n" "1: 1#1 2#1 | 1: \n" "2: 0#1 | 2: \n" " | \n" "0: 0#1 1#1 2#1 | 0: 0#1\n" "1: 0#1 1#2 2#3 | 1: 0#4\n"; qm = qm.toCanonical(); ASSERT_EQ(str, qm.toString()) << "** qm:\n" << qm; } } TEST(F4MatrixBuilder, IteratedReducer) { for (int threadCount = 1; threadCount < 4; ++threadCount) { BuilderMaker maker; const Poly& p1 = maker.addBasisElement("a4-a3"); const Poly& p2 = maker.addBasisElement("a-1"); F4MatrixBuilder& builder = maker.create(); builder.addPolynomialToMatrix(p1.leadMono(), p2); QuadMatrix qm(builder.ring()); builder.buildMatrixAndClear(qm); const char* str = "Left columns: a5 a4 a3 a2 a\n" "Right columns: 1\n" "0: 4#1 | 0: 0#100\n" "1: 3#1 4#100 | 1: \n" "2: 2#1 3#100 | 2: \n" "3: 1#1 2#100 | 3: \n" "4: 0#1 1#100 | 4: \n" " | \n" "0: 0#1 1#100 | 0: \n"; ASSERT_EQ(str, qm.toCanonical().toString()) << "** qm:\n" << qm; } } mathicgb-1.1/src/test/QuadMatrixBuilder.cpp0000664000175000017500000002053414560325357014472 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "mathicgb/stdinc.h" #include "mathicgb/QuadMatrixBuilder.hpp" #include "mathicgb/Poly.hpp" #include "mathicgb/PolyRing.hpp" #include "mathicgb/io-util.hpp" #include "mathicgb/Basis.hpp" #include "mathicgb/QuadMatrix.hpp" #include "mathicgb/MathicIO.hpp" #include using namespace mgb; namespace { [[maybe_unused]] std::string monToStr(const PolyRing& ring, ConstMonomial a) { std::ostringstream out; ring.monomialDisplay(out, a, false, true); return out.str(); } template std::string monoToStr( const Monoid& monoid, typename Monoid::ConstMonoRef a ) { std::ostringstream out; MathicIO().writeMonomial(monoid, false, a, out); return out.str(); } void createColumns(const char* left, const char* right, QuadMatrixBuilder& b) { const PolyRing& ring = b.ring(); { std::istringstream in(left); Scanner scanner(in); auto p = MathicIO<>().readPolyDoNotOrder(ring, true, scanner); size_t colCount = 0; for (auto it = p.begin(); it != p.end(); ++it) { QuadMatrixBuilder::LeftRightColIndex lrCol = b.createColumnLeft(it.mono()).first; ASSERT_TRUE(lrCol.left()); ASSERT_FALSE(lrCol.right()); auto col = lrCol.leftIndex(); ASSERT_EQ(col, lrCol.index()); ASSERT_EQ(colCount, col); ++colCount; } } { std::istringstream in(right); Scanner scanner(in); auto p = MathicIO<>().readPolyDoNotOrder(ring, true, scanner); size_t colCount = 0; for (auto it = p.begin(); it != p.end(); ++it) { QuadMatrixBuilder::LeftRightColIndex lrCol = b.createColumnRight(it.mono()).first; ASSERT_TRUE(lrCol.right()); ASSERT_FALSE(lrCol.left()); auto col = lrCol.rightIndex(); ASSERT_EQ(col, lrCol.index()); ASSERT_EQ(colCount, col); ++colCount; } } } } TEST(QuadMatrixBuilder, Empty) { // test a builder with no rows and no columns PolyRing ring(2, PolyRing::Monoid(0)); QuadMatrixBuilder::Map map(ring); QuadMatrixBuilder::Monomials monoLeft; QuadMatrixBuilder::Monomials monoRight; QuadMatrixBuilder b(ring, map, monoLeft, monoRight); const char* matrixStr = "Left columns:\n" "Right columns:\n" "matrix with no rows | matrix with no rows\n" " | \n" "matrix with no rows | matrix with no rows\n"; auto matrix = b.buildMatrixAndClear(); matrix.leftColumnMonomials = monoLeft; matrix.rightColumnMonomials = monoRight; ASSERT_EQ(matrixStr, matrix.toString()); } TEST(QuadMatrixBuilder, Construction) { std::unique_ptr ring(ringFromString("32003 6 1\n1 1 1 1 1 1")); QuadMatrixBuilder::Map map(*ring); QuadMatrixBuilder::Monomials monoLeft; QuadMatrixBuilder::Monomials monoRight; QuadMatrixBuilder b(*ring, map, monoLeft, monoRight); createColumns("a<1>+<0>", "bc<0>+b<0>+c<0>", b); // top row: nothing, nothing b.rowDoneTopLeftAndRight(); // top row: 0#1 1#2, 2#3 b.appendEntryTopLeft(0, 1); b.appendEntryTopLeft(1, 2); b.appendEntryTopRight(2, 3); b.rowDoneTopLeftAndRight(); // bottom row: 1#4, nothing b.appendEntryBottomLeft(1,4); b.rowDoneBottomLeftAndRight(); // bottom row: nothing, 0#5 b.appendEntryBottomRight(0,5); b.rowDoneBottomLeftAndRight(); // bottom row: nothing, nothing b.rowDoneBottomLeftAndRight(); const char* matrixStr = "Left columns: a 1\n" "Right columns: bc b c\n" "0: | 0: \n" "1: 0#1 1#2 | 1: 2#3\n" " | \n" "0: 1#4 | 0: \n" "1: | 1: 0#5\n" "2: | 2: \n"; auto matrix = b.buildMatrixAndClear(); matrix.leftColumnMonomials = monoLeft; matrix.rightColumnMonomials = monoRight; ASSERT_EQ(matrixStr, matrix.toString()); } TEST(QuadMatrixBuilder, ColumnQuery) { std::unique_ptr ring(ringFromString("32003 6 1\n1 1 1 1 1 1")); QuadMatrixBuilder::Map map(*ring); QuadMatrixBuilder::Monomials monoLeft; QuadMatrixBuilder::Monomials monoRight; QuadMatrixBuilder b(*ring, map, monoLeft, monoRight); createColumns("a<1>+<0>", "b<0>+c<0>+bc<0>", b); // coefficient 1X=left, 2X=right, 30=not there, % 10 = column index std::istringstream in ("10a<1>+11<0>+20b<0>+21c<0>+22bc<0>+30ab<0>+30e<0>+10a<1>"); Scanner scanner(in); auto p = MathicIO<>().readPolyDoNotOrder(b.ring(), true, scanner); for (auto it = p.begin(); it != p.end(); ++it) { const QuadMatrixBuilder::LeftRightColIndex* col = MonomialMap::Reader(map). find(it.mono()).first; if (it.coef() / 10 == 3) ASSERT_EQ(col, static_cast(0)); else { ASSERT_TRUE(col != static_cast(0)); ASSERT_EQ(it.coef() % 10, col->index()); if (it.coef() / 10 == 2) ASSERT_TRUE(col->right()); else ASSERT_TRUE(col->left()); } } } TEST(QuadMatrixBuilder, SortColumns) { // construct builder and reverse lex order std::unique_ptr ring(ringFromString("32003 6 1\n1 1 1 1 1 1")); Basis basis(*ring); // one row top, no rows bottom, no columns { QuadMatrixBuilder::Map map(*ring); QuadMatrixBuilder::Monomials monoLeft; QuadMatrixBuilder::Monomials monoRight; QuadMatrixBuilder b(*ring, map, monoLeft, monoRight); b.rowDoneTopLeftAndRight(); auto matrix = b.buildMatrixAndClear(); matrix.sortColumnsLeftRightParallel(); const char* matrixStr = "Left columns:\n" "Right columns:\n" "0: | 0: \n" " | \n" "matrix with no rows | matrix with no rows\n"; ASSERT_EQ(matrixStr, matrix.toString()); } { QuadMatrixBuilder::Map map(*ring); QuadMatrixBuilder::Monomials monoLeft; QuadMatrixBuilder::Monomials monoRight; QuadMatrixBuilder b(*ring, map, monoLeft, monoRight); createColumns("<0>+a<0>", "b<0>+bcd<0>+bc<0>", b); b.appendEntryTopLeft(0,1); b.appendEntryTopLeft(1,2); b.appendEntryTopRight(0,3); b.appendEntryTopRight(1,4); b.appendEntryTopRight(2,5); b.rowDoneTopLeftAndRight(); b.appendEntryBottomLeft(0,6); b.appendEntryBottomLeft(1,7); b.appendEntryBottomRight(0,8); b.appendEntryBottomRight(1,9); b.appendEntryBottomRight(2,10); b.rowDoneBottomLeftAndRight(); auto matrix = b.buildMatrixAndClear(); matrix.leftColumnMonomials = monoLeft; matrix.rightColumnMonomials = monoRight; const char* matrixStr1 = "Left columns: 1 a\n" "Right columns: b bcd bc\n" "0: 0#1 1#2 | 0: 0#3 1#4 2#5 \n" " | \n" "0: 0#6 1#7 | 0: 0#8 1#9 2#10\n"; ASSERT_EQ(matrixStr1, matrix.toString()); const char* matrixStr2 = "Left columns: a 1\n" "Right columns: bcd bc b\n" "0: 1#1 0#2 | 0: 2#3 0#4 1#5 \n" " | \n" "0: 1#6 0#7 | 0: 2#8 0#9 1#10\n"; matrix.sortColumnsLeftRightParallel(); ASSERT_EQ(matrixStr2, matrix.toString()); matrix.sortColumnsLeftRightParallel(); ASSERT_EQ(matrixStr2, matrix.toString()); } } TEST(QuadMatrixBuilder, BuildAndClear) { std::unique_ptr ring(ringFromString("32003 6 1\n1 1 1 1 1 1")); QuadMatrixBuilder::Map map(*ring); QuadMatrixBuilder::Monomials monoLeft; QuadMatrixBuilder::Monomials monoRight; QuadMatrixBuilder b(*ring, map, monoLeft, monoRight); createColumns("a<1>+<0>", "b<0>+c<0>+bc<0>", b); b.appendEntryTopLeft(1, 1); b.appendEntryTopRight(2, 2); b.rowDoneTopLeftAndRight(); b.appendEntryBottomLeft(1, 3); b.appendEntryBottomRight(2, 4); b.rowDoneBottomLeftAndRight(); QuadMatrix qm(b.buildMatrixAndClear()); qm.leftColumnMonomials = monoLeft; qm.rightColumnMonomials = monoRight; // test that the quad matrix is right ASSERT_EQ("0: 1#1\n", qm.topLeft.toString()); ASSERT_EQ("0: 2#2\n", qm.topRight.toString()); ASSERT_EQ("0: 1#3\n", qm.bottomLeft.toString()); ASSERT_EQ("0: 2#4\n", qm.bottomRight.toString()); ASSERT_EQ(2, qm.leftColumnMonomials.size()); ASSERT_EQ(3, qm.rightColumnMonomials.size()); const auto& monoid = ring->monoid(); ASSERT_EQ("a", monoToStr(monoid, *qm.leftColumnMonomials[0])); ASSERT_EQ("b", monoToStr(monoid, *qm.rightColumnMonomials[0])); } mathicgb-1.1/src/test/MathicIO.cpp0000664000175000017500000002324214560325357012540 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "mathicgb/stdinc.h" #include "mathicgb/MathicIO.hpp" #include using namespace mgb; TEST(MathicIO, Combined) { const char* const str = "32003 6\n" "1 1 1 1 1 1 1\n" "_revlex revcomponent\n" "3\n" " -bc+ad\n" " -b2+af\n" " -bc2+a2e\n"; std::istringstream inStream(str); Scanner in(inStream); auto p = MathicIO<>().readRing(true, in); auto& ring = *p.first; auto basis = MathicIO<>().readBasis(ring, false, in); } TEST(MathicIO, ReadWriteRing) { typedef PolyRing::Monoid Monoid; typedef Monoid::VarIndex VarIndex; // typedef Monoid::Exponent Exponent; typedef PolyRing::Field BaseField; typedef BaseField::RawElement RawElement; auto check = [&]( const char* const inStr, const char* outStr, const RawElement charac, const VarIndex varCount, const VarIndex gradingCount, const bool withComponent ) { for (int i = 0; i < 2; ++i) { const char* str = i == 0 ? inStr : outStr; if (str == 0) continue; Scanner in(str); const auto p = MathicIO<>().readRing(withComponent, in); const auto& monoid = p.first->monoid(); const auto& field = p.first->field(); ASSERT_EQ(charac, field.charac()); ASSERT_EQ(varCount, monoid.varCount()); ASSERT_EQ(gradingCount, monoid.gradingCount()); std::ostringstream out; MathicIO<>().writeRing(*p.first, p.second, withComponent, out); ASSERT_EQ(outStr, out.str()); } }; check("101 2 1 3 4", "101 2\nrevlex 1\n 3 4\n", 101, 2, 1, false); check( "101 2 schreyer lex 1 3 4 _lex revcomponent", "101 2\nschreyer lex 1\n 3 4\n _lex\n revcomponent\n", 101, 2, 1, true ); check( "101 2 2 component 3 4", "101 2\nrevlex 2\n component\n 3 4\n", 101, 2, 2, true ); } TEST(MathicIO, ReadWriteMonomial) { typedef PolyRing::Monoid Monoid; typedef Monoid::VarIndex VarIndex; typedef Monoid::Exponent Exponent; static const auto NoComponent = static_cast(-1); static const auto NoExponent = NoComponent; static const auto NoVar = static_cast(-1); Monoid m(28); // canonicalStr is str as it should appear after being read and // printed. If canonicalStr is null then this is the same as str. auto check = [&]( const char* const str, const Exponent component, const VarIndex var1, const Exponent exp1, const VarIndex var2, const Exponent exp2, const char* const canonicalStr ) { const bool doComponent = component != NoComponent; // read monomial from string auto monoRead = m.alloc(); Scanner in(str); MathicIO<>().readMonomial(m, doComponent, *monoRead, in); // directly make monomial auto monoSet = m.alloc(); if(var1!=NoVar) m.setExponent(var1, exp1, *monoSet); if(var2!=NoVar) m.setExponent(var2, exp2, *monoSet); if (doComponent) m.setComponent(component, *monoSet); ASSERT_TRUE(m.equal(*monoRead, *monoSet)) << "Str: " << str; // print monomial std::ostringstream out; MathicIO<>().writeMonomial(m, doComponent, *monoRead, out); const auto correctStr = canonicalStr == 0 ? str : canonicalStr; ASSERT_EQ(correctStr, out.str()); }; check("1", NoComponent, NoVar,NoExponent, NoVar,NoExponent, 0); check("1<0>", 0, NoVar,NoExponent, NoVar,NoExponent, 0); check("1<1>", 1, NoVar,NoExponent, NoVar,NoExponent, 0); check("1<999>", 999, NoVar,NoExponent, NoVar,NoExponent, 0); check("a1", NoComponent, 0,1, NoVar,NoExponent, "a"); check("b10<0>", 0, 1,10, NoVar,NoExponent, 0); check("A11", NoComponent, 26,11, NoVar,NoExponent, 0); check("B99<1>", 1, 27,99, NoVar,NoExponent, 0); check("ab", NoComponent, 0,1, 1,1, 0); check("ba", NoComponent, 0,1, 1,1, "ab"); check("a0c3b1", NoComponent, 1,1, 2,3, "bc3"); check("ab<2>", 2, 0,1, 1,1, 0); } TEST(MathicIO, ReadWriteBasis) { typedef PolyRing::Monoid Monoid; typedef PolyRing::Field Field; PolyRing ring(Field(101), Monoid(28)); auto check = [&]( const char* const inStr, const char* const outStr, const bool doComponent ) { for (int i = 0; i < 2; ++i) { const char* str = i == 0 ? inStr : outStr; if (str == 0) continue; Scanner in(str); const auto basis = MathicIO<>().readBasis(ring, doComponent, in); std::ostringstream out; MathicIO<>().writeBasis(basis, doComponent, out); const auto correctStr = outStr == 0 ? inStr : outStr; ASSERT_EQ(correctStr, out.str()); } }; check("0", "0\n", false); check("0", "0\n", true); check("1 0", "1\n 0\n", false); check("1 0", "1\n 0\n", true); check("1 1", "1\n 1\n", false); check("1 a<0>", "1\n a<0>\n", true); check("2 a b", "2\n a\n b\n", false); } TEST(MathicIO, ReadWritePoly) { typedef PolyRing::Monoid Monoid; typedef PolyRing::Field Field; PolyRing ring(Field(101), Monoid(28)); auto check = [&]( const char* const inStr, const char* const outStr, const bool doComponent ) { for (int i = 0; i < 2; ++i) { const char* str = i == 0 ? inStr : outStr; if (str == 0) continue; Scanner in(str); const auto poly = MathicIO<>().readPolyDoNotOrder(ring, doComponent, in); std::ostringstream out; MathicIO<>().writePoly(poly, doComponent, out); const auto correctStr = outStr == 0 ? inStr : outStr; ASSERT_EQ(correctStr, out.str()); } }; check("+0", "0", false); check("-0", "0", false); check("+1", "1", false); check("\t a\t", "a", false); check("3a+1b5+2c6", "3a+b5+2c6", false); check("+0", "0", true); check("-0", "0", true); check("+1<5>", "1<5>", true); check("\t a<0>\t", "a<0>", true); check("3a<1>+1b5<2>+2c6<3>", "3a<1>+b5<2>+2c6<3>", true); } TEST(MathicIO, ReadWriteTerm) { typedef PolyRing::Monoid Monoid; // typedef Monoid::VarIndex VarIndex; // typedef Monoid::Exponent Exponent; typedef PolyRing::Field Field; typedef Field::Element Coefficient; typedef Field::RawElement RawCoefficient; //static const auto NoComponent = static_cast(-1); PolyRing ring(Field(101), Monoid(28)); auto&& m = ring.monoid(); auto&& f = ring.field(); auto check = [&]( const char* const inStr, const char* const outStr, const bool doComponent, const RawCoefficient coef ) { for (int i = 0; i < 2; ++i) { const char* str = i == 0 ? inStr : outStr; if (str == 0) continue; // read term from string auto monoRead = m.alloc(); Coefficient readCoef = f.zero(); Scanner in(str); MathicIO<>().readTerm(ring, doComponent, readCoef, *monoRead, in); ASSERT_EQ(coef, readCoef.value()); // print monomial std::ostringstream out; MathicIO<>().writeTerm (ring, doComponent, readCoef, *monoRead, false, out); const auto correctStr = outStr == 0 ? inStr : outStr; ASSERT_EQ(correctStr, out.str()); } }; check("1", 0, false, 1); check("-1", "-1", false, f.minusOne().value()); check("+1", "1", false, 1); check("2", 0, false, 2); check("+102", "1", false, 1); check("1<0>", 0, true, 1); check("+1<2>", "1<2>", true, 1); check("2<3>", 0, true, 2); check("+3<4>", "3<4>", true, 3); check("-3<4>", "-3<4>", true, f.negative(f.toElement(3)).value()); check("+1a<0>", "a<0>", true, 1); check("+2b", "2b", false, 2); } TEST(MathicIO, ReadWriteBaseField) { Scanner in("101"); auto field = MathicIO<>().readBaseField(in); ASSERT_EQ(101, field.charac()); std::ostringstream out; MathicIO<>().writeBaseField(field, out); ASSERT_EQ("101", out.str()); } TEST(MathicIO, ReadWriteOrder) { typedef PolyRing::Monoid Monoid; typedef Monoid::VarIndex VarIndex; const auto check = []( const char* const inStr, const char* const outStr, const VarIndex varCount, const VarIndex gradingCount, const bool withComponent, const bool componentsAscendingDesired, const bool schreyering ) -> void { for (int i = 0; i < 2; ++i) { const char* str = i == 0 ? inStr : outStr; if (str == 0) continue; Scanner in(str); const auto order = MathicIO<>().readOrder(varCount, withComponent, in); ASSERT_EQ(varCount, order.varCount()); ASSERT_EQ(gradingCount, order.gradingCount()) << inStr; ASSERT_EQ(componentsAscendingDesired, order.componentsAscendingDesired()); ASSERT_EQ(schreyering, order.schreyering()) << inStr; std::ostringstream out; MathicIO<>().writeOrder(order, withComponent, out); ASSERT_EQ(outStr, out.str()); } }; check("0\n", "revlex 0\n", 0, 0, 0,1,0); check("1\n 2\n", "revlex 1\n 2\n", 1, 1, 0,1,0); check("2\n 3\n 4\n", "revlex 2\n 3\n 4\n", 1, 2, 0,1,0); check("2\n 3 4\n 5 6\n", "revlex 2\n 3 4\n 5 6\n", 2, 2, 0,1,0); check("1\n 1 1 1 1\n", "revlex 1\n 1 1 1 1\n", 4, 1, 0,1,0); check("lex 0", "lex 0\n", 0, 0, 0,1,0); check("lex 1 2", "lex 1\n 2\n", 1, 1, 0,1,0); check("lex 2 3 4", "lex 2\n 3\n 4\n", 1, 2, 0,1,0); check("lex 2 3 4 5 6", "lex 2\n 3 4\n 5 6\n", 2, 2, 0,1,0); check("lex 1 1 1 1 1", "lex 1\n 1 1 1 1\n", 4, 1, 0,1,0); check("2 component\n 5 6\n", "revlex 2\n component\n 5 6\n", 2, 1, 1, 1, 0); check("2 3 4\nrevcomponent\n","revlex 2\n 3 4\n revcomponent\n",2, 1, 1,0,0); check("lex 1 component", "lex 1\n component\n", 0, 0, 1, 1, 0); check("lex 1 revcomponent", "lex 1\n revcomponent\n", 1, 0, 1, 0, 0); check("lex 1 revcomponent", "lex 1\n revcomponent\n", 5, 0, 1, 0, 0); check( "schreyer lex 1 1 _revlex revcomponent", "schreyer revlex 1\n 1\n _revlex\n revcomponent\n", 1, 1, 1, 0, 1 ); } mathicgb-1.1/src/test/SparseMatrix.cpp0000664000175000017500000000526014560325357013525 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "mathicgb/stdinc.h" #include "mathicgb/SparseMatrix.hpp" #include "mathicgb/Poly.hpp" #include "mathicgb/PolyRing.hpp" #include "mathicgb/io-util.hpp" #include "mathicgb/MathicIO.hpp" #include #include #include using namespace mgb; namespace { std::unique_ptr parsePoly(const PolyRing& ring, std::string str) { std::istringstream in(str); Scanner scanner(in); return make_unique(MathicIO<>().readPoly(ring, false, scanner)); } } TEST(SparseMatrix, NoRows) { SparseMatrix mat; // test a matrix with no rows ASSERT_EQ(0, mat.entryCount()); ASSERT_EQ(0, mat.rowCount()); ASSERT_EQ(0, mat.computeColCount()); ASSERT_EQ("matrix with no rows\n", mat.toString()); } TEST(SparseMatrix, Simple) { SparseMatrix mat; mat.appendEntry(5, 101); mat.rowDone(); ASSERT_EQ(1, mat.entryCount()); ASSERT_EQ(1, mat.rowCount()); ASSERT_EQ(6, mat.computeColCount()); ASSERT_EQ(5, mat.leadCol(0)); ASSERT_EQ(1, mat.entryCountInRow(0)); ASSERT_EQ("0: 5#101\n", mat.toString()); ASSERT_FALSE(mat.emptyRow(0)); mat.rowDone(); // add a row with no entries ASSERT_EQ(1, mat.entryCount()); ASSERT_EQ(2, mat.rowCount()); ASSERT_EQ(6, mat.computeColCount()); ASSERT_EQ(5, mat.leadCol(0)); ASSERT_EQ(0, mat.entryCountInRow(1)); ASSERT_EQ("0: 5#101\n1:\n", mat.toString()); ASSERT_TRUE(mat.emptyRow(1)); mat.appendEntry(5, 102); mat.appendEntry(2001, 0); // scalar zero mat.rowDone(); // add a row with two entries ASSERT_EQ(3, mat.entryCount()); ASSERT_EQ(3, mat.rowCount()); ASSERT_EQ(2002, mat.computeColCount()); ASSERT_EQ(5, mat.leadCol(2)); ASSERT_EQ(2, mat.entryCountInRow(2)); ASSERT_EQ("0: 5#101\n1:\n2: 5#102 2001#0\n", mat.toString()); ASSERT_FALSE(mat.emptyRow(2)); } TEST(SparseMatrix, toRow) { auto ring = ringFromString("32003 6 1\n1 1 1 1 1 1"); auto polyForMonomials = parsePoly(*ring, "a5+a4+a3+a2+a1+a0"); std::vector monomials; for (auto it = polyForMonomials->begin(); it != polyForMonomials->end(); ++it) monomials.push_back(it.mono().ptr()); SparseMatrix mat(5); mat.clear(); mat.rowDone(); mat.appendEntry(0,10); mat.rowDone(); mat.appendEntry(2,20); mat.appendEntry(3,0); mat.appendEntry(4,40); mat.rowDone(); Poly p(*ring); mat.rowToPolynomial(0, monomials, p); ASSERT_EQ(*parsePoly(*ring, "0"), p); mat.rowToPolynomial(1, monomials, p); ASSERT_EQ(*parsePoly(*ring, "10a5"), p); mat.rowToPolynomial(2, monomials, p); ASSERT_EQ(*parsePoly(*ring, "20a3+40a1"), p); } mathicgb-1.1/src/mathicgb/0000775000175000017500000000000015117247675011260 5mathicgb-1.1/src/mathicgb/Reducer.hpp0000664000175000017500000001207414560325357013301 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_REDUCER_GUARD #define MATHICGB_REDUCER_GUARD #include "PolyRing.hpp" #include #include MATHICGB_NAMESPACE_BEGIN class Poly; class SigPolyBasis; class PolyBasis; /// Abstract base class for classes that allow reduction of polynomials. /// /// @todo: consider changing name of findLeadTerm to leadTerm. class Reducer { public: typedef PolyRing::Monoid Monoid; typedef Monoid::Mono Mono; typedef Monoid::MonoRef MonoRef; typedef Monoid::ConstMonoRef ConstMonoRef; typedef Monoid::MonoPtr MonoPtr; typedef Monoid::ConstMonoPtr ConstMonoPtr; typedef coefficient Coefficient; virtual ~Reducer(); /// Returns the preferred number of reductions to do at a time. A classic /// serial reducer will have no particular benefit from doing more than /// one reduction at a time, so it should say that. A matrix-based or /// parallel reducer will have benefit from being presented with /// larger sets of reductions at a time. virtual unsigned int preferredSetSize() const = 0; virtual std::string description() const = 0; virtual size_t getMemoryUse() const = 0; // ***** Methods that do reduction /// Clasically reduces poly by the basis elements of basis. The reduction /// is classic in that no signatures are taken into account. virtual std::unique_ptr classicReduce (const Poly& poly, const PolyBasis& basis) = 0; /// Clasically reduces poly by the basis elements of basis, except that the /// lead term is not reduced. The reduction is classic in that no signatures /// are taken into account. virtual std::unique_ptr classicTailReduce (const Poly& poly, const PolyBasis& basis) = 0; /// Clasically reduces the S-polynomial between a and b. virtual std::unique_ptr classicReduceSPoly (const Poly& a, const Poly& b, const PolyBasis& basis) = 0; /// Clasically reduces the S-polynomial of these pairs. May or may /// not also interreduce these to some extent. Polynomials that are /// reduced to zero are not put into reducedOut. virtual void classicReduceSPolySet( std::vector >& spairs, const PolyBasis& basis, std::vector >& reducedOut ) = 0; /// Clasically reduces the passed-in polynomials of these pairs. May /// or may not also interreduce these to some extent. Polynomials /// that are reduced to zero are not put into reducedOut. virtual void classicReducePolySet( const std::vector >& polys, const PolyBasis& basis, std::vector >& reducedOut ) = 0; /// Regular reduce multiple*basisElement in signature sig by the /// basis elements in basis. Returns null (0) if multiple*basisElement /// is not regular top reducible -- this indicates a singular /// reduction. virtual std::unique_ptr regularReduce( ConstMonoRef sig, ConstMonoRef multiple, size_t basisElement, const SigPolyBasis& basis ) = 0; /// Sets how many bytes of memory to increase the memory use by /// at a time - if such a thing is appropriate for the reducer. virtual void setMemoryQuantum(size_t quantum) = 0; // ***** Kinds of reducers and creating a Reducer enum ReducerType { Reducer_TourTree_NoDedup = 7, Reducer_TourTree_Dedup, Reducer_TourTree_Hashed, Reducer_TourTree_NoDedup_Packed, Reducer_TourTree_Dedup_Packed, Reducer_TourTree_Hashed_Packed, Reducer_Heap_NoDedup, Reducer_Heap_Dedup, Reducer_Heap_Hashed, Reducer_Heap_NoDedup_Packed, Reducer_Heap_Dedup_Packed, Reducer_Heap_Hashed_Packed, Reducer_Geobucket_NoDedup, Reducer_Geobucket_Dedup, Reducer_Geobucket_Hashed, Reducer_Geobucket_NoDedup_Packed, Reducer_Geobucket_Dedup_Packed, Reducer_Geobucket_Hashed_Packed, Reducer_F4_Old, Reducer_F4_New }; static std::unique_ptr makeReducer (ReducerType t, const PolyRing& ring); static std::unique_ptr makeReducerNullOnUnknown (ReducerType t, const PolyRing& ring); static ReducerType reducerType(int typ); static void displayReducerTypes(std::ostream& out); class Registration { public: Registration( const char* name, ReducerType id, std::unique_ptr (*create)(const PolyRing&) ); private: friend class Reducer; const char* mName; ReducerType mId; std::unique_ptr (*mCreate)(const PolyRing&); }; }; /// Registers a reducer type with the given name and id. The value of /// create, when executed, should be something convertible to a /// std::unique_ptr. CREATE may pick up a const PolyRing& /// by the name ring. #define MATHICGB_REGISTER_REDUCER(NAME, ID, CREATE) \ namespace { \ Reducer::Registration MATHICGB_UNIQUE(reducerRegistration) ( \ NAME, \ Reducer:: ID, \ [](const PolyRing& ring) -> std::unique_ptr { \ return CREATE; \ } \ ); \ } MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/MonoOrder.hpp0000664000175000017500000001464214560325357013617 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_MONO_ORDER_GUARD #define MATHICGB_MONO_ORDER_GUARD #include #include MATHICGB_NAMESPACE_BEGIN /// Class used to describe an monomial order and/or a module monomial /// order. Use this class to construct a monoid. The monoid does the /// actual comparisons. Monomials must be preprocessed by MonoProcessor - /// otherwise the ordering may not be correct. MonoProcessor also offers /// additional parameters for making orders. template class MonoOrder; template class MonoOrder { public: typedef W Weight; typedef size_t VarIndex; typedef std::vector Gradings; static const size_t ComponentAfterBaseOrder = static_cast(-1); enum BaseOrder { /// Lexicographic order with x_0 < x_1 < ... < x_n. LexBaseOrderFromRight = 0, /// Reverse lexicographic order with x_0 > x_1 > ... > x_n. RevLexBaseOrderFromRight = 1, /// Lexicographic order with x_0 > x_1 > ... > x_n. LexBaseOrderFromLeft = 2, /// Reverse lexicographic order with x_0 < x_1 < ... < x_n. RevLexBaseOrderFromLeft = 3 }; /// The specified base order is graded by the gradings matrix. /// /// The layout of the gradings matrix is row-major. For comparisons, /// the degree with respect to the first row is considered first, /// then the degree with respect to the second row and so on. The /// base order is used as a tie-breaker. The gradings vector can be /// empty. The order must be a monomial order - in particular, 1 /// must be strictly less than all other monomials. /// /// For module monomials, the component is considered too. When the /// component is considered depends on componentBefore. If /// componentBefore == 0 then the component is considered before /// anything else. If componentBefore < gradingCount(), then the /// component is considered before the grading with index /// componentBefore and after the grading with index componentBefore /// - 1. If componentBefore == gradingCount(), then the component is /// considered after all gradings and before the base order. If /// componentBefore = ComponentAfterBaseOrder then the component is /// considered after everything else, including afte the base order. MonoOrder( const VarIndex varCount, Gradings&& gradings, const BaseOrder baseOrder = RevLexBaseOrderFromRight, const size_t componentBefore = ComponentAfterBaseOrder, const bool componentsAscendingDesired = true, const bool schreyering = true ): mVarCount(varCount), mGradings(std::move(gradings)), mBaseOrder(baseOrder), mComponentBefore(componentBefore), mSchreyering(schreyering), mComponentsAscendingDesired(componentsAscendingDesired) { MATHICGB_ASSERT(debugAssertValid()); } /// Same as MonoOrder(varCount, varOrder, gradings, componentBefore) /// where gradings has a single row of varCount 1's. MonoOrder( const VarIndex varCount, const BaseOrder baseOrder = RevLexBaseOrderFromRight, const size_t componentBefore = ComponentAfterBaseOrder, const bool componentsAscendingDesired = true, const bool schreyering = true ): mVarCount(varCount), mGradings(varCount, 1), mBaseOrder(baseOrder), mComponentBefore(componentBefore), mSchreyering(schreyering), mComponentsAscendingDesired(componentsAscendingDesired) { MATHICGB_ASSERT(debugAssertValid()); } VarIndex varCount() const {return mVarCount;} VarIndex componentBefore() const {return mComponentBefore;} /// Returns the number of rows in the grading vector. size_t gradingCount() const { return varCount() == 0 ? 0 : mGradings.size() / varCount(); } /// Returns the grading matrix in row-major layout. const Gradings& gradings() const {return mGradings;} /// Returns true if the grading matrix is a single row of 1's. bool isTotalDegree() const { if (varCount() == 0 || mGradings.size() != varCount()) return false; for (VarIndex var = 0; var < varCount(); ++var) if (mGradings[var] != 1) return false; return true; } BaseOrder baseOrder() const {return mBaseOrder;} bool hasFromLeftBaseOrder() const { return baseOrder() == LexBaseOrderFromLeft || baseOrder() == RevLexBaseOrderFromLeft; } bool hasLexBaseOrder() const { return baseOrder() == LexBaseOrderFromLeft || baseOrder() == LexBaseOrderFromRight; } /// Returns true if the order is a monomial order. A monomial order /// is a total order on monomials where a>b => ac>bc for all /// monomials a,b,c and where the order is a well order. Only the /// well order property could currently fail. It is equivalent to /// stating that x>1 for all variables x. bool isMonomialOrder() const { for (VarIndex var = 0; var < varCount(); ++var) { // Check that x_var > 1. for (size_t grading = 0; ; ++grading) { if (grading == gradingCount()) { // The column was entirely zero, so x_var > 1 if and only if the // base ordering is lex. if (!hasLexBaseOrder()) return false; break; } const auto index = grading * varCount() + var; MATHICGB_ASSERT(index < mGradings.size()); if (mGradings[index] != 0) { // We have found the first non-zero weight in this column, // so x_var > 1 if and only if this weight is positive. if (mGradings[index] < 0) return false; break; } } } return true; } bool componentsAscendingDesired() const {return mComponentsAscendingDesired;} bool schreyering() const {return mSchreyering;} private: bool debugAssertValid() { #ifdef MATHICGB_DEBUG MATHICGB_ASSERT(mGradings.size() == gradingCount() * varCount()); MATHICGB_ASSERT( mComponentBefore == ComponentAfterBaseOrder || mComponentBefore <= gradingCount() ); MATHICGB_ASSERT( mBaseOrder == LexBaseOrderFromLeft || mBaseOrder == RevLexBaseOrderFromLeft || mBaseOrder == LexBaseOrderFromRight || mBaseOrder == RevLexBaseOrderFromRight ); #endif return true; } const VarIndex mVarCount; const Gradings mGradings; const BaseOrder mBaseOrder; const size_t mComponentBefore; const bool mSchreyering; const bool mComponentsAscendingDesired; }; MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/F4MatrixBuilder2.cpp0000664000175000017500000005117114560325357014733 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "F4MatrixBuilder2.hpp" #include "LogDomain.hpp" #include "F4MatrixProjection.hpp" MATHICGB_DEFINE_LOG_DOMAIN( F4MatrixBuild2, "Displays statistics about F4 matrix construction." ); MATHICGB_DEFINE_LOG_DOMAIN( F4MatrixSizes, "Displays row and column count for each F4 matrix construction." ); MATHICGB_NAMESPACE_BEGIN class F4MatrixBuilder2::Builder { public: typedef PolyRing::Field Field; typedef PolyRing::Monoid Monoid; typedef Monoid::Mono Mono; typedef Monoid::MonoRef MonoRef; typedef Monoid::ConstMonoRef ConstMonoRef; typedef Monoid::MonoPtr MonoPtr; typedef Monoid::ConstMonoPtr ConstMonoPtr; typedef SparseMatrix::ColIndex ColIndex; typedef SparseMatrix::Scalar Scalar; typedef MonomialMap Map; typedef SparseMatrix::RowIndex RowIndex; /// Initializes the set of add-this-row tasks. void initializeRowsToReduce(std::vector& tasks) { // If aF-bG is an S-pair that is added as a bottom row in the matrix, and // we do not already have a reducer for the common leading term of aF and // bG, then we can instead set bG as a top/reducer/pivot row and put aF // as a bottom row. This way, we do not need to add a reducer for that // column if that monomial turns out to be used. We can also use the // faster code path for adding a single multiple like aF to the matrix // instead of the more complicated path that adds the difference between // two multiples aF-bG. // // If bG is already the top/reducer/pivot row for its leading monomial, // then we can simply replace a bottom row aF-bG with aF directly, since // the first computation that will happen will be to calculate aF-bG. // This way we get to use the much faster code in the matrix reducer for // making that reduction/Gaussian-elimination step. More importantly, we // have 1 row less to construct. // // The above two cases turn rows specified like aF-bG into rows specified // more simply as just aF. Note that we can interchange aF and bG in these // arguments with no problems. // // These two cases will apply to all // S-pairs with a given leading monomial if and only if there is a single // bG that appears in all of those S-pairs. The absolute best case is // if that single common bG is at the same time the most preferable // (sparsest or oldest) reducer for that monomial. It is not trivial to // realize this (in fact I should write a paper it), but the particular // way that S-pair elimination works in MathicGB ensures that this best // case is always the case. So the code below will get rid of all the // S-pairs aF-bG and replace them with single bottom rows aF. // However, if the S-pair elimination code is ever changed, that may // no longer be the case, so this code is still supposed to work even // if some S-pairs are not gotten rid of. Still, there is an assert // to flag it if the S-pair elimination is accidentally broken so that it // no longer gives this guarantee. // Bring S-pairs with the same leading monomial together by ordering // them according in increasing order of monomial. Put the non-S-pairs // together at the front. auto cmp = [&](const RowTask& a, const RowTask& b) { if (a.sPairPoly == nullptr) return b.sPairPoly != nullptr; else return monoid().lessThan(*a.desiredLead, *b.desiredLead); }; mtbb::parallel_sort(tasks.begin(), tasks.end(), cmp); const auto taskCount = tasks.size(); for (size_t i = 0; i < taskCount;) { if (tasks[i].sPairPoly == 0) { ++i; continue; } MATHICGB_ASSERT(tasks[i].desiredLead != nullptr); MATHICGB_ASSERT(ColReader(mMap).find(*tasks[i].desiredLead).first == 0); // Create column for the lead term that cancels in the S-pair if (mIsColumnToLeft.size() >= std::numeric_limits::max()) throw std::overflow_error("Too many columns in matrix."); const auto newIndex = static_cast(mIsColumnToLeft.size()); const auto inserted = mMap.insert(std::make_pair(tasks[i].desiredLead, newIndex)); mIsColumnToLeft.push_back(true); const auto& mono = inserted.first.second; // Schedule the two parts of the S-pair as separate rows. This adds a row // while creating the column in the hash table without adding a reducer // removes a row, effectively making this operation equivalent to taking // half of the S-pair and using it as a reducer. auto desiredLead = monoid().alloc(); monoid().copy(*mono, *desiredLead); RowTask newTask = {desiredLead.release(), tasks[i].sPairPoly, nullptr}; // Now we can strip off any part of an S-pair with the same cancelling lead // term that equals a or b since those rows are in the matrix. const auto* const a = tasks[i].poly; const auto* const b = tasks[i].sPairPoly; tasks[i].sPairPoly = 0; tasks.push_back(newTask); for (++i; i < taskCount; ++i) { // auto& task = tasks[i]; if (tasks[i].sPairPoly == 0) continue; MATHICGB_ASSERT(tasks[i].desiredLead != nullptr); if (!monoid().equal(*tasks[i].desiredLead, *mono)) break; if (tasks[i].poly == a || tasks[i].poly == b) { tasks[i].poly = tasks[i].sPairPoly; tasks[i].sPairPoly = 0; } else if (tasks[i].sPairPoly == a || tasks[i].sPairPoly == b) { tasks[i].sPairPoly = 0; } else MATHICGB_ASSERT(false); } } } void buildMatrixAndClear(std::vector& tasks, QuadMatrix& quadMatrix) { MATHICGB_ASSERT(&quadMatrix.ring() == &ring()); MATHICGB_LOG_TIME(F4MatrixBuild2) << "\n***** Constructing matrix *****\n"; if (tasks.empty()) { quadMatrix.clear(); return; } initializeRowsToReduce(tasks); // The MonoRef's cannot be Mono's since enumerable_thread_specific // apparently requires the stored data type to be copyable and // Mono is not copyable. struct ThreadData { MonoRef tmp1; MonoRef tmp2; F4ProtoMatrix block; }; mtbb::enumerable_thread_specific threadData([&](){ // We need to grab a lock since monoid isn't internally synchronized. const mtbb::lock_guard guard(mCreateColumnLock); ThreadData data = { *monoid().alloc().release(), *monoid().alloc().release(), F4ProtoMatrix() }; return data; }); // Construct the matrix as pre-blocks mtbb::parallel_for_each(tasks.begin(), tasks.end(), [&](const RowTask& task, TaskFeeder& feeder) { auto& data = threadData.local(); const auto& poly = *task.poly; // It is perfectly permissible for task.sPairPoly to be non-null. The // assert is there because of an interaction between S-pair // elimination/choice and the use of halves of S-pairs as reducers. The // current effect of these is that *all* S-pairs have a component split // off so that sPairPoly is always null (this is non-trivial to // realize). So if this assert goes off, you've messed that interaction // up somehow or you are using this class in some new way. So you can // remove the assert if necessary. MATHICGB_ASSERT(task.sPairPoly == 0); if (task.sPairPoly != 0) { monoid().colons( poly.leadMono(), task.sPairPoly->leadMono(), data.tmp2, data.tmp1 ); appendRowSPair (poly, data.tmp1, *task.sPairPoly, data.tmp2, data.block, feeder); return; } if (task.desiredLead == nullptr) monoid().setIdentity(data.tmp1); else monoid().divide(poly.leadMono(), *task.desiredLead, data.tmp1); appendRow(data.tmp1, *task.poly, data.block, feeder); }); MATHICGB_ASSERT(!threadData.empty()); // as tasks empty causes early return // Free the monomials from all the tasks for (const auto& task : tasks) if (task.desiredLead != nullptr) monoid().freeRaw(*task.desiredLead.castAwayConst()); tasks.clear(); // Move the proto-matrices across all threads into the projection. F4MatrixProjection projection (ring(), static_cast(mMap.entryCount())); for (auto& data : threadData) { monoid().freeRaw(data.tmp1); monoid().freeRaw(data.tmp2); projection.addProtoMatrix(std::move(data.block)); } // Sort columns by monomial and tell the projection of the resulting order MonomialMap::Reader reader(mMap); typedef std::pair IndexMono; auto toPtr = [](std::pair p) { return std::make_pair(p.first, &p.second); }; std::vector columns; std::transform (reader.begin(), reader.end(), std::back_inserter(columns), toPtr); const auto cmp = [&](const IndexMono& a, const IndexMono b) { return monoid().lessThan(*b.second, *a.second); }; mtbb::parallel_sort(columns.begin(), columns.end(), cmp); const auto colEnd = columns.end(); for (auto it = columns.begin(); it != colEnd; ++it) { const auto p = *it; projection.addColumn(p.first, *p.second, mIsColumnToLeft[p.first]); } quadMatrix = projection.makeAndClear(mMemoryQuantum); MATHICGB_LOG(F4MatrixSizes) << "F4[" << mathic::ColumnPrinter::commafy(quadMatrix.rowCount()) << " by " << mathic::ColumnPrinter::commafy( quadMatrix.computeLeftColCount() + quadMatrix.computeRightColCount()) << "]" << std::endl; #ifdef MATHICGB_DEBUG for (size_t side = 0; side < 2; ++side) { auto& monos = side == 0 ? quadMatrix.leftColumnMonomials : quadMatrix.rightColumnMonomials; for (auto it = monos.begin(); it != monos.end(); ++it) { MATHICGB_ASSERT(!it->isNull()); } } for (RowIndex row = 0; row < quadMatrix.topLeft.rowCount(); ++row) { MATHICGB_ASSERT(quadMatrix.topLeft.entryCountInRow(row) > 0); MATHICGB_ASSERT(quadMatrix.topLeft.leadCol(row) == row); } MATHICGB_ASSERT(quadMatrix.debugAssertValid()); #endif } const PolyRing& ring() const {return mBasis.ring();} const Monoid& monoid() const {return ring().monoid();} const Field& field() const {return ring().field();} Builder(const PolyBasis& basis, const size_t memoryQuantum): mMemoryQuantum(memoryQuantum), mTmp(basis.ring().monoid().alloc()), mMap(basis.ring()), mBasis(basis) { // This assert has to be _NO_ASSUME since otherwise the compiler will // assume that the error checking branch here cannot be taken and optimize // it away. const Scalar maxScalar = std::numeric_limits::max(); MATHICGB_ASSERT_NO_ASSUME(ring().charac() <= maxScalar); if (ring().charac() > maxScalar) mathic::reportInternalError("F4MatrixBuilder2: too large characteristic."); } typedef const Map::Reader ColReader; typedef std::vector Monomials; using TaskFeeder = mtbb::feeder; /// Creates a column with monomial label monoA * monoB and schedules a new /// row to reduce that column if possible. If such a column already /// exists, then a new column is not inserted. In either case, returns /// the column index and column monomial corresponding to monoA * monoB. /// /// createColumn can be used simply to search for an existing column, but /// since createColumn incurs locking overhead, this is not a good idea. /// Note that createColumn has to work correctly for pre-existing columns /// because the only way to be *certain* that no other thread has inserted /// the column of interest is to grab a lock, and the lock being grabbed /// is being grabbed inside createColumn. MATHICGB_NO_INLINE std::pair createColumn( ConstMonoRef monoA, ConstMonoRef monoB, TaskFeeder& feeder ) { const mtbb::lock_guard guard(mCreateColumnLock); // see if the column exists now after we have synchronized { const auto found(ColReader(mMap).findProduct(monoA, monoB)); if (found.first != 0) return std::make_pair(*found.first, *found.second); } // The column really does not exist, so we need to create it monoid().multiply(monoA, monoB, mTmp); if (!monoid().hasAmpleCapacity(*mTmp)) mathic::reportError("Monomial exponent overflow in F4MatrixBuilder2."); // look for a reducer of mTmp const size_t reducerIndex = mBasis.classicReducer(*mTmp); const bool insertLeft = (reducerIndex != static_cast(-1)); // Create the new left or right column if (mIsColumnToLeft.size() >= std::numeric_limits::max()) throw std::overflow_error("Too many columns in QuadMatrix"); const auto newIndex = static_cast(mIsColumnToLeft.size()); const auto inserted = mMap.insert(std::make_pair(mTmp.ptr(), newIndex)); mIsColumnToLeft.push_back(insertLeft); // schedule new task if we found a reducer if (insertLeft) { RowTask task = {}; task.poly = &mBasis.poly(reducerIndex); task.desiredLead = inserted.first.second; feeder.add(task); } return std::make_pair(*inserted.first.first, *inserted.first.second); } /// Append multiple * poly to block, creating new columns as necessary. void appendRow( ConstMonoRef multiple, const Poly& poly, F4ProtoMatrix& block, TaskFeeder& feeder ) { const auto begin = poly.begin(); const auto end = poly.end(); const auto count = poly.termCount(); MATHICGB_ASSERT(count < std::numeric_limits::max()); auto indices = block.makeRowWithTheseScalars(poly); auto it = begin; if ((count % 2) == 1) { ColReader reader(mMap); const auto col = findOrCreateColumn (it.mono(), multiple, reader, feeder); MATHICGB_ASSERT(it.coef() < std::numeric_limits::max()); MATHICGB_ASSERT(!field().isZero(it.coef())); *indices = col.first; ++indices; ++it; } updateReader: ColReader colMap(mMap); while (it != end) { MATHICGB_ASSERT(it.coef() < std::numeric_limits::max()); MATHICGB_ASSERT(!field().isZero(it.coef())); // Unused. Remove. const auto scalar1 = static_cast(it.coef()); const auto mono1 = it.mono(); auto it2 = it; ++it2; MATHICGB_ASSERT(it2.coef() < std::numeric_limits::max()); MATHICGB_ASSERT(!field().isZero(it2.coef())); // Unused. Remove. const auto scalar2 = static_cast(it2.coef()); const auto mono2 = it2.mono(); const auto colPair = colMap.findTwoProducts(mono1, mono2, multiple); if (colPair.first == 0 || colPair.second == 0) { createColumn(mono1, multiple, feeder); createColumn(mono2, multiple, feeder); goto updateReader; } *indices = *colPair.first; ++indices; *indices = *colPair.second; ++indices; it = ++it2; } } /// Append poly*multiply - sPairPoly*sPairMultiply to block, creating new /// columns as necessary. void appendRowSPair( const Poly& poly, ConstMonoRef multiply, const Poly& sPairPoly, ConstMonoRef sPairMultiply, F4ProtoMatrix& block, TaskFeeder& feeder ) { MATHICGB_ASSERT(!poly.isZero()); auto itA = poly.begin(); const auto endA = poly.end(); MATHICGB_ASSERT(!sPairPoly.isZero()); auto itB = sPairPoly.begin(); const auto endB = sPairPoly.end(); // skip leading terms since they cancel MATHICGB_ASSERT(itA.coef() == itB.coef()); ++itA; ++itB; // @todo: handle overflow of termCount addition here MATHICGB_ASSERT(poly.termCount() + sPairPoly.termCount() - 2 <= std::numeric_limits::max()); const auto maxCols = static_cast(poly.termCount() + sPairPoly.termCount() - 2); auto row = block.makeRow(maxCols); const auto indicesBegin = row.first; const ColReader colMap(mMap); auto mulA = multiply; auto mulB = sPairMultiply; while (itB != endB && itA != endA) { const auto colA = findOrCreateColumn (itA.mono(), mulA, colMap, feeder); const auto colB = findOrCreateColumn (itB.mono(), mulB, colMap, feeder); const auto cmp = monoid().compare(colA.second, colB.second); coefficient coeff = 0; ColIndex col; if (cmp != LT) { coeff = itA.coef(); col = colA.first; ++itA; } if (cmp != GT) { coeff = ring().coefficientSubtract(coeff, itB.coef()); col = colB.first; ++itB; } MATHICGB_ASSERT(coeff < std::numeric_limits::max()); if (coeff != 0) { *row.first++ = col; *row.second++ = static_cast(coeff); } } for (; itA != endA; ++itA) { const auto colA = findOrCreateColumn (itA.mono(), mulA, colMap, feeder); *row.first++ = colA.first; *row.second++ = static_cast(itA.coef()); } for (; itB != endB; ++itB) { const auto colB = findOrCreateColumn (itB.mono(), mulB, colMap, feeder); const auto negative = ring().coefficientNegate(itB.coef()); *row.first = colB.first; ++row.first; *row.second = static_cast(negative); ++row.second; } const auto toRemove = maxCols - static_cast(row.first - indicesBegin); block.removeLastEntries(block.rowCount() - 1, toRemove); } /// As createColumn, except with much better performance in the common /// case that the column for monoA * monoB already exists. In particular, /// no lock is grabbed in that case. MATHICGB_NO_INLINE std::pair findOrCreateColumn( ConstMonoRef monoA, ConstMonoRef monoB, TaskFeeder& feeder ) { const auto col = ColReader(mMap).findProduct(monoA, monoB); if (col.first != 0) return std::make_pair(*col.first, *col.second); return createColumn(monoA, monoB, feeder); } /// As the overload that does not take a ColReader parameter, except with /// better performance in the common case that the column already exists /// and colMap is up-to-date. MATHICGB_INLINE std::pair findOrCreateColumn( ConstMonoRef monoA, ConstMonoRef monoB, const ColReader& colMap, TaskFeeder& feeder ) { const auto col = colMap.findProduct(monoA, monoB); if (col.first == 0) { // The reader may be out of date, so try again with a fresh reader. return findOrCreateColumn(monoA, monoB, feeder); } return std::make_pair(*col.first, *col.second); } /// The split into left and right columns is not done until the whole matrix /// has been constructed. This vector keeps track of which side each column /// should go to once we do the split. char is used in place of bool because /// the specialized bool would just be slower for this use case. See /// http://isocpp.org/blog/2012/11/on-vectorbool . std::vector mIsColumnToLeft; /// How much memory to allocate every time more memory is needed. const size_t mMemoryQuantum; /// If you want to modify the columns, you need to grab this lock first. mtbb::mutex mCreateColumnLock; /// A monomial for temporary scratch calculations. Protected by /// mCreateColumnLock. Mono mTmp; /// Mapping from monomials to column indices. Map mMap; /// The basis that supplies reducers. const PolyBasis& mBasis; }; F4MatrixBuilder2::F4MatrixBuilder2( const PolyBasis& basis, const size_t memoryQuantum ): mMemoryQuantum(memoryQuantum), mBasis(basis) {} void F4MatrixBuilder2::addSPolynomialToMatrix( const Poly& polyA, const Poly& polyB ) { MATHICGB_ASSERT(!polyA.isZero()); MATHICGB_ASSERT(polyA.isMonic()); MATHICGB_ASSERT(!polyB.isZero()); MATHICGB_ASSERT(polyB.isMonic()); auto desiredLead = monoid().alloc(); monoid().lcm(polyA.leadMono(), polyB.leadMono(), *desiredLead); RowTask task = {desiredLead.release(), &polyA, &polyB}; mTodo.push_back(task); } void F4MatrixBuilder2::addPolynomialToMatrix(const Poly& poly) { if (poly.isZero()) return; RowTask task = {}; task.poly = &poly; mTodo.push_back(task); } void F4MatrixBuilder2::addPolynomialToMatrix( ConstMonoRef multiple, const Poly& poly ) { if (poly.isZero()) return; auto desiredLead = monoid().alloc(); monoid().multiply(poly.leadMono(), multiple, desiredLead); RowTask task = {desiredLead.release(), &poly, nullptr}; mTodo.push_back(task); } void F4MatrixBuilder2::buildMatrixAndClear(QuadMatrix& quadMatrix) { Builder builder(mBasis, mMemoryQuantum); builder.buildMatrixAndClear(mTodo, quadMatrix); } MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/SignatureGB.cpp0000664000175000017500000005641414560325357014063 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "SignatureGB.hpp" #include "Basis.hpp" #include "MonoLookup.hpp" #include "SigSPairs.hpp" #include "ModuleMonoSet.hpp" #include "LogDomain.hpp" #include #include MATHICGB_DEFINE_LOG_DOMAIN( SigBasisChanged, "Show the signature basis after each change." ); MATHICGB_DEFINE_LOG_DOMAIN( SigSPairFinal, "Show the outcome of final processing for S-pairs." ); MATHICGB_NAMESPACE_BEGIN int tracingLevel = 0; SignatureGB::SignatureGB( Basis&& basis, Processor&& processor, Reducer::ReducerType reductiontyp, int divlookup_type, int montable_type, bool postponeKoszul, bool useBaseDivisors, bool preferSparseReducers, bool useSingularCriterionEarly, size_t queueType ): mBreakAfter(0), mPrintInterval(0), R(basis.getPolyRing()), mPostponeKoszul(postponeKoszul), mUseBaseDivisors(useBaseDivisors), stats_sPairSignaturesDone(0), stats_sPairsDone(0), stats_koszulEliminated(0), stats_SignatureCriterionLate(0), stats_relativelyPrimeEliminated(0), stats_pairsReduced(0), stats_nsecs(0.0), GB(make_unique(*R, divlookup_type, montable_type, preferSparseReducers)), mKoszuls(R->monoid()), Hsyz(ModuleMonoSet::make(R->monoid(), montable_type, basis.size(), !mPostponeKoszul)), Hsyz2(ModuleMonoSet::make(R->monoid(), montable_type, basis.size(), !mPostponeKoszul)), reducer(Reducer::makeReducer(reductiontyp, *R)), SP(make_unique(R, GB.get(), Hsyz.get(), reducer.get(), mPostponeKoszul, mUseBaseDivisors, useSingularCriterionEarly, queueType)) { mProcessor = make_unique>(std::move(processor)); if (basis.size() > std::numeric_limits::max()) mathic::reportError("Dimension of module too large."); const auto componentCount = Component(basis.size()); mProcessor->setComponentCount(componentCount); // Populate GB for (Component j = 0; j < componentCount; j++) GB->addComponent(); for (Component i = 0; i < componentCount; i++) { auto g = make_unique(*basis.getPoly(i)); g->makeMonic(); auto sig = monoid().alloc(); monoid().setIdentity(*sig); monoid().setComponent(i, *sig); mProcessor->preprocess(*sig); GB->insert(std::move(sig), std::move(g)); } // Populate SP for (size_t i = 0; i < basis.size(); i++) SP->newPairs(i); } void SignatureGB::computeGrobnerBasis() { size_t counter = 0; mTimer.reset(); std::ostream& out = std::cout; while (step()) { if (mBreakAfter > 0 && GB->size() > mBreakAfter) { break; const size_t pairs = SP->pairCount(); size_t sigs = 0; size_t syzygySigs = 0; while (true) { auto sig = SP->popSignature(mSpairTmp); if (sig.isNull()) break; ++sigs; if (Hsyz->member(*sig)) ++syzygySigs; else GB->minimalLeadInSig(*sig); } const double syzygyRatio = static_cast(syzygySigs) / sigs; std::cerr << "*** Early exit statistics ***\n" << "remaining spairs: " << pairs << '\n' << "remaining spair signatures: " << sigs << '\n' << "spair signature syzygies: " << syzygySigs << " (" << syzygyRatio * 100 << "% of sigs)\n"; break; } if (mPrintInterval == 0 || (++counter % mPrintInterval) != 0) continue; out << "\n-------------------------------------------------------------\n"; displayMemoryUse(out); out << "\n"; displaySomeStats(out); } // exit(1); /*displayMemoryUse(std::cout); std::cout << "\n"; displaySomeStats(std::cout);*/ // displayMemoryUse(std::cout); stats_nsecs = mTimer.getMilliseconds() / 1000.0; //GB->displayBrief(out); if (mProcessor->processingNeeded()) { GB->postprocess(*mProcessor); Hsyz->forAll([&](ConstMonoRef mono) { auto sig = R->allocMonomial(); R->monoid().copy(mono, sig); mProcessor->postprocess(sig); Hsyz2->insert(sig); }); } } bool SignatureGB::processSPair (Mono sig, const SigSPairs::PairContainer& pairs) { MATHICGB_ASSERT(!pairs.empty()); // the module term to reduce is multiple * GB->getSignature(gen) size_t gen = GB->minimalLeadInSig(*sig); MATHICGB_ASSERT(gen != static_cast(-1)); monomial multiple = R->allocMonomial(); monoid().divide(GB->signature(gen), *sig, multiple); GB->basis().usedAsStart(gen); // reduce multiple * GB->getSignature(gen) auto f = reducer->regularReduce(*sig, multiple, gen, *GB); R->freeMonomial(multiple); if (f == nullptr) { // singular reduction MATHICGB_LOG(SigSPairFinal) << " eliminated by singular criterion.\n"; return true; } if (f->isZero()) { // reduction to zero // todo: what are the correct ownership relations here? auto ptr = sig.release(); Hsyz->insert(*ptr); SP->setKnownSyzygies(mSpairTmp); MATHICGB_LOG(SigSPairFinal) << " s-reduced to zero.\n"; return false; } // new basis element MATHICGB_ASSERT(!GB->isSingularTopReducibleSlow(*f, *sig)); GB->insert(std::move(sig), std::move(f)); MATHICGB_LOG(SigSPairFinal) << " s-reduced to new basis element.\n"; MATHICGB_IF_STREAM_LOG(SigBasisChanged) { stream << "New signature basis element. The basis is now:\n"; GB->displayFancy(stream, *mProcessor); }; SP->newPairs(GB->size()-1); return true; } bool SignatureGB::step() { auto sig = SP->popSignature(mSpairTmp); if (sig.isNull()) return false; ++stats_sPairSignaturesDone; stats_sPairsDone += mSpairTmp.size(); MATHICGB_IF_STREAM_LOG(SigSPairFinal) { stream << "Final processing of signature "; R->monomialDisplay(stream, Monoid::toOld(*sig)); stream << '\n'; }; if (Hsyz->member(*sig)) { ++stats_SignatureCriterionLate; SP->setKnownSyzygies(mSpairTmp); MATHICGB_LOG(SigSPairFinal) << " eliminated by signature criterion.\n"; return true; } while (!mKoszuls.empty() && R->monoid().lessThan(mKoszuls.top(), *sig)) mKoszuls.pop(); if (!mKoszuls.empty() && R->monoid().equal(mKoszuls.top(), *sig)) { ++stats_koszulEliminated; // This signature is of a syzygy that is not in Hsyz, so add it // todo: what are the correct ownership relations here? auto ptr = sig.release(); Hsyz->insert(*ptr); SP->setKnownSyzygies(mSpairTmp); MATHICGB_LOG(SigSPairFinal) << " eliminated by Koszul criterion.\n"; return true; } if (mPostponeKoszul) { // Relatively prime check for (auto it = mSpairTmp.begin(); it != mSpairTmp.end(); ++it) { auto a = GB->leadMono(it->first); auto b = GB->leadMono(it->second); if (monoid().relativelyPrime(a, b)) { ++stats_relativelyPrimeEliminated; // todo: what are the correct ownership relations here? auto ptr = sig.release(); Hsyz->insert(*ptr); SP->setKnownSyzygies(mSpairTmp); MATHICGB_LOG(SigSPairFinal) << " eliminated by relatively prime criterion.\n"; return true; } } } #ifdef MATHICGB_DEBUG for (auto it = mSpairTmp.begin(); it != mSpairTmp.end(); ++it) { auto a = GB->leadMono(it->first); auto b = GB->leadMono(it->second); MATHICGB_ASSERT(!monoid().relativelyPrime(a, b)); } #endif // Reduce the pair ++stats_pairsReduced; if (!processSPair(std::move(sig), mSpairTmp) || !mPostponeKoszul) return true; for (auto it = mSpairTmp.begin(); it != mSpairTmp.end(); ++it) { std::pair p = *it; if (GB->ratioCompare(p.first, p.second) == LT) std::swap(p.first, p.second); auto greaterSig = GB->signature(p.first); auto smallerLead = GB->leadMono(p.second); monomial koszul = R->allocMonomial(); monoid().multiply(greaterSig, smallerLead, koszul); if (Hsyz->member(koszul)) R->freeMonomial(koszul); else mKoszuls.push(koszul); } return true; } size_t SignatureGB::getMemoryUse() const { return GB->getMemoryUse() + Hsyz->getMemoryUse() + R->getMemoryUse() + reducer->getMemoryUse() + mSpairTmp.capacity() * sizeof(mSpairTmp.front()) + SP->getMemoryUse() + mKoszuls.getMemoryUse(); } void SignatureGB::displayStats(std::ostream &o) const { o << "-- stats: -- \n"; o << " strategy: signature" << (mPostponeKoszul ? "-postpone" : "") << (mUseBaseDivisors ? "-basediv" : "") << '\n'; o << " reduction type: " << reducer->description() << '\n'; o << " divisor tab type: " << GB->basis().monoLookup().getName() << '\n'; o << " syzygy tab type: " << Hsyz->name() << '\n'; o << " S-pair queue type: " << SP->name() << '\n'; o << " total compute time: " << stats_nsecs << " -- seconds" << '\n'; displayMemoryUse(o); displaySomeStats(o); o << std::flush; } void SignatureGB::displayPaperStats(std::ostream& out) const { SigSPairs::Stats stats = SP->getStats(); //Reducer::Stats reducerStats = reducer->sigStats(); mic::ColumnPrinter pr; pr.addColumn(true, " "); pr.addColumn(false, " "); pr.addColumn(true, " "); std::ostream& name = pr[0]; std::ostream& value = pr[1]; std::ostream& extra = pr[2]; const unsigned long long considered0 = GB->size() * (GB->size() - 1) / 2; const unsigned long long considered = stats.spairsConstructed; if (considered0 != considered) { name << "WARNING!!! #spairsConstructed is not correct!!\n"; value << '\n'; extra << '\n'; } name << "S-pairs considered:\n"; value << mic::ColumnPrinter::commafy(considered) << '\n'; extra << '\n'; name << "Removed via non-regular criterion:\n"; value << mic::ColumnPrinter::commafy(stats.nonregularSPairs) << '\n'; extra << '\n'; name << "Removed via low base divisor:\n"; value << mic::ColumnPrinter::commafy(stats.lowBaseDivisorHits) << '\n'; extra << '\n'; name << "Removed via high base divisor:\n"; value << mic::ColumnPrinter::commafy(stats.highBaseDivisorHits) << '\n'; extra << '\n'; name << "Removed via signature criterion:\n"; value << mic::ColumnPrinter::commafy(stats.syzygyModuleHits) << '\n'; extra << '\n'; name << "Removed via relatively prime criterion:\n"; value << mic::ColumnPrinter::commafy(stats.earlyRelativelyPrimePairs) << '\n'; extra << '\n'; name << "Removed via singular criterion (early):\n"; value << mic::ColumnPrinter::commafy(stats.earlySingularCriterionPairs) << '\n'; extra << '\n'; name << "Number of queued pairs:\n"; value << mic::ColumnPrinter::commafy(stats.queuedPairs) << '\n'; extra << '\n'; name << "Removed via duplicate signature:\n"; value << mic::ColumnPrinter::commafy(stats.duplicateSignatures) << '\n'; extra << '\n'; name << "Removed via signature criterion (late):\n"; value << mic::ColumnPrinter::commafy(stats_SignatureCriterionLate) << '\n'; extra << '\n'; name << "Removed via Koszul criterion (late):\n"; value << mic::ColumnPrinter::commafy(stats_koszulEliminated) << '\n'; extra << '\n'; name << "Removed via relatively prime criterion (late):\n"; value << mic::ColumnPrinter::commafy(stats_relativelyPrimeEliminated) << '\n'; extra << '\n'; /*name << "Removed (singular reduction):\n"; value << mic::ColumnPrinter::commafy(reducerStats.singularReductions) << '\n'; extra << '\n';*/ //unsigned long long nonzeroReductions = stats_pairsReduced - reducerStats.singularReductions - reducerStats.zeroReductions; /*name << "Number of pairs reduced to signature GB elems:\n"; value << mic::ColumnPrinter::commafy(nonzeroReductions) << '\n'; extra << '\n';*/ /*name << "Number of pairs reduced to new syzygy signatures:\n"; value << mic::ColumnPrinter::commafy(reducerStats.zeroReductions) << '\n'; extra << '\n';*/ /* unsigned long long nleft = considered - stats.nonregularSPairs - stats.lowBaseDivisorHits - stats.highBaseDivisorHits - stats.syzygyModuleHits - stats.earlyRelativelyPrimePairs - stats.earlySingularCriterionPairs; if (nleft != stats.queuedPairs) { name << "WARNING!!! queuedPairs is not correct!!\n"; value << '\n'; extra << '\n'; } nleft = nleft - stats.duplicateSignatures - stats_SignatureCriterionLate - stats_koszulEliminated - stats_relativelyPrimeEliminated - reducerStats.singularReductions - reducerStats.zeroReductions - nonzeroReductions; name << "Number of spairs unaccounted for:\n"; value << mic::ColumnPrinter::commafy(nleft) << '\n'; extra << '\n';*/ #ifdef MATHIC_TRACK_DIV_MASK_HIT_RATIO name << "Divisor Mask Stats" << '\n'; value << '\n'; extra << '\n'; name << " DivMasks Computed: " << '\n'; value << mic::ColumnPrinter::commafy(mathic::DivMaskStats::maskComputes) << '\n'; extra << '\n'; name << " DivMask checks: " << '\n'; value << mic::ColumnPrinter::commafy(mathic::DivMaskStats::maskChecks) << '\n'; extra << '\n'; name << " DivMask hits: " << '\n'; value << mic::ColumnPrinter::commafy(mathic::DivMaskStats::maskHits) << '\n'; extra << '\n'; name << " DivMask divisor checks: " << '\n'; value << mic::ColumnPrinter::commafy(mathic::DivMaskStats::divChecks) << '\n'; extra << '\n'; name << " DivMask divisor divides: " << '\n'; value << mic::ColumnPrinter::commafy(mathic::DivMaskStats::divDivides) << '\n'; extra << '\n'; name << " DivMask divisor hits: " << '\n'; value << mic::ColumnPrinter::commafy(mathic::DivMaskStats::divHits) << '\n'; extra << '\n'; #endif out << "*** Statistics for ISSAC 2012 Paper ***\n" << pr << std::flush; } void SignatureGB::displaySomeStats(std::ostream& out) const { mic::ColumnPrinter pr; pr.addColumn(true, " "); pr.addColumn(false, " "); pr.addColumn(true, " "); std::ostream& name = pr[0]; std::ostream& value = pr[1]; std::ostream& extra = pr[2]; const size_t basisSize = GB->size(); const double mseconds = mTimer.getMilliseconds(); const size_t pending = SP->pairCount(); name << "Time spent:\n"; value << mTimer << '\n'; extra << mic::ColumnPrinter::oneDecimal(mseconds / basisSize) << " ms per basis element\n"; const double pendingRatio = static_cast(pending) / basisSize; name << "Basis elements:\n"; value << mic::ColumnPrinter::commafy(basisSize) << '\n'; extra << mic::ColumnPrinter::oneDecimal(pendingRatio) << " Sp pend per basis ele\n"; const size_t basisTermCount = GB->basis().monomialCount(); name << "Terms for basis:\n"; value << mic::ColumnPrinter::commafy(basisTermCount) << '\n'; extra << mic::ColumnPrinter::ratioInteger(basisTermCount, basisSize) << " terms per basis ele\n"; const size_t minLeadCount = GB->basis().minimalLeadCount(); name << "Minimum lead terms:\n"; value << mic::ColumnPrinter::commafy(minLeadCount) << '\n'; extra << mic::ColumnPrinter::percentInteger(minLeadCount, basisSize) << " basis ele have min lead\n"; const size_t lastMinLead = GB->basis().maxIndexMinimalLead() + 1; const size_t timeSinceLastMinLead = basisSize - lastMinLead; name << "Index of last min lead:\n"; value << mic::ColumnPrinter::commafy(lastMinLead) << '\n'; extra << mic::ColumnPrinter::percentInteger(timeSinceLastMinLead, basisSize) << " of basis added since then\n"; const size_t minSyz = Hsyz->elementCount(); const double syzBasisRatio = static_cast(minSyz) / basisSize; name << "Minimal syzygies:\n"; value << mic::ColumnPrinter::commafy(minSyz) << '\n'; extra << mic::ColumnPrinter::oneDecimal(syzBasisRatio) << " syzygies per basis element\n"; const size_t queuedKoszuls = mKoszuls.size(); const double quedRatio = static_cast(queuedKoszuls) / minSyz; name << "Queued Koszul syzygies:\n"; value << mic::ColumnPrinter::commafy(queuedKoszuls) << '\n'; extra << mic::ColumnPrinter::oneDecimal(quedRatio) << " queued koszuls per msyzygy\n"; const unsigned long long considered = GB->size() * (GB->size() - 1) / 2; name << "S-pairs considered:\n"; value << mic::ColumnPrinter::commafy(considered) << '\n'; extra << '\n'; unsigned long long earlyNonElim; SigSPairs::Stats stats = SP->getStats(); const unsigned long long lowElim = stats.lowBaseDivisorHits; const unsigned long long highElim = stats.highBaseDivisorHits; const unsigned long long syzElim = stats.syzygyModuleHits; earlyNonElim = considered - lowElim - highElim - syzElim; name << "S-pairs not early elim:\n"; value << mic::ColumnPrinter::commafy(earlyNonElim) << '\n'; extra << mic::ColumnPrinter::percentInteger(earlyNonElim, considered) << " of considered\n"; name << "Syz module S-pair elim:\n"; value << mic::ColumnPrinter::commafy(syzElim) << '\n'; extra << mic::ColumnPrinter::percentInteger(syzElim, considered) << " of considered\n"; name << "Low bdiv S-pair elim:\n"; value << mic::ColumnPrinter::commafy(lowElim) << '\n'; extra << mic::ColumnPrinter::percentInteger(lowElim, considered) << " of considered\n"; name << "High bdiv S-pair elim:\n"; value << mic::ColumnPrinter::commafy(highElim) << '\n'; extra << mic::ColumnPrinter::percentInteger(highElim, considered) << " of considered\n"; const unsigned long long hadLow = stats.hasLowBaseDivisor; name << "Basis ele had low bdiv:\n"; value << mic::ColumnPrinter::commafy(hadLow) << '\n'; extra << mic::ColumnPrinter::percentInteger(hadLow, basisSize) << " of basis ele\n"; const unsigned long long hadHigh = stats.hasHighBaseDivisor; name << "Basis ele had high bdiv:\n"; value << mic::ColumnPrinter::commafy(hadHigh) << '\n'; extra << mic::ColumnPrinter::percentInteger(hadHigh, basisSize) << " of basis ele\n"; name << "S-pairs pending:\n"; value << mic::ColumnPrinter::commafy(pending) << '\n'; extra << mic::ColumnPrinter::percentInteger(pending, considered) << " of considered\n"; const size_t done = stats_sPairsDone; name << "S pairs done:\n"; value << mic::ColumnPrinter::commafy(done) << '\n'; extra << mic::ColumnPrinter::percentInteger(done, earlyNonElim) << " of not early elim\n"; const size_t sigsDone = stats_sPairSignaturesDone; const double perSig = static_cast(done) / sigsDone; name << "S pair sigs done:\n"; value << mic::ColumnPrinter::commafy(sigsDone) << '\n'; extra << mic::ColumnPrinter::oneDecimal(perSig) << " spairs per signature\n"; //Reducer::Stats reducerStats = reducer->sigStats(); /*const unsigned long long reductions = reducerStats.reductions; const size_t koszulElim = stats_koszulEliminated; name << "Koszul sp eliminated:\n"; value << mic::ColumnPrinter::commafy(koszulElim) << '\n'; extra << mic::ColumnPrinter::percentInteger(koszulElim, sigsDone - reductions) << " of late eliminations\n";*/ /*const size_t primeElim = stats_relativelyPrimeEliminated; name << "Rel.prime sp eliminated:\n"; value << mic::ColumnPrinter::commafy(primeElim) << '\n'; extra << mic::ColumnPrinter::percentInteger(primeElim, sigsDone - reductions) << " of late eliminations\n";*/ /*name << "Signature reductions:\n"; value << mic::ColumnPrinter::commafy(reductions) << '\n'; extra << mic::ColumnPrinter::percentInteger(reductions, sigsDone) << " of S-pairs are reduced\n";*/ /*const unsigned long long singularReductions = reducerStats.singularReductions; name << "Singular reductions:\n"; value << mic::ColumnPrinter::commafy(singularReductions) << '\n'; extra << mic::ColumnPrinter::percentInteger(singularReductions, reductions) << " of reductions\n";*/ /*const unsigned long long zeroReductions = reducerStats.zeroReductions; name << "Reductions to zero:\n"; value << mic::ColumnPrinter::commafy(zeroReductions) << '\n'; extra << mic::ColumnPrinter::percentInteger(zeroReductions, reductions) << " of reductions\n";*/ /*const unsigned long long newReductions = reductions - singularReductions - zeroReductions; name << "Reductions to new ele:\n"; value << mic::ColumnPrinter::commafy(newReductions) << '\n'; extra << mic::ColumnPrinter::percentInteger(newReductions, reductions) << " of reductions\n";*/ /*const unsigned long long redSteps = reducerStats.steps; const double stepsRatio = static_cast(redSteps) / (reductions - singularReductions); name << "Sig reduction steps:\n"; value << mic::ColumnPrinter::commafy(redSteps) << '\n'; extra << mic::ColumnPrinter::oneDecimal(stepsRatio) << " steps per non-sing reduction\n";*/ /*const unsigned long long longestReduction = reducerStats.maxSteps; name << "Longest sig reduction:\n"; value << mic::ColumnPrinter::commafy(longestReduction) << '\n'; extra << '\n';*/ /*Reducer::Stats classicRedStats = reducer->classicStats(); const unsigned long long clReductions = classicRedStats.reductions; name << "Classic reductions:\n"; value << mic::ColumnPrinter::commafy(clReductions) << '\n'; extra << '\n';*/ /*const unsigned long long clRedSteps = classicRedStats.steps; const double clStepsRatio = static_cast(clRedSteps) / clReductions; name << "Classic reduction steps:\n"; value << mic::ColumnPrinter::commafy(clRedSteps) << '\n'; extra << mic::ColumnPrinter::oneDecimal(clStepsRatio) << " steps per reduction\n";*/ /*const unsigned long long clLongestReduction = classicRedStats.maxSteps; name << "Longest classic red:\n"; value << mic::ColumnPrinter::commafy(clLongestReduction) << '\n'; extra << '\n';*/ out << "*** Some of the statistics ***\n" << pr << std::flush; } void SignatureGB::displayMemoryUse(std::ostream& out) const { // set up printer mic::ColumnPrinter pr; pr.addColumn(); pr.addColumn(false); pr.addColumn(false); std::ostream& name = pr[0]; std::ostream& value = pr[1]; std::ostream& extra = pr[2]; const size_t total = getMemoryUse(); { // Grobner basis const size_t basisMem = GB->getMemoryUse(); name << "Grobner basis:\n"; value << mic::ColumnPrinter::bytesInUnit(basisMem) << '\n'; extra << mic::ColumnPrinter::percentInteger(basisMem, total) << '\n'; } { // Spairs const size_t sPairMem = SP->getMemoryUse(); name << "S-pairs:\n"; value << mic::ColumnPrinter::bytesInUnit(sPairMem) << '\n'; extra << mic::ColumnPrinter::percentInteger(sPairMem, total) << '\n'; const size_t knownSyzygyMem = SP->getKnownSyzygyBitsMemoryUse(); name << " Known syzygy bits:\n"; value << mic::ColumnPrinter::bytesInUnit(knownSyzygyMem) << '\n'; extra << '\n'; } { // Syzygies const size_t syzMem = Hsyz->getMemoryUse(); name << "Minimal syzygies:\n"; value << mic::ColumnPrinter::bytesInUnit(syzMem) << '\n'; extra << mic::ColumnPrinter::percentInteger(syzMem, total) << '\n'; } { // Koszul queue const size_t syzQueueMem = mKoszuls.getMemoryUse(); name << "Koszul queue:\n"; value << mic::ColumnPrinter::bytesInUnit(syzQueueMem) << '\n'; extra << mic::ColumnPrinter::percentInteger(syzQueueMem, total) << '\n'; } { // Reducer const size_t reducerMem = reducer->getMemoryUse(); name << "Reducer:\n"; value << mic::ColumnPrinter::bytesInUnit(reducerMem) << '\n'; extra << mic::ColumnPrinter::percentInteger(reducerMem, total) << '\n'; } { // Signatures const size_t sigMem = R->getMemoryUse(); name << "Signatures:\n"; value << mic::ColumnPrinter::bytesInUnit(sigMem) << '\n'; extra << mic::ColumnPrinter::percentInteger(sigMem, total) << '\n'; } // total name << "-------------\n"; value << '\n'; extra << '\n'; name << "Memory used in total:\n"; value << mic::ColumnPrinter::bytesInUnit(total) << "\n"; extra << "\n"; out << "*** Summary of memory use ***\n" << pr << std::flush; } MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/Basis.cpp0000664000175000017500000000152414560325357012742 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "Basis.hpp" #include "PolyRing.hpp" #include "Poly.hpp" #include "MathicIO.hpp" #include #include #include #include MATHICGB_NAMESPACE_BEGIN void Basis::insert(std::unique_ptr&& p) { MATHICGB_ASSERT(p.get() != 0); MATHICGB_ASSERT(p->termsAreInDescendingOrder()); mGenerators.push_back(std::move(p)); } void Basis::sort() { const auto& monoid = ring().monoid(); const auto cmp = [&monoid]( const std::unique_ptr& a, const std::unique_ptr& b ) { return monoid.lessThan(a->leadMono(), b->leadMono()); }; std::sort(mGenerators.begin(), mGenerators.end(), cmp); } MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/io-util.cpp0000664000175000017500000000571614560325357013272 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "io-util.hpp" #include "Poly.hpp" #include "ModuleMonoSet.hpp" #include "io-util.hpp" #include "Scanner.hpp" #include "MathicIO.hpp" #include "SigPolyBasis.hpp" #include "SignatureGB.hpp" #include "Basis.hpp" #include "PolyBasis.hpp" #include #include #include #include MATHICGB_NAMESPACE_BEGIN std::unique_ptr polyParseFromString(const PolyRing *R, const std::string &s) { std::istringstream in(s); Scanner scanner(in); return make_unique(MathicIO<>().readPoly(*R, false, scanner)); } std::string toString(const Poly *g) { std::ostringstream o; MathicIO<>().writePoly(*g, true, o); return o.str(); } std::unique_ptr basisParseFromString(std::string str) { std::istringstream inStream(str); Scanner in(inStream); auto p = MathicIO<>().readRing(true, in); auto& ring = *p.first.release(); // todo: fix leak return make_unique(MathicIO<>().readBasis(ring, false, in)); } std::unique_ptr ringFromString(std::string ringStr) { std::stringstream inStream(ringStr); Scanner in(inStream); return MathicIO<>().readRing(true, in).first; } Monomial stringToMonomial(const PolyRing *R, std::string mon) { Monomial result = R->allocMonomial(); std::stringstream ifil(mon); R->monomialParse(ifil, result); return result; } std::string monomialToString(const PolyRing *R, const Monomial& mon) { std::ostringstream o; R->monomialDisplay(o,mon); return o.str(); } monomial monomialParseFromString(const PolyRing *R, std::string mon) { // This is poor code, to only be used for testing! monomial result = R->allocMonomial(); std::stringstream ifil(mon); R->monomialParse(ifil, result); return result; } std::string monomialDisplay(const PolyRing *R, const_monomial mon) { std::ostringstream o; R->monomialDisplay(o,mon); return o.str(); } //////////////////////////////////////////////////////////////// std::string toString(SigPolyBasis *I) { std::ostringstream o; for (size_t i=0; isize(); i++) { o << " "; MathicIO<>().writePoly(I->poly(i), false, o); o << std::endl; } return o.str(); } std::string toString(SigPolyBasis *I, int) { std::ostringstream o; I->display(o); return o.str(); } std::string toString(ModuleMonoSet* H) { std::ostringstream o; H->display(o); return o.str(); } std::string toString(Basis *I) { std::ostringstream o; for (size_t i=0; isize(); i++) { o << " "; MathicIO<>().writePoly(*I->getPoly(i), false, o); o << std::endl; } return o.str(); } void output(std::ostream &o, const PolyBasis &I) { for (size_t i = 0; i < I.size(); i++) { if (!I.retired(i)) { MathicIO<>().writePoly(I.poly(i), false, o); o << std::endl; } } } MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/ReducerHash.cpp0000664000175000017500000000760014560325357014077 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "ReducerHash.hpp" #include "TypicalReducer.hpp" #include "ReducerHelper.hpp" #include "PolyHashTable.hpp" #include #include MATHICGB_NAMESPACE_BEGIN void reducerHashDependency() {} /// The simplest reducer using a hashtable. All terms are in the hash table /// and in the queue. There are no duplicates as new terms are looked up in /// the hash table before insertion into the queue. The coefficient is /// stored in the hash table. template class Queue> class ReducerHash : public TypicalReducer { public: ReducerHash(const PolyRing &ring); virtual std::string description() const { return mQueue.getName() + "-hashed"; } void insertTail(NewConstTerm multiplier, const Poly& f); void insert(ConstMonoRef multiplier, const Poly& f); virtual bool leadTerm(NewConstTerm& result); void removeLeadTerm(); size_t getMemoryUse() const; void resetReducer(); public: class Configuration : public ReducerHelper::PlainConfiguration { public: typedef PolyHashTable::Node* Entry; Configuration(const PolyRing& ring): PlainConfiguration(ring) {} CompareResult compare(const Entry& a, const Entry& b) const { return ring().monoid().lessThan(a->mono(), b->mono()); } }; private: mutable std::vector mNodesTmp; const PolyRing &mRing; PolyHashTable mHashTable; Queue mQueue; }; template class Q> ReducerHash::ReducerHash(const PolyRing &ring): mRing(ring), mHashTable(ring), mQueue(Configuration(ring)) {} template class Q> void ReducerHash::insertTail(NewConstTerm multiplier, const Poly& f) { if (f.termCount() <= 1) return; mNodesTmp.clear(); auto it = f.begin(); const auto end = f.end(); for (++it; it != end; ++it) { auto p = mHashTable.insertProduct(*it, multiplier); if (p.second) mNodesTmp.emplace_back(p.first); } if (!mNodesTmp.empty()) mQueue.push(mNodesTmp.begin(), mNodesTmp.end()); } template class Q> void ReducerHash::insert(ConstMonoRef multiplier, const Poly& f) { mNodesTmp.clear(); const auto end = f.end(); for (auto it = f.begin(); it != end; ++it) { auto p = mHashTable.insertProduct(it.mono(), multiplier, it.coef()); if (p.second) mNodesTmp.emplace_back(p.first); } if (!mNodesTmp.empty()) mQueue.push(mNodesTmp.begin(), mNodesTmp.end()); } template class Q> bool ReducerHash::leadTerm(NewConstTerm& result) { while (!mQueue.empty()) { const auto top = mQueue.top(); if (!mRing.coefficientIsZero(top->value())) { result.coef = top->value(); result.mono = top->mono().ptr(); return true; } mQueue.pop(); mHashTable.remove(top); } return false; } template class Q> void ReducerHash::removeLeadTerm() { const auto top = mQueue.top(); mQueue.pop(); mHashTable.remove(top); } template class Q> void ReducerHash::resetReducer() { while (!mQueue.empty()) { const auto top = mQueue.top(); mQueue.pop(); mHashTable.remove(top); } mHashTable.clear(); } template class Q> size_t ReducerHash::getMemoryUse() const { size_t result = TypicalReducer::getMemoryUse(); result += mHashTable.getMemoryUse(); result += mQueue.getMemoryUse(); return result; } MATHICGB_REGISTER_REDUCER( "TourHash", Reducer_TourTree_Hashed, make_unique>(ring) ); MATHICGB_REGISTER_REDUCER( "HeapHash", Reducer_Heap_Hashed, make_unique>(ring) ); MATHICGB_REGISTER_REDUCER( "GeoHash", Reducer_Geobucket_Hashed, make_unique>(ring) ); MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/F4MatrixReducer.cpp0000664000175000017500000006544414560325357014664 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "F4MatrixReducer.hpp" #include "QuadMatrix.hpp" #include "SparseMatrix.hpp" #include "PolyRing.hpp" #include "LogDomain.hpp" #include "mtbb.hpp" #include #include #include #include #include #include #include MATHICGB_DEFINE_LOG_DOMAIN( F4MatrixReduce, "Displays statistics about matrices that are row reduced." ); MATHICGB_DEFINE_LOG_DOMAIN( F4MatReduceTop, "Displays time to reduce each F4 matrix to the bottom right submatrix." ); MATHICGB_DEFINE_LOG_DOMAIN( F4RedBottomRight, "Displays time to reduce the bottom right submatrix of each F4 matrix." ); MATHICGB_NAMESPACE_BEGIN namespace { class DenseRow { public: typedef uint16 Scalar; typedef uint32 ScalarProduct; typedef uint64 ScalarProductSum; static ScalarProduct product(const Scalar a, const Scalar b) { return static_cast(a) * b; } static void multiplyAdd( const Scalar a, const Scalar b, ScalarProductSum& x ) { x += product(a, b); } static void add(const Scalar a, ScalarProductSum& sum) { sum += a; } Scalar modulusOf(ScalarProductSum x, Scalar modulus) { return static_cast(x % modulus); } DenseRow() {} DenseRow(size_t colCount): mEntries(colCount) {} /// returns false if all entries are zero bool takeModulus(const SparseMatrix::Scalar modulus) { ScalarProductSum bitwiseOr = 0; // bitwise or of all entries after modulus const auto end = mEntries.end(); for (auto it = mEntries.begin(); it != end; ++it) { if (*it >= modulus) *it = modulusOf(*it, modulus); bitwiseOr |= *it; } return bitwiseOr != 0; } size_t colCount() const {return mEntries.size();} bool empty() const {return mEntries.empty();} void clear(size_t colCount = 0) { mEntries.clear(); mEntries.resize(colCount); } ScalarProductSum& operator[](size_t col) { MATHICGB_ASSERT(col < colCount()); return mEntries[col]; } ScalarProductSum const& operator[](size_t col) const { MATHICGB_ASSERT(col < colCount()); return mEntries[col]; } void appendTo(SparseMatrix& matrix) {matrix.appendRow(mEntries);} void makeUnitary(const SparseMatrix::Scalar modulus, const size_t lead) { MATHICGB_ASSERT(lead < colCount()); MATHICGB_ASSERT(mEntries[lead] != 0); const auto end = mEntries.end(); auto it = mEntries.begin() + lead; const auto toInvert = static_cast(*it % modulus); const auto multiply = modularInverse(toInvert, modulus); *it = 1; for (++it; it != end; ++it) { const auto entry = modulusOf(*it, modulus); if (entry != 0) *it = modulusOf(product(entry, multiply), modulus); else *it = 0; } } void addRow(const SparseMatrix& matrix, SparseMatrix::RowIndex row) { MATHICGB_ASSERT(row < matrix.rowCount()); const auto end = matrix.rowEnd(row); for (auto it = matrix.rowBegin(row); it != end; ++it) { MATHICGB_ASSERT(it.index() < colCount()); add(it.scalar(), mEntries[it.index()]); } } template void addRowMultiple( const SparseMatrix::Scalar multiple, const Iter begin, const Iter end ) { // I have a matrix reduction that goes from 2.8s to 2.4s on MSVC 2012 by // using entries instead of mEntries, even after removing restrict and // const from entries. That does not make sense to me, but it is a fact // none-the-less, so don't replace entries by mEntries unless you think // it's worth a 14% slowdown of matrix reduction (the whole computation, // not just this method). ScalarProductSum* const MATHICGB_RESTRICT entries = mEntries.data(); #ifdef MATHICGB_DEBUG // These asserts are separated out since otherwise they would also need // to be duplicated due to the manual unrolling. for (auto it = begin; it != end; ++it) { MATHICGB_ASSERT(it.index() < colCount()); MATHICGB_ASSERT(entries + it.index() == &mEntries[it.index()]); } #endif // I have a matrix reduction that goes from 2.601s to 2.480s on MSVC 2012 // by unrolling this loop manually. Unrolling more than once was not a // benefit. So don't undo the unrolling unless you think it's worth a 5% // slowdown of matrix reduction (the whole computation, not just this // method). auto it = begin; if (std::distance(begin, end) % 2 == 1) { // Replacing this by a goto into the middle of the following loop // (similar to Duff's device) made the code slower on MSVC 2012. multiplyAdd(it.scalar(), multiple, entries[it.index()]); ++it; } while (it != end) { multiplyAdd(it.scalar(), multiple, entries[it.index()]); ++it; multiplyAdd(it.scalar(), multiple, entries[it.index()]); ++it; } } void rowReduceByUnitary( const SparseMatrix::RowIndex pivotRow, const SparseMatrix& matrix, const SparseMatrix::Scalar modulus ) { MATHICGB_ASSERT(matrix.rowBegin(pivotRow).scalar() == 1); // unitary MATHICGB_ASSERT(modulus > 1); auto begin = matrix.rowBegin(pivotRow); const auto col = begin.index(); const auto entry = modulusOf(mEntries[col], modulus); mEntries[col] = 0; if (entry == 0) return; ++begin; // can skip first entry as we just set it to zero. addRowMultiple( modularNegativeNonZero(entry, modulus), begin, matrix.rowEnd(pivotRow) ); } private: std::vector mEntries; }; SparseMatrix reduce( const QuadMatrix& qm, SparseMatrix::Scalar modulus ) { const SparseMatrix& toReduceLeft = qm.bottomLeft; const SparseMatrix& toReduceRight = qm.bottomRight; const SparseMatrix& reduceByLeft = qm.topLeft; const SparseMatrix& reduceByRight = qm.topRight; const auto leftColCount = qm.computeLeftColCount(); const auto rightColCount = static_cast(qm.computeRightColCount()); MATHICGB_ASSERT(leftColCount == reduceByLeft.rowCount()); const auto pivotCount = leftColCount; const auto rowCount = toReduceLeft.rowCount(); // ** pre-calculate what rows are pivots for what columns. // Store column indexes instead of row indices as the matrix is square // anyway (so all indices fit) and we are going to store this as a column // index later on. std::vector rowThatReducesCol(pivotCount); #ifdef MATHICGB_DEBUG // fill in an invalid value that can be recognized by asserts to be invalid. std::fill(rowThatReducesCol.begin(), rowThatReducesCol.end(), pivotCount); #endif for (SparseMatrix::ColIndex pivot = 0; pivot < pivotCount; ++pivot) { MATHICGB_ASSERT(!reduceByLeft.emptyRow(pivot)); SparseMatrix::ColIndex col = reduceByLeft.leadCol(pivot); MATHICGB_ASSERT(rowThatReducesCol[col] == pivotCount); rowThatReducesCol[col] = pivot; } #ifdef MATHICGB_DEBUG for (SparseMatrix::ColIndex col = 0; col < pivotCount; ++col) { MATHICGB_ASSERT(rowThatReducesCol[col] < pivotCount); } #endif SparseMatrix reduced(qm.topRight.memoryQuantum()); mtbb::enumerable_thread_specific denseRowPerThread([&](){ return DenseRow(); }); SparseMatrix tmp(qm.topRight.memoryQuantum()); std::vector rowOrder(rowCount); mtbb::mutex lock; mtbb::parallel_for(mtbb::blocked_range(0, rowCount, 2), [&](const mtbb::blocked_range& range) { auto& denseRow = denseRowPerThread.local(); for (auto it = range.begin(); it != range.end(); ++it) { const auto row = it; denseRow.clear(leftColCount); denseRow.addRow(toReduceLeft, row); MATHICGB_ASSERT(leftColCount == pivotCount); for (size_t pivot = 0; pivot < pivotCount; ++pivot) { if (denseRow[pivot] != 0) { auto entry = denseRow[pivot]; entry %= modulus; if (entry == 0) { denseRow[pivot] = 0; } else { entry = modulus - entry; const auto row = rowThatReducesCol[pivot]; MATHICGB_ASSERT(row < pivotCount); MATHICGB_ASSERT(!reduceByLeft.emptyRow(row)); MATHICGB_ASSERT(reduceByLeft.leadCol(row) == pivot); MATHICGB_ASSERT(entry < std::numeric_limits::max()); denseRow.addRowMultiple( static_cast(entry), ++reduceByLeft.rowBegin(row), reduceByLeft.rowEnd(row) ); denseRow[pivot] = entry; } } } mtbb::lock_guard lockGuard(lock); // const std::lock_guard lockGuard(lock); for (size_t pivot = 0; pivot < pivotCount; ++pivot) { MATHICGB_ASSERT(denseRow[pivot] < std::numeric_limits::max()); if (denseRow[pivot] != 0) tmp.appendEntry(rowThatReducesCol[pivot], static_cast(denseRow[pivot])); } tmp.rowDone(); rowOrder[tmp.rowCount() - 1] = row; } }); mtbb::parallel_for(mtbb::blocked_range(0, rowCount), [&](const mtbb::blocked_range& range) {for (auto iter = range.begin(); iter != range.end(); ++iter) { const auto i = iter; const auto row = rowOrder[i]; auto& denseRow = denseRowPerThread.local(); denseRow.clear(rightColCount); denseRow.addRow(toReduceRight, row); auto it = tmp.rowBegin(i); const auto end = tmp.rowEnd(i); for (; it != end; ++it) { const auto begin = reduceByRight.rowBegin(it.index()); const auto end = reduceByRight.rowEnd(it.index()); denseRow.addRowMultiple(it.scalar(), begin, end); } mtbb::lock_guard lockGuard(lock); // const std::lock_guard lockGuard(lock); bool zero = true; for (SparseMatrix::ColIndex col = 0; col < rightColCount; ++col) { const auto entry = static_cast(denseRow[col] % modulus); if (entry != 0) { reduced.appendEntry(col, entry); zero = false; } } if (!zero) reduced.rowDone(); }}); return reduced; } SparseMatrix reduceToEchelonFormSparse( const SparseMatrix& toReduce, const SparseMatrix::Scalar modulus ) { const auto colCount = toReduce.computeColCount(); const auto noRow = static_cast(-1); // pivotRowOfCol[i] is the pivot in column i or noRow // if we have not identified such a pivot so far. std::vector pivotRowOfCol(colCount, noRow); DenseRow rowToReduce(colCount); // ** Reduce to row echelon form -- every row is a pivot row. SparseMatrix pivots(colCount); for (SparseMatrix::RowIndex row = 0; row < toReduce.rowCount(); ++row) { if (toReduce.emptyRow(row)) continue; rowToReduce.clear(colCount); rowToReduce.addRow(toReduce, row); SparseMatrix::ColIndex leadingCol = 0; while (true) { // reduce row by previous pivots for (; leadingCol < colCount; ++leadingCol) { auto& entry = rowToReduce[leadingCol]; if (entry != 0) { entry %= modulus; if (entry != 0) break; } } if (leadingCol == colCount) break; // The row has been reduced to zero. const auto pivotRow = pivotRowOfCol[leadingCol]; if (pivotRow == noRow) { // If the row is a new pivot. rowToReduce.makeUnitary(modulus, leadingCol); pivotRowOfCol[leadingCol] = pivots.rowCount(); rowToReduce.appendTo(pivots); break; } rowToReduce.rowReduceByUnitary(pivotRow, pivots, modulus); } } // ** Reduce from row echelon form to reduced row echelon form SparseMatrix reduced(colCount); auto pivotCol = colCount; // Reduce pivot rows in descending order of leading column. The reduced // pivots go into reduced and we update pivotRowOfCol to refer to the // row indices in reduced as we go along. while (pivotCol != 0) { --pivotCol; const auto row = pivotRowOfCol[pivotCol]; if (row == noRow) continue; rowToReduce.clear(colCount); rowToReduce.addRow(pivots, row); MATHICGB_ASSERT(rowToReduce[pivotCol] == 1); // unitary for (auto col = pivotCol + 1; col != colCount; ++col) { auto& entry = rowToReduce[col]; if (entry == 0) continue; entry %= modulus; if (entry == 0) continue; const auto pivotRow = pivotRowOfCol[col]; if (pivotRow != noRow) rowToReduce.rowReduceByUnitary(pivotRow, reduced, modulus); MATHICGB_ASSERT(entry < modulus); } pivotRowOfCol[pivotCol] = reduced.rowCount(); rowToReduce.appendTo(reduced); } return reduced; } SparseMatrix reduceToEchelonForm( const SparseMatrix& toReduce, const SparseMatrix::Scalar modulus ) { const auto colCount = toReduce.computeColCount(); const auto rowCount = toReduce.rowCount(); // convert to dense representation std::vector dense(rowCount); mtbb::parallel_for(mtbb::blocked_range(0, rowCount), [&](const mtbb::blocked_range& range) {for (auto it = range.begin(); it != range.end(); ++it) { const auto row = it; if (toReduce.emptyRow(row)) continue; dense[row].clear(colCount); dense[row].addRow(toReduce, row); }}); // invariant: all columns in row to the left of leadCols[row] are zero. std::vector leadCols(rowCount); // pivot rows get copied here before being used to reduce the matrix. SparseMatrix reduced(toReduce.memoryQuantum()); // (col,row) in nextReducers, then use row as a pivot in column col // for the next iteration. std::vector< std::pair > nextReducers; // isPivotRow[row] is true if row is or has been used as a pivot. std::vector isPivotRow(rowCount); // columnHasPivot[col] is true if a pivot row for column col has // been chosen. std::vector columnHasPivot(colCount); bool firstIteration = true; while (firstIteration || reduced.rowCount() > 0) { firstIteration = false; size_t const reducerCount = reduced.rowCount(); //std::cout << "reducing " << reduced.rowCount() << " out of " << toReduce.rowCount() << std::endl; mtbb::mutex lock; mtbb::parallel_for(mtbb::blocked_range(0, rowCount), [&](const mtbb::blocked_range& range) {for (auto it = range.begin(); it != range.end(); ++it) { const auto row = it; MATHICGB_ASSERT(leadCols[row] <= colCount); DenseRow& denseRow = dense[row]; if (denseRow.empty()) continue; // reduce by each row of reduced. for (SparseMatrix::RowIndex reducerRow = 0; reducerRow < reducerCount; ++reducerRow) { const auto col = reduced.rowBegin(reducerRow).index(); if (denseRow[col] == 0 || (isPivotRow[row] && col == leadCols[row])) continue; denseRow.rowReduceByUnitary(reducerRow, reduced, modulus); } // update leadCols[row] SparseMatrix::ColIndex col; MATHICGB_ASSERT(leadCols[row] <= colCount); for (col = leadCols[row]; col < colCount; ++col) { denseRow[col] %= modulus; if (denseRow[col] != 0) break; } leadCols[row] = col; MATHICGB_ASSERT(leadCols[row] <= colCount); // note if we have found a new pivot row if (col == colCount) denseRow.clear(); else { MATHICGB_ASSERT(col < colCount); bool isNewReducer = false; { mtbb::lock_guard lockGuard(lock); // const std::lock_guard lockGuard(lock); if (!columnHasPivot[col]) { columnHasPivot[col] = true; isNewReducer = true; nextReducers.push_back(std::make_pair(col, row)); } } if (isNewReducer) denseRow.makeUnitary(modulus, col); } }}); reduced.clear(); std::sort(nextReducers.begin(), nextReducers.end()); for (size_t i = 0; i < nextReducers.size(); ++i) { size_t const row = nextReducers[i].second; MATHICGB_ASSERT(static_cast (columnHasPivot[nextReducers[i].first])); MATHICGB_ASSERT(dense[row].colCount() == colCount); MATHICGB_ASSERT(dense[row][nextReducers[i].first] == 1); MATHICGB_ASSERT(reduced.rowCount() == i); MATHICGB_ASSERT(!isPivotRow[row]); dense[row].appendTo(reduced); // already unitary isPivotRow[row] = true; } nextReducers.clear(); } mtbb::parallel_for(mtbb::blocked_range(0, rowCount), [&](const mtbb::blocked_range& range) {for (auto it = range.begin(); it != range.end(); ++it) { const size_t row = it; dense[row].takeModulus(modulus); }}); #ifdef MATHICGB_DEBUG std::vector sawPivot(colCount); for (SparseMatrix::RowIndex row = 0; row < rowCount; ++row) { if (dense[row].empty()) { MATHICGB_ASSERT(!isPivotRow[row]); MATHICGB_ASSERT(leadCols[row] == colCount); } else { MATHICGB_ASSERT(isPivotRow[row]); const auto leadCol = leadCols[row]; MATHICGB_ASSERT(leadCol < colCount); MATHICGB_ASSERT(columnHasPivot[leadCol]); MATHICGB_ASSERT(dense[row][leadCol] == 1); MATHICGB_ASSERT(!sawPivot[leadCol]); sawPivot[leadCol] = true; for (size_t col = 0; col < colCount; ++col) { const auto scalar = dense[row][col]; if (col < leadCol) { MATHICGB_ASSERT(scalar == 0); } else if (col == leadCol) { MATHICGB_ASSERT(scalar == 1); } else { MATHICGB_ASSERT(scalar == 0 || !columnHasPivot[col]); } } } } #endif reduced.clear(); for (size_t row = 0; row < rowCount; ++row) if (!dense[row].empty()) dense[row].appendTo(reduced); return reduced; } } void addRowMultipleInplace( std::vector< std::vector >& matrix, const SparseMatrix::RowIndex addRow, const SparseMatrix::Scalar multiple, const SparseMatrix::RowIndex row, const SparseMatrix::ColIndex leadingCol, const SparseMatrix::ColIndex colCount, const SparseMatrix::Scalar modulus ) { assert(addRow < matrix.size()); assert(row < matrix.size()); assert(row != addRow); assert(leadingCol < colCount); assert(matrix[row].size() == colCount); assert(matrix[addRow].size() == colCount); for(auto col = leadingCol; col < colCount; ++col){ const auto product = modularProduct (multiple, matrix[addRow][col], modulus); matrix[row][col] = modularSum(matrix[row][col], product, modulus); } } void makeRowUnitary( std::vector< std::vector>& matrix, const SparseMatrix::RowIndex row, const SparseMatrix::ColIndex colCount, const SparseMatrix::ColIndex leadingCol, const SparseMatrix::Scalar modulus ) { assert(row 1); const auto leadingScalar = matrix[row][leadingCol]; assert(leadingScalar != 0); auto multiply = modularInverse(leadingScalar, modulus); for(SparseMatrix::ColIndex col = leadingCol; col < colCount; ++col) matrix[row][col] = modularProduct(matrix[row][col], multiply, modulus); } SparseMatrix::ColIndex leadingColumn( const std::vector< std::vector>& matrix, const SparseMatrix::RowIndex row, const SparseMatrix::ColIndex colCount, SparseMatrix::ColIndex startAtCol ) { assert(row < matrix.size()); assert(matrix[row].size() == colCount); for(auto col = startAtCol; col < colCount; ++col){ if(matrix[row][col] != 0) return col; } return colCount; } void rowReducedEchelonMatrix( std::vector< std::vector >& matrix, const SparseMatrix::ColIndex colCount, const SparseMatrix::Scalar modulus ) { assert(matrix.empty() || matrix[0].size() == colCount); const SparseMatrix::RowIndex rowCount = static_cast(matrix.size()); // pivotRowOfCol[i] is the pivot in column i or rowCount // if we have not identified such a pivot so far. std::vector pivotRowOfCol(colCount, rowCount); // row reduce to row echelon form for(SparseMatrix::RowIndex row=0; row> matrix(rowCount); for (SparseMatrix::RowIndex row = 0; row < rowCount; ++row) { MATHICGB_ASSERT(!toReduce.emptyRow(row)); matrix[row].resize(colCount); const auto end = toReduce.rowEnd(row); for (auto it = toReduce.rowBegin(row); it != end; ++it) { MATHICGB_ASSERT(it.index() < colCount); matrix[row][it.index()] = it.scalar(); } } rowReducedEchelonMatrix(matrix, colCount, modulus); // convert reduced matrix to SparseMatrix. SparseMatrix reduced; for (size_t row = 0; row < rowCount; ++row) { bool rowIsZero = true; for (SparseMatrix::ColIndex col = 0; col < colCount; ++col) { if (matrix[row][col] != 0) { rowIsZero = false; reduced.appendEntry(col, matrix[row][col]); } } if (!rowIsZero) reduced.rowDone(); } return reduced; } SparseMatrix reduceToEchelonFormShrawanDelayedModulus( const SparseMatrix& toReduce, SparseMatrix::Scalar modulus ) { const SparseMatrix::RowIndex rowCount = toReduce.rowCount(); const auto colCount = toReduce.computeColCount(); // Convert input matrix to dense format std::vector< std::vector> matrix(rowCount); for (SparseMatrix::RowIndex row = 0; row < rowCount; ++row) { MATHICGB_ASSERT(!toReduce.emptyRow(row)); matrix[row].resize(colCount); const auto end = toReduce.rowEnd(row); for (auto it = toReduce.rowBegin(row); it != end; ++it) { MATHICGB_ASSERT(it.index() < colCount); matrix[row][it.index()] = it.scalar(); } } rowReducedEchelonMatrix(matrix, colCount, modulus); // convert reduced matrix to SparseMatrix. SparseMatrix reduced; for (size_t row = 0; row < rowCount; ++row) { bool rowIsZero = true; for (SparseMatrix::ColIndex col = 0; col < colCount; ++col) { if (matrix[row][col] != 0) { rowIsZero = false; reduced.appendEntry(col, matrix[row][col]); } } if (!rowIsZero) reduced.rowDone(); } return reduced; } SparseMatrix F4MatrixReducer::reduceToBottomRight(const QuadMatrix& matrix) { MATHICGB_ASSERT(matrix.debugAssertValid()); MATHICGB_LOG_TIME(F4MatReduceTop); MATHICGB_LOG_TIME(F4MatrixReduce) << "\n***** Reducing QuadMatrix to bottom right matrix *****\n"; MATHICGB_IF_STREAM_LOG(F4MatrixReduce) {matrix.printStatistics(log.stream());}; return reduce(matrix, mModulus); } SparseMatrix F4MatrixReducer::reducedRowEchelonForm( const SparseMatrix& matrix ) { MATHICGB_LOG_TIME(F4RedBottomRight); MATHICGB_LOG_TIME(F4MatrixReduce) << "\n***** Reducing SparseMatrix to reduced row echelon form *****\n"; MATHICGB_IF_STREAM_LOG(F4MatrixReduce) {matrix.printStatistics(log.stream());}; const bool useShrawan = false; const bool useDelayedModulus = false; if (useShrawan) { if (useDelayedModulus) return reduceToEchelonFormShrawanDelayedModulus(matrix, mModulus); else return reduceToEchelonFormShrawan(matrix, mModulus); } else { // todo: actually do some work to find a good way to determine // when to use the sparse method, or alternatively make some // sort of hybrid. if (matrix.computeDensity() < 0.02) return reduceToEchelonFormSparse(matrix, mModulus); else return reduceToEchelonForm(matrix, mModulus); } } SparseMatrix F4MatrixReducer::reducedRowEchelonFormBottomRight( const QuadMatrix& matrix ) { return reducedRowEchelonForm(reduceToBottomRight(matrix)); } namespace { /// this has to be a separate function that returns the scalar since signed /// overflow is undefine behavior so we cannot check after the cast and /// we also cannot set the modulus field inside the constructor since it is /// const. SparseMatrix::Scalar checkModulus(const coefficient modulus) { // this assert has to be NO_ASSUME as otherwise the branch below will get // optimized out. MATHICGB_ASSERT_NO_ASSUME(modulus <= std::numeric_limits::max()); if (modulus > std::numeric_limits::max()) throw std::overflow_error("Too large modulus in F4 matrix reduction."); return static_cast(modulus); } } F4MatrixReducer::F4MatrixReducer(const coefficient modulus): mModulus(checkModulus(modulus)) {} MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/StaticMonoMap.hpp0000664000175000017500000003226114560325357014426 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_STATIC_MONO_LOOKUP_GUARD #define MATHICGB_STATIC_MONO_LOOKUP_GUARD #include "SigPolyBasis.hpp" #include "PolyBasis.hpp" #include "MonoLookup.hpp" #include "PolyRing.hpp" #include #include #include #include MATHICGB_NAMESPACE_BEGIN /// Data structure for performing queries on a set of monomials. /// This is static in the sense that the interface is not virtual. template< /// Will use mathic::DivList or mathic::KDTree depending on this value. bool UseKDTree, /// Thing to store along with each monomial in the data structure. class Data, /// Indicate whether elements should be allowed to be removed from the /// data structure. There can be a slight performance benefit from /// disallowing removal. bool AllowRemovals, /// Whether to use bit vectors of features to speed up divisibility /// checks. This is usually a big speed up. bool UseDivMask > class StaticMonoLookup; template class StaticMonoLookup { private: typedef PolyRing::Monoid Monoid; typedef Monoid::ConstMonoRef ConstMonoRef; typedef Monoid::ConstMonoPtr ConstMonoPtr; typedef MonoLookup::EntryOutput EntryOutput; /// Configuration for a Mathic KDTree or DivList. class Configuration { public: Configuration(const Monoid& monoid): mMonoid(monoid) {} const Monoid& monoid() const {return mMonoid;} typedef int Exponent; typedef ConstMonoRef Monomial; class Entry { public: Entry(): mEntry() {} template Entry(ConstMonoRef mono, D&& data): mEntry(mono.ptr(), std::forward(data)) {} ConstMonoRef mono() const {return *mEntry.first;} const Data& data() const {return mEntry.second;} Data& data() {return mEntry.second;} private: // Store in a std::pair so that if Data has no members then no space // will be used on it. Here we are depending on std::pair to be using // the empty base class optimization. std::pair mEntry; }; Exponent getExponent(const Monomial& m, size_t var) const { return monoid().exponent(m, var); } Exponent getExponent(const Entry& e, size_t var) const { return monoid().exponent(e.mono(), var); } bool divides(const Monomial& a, const Monomial& b) const { return monoid().dividesWithComponent(a, b); } bool divides(const Entry& a, const Monomial& b) const { return monoid().dividesWithComponent(a.mono(), b); } bool divides(const Monomial& a, const Entry& b) const { return monoid().dividesWithComponent(a, b.mono()); } bool divides(const Entry& a, const Entry& b) const { return monoid().dividesWithComponent(a.mono(), b.mono()); } bool getSortOnInsert() const {return false;} template bool isLessThan(const A& a, const B& b) const { MATHICGB_ASSERT(false); return false; } size_t getVarCount() const {return monoid().varCount();} static const bool UseTreeDivMask = DM; static const bool UseLinkedList = false; static const bool UseDivMask = DM; static const size_t LeafSize = 1; static const bool PackedTree = true; static const bool AllowRemovals = AR; bool getUseDivisorCache() const {return true;} bool getMinimizeOnInsert() const {return false;} bool getDoAutomaticRebuilds() const {return UseDivMask;} double getRebuildRatio() const {return 0.5;} size_t getRebuildMin() const {return 50;} private: const Monoid& mMonoid; }; public: typedef typename std::conditional< UseKDTree, mathic::KDTree, mathic::DivList >::type BaseLookup; typedef typename BaseLookup::Entry Entry; static_assert (!Configuration::UseTreeDivMask || Configuration::UseDivMask, ""); StaticMonoLookup(const Monoid& monoid): mLookup(Configuration(monoid)) {} const Monoid& monoid() const {return mLookup.getConfiguration().monoid();} template class LambdaWrap { public: LambdaWrap(Lambda& lambda): mLambda(lambda) {} bool proceed(const Entry& entry) const {return mLambda(entry);} private: Lambda& mLambda; }; template static LambdaWrap lambdaWrap(Lambda& lambda) { return LambdaWrap(lambda); } template void forAll(Lambda&& lambda) const { const auto wrap = [&](const Entry& entry){ lambda(entry); return true; }; auto outerWrap = lambdaWrap(wrap); mLookup.forAll(outerWrap); } // *** Signature specific functionality size_t regularReducer( ConstMonoRef sig, ConstMonoRef mono, const SigPolyBasis& sigBasis, const bool preferSparseReducers ) const { SigPolyBasis::StoredRatioCmp ratioCmp(sig, mono, sigBasis); const auto& basis = sigBasis.basis(); auto reducer = size_t(-1); auto proceed = [&](const Entry& e) { if (ratioCmp.compare(e.data()) != GT) return true; if (reducer != size_t(-1)) { if (preferSparseReducers) { const auto newTermCount = basis.poly(e.data()).termCount(); const auto oldTermCount = basis.poly(reducer).termCount(); if (newTermCount > oldTermCount) return true; // what we already have is sparser // resolve ties by picking oldest if (newTermCount == oldTermCount && e.data() > reducer) return true; } else { // pick oldest if (e.data() > reducer) return true; // what we already have is older } } reducer = e.data(); return true; }; auto wrap = lambdaWrap(proceed); mLookup.findAllDivisors(mono, wrap); return reducer; } void lowBaseDivisors( std::vector& divisors, const size_t maxDivisors, const size_t newGenerator, const SigPolyBasis& basis ) const { MATHICGB_ASSERT(newGenerator < basis.size()); auto proceed = [&](const Entry& entry) { if (entry.data() >= newGenerator) return true; for (size_t j = 0; j <= divisors.size(); ++j) { if (j == divisors.size()) { divisors.push_back(entry.data()); break; } int cmp = basis.ratioCompare(entry.data(), divisors[j]); if (cmp == EQ && (entry.data() < divisors[j])) cmp = GT; // prefer minimum index to ensure deterministic behavior if (cmp == GT) { divisors.insert(divisors.begin() + j, entry.data()); break; } } if (divisors.size() > maxDivisors) divisors.pop_back(); MATHICGB_ASSERT(divisors.size() <= maxDivisors); return true; }; divisors.clear(); divisors.reserve(maxDivisors + 1); auto wrap = lambdaWrap(proceed); mLookup.findAllDivisors(basis.signature(newGenerator), wrap); } size_t highBaseDivisor( const size_t newGenerator, const SigPolyBasis& basis ) const { MATHICGB_ASSERT(newGenerator < basis.size()); auto highDivisor = size_t(-1); auto proceed = [&](const Entry& entry) { if (entry.data() >= newGenerator) return true; if (highDivisor != size_t(-1)) { int cmp = basis.ratioCompare(highDivisor, entry.data()); if (cmp == LT) return true; if (cmp == EQ && (entry.data() > highDivisor)) return true; // prefer minimum index to ensure deterministic behavior } highDivisor = entry.data(); return true; }; auto wrap = lambdaWrap(proceed); mLookup.findAllDivisors(basis.leadMono(newGenerator), wrap); return highDivisor; } size_t minimalLeadInSig( ConstMonoRef sig, const SigPolyBasis& basis ) const { // Given signature sig, we want to minimize (S/G)g where // g and G are the lead term and signature taken over basis elements // whose signature G divide S. The code here instead maximizes G/g, // which is equivalent and also faster since the basis has a data // structure to accelerate comparisons between the ratio of // signature to lead term. // // In case of ties, we select the sparser elements. If there is // still a tie, we select the basis element with the largest // signature. There can be no further ties since all basis // elements have distinct signatures. auto minLeadGen = size_t(-1); auto proceed = [&](const Entry& entry) { if (minLeadGen != size_t(-1)) { const int ratioCmp = basis.ratioCompare(entry.data(), minLeadGen); if (ratioCmp == LT) return true; if (ratioCmp == EQ) { // If same lead monomial in signature, pick the one with fewer terms // as that one might be less effort to reduce. const size_t minTerms = basis.poly(minLeadGen).termCount(); const size_t terms = basis.poly(entry.data()).termCount(); if (minTerms > terms) return true; if (minTerms == terms) { // If same number of terms, pick the one with larger signature // before being multiplied into the same signature. That one // might be more reduced as the constraint on regular reduction // is less. Also, as no two generators have same signature, this // ensures deterministic behavior. const auto minSig = basis.signature(minLeadGen); const auto genSig = basis.signature(entry.data()); if (basis.monoid().lessThan(genSig, minSig)) return true; } } } minLeadGen = entry.data(); return true; }; auto wrap = lambdaWrap(proceed); mLookup.findAllDivisors(sig, wrap); return minLeadGen; } // *** Classic GB specific functionality size_t classicReducer( ConstMonoRef mono, const PolyBasis& basis, const bool preferSparseReducers ) const { auto reducer = size_t(-1); auto proceed = [&](const Entry& entry) { if (reducer == size_t(-1)) { reducer = entry.data(); return true; } if (preferSparseReducers) { const auto oldTermCount = basis.poly(reducer).termCount(); const auto newTermCount = basis.poly(entry.data()).termCount(); if (oldTermCount > newTermCount) { reducer = entry.data(); // prefer sparser return true; } if (oldTermCount < newTermCount) return true; } // break ties by age if (reducer > entry.data()) reducer = entry.data(); // prefer older return true; }; auto wrap = lambdaWrap(proceed); mLookup.findAllDivisors(mono, wrap); return reducer; } // *** General functionality const Entry* divisor(ConstMonoRef mono) const { return mLookup.findDivisor(mono); } void divisors(ConstMonoRef mono, EntryOutput& consumer) const { auto proceed = [&](const Entry& e) {return consumer.proceed(e.data());}; auto wrap = lambdaWrap(proceed); mLookup.findAllDivisors(mono, wrap); } void multiples(ConstMonoRef mono, EntryOutput& consumer) const { auto proceed = [&](const Entry& e) {return consumer.proceed(e.data());}; auto wrap = lambdaWrap(proceed); mLookup.findAllMultiples(mono, wrap); } void removeMultiples(ConstMonoRef mono) { mLookup.removeMultiples(mono); } void remove(ConstMonoRef mono) {mLookup.removeElement(mono);} size_t size() const {return mLookup.size();} std::string getName() const {return mLookup.getName();} const PolyRing& ring() const {return mLookup.configuration().ring();} size_t getMemoryUse() const {return mLookup.getMemoryUse();} template void insert(ConstMonoRef mono, D&& data) { mLookup.insert(Entry(mono, std::forward(data))); } private: BaseLookup mLookup; }; /// Function for creating statically compiled classes that use /// StaticMonoLookup based on run-time values. /// /// The type Functor must have an interface that is compatible with the /// following example. /// /// template /// struct Functor { /// static ReturnType make(const Params& params) { /// // do your thing /// } /// }; template< template class Functor, class ReturnType, class Params > ReturnType staticMonoLookupMake( int type, bool allowRemovals, Params&& params ) { switch (type) { case 1: if (allowRemovals) return Functor<0, 1, 1>::make(std::forward(params)); else return Functor<0, 0, 1>::make(std::forward(params)); case 2: if (allowRemovals) return Functor<1, 1, 1>::make(std::forward(params)); else return Functor<1, 0, 1>::make(std::forward(params)); case 3: if (allowRemovals) return Functor<0, 1, 0>::make(std::forward(params)); else return Functor<0, 0, 0>::make(std::forward(params)); case 4: if (allowRemovals) return Functor<1, 1, 0>::make(std::forward(params)); else return Functor<1, 0, 0>::make(std::forward(params)); default: MATHICGB_ASSERT_NO_ASSUME(false); throw std::runtime_error("Unknown code for monomial data structure"); } } MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/mtbb.hpp0000664000175000017500000001564014570075453012636 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_M_TBB_GUARD #define MATHICGB_M_TBB_GUARD /// A compatibility layer for tbb. If we are compiling with tbb present, then /// these classes will simply be the same classes as in tbb. However, if we /// are compiling without tbb (so without parallelism), then these classes will /// be trivial non-parallel implementations that allows MathicGB to work /// without tbb being present. TBB doesn't work on Cygwin, so that is at least /// one good reason to have this compatibility layer. This only works if all /// uses of tbb go through mtbb, so make sure to do that. #ifndef WITH_TBB #ifndef MATHICGB_NO_TBB #define WITH_TBB 1 #endif #endif #ifdef WITH_TBB #include #include #include namespace mtbb { using ::tbb::global_control; using ::tbb::task_arena; using ::tbb::enumerable_thread_specific; using ::tbb::queuing_mutex; using ::tbb::null_mutex; using ::tbb::parallel_sort; using ::tbb::parallel_for; using ::tbb::blocked_range; using ::tbb::tick_count; using ::std::mutex; using lock_guard = ::std::lock_guard; template using unordered_map = ::tbb::concurrent_unordered_map; template #if TBB_VERSION_MAJOR >= 2021 using feeder = ::tbb::feeder; #else using feeder = ::tbb::parallel_do_feeder; #endif template static inline void parallel_for_each(T1 a, T1 b, T2 c) { #if TBB_VERSION_MAJOR >= 2021 tbb::parallel_for_each(a,b,c); #else tbb::parallel_do(a,b,c); #endif } inline int numThreads(int nthreads) { return (nthreads != 0 ? nthreads : #if TBB_VERSION_MAJOR >= 2021 tbb::info::default_concurrency() #else tbb::task_scheduler_init::default_num_threads() #endif ); } } #else // TBB not present // below is an interface to serial versions of the above code. #include #include #include #include #include #include #include #include namespace mtbb { class task_arena { public: task_arena(int) {} static const int automatic = 1; template auto execute(const F& f) -> decltype(f()) { return f(); } }; inline int numThreads(int nthreads) { return 1; } class mutex { public: mutex(): mLocked(false) {} void lock() { assert(!mLocked); // deadlock mLocked = true; } bool try_lock() { if (mLocked) return false; lock(); return true; } void unlock() { assert(mLocked); mLocked = false; } class scoped_lock { public: scoped_lock(): mMutex(nullptr) {} scoped_lock(mutex& m): mMutex(&m) {mMutex->lock();} ~scoped_lock() { if (mMutex != nullptr) release(); } void acquire(mutex& m) { assert(mMutex == nullptr); mMutex = &m; } bool try_acquire(mutex& m) { assert(mMutex == nullptr); if (!m.try_lock()) return false; mMutex = &m; return true; } void release() { assert(mMutex != nullptr); mMutex->unlock(); mMutex = nullptr; } private: mutex* mMutex; }; private: bool mLocked; }; using lock_guard = mutex::scoped_lock; using null_mutex = mutex; using queuing_mutex = mutex; template using unordered_map = ::std::unordered_map; template class enumerable_thread_specific { public: template enumerable_thread_specific(Op&& creater): mCreater(creater) {} bool empty() const {return mObj.get() == nullptr;} using reference = T&; T& local() { if (empty()) mObj = std::make_unique(mCreater()); assert(!empty()); return *mObj; } T* begin() { if (empty()) return nullptr; else return mObj.get(); } T* end() { if (empty()) return nullptr; else return begin() + 1; } void clear() { mObj.reset(nullptr); } private: std::function mCreater; std::unique_ptr mObj; }; template class blocked_range { public: typedef size_t size_type; typedef Value const_iterator; blocked_range(Value begin, Value end, size_t grainSize = 1): mBegin(begin), mEnd(end), mGrainSize(grainSize) {} size_type size() const {return end() - begin();} bool empty() const {return mBegin == mEnd;} size_type grainsize() const {return mGrainSize;} bool is_divisible() const {return false;} const_iterator begin() const {return mBegin;} const_iterator end() const {return mEnd;} private: const_iterator mBegin; const_iterator mEnd; size_type mGrainSize; }; template void parallel_for(Range&& range, Func&& f) { f(range); } template void parallel_for(Index begin, Index end, Index step, Func&& f) { for (auto i = begin; i < end; i += step) f(i); } template class feeder { public: feeder(std::vector& tasks): mTasks(tasks) {} template void add(TT&& t) {mTasks.push_back(std::forward(t));} private: std::vector& mTasks; }; template void parallel_for_each(InputIterator begin, InputIterator end, Body body) { typedef typename std::remove_reference::type Task; std::vector tasks; feeder feeder(tasks); for (; begin != end; ++begin) { tasks.push_back(*begin); while (!tasks.empty()) { auto task = std::move(tasks.back()); tasks.pop_back(); body(task, feeder); } } } template void parallel_sort(It begin, It end, Pred&& pred) { std::sort(begin, end, pred); } class tick_count { private: // This really should be std::chrono::steady_clock, but GCC 4.5.3 doesn't // have that. typedef std::chrono::system_clock clock; public: tick_count(): mTime() {} static tick_count now() { tick_count t; t.mTime = clock::now(); return t; } class interval_t { public: interval_t(double seconds): mSeconds(seconds) {} double seconds() const {return mSeconds;} private: const double mSeconds; }; interval_t operator-(const tick_count t) const { typedef std::chrono::duration SecondDuration; const auto duration = std::chrono::duration_cast(mTime - t.mTime); return duration.count(); } private: clock::time_point mTime; }; } #endif #endif mathicgb-1.1/src/mathicgb/CFile.cpp0000664000175000017500000000140114560325357012655 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "CFile.hpp" #include #include MATHICGB_NAMESPACE_BEGIN CFile::CFile(const std::string& fileName, const char* mode, NoThrowTag): mFile(fopen(fileName.c_str(), mode) ) {} CFile::CFile(const std::string& fileName, const char* mode): mFile(fopen(fileName.c_str(), mode) ) { if (mFile == 0) { std::ostringstream error; error << "Could not open file " << fileName << " in mode " << mode << '.'; mathic::reportError(error.str()); } } CFile::~CFile() { close(); } void CFile::close() { if (mFile != 0) fclose(mFile); } MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/ReducerHash.hpp0000664000175000017500000000103014560325357014073 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_REDUCER_HASH_GUARD #define MATHICGB_REDUCER_HASH_GUARD MATHICGB_NAMESPACE_BEGIN // This translation unit has to expose something that is needed elsewhere. // Otherwise, the compiler will think it is not needed and exclude the // whole thing, despite there being important global objects in the .cpp file. void reducerHashDependency(); MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/MathicIO.hpp0000664000175000017500000003755214560325357013355 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_MATHIC_IO_GUARD #define MATHICGB_MATHIC_IO_GUARD #include "Basis.hpp" #include "Poly.hpp" #include "Scanner.hpp" #include "PolyRing.hpp" #include "MonoProcessor.hpp" #include #include MATHICGB_NAMESPACE_BEGIN /// Class for input and output in Mathic's format. template< class Monoid = PolyRing::Monoid, class BaseField = PolyRing::Field > class MathicIO; template class MathicIO { public: typedef BF BaseField; typedef typename BaseField::Element Coefficient; typedef typename BaseField::RawElement RawCoefficient; typedef M Monoid; typedef typename Monoid::MonoRef MonoRef; typedef typename Monoid::Exponent Exponent; typedef typename Monoid::VarIndex VarIndex; typedef typename Monoid::ConstMonoRef ConstMonoRef; typedef typename Monoid::Order Order; typedef typename Monoid::MonoVector MonoVector; typedef MonoProcessor Processor; typedef typename Order::Gradings Gradings; BaseField readBaseField(Scanner& in); void writeBaseField(const BaseField& field, std::ostream& out); std::pair, Processor> readRing( const bool withComponent, Scanner& in ); void writeRing( const PolyRing& ring, const Processor& processor, const bool withComponent, std::ostream& out ); Order readOrderWithVarCount(bool withComponent, Scanner& in); void writeOrderWithVarCount (const Order& monoid, const bool withComponent, std::ostream& out); Order readOrder( const VarIndex varCount, const bool withComponent, Scanner& in ); void writeOrder( const Order& order, const bool withComponent, std::ostream& out ); Basis readBasis( const PolyRing& ring, const bool readComponent, Scanner& in ); void writeBasis( const Basis& basis, const bool writeComponent, std::ostream& out ); /// Reads a polynomial and does not reorder the terms to be in descending /// order. Poly readPolyDoNotOrder( const PolyRing& ring, const bool readComponent, Scanner& in ); /// Reads a polynomial and orders the terms in descending order. Poly readPoly(const PolyRing& ring, const bool readComponent, Scanner& in); void writePoly( const Poly& poly, const bool writeComponent, std::ostream& out ); void readTerm( const PolyRing& ring, const bool readComponent, Coefficient& coef, MonoRef mono, Scanner& in ); void writeTerm( const PolyRing& ring, const bool writeComponent, const Coefficient coef, ConstMonoRef mono, bool writeSignEvenIfPositive, std::ostream& out ); /// Read a monomial with no coefficient. A 1 on its own is not /// considered a coefficient here - it is the monomial with all /// exponents zero and no coefficient. /// /// @todo: Eventually, pick up readComponent from Monoid::HasComponent. void readMonomial( const Monoid& monoid, const bool readComponent, MonoRef mono, Scanner& in ); /// Print a monomial with no coefficient. void writeMonomial( const Monoid& monoid, const bool writeComponent, ConstMonoRef mono, std::ostream& out ); /// Reads a non-empty space-separated list of monomials. The monomials /// are appended to the end of the vector. void readMonomialVector( const bool readComponents, Scanner& in, MonoVector& v ) { MATHICGB_ASSERT(Monoid::HasComponent || !readComponents); while (true) { v.push_back(); readMonomial(v.monoid(), readComponents, v.back(), in); if (in.peek() != ' ') break; in.get(); } } void writeMonomialVector( const MonoVector& v, const bool writeComponent, std::ostream& out ) { MATHICGB_ASSERT(Monoid::HasComponent || !writeComponent); for (auto it = v.begin(); it != v.end(); ++it) { if (it != v.begin()) out << ' '; writeMonomial(v.monoid(), writeComponent, *it, out); } out << '\n'; } /// Read the trailing indicator of the component of a module monomial. void readComponent( const Monoid& monoid, MonoRef mono, Scanner& in ); void writeComponent( const Monoid& monoid, ConstMonoRef mono, std::ostream& out ); }; template auto MathicIO::readBaseField(Scanner& in) -> BaseField { return BaseField(in.readInteger()); } template void MathicIO::writeBaseField( const BaseField& field, std::ostream& out ) { out << field.charac(); } template auto MathicIO::readRing( const bool withComponent, Scanner& in ) -> std::pair, Processor> { auto baseField = readBaseField(in); const auto varCount = in.readInteger(); auto order = readOrder(varCount, withComponent, in); const bool componentsAscendingDesired = order.componentsAscendingDesired(); const bool schreyering = order.schreyering(); auto ring = make_unique (std::move(baseField), Monoid(std::move(order))); Processor processor( ring->monoid(), componentsAscendingDesired, schreyering ); return std::make_pair(std::move(ring), std::move(processor)); } template void MathicIO::writeRing( const PolyRing& ring, const Processor& processor, const bool withComponent, std::ostream& out ){ writeBaseField(ring.field(), out); out << ' ' << ring.varCount() << '\n'; auto&& order = ring.monoid().makeOrder( processor.componentsAscendingDesired(), processor.schreyering() ); writeOrder(order, withComponent, out); } template auto MathicIO::readOrderWithVarCount(bool withComponent, Scanner& in) -> Order { const auto varCount = in.readInteger(); return readOrder(varCount, withComponent, in); } template void MathicIO::writeOrderWithVarCount( const Order& order, const bool withComponent, std::ostream& out ) { out << order.varCount() << '\n'; writeOrder(order, withComponent, out); } template auto MathicIO::readOrder( const VarIndex varCount, const bool withComponent, Scanner& in ) -> Order { const bool schreyering = in.match("schreyer"); bool lexBaseOrder = !in.match("revlex") && in.match("lex"); auto gradingCount = in.readInteger(); bool componentsAscendingDesired = true; auto componentCompareIndex = Order::ComponentAfterBaseOrder; Gradings gradings; gradings.reserve(static_cast(varCount) * gradingCount); for (VarIndex grading = 0; grading < gradingCount; ++grading) { const bool com = in.match("component"); if (com || in.match("revcomponent")) { if (!withComponent) in.reportError("Cannot specify component comparison for non-modules."); MATHICGB_ASSERT(Monoid::HasComponent); if (componentCompareIndex != Order::ComponentAfterBaseOrder) in.reportError("Component comparison must be specified at most once."); componentsAscendingDesired = com; componentCompareIndex = grading; } else { for (VarIndex i = 0; i < varCount; ++i) gradings.emplace_back(in.readInteger()); } } const bool moreLex = in.match("_lex"); if (moreLex || in.match("_revlex")) { lexBaseOrder = moreLex; const bool moreCom = in.match("component"); if (moreCom || in.match("revcomponent")) { if (!withComponent) in.reportError("Cannot specify component comparison for non-modules."); MATHICGB_ASSERT(Monoid::HasComponent); componentsAscendingDesired = moreCom; } } Order order( varCount, std::move(gradings), lexBaseOrder ? Order::LexBaseOrderFromRight : Order::RevLexBaseOrderFromRight, componentCompareIndex, componentsAscendingDesired, schreyering ); return order; } template void MathicIO::writeOrder( const Order& order, const bool withComponent, std::ostream& out ) { MATHICGB_ASSERT(Monoid::HasComponent || !withComponent); const auto baseOrder = order.baseOrder() == Order::LexBaseOrderFromRight ? "lex" : "revlex"; const auto componentOrder = order.componentsAscendingDesired() ? "component" : "revcomponent"; if (order.schreyering()) out << "schreyer "; const bool componentLast = order.componentBefore() == Order::ComponentAfterBaseOrder; out << baseOrder << ' ' << order.gradingCount() + !componentLast << '\n'; for (VarIndex grading = 0; grading < order.gradingCount(); ++grading) { if (withComponent && grading == order.componentBefore()) out << ' ' << componentOrder << '\n'; for (VarIndex var = 0; var < order.varCount(); ++var) { const auto index = var + grading * order.varCount(); out << ' ' << unchar(order.gradings()[index]); } out << '\n'; } if (withComponent && order.componentBefore() == order.gradingCount()) out << ' ' << componentOrder << '\n'; if ( withComponent && !order.componentsAscendingDesired() && order.componentBefore() == Order::ComponentAfterBaseOrder ) { out << " _" << baseOrder << "\n " << componentOrder << '\n'; } } template Basis MathicIO::readBasis( const PolyRing& ring, const bool readComponent, Scanner& in ) { const auto polyCount = in.readInteger(); Basis basis(ring); for (size_t i = 0; i < polyCount; ++i) { auto p = make_unique(readPoly(ring, readComponent, in)); *p = p->polyWithTermsDescending(); basis.insert(std::move(p)); } return basis; } template void MathicIO::writeBasis( const Basis& basis, const bool writeComponent, std::ostream& out ) { out << basis.size() << '\n'; for (size_t i = 0; i < basis.size(); ++i) { out << ' '; writePoly(*basis.getPoly(i), writeComponent, out); out << '\n'; } } template Poly MathicIO::readPoly( const PolyRing& ring, const bool readComponent, Scanner& in ) { return readPolyDoNotOrder(ring, readComponent, in).polyWithTermsDescending(); } template Poly MathicIO::readPolyDoNotOrder( const PolyRing& ring, const bool readComponent, Scanner& in ) { Poly p(ring); // also skips whitespace if (in.match('0') || in.match("+0") || in.match("-0")) return p; MATHICGB_ASSERT(!in.peekWhite()); auto mono = ring.monoid().alloc(); auto coef = ring.field().zero(); do { if (!p.isZero() && !in.peekSign() && (!readComponent || in.peek() != '<')) in.expect('+', '-'); readTerm(ring, readComponent, coef, mono, in); p.append(coef.value(), *mono); } while (!in.peekWhite() && !in.matchEOF()); return p; } template void MathicIO::writePoly( const Poly& poly, const bool writeComponent, std::ostream& out ) { if (poly.isZero()) { out << '0'; return; } const auto end = poly.end(); for (auto it = poly.begin(); it != end; ++it) { writeTerm( poly.ring(), writeComponent, it.coef(), it.mono(), it != poly.begin(), out ); } } template void MathicIO::readTerm( const PolyRing& ring, const bool readComponent, Coefficient& coef, MonoRef mono, Scanner& in ) { // ** Read coefficient, if any. const auto& field = ring.field(); const auto& monoid = ring.monoid(); const bool negate = !in.match('+') && in.match('-'); if (in.peekDigit()) { coef = in.readModular(field, negate); if (!in.peekAlpha()) { // Identify a number c on its own as the monomial 1 times c. monoid.setIdentity(mono); if (readComponent) this->readComponent(monoid, mono, in); return; } } else if (negate) coef = field.minusOne(); else coef = field.one(); readMonomial(monoid, readComponent, mono, in); } template void MathicIO::writeTerm( const PolyRing& ring, const bool writeComponent, Coefficient coef, ConstMonoRef mono, bool writeSignEvenIfPositive, std::ostream& out ) { Coefficient coef1 = coef; if (ring.field().isNegative(coef)) { out << "-"; coef1 = ring.field().negativeNonZero(coef); } else if (writeSignEvenIfPositive) out << '+'; if (!ring.field().isOne(coef1)) { out << unchar(coef1.value()); if (ring.monoid().isIdentity(mono)) { if (writeComponent) this->writeComponent(ring.monoid(), mono, out); return; } } writeMonomial(ring.monoid(), writeComponent, mono, out); } template void MathicIO::readMonomial( const Monoid& monoid, const bool readComponent, MonoRef mono, Scanner& in ) { MATHICGB_ASSERT(!readComponent || Monoid::HasComponent); monoid.setIdentity(mono); if (in.peek() == '1') { const auto e = in.readInteger(); if (e != 1) { std::ostringstream err; err << "Expected monomial, but got " << e << " (did you mean 1?)."; in.reportError(err.str()); } } else if (!readComponent || in.peek() != '<') { bool sawSome = false; while (true) { const auto letterCount = 'z' - 'a' + 1; const auto letter = in.peek(); VarIndex var; if ('a' <= letter && letter <= 'z') var = letter - 'a'; else if ('A' <= letter && letter <= 'Z') var = (letter - 'A') + letterCount; else if (sawSome) break; else { std::ostringstream err; err << "Expected letter while reading monomial, but got '" << static_cast(letter) << "'."; in.reportError(err.str()); return; } in.get(); // skip past letter MATHICGB_ASSERT(var < 2 * letterCount); if (var >= monoid.varCount()) { std::ostringstream err; err << "Saw the variable " << static_cast(letter) << ", but the monoid only has " << monoid.varCount() << " variables."; in.reportError(err.str()); return; } if (monoid.externalExponent(mono, var) > static_cast(0)) { std::ostringstream err; err << "Variable " << static_cast(letter) << " must not be written twice in one monomial."; in.reportError(err.str()); } if (in.peekDigit()) monoid.setExternalExponent(var, in.readInteger(), mono); else monoid.setExternalExponent(var, static_cast(1), mono); sawSome = true; } } if (readComponent) this->readComponent(monoid, mono, in); } template void MathicIO::readComponent( const Monoid& monoid, MonoRef mono, Scanner& in ) { MATHICGB_ASSERT(Monoid::HasComponent); in.expect('<'); monoid.setComponent(in.readInteger(), mono); in.expect('>'); } template void MathicIO::writeComponent( const Monoid& monoid, ConstMonoRef mono, std::ostream& out ) { MATHICGB_ASSERT(Monoid::HasComponent); out << '<' << unchar(monoid.component(mono)) << '>'; } /// Print a monomial with no coefficient. template void MathicIO::writeMonomial( const Monoid& monoid, const bool writeComponent, ConstMonoRef mono, std::ostream& out ) { const auto letterCount = 'z' - 'a' + 1; bool printedSome = false; for (VarIndex var = 0; var < monoid.varCount(); ++var) { const auto e = monoid.exponent(mono, var); if (e == 0) continue; char letter; if (var < letterCount) letter = 'a' + static_cast(var); else if (var < 2 * letterCount) letter = 'A' + (static_cast(var) - letterCount); else { mathic::reportError("Too few letters in alphabet to print variable."); return; } printedSome = true; out << letter; if (e != 1) out << unchar(e); } if (!printedSome) out << '1'; if (writeComponent) this->writeComponent(monoid, mono, out); } MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/F4MatrixProjection.cpp0000664000175000017500000002555714560325357015410 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "F4MatrixProjection.hpp" #include "ScopeExit.hpp" MATHICGB_NAMESPACE_BEGIN F4MatrixProjection::F4MatrixProjection( const PolyRing& ring, ColIndex colCount ): mColProjectTo(colCount), mRing(ring) {} void F4MatrixProjection::addColumn( const ColIndex projectFrom, ConstMonoRef mono, const bool isLeft ) { MATHICGB_ASSERT(projectFrom < mColProjectTo.size()); MATHICGB_ASSERT (mLeftMonomials.size() + mRightMonomials.size() < mColProjectTo.size()); auto monoCopy = mRing.monoid().alloc(); mRing.monoid().copy(mono, *monoCopy); auto& projected = mColProjectTo[projectFrom]; if (isLeft) { projected.isLeft = true; projected.index = static_cast(mLeftMonomials.size()); mLeftMonomials.push_back(monoCopy.ptr()); } else { projected.isLeft = false; projected.index = static_cast(mRightMonomials.size()); mRightMonomials.push_back(monoCopy.ptr()); } monoCopy.release(); } struct RowData : F4ProtoMatrix::Row { RowData(): F4ProtoMatrix::Row() {} RowData(const F4ProtoMatrix::Row& row): F4ProtoMatrix::Row(row) {} }; typedef std::pair RowProjectFrom; template class F4MatrixProjection::TopBottom { public: typedef std::pair RowMultiple; typedef std::vector RowVector; TopBottom(const size_t leftColCount, const PolyRing& ring): mModulus(static_cast(ring.charac())), mTopRows(leftColCount) { MATHICGB_ASSERT(ring.charac() <= std::numeric_limits::max()); MATHICGB_ASSERT(leftColCount <= std::numeric_limits::max()); } void addRow(const Row& row, ColIndex leadIndex, Scalar leadScalar) { if (row.entryCount == 0) return; // Skip zero rows. if (leadIndex == std::numeric_limits::max()) { // this row has no left entries, so it cannot be a top row. mBottomRows.push_back(RowMultiple(row, 1)); return; } const auto currentTop = mTopRows[leadIndex].first; if ( currentTop.entryCount != 0 && // already have a reducer and... currentTop.entryCount < row.entryCount // ...it is sparser/better ) { mBottomRows.push_back(RowMultiple(row, 1)); } else { if (currentTop.entryCount != 0) mBottomRows.push_back(std::make_pair(currentTop, 1)); MATHICGB_ASSERT(leadScalar != 0); const auto inverse = leadScalar == 1 ? // 1 is a common case 1 : modularInverse(leadScalar, mModulus); mTopRows[leadIndex] = RowMultiple(row, inverse); } } bool debugAssertValid() { #ifdef MATHICGB_DEBUG auto check = [](RowMultiple r) { MATHICGB_ASSERT(r.first.entryCount > 0); MATHICGB_ASSERT(r.second != 0); }; std::for_each(mTopRows.begin(), mTopRows.end(), check); std::for_each(mBottomRows.begin(), mBottomRows.end(), check); #endif return true; } Scalar modulus() const {return mModulus;} const RowVector& top() const {return mTopRows;} const RowVector& bottom() const {return mBottomRows;} RowVector moveTop() {return mTopRows;} RowVector moveBottom() {return mBottomRows;} private: const Scalar mModulus; RowVector mTopRows; RowVector mBottomRows; }; class F4MatrixProjection::LeftRight { public: typedef F4ProtoMatrix::ExternalScalar ExternalScalar; typedef F4ProtoMatrix::Row Row; LeftRight( const std::vector& colProjectTo, const PolyRing& ring, const size_t quantum ): mColProjectTo(colProjectTo), mModulus(static_cast(ring.charac())), mLeft(quantum), mRight(quantum) { MATHICGB_ASSERT(ring.charac() < std::numeric_limits::max()); mLeft.clear(); mRight.clear(); } template void appendRowsPermuted(const std::vector& rows) { const auto end = rows.end(); for (auto it = rows.begin(); it != end; ++it) appendRow(it->first, it->second); } void appendRows(const std::vector& preBlocks) { const auto end = preBlocks.end(); for (auto it = preBlocks.begin(); it != end; ++it) { auto& block = **it; const auto rowCount = block.rowCount(); for (SparseMatrix::RowIndex r = 0; r < rowCount; ++r) { const auto row = block.row(r); if (row.entryCount > 0) appendRow(row); } } } void appendRow(const Row& row) { MATHICGB_ASSERT(row.entryCount > 0); // could be OK, but unexpected const auto indicesEnd = row.indices + row.entryCount; if (row.scalars == nullptr) appendRow(row.indices, indicesEnd, row.externalScalars); else appendRow(row.indices, indicesEnd, row.scalars); } void appendRow(const Row& row, Scalar multiplyBy) { MATHICGB_ASSERT(multiplyBy != 0); appendRow(row); if (multiplyBy != 1) { const auto rowIndex = mLeft.rowCount() - 1; mLeft.multiplyRow(rowIndex, multiplyBy, mModulus); mRight.multiplyRow(rowIndex, multiplyBy, mModulus); } } template void appendRow( IndexIter indices, const IndexIter indicesEnd, ScalarIter scalars ) { for (; indices != indicesEnd; ++indices, ++scalars) appendEntry(*indices, *scalars); rowDone(); } void appendEntry(const ColIndex projectMe, const Scalar scalar) { MATHICGB_ASSERT(scalar < mModulus); MATHICGB_ASSERT(mLeft.rowCount() == mRight.rowCount()); MATHICGB_ASSERT(projectMe < mColProjectTo.size()); const auto projected = mColProjectTo[projectMe]; if (projected.isLeft) mLeft.appendEntry(projected.index, scalar); else mRight.appendEntry(projected.index, scalar); } void appendEntry(const ColIndex projectMe, const ExternalScalar scalar) { MATHICGB_ASSERT(scalar <= std::numeric_limits::max()); appendEntry(projectMe, static_cast(scalar)); } void rowDone() { MATHICGB_ASSERT(mLeft.rowCount() == mRight.rowCount()); mLeft.rowDone(); mRight.rowDone(); }; const SparseMatrix& left() const {return mLeft;} const SparseMatrix& right() const {return mRight;} SparseMatrix moveLeft() {return std::move(mLeft);} SparseMatrix moveRight() {return std::move(mRight);} private: const std::vector& mColProjectTo; const Scalar mModulus; SparseMatrix mLeft; SparseMatrix mRight; }; QuadMatrix F4MatrixProjection::makeAndClear(const size_t quantum) { if (true) return makeAndClearOneStep(quantum); else return makeAndClearTwoStep(quantum); } QuadMatrix F4MatrixProjection::makeAndClearOneStep(const size_t quantum) { // Construct top/bottom row permutation TopBottom tb(mLeftMonomials.size(), ring()); const auto end = mMatrices.end(); for (auto it = mMatrices.begin(); it != end; ++it) { const auto& matrix = **it; const auto rowCount = matrix.rowCount(); for (RowIndex r = 0; r < rowCount; ++r) { const auto& row = matrix.row(r); // const ref keeps temporary alive if (row.entryCount == 0) continue; // ignore zero rows // *** Look for leading left entry ColIndex lead = 0; for (; lead < row.entryCount; ++lead) { MATHICGB_ASSERT(row.indices[lead] < mColProjectTo.size()); auto const projected = mColProjectTo[row.indices[lead]]; if (projected.isLeft) { const auto leadScalar = row.scalars != nullptr ? row.scalars[lead] : static_cast(row.externalScalars[lead]); tb.addRow(row, projected.index, leadScalar); goto done; } } // Did not find any left entry. tb.addRow(row, std::numeric_limits::max(), 0); done:; } } MATHICGB_ASSERT(tb.debugAssertValid()); // Split left/right and top/bottom simultaneously LeftRight top(mColProjectTo, ring(), quantum); top.appendRowsPermuted(tb.moveTop()); LeftRight bottom(mColProjectTo, ring(), 0); bottom.appendRowsPermuted(tb.moveBottom()); // Move the data into place QuadMatrix qm(ring()); qm.leftColumnMonomials = std::move(mLeftMonomials); qm.rightColumnMonomials = std::move(mRightMonomials); qm.topLeft = top.moveLeft(); qm.topRight = top.moveRight(); qm.bottomLeft = bottom.moveLeft(); qm.bottomRight = bottom.moveRight(); return qm; } namespace { // Helper function for F4MatrixProjection::makeAndClearTwoStep template std::pair projectRows( const TopBottom& tb, size_t quantum, SparseMatrix&& in ) { const auto modulus = tb.modulus(); SparseMatrix top(quantum); const auto topRows = tb.top(); const auto rowCountTop = static_cast(topRows.size()); for (SparseMatrix::RowIndex toRow = 0; toRow < rowCountTop; ++toRow) { top.appendRow(in, topRows[toRow].first.index); if (topRows[toRow].second != 1) top.multiplyRow(toRow, topRows[toRow].second, modulus); } SparseMatrix bottom(quantum); const auto bottomRows = tb.bottom(); const auto rowCountBottom = static_cast(bottomRows.size()); for (SparseMatrix::RowIndex toRow = 0; toRow < rowCountBottom; ++toRow) { bottom.appendRow(in, bottomRows[toRow].first.index); if (bottomRows[toRow].second != 1) bottom.multiplyRow(toRow, bottomRows[toRow].second, modulus); } in.clear(); return std::make_pair(std::move(top), std::move(bottom)); } } QuadMatrix F4MatrixProjection::makeAndClearTwoStep(const size_t quantum) { // Split whole matrix into left/right LeftRight lr(mColProjectTo, ring(), quantum); lr.appendRows(mMatrices); // Construct top/bottom matrix permutation struct Row { RowIndex index; ColIndex entryCount; }; TopBottom tb(mLeftMonomials.size(), ring()); const auto rowCount = lr.left().rowCount(); for (SparseMatrix::RowIndex row = 0; row < rowCount; ++row) { const auto leftEntryCount = lr.left().entryCountInRow(row); const auto entryCount = leftEntryCount + lr.right().entryCountInRow(row); MATHICGB_ASSERT(entryCount >= leftEntryCount); // no overflow if (entryCount == 0) continue; // ignore zero rows const Row r = {row, entryCount}; if (leftEntryCount == 0) tb.addRow(r, std::numeric_limits::max(), 0); else { const auto entry = lr.left().rowBegin(row); tb.addRow(r, entry.index(), entry.scalar()); } } MATHICGB_ASSERT(tb.debugAssertValid()); QuadMatrix qm(ring()); auto left = projectRows(tb, quantum, lr.moveLeft()); auto right = projectRows(tb, quantum, lr.moveRight()); qm.topLeft = std::move(left.first); qm.bottomLeft = std::move(left.second); qm.topRight = std::move(right.first); qm.bottomRight = std::move(right.second); qm.leftColumnMonomials = std::move(mLeftMonomials); qm.rightColumnMonomials = std::move(mRightMonomials); return qm; } MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/PrimeField.hpp0000664000175000017500000002405214560325357013727 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_PRIME_FIELD_GUARD #define MATHICGB_PRIME_FIELD_GUARD #include #include #include #include MATHICGB_NAMESPACE_BEGIN /// Implements arithmetic in a prime field. T must be an unsigned integer type /// that is used to store the elements of the field. The characteristic of the /// field must be a prime not exceeding std::numeric_limits::max(). template class PrimeField { public: typedef T RawElement; class Element { public: // Re-instate this assert once all code has moved to using PrimeField // properly so that coefficients are no longer signed. //static_assert(!std::numeric_limits::is_signed, ""); static_assert(std::numeric_limits::is_integer, ""); /// This constructor/conversion needs to go away as soon as all code /// has been converted to using PrimeField properly. Kill it with fire! Element(const RawElement& e): mValue(e) {} /// This conversion needs to go away as soon as all code /// has been converted to using PrimeField properly. Kill it with fire! operator RawElement&() {return mValue;} /// This conversion needs to go away as soon as all code /// has been converted to using PrimeField properly. Kill it with fire! operator const RawElement&() const {return mValue;} /// This method needs to go away as soon as all code /// has been converted to using PrimeField properly. Kill it with fire! bool operator==(const RawElement e) const {return value() == e.value();} /// This method needs to go away as soon as all code /// has been converted to using PrimeField properly. Kill it with fire! bool operator!=(const RawElement e) const {return !(*this == e);} Element(const Element& e): mValue(e.value()) {} Element& operator=(const Element& e) { mValue = e.value(); return *this; } bool operator==(const Element e) const {return value() == e.value();} bool operator!=(const Element e) const {return !(*this == e);} T value() const {return mValue;} private: friend class PrimeField; // Uncomment this constructor once the public one is gone. //Element(const T value): mValue(value) {} friend class PrimeFile; T mValue; }; typedef Element& ElementRef; typedef const Element& ConstElementRef; typedef Element* ElementPtr; typedef const Element* ConstElementPtr; typedef std::vector ElementVector; PrimeField(const T primeCharacteristic): mCharac(primeCharacteristic) {} Element zero() const {return Element(0);} Element one() const {return Element(1);} Element minusOne() const {return Element(charac() - 1);} bool isZero(const Element a) const {return a == zero();} bool isOne(const Element a) const {return a == one();} /// Returns true if a is strictly in the upper half of the range of values. /// These can be considered as a negative number with smaller absolute /// value, which can be useful for example when printing the value. bool isNegative(const Element a) const { return a.value() > (charac() + 1) / 2; } T charac() const {return mCharac;} /// Assumes that i is in the range [0;charac()). template Element toElementInRange(Integer&& i) const { typedef typename std::remove_reference::type NoRefInteger; static_assert(std::numeric_limits::is_integer, ""); MATHICGB_ASSERT(0 <= i); //replace the below assert with these 2 commented lines once we get rid //of signed element types. //typedef typename std::make_unsigned::type Unsigned; //MATHICGB_ASSERT(static_cast(i) < charac()); MATHICGB_ASSERT(i < charac()); return Element(i); } template Element toElement(Integer&& i) const { typedef typename std::remove_reference::type NoRefInteger; static_assert(std::numeric_limits::is_integer, ""); // We need to take the modulus of i to put it into the range [0;charac()). // That is more tricky to get right than it might seem. // // The sign of a % b is implementation defined in C++ if either of a or b // are negative. We need the positive remainder so the operands have to be // positive. Another reason for this is that we could not allow b to be // converted to a signed integer since it might not be representable that // way. // // If Integer is signed and i is std::numeric_limits::min() then // it is undefined behavior to evaluate the expression -i since -i is not // representable, leading to a signed overflow. So we have to cast to // unsigned before doing the minus. typedef typename std::make_unsigned::type Unsigned; if (i < 0) { // Negate i to get a positive number, then negate again to cancel out // the first negation. The first cast to unsigned is to avoid // undefined behavior from -i. The second is there because apparently, // at least on GCC, the unary - re-introduces signed and we need to // be unsigned to avoid sign extension. We need zero extension. const auto unsignedNegative = static_cast(-static_cast(i)); return negative(Element(unsignedNegative % charac())); } else return Element(static_cast(i) % charac()); } T toValue(Element e) const {return e.value;} Element sum(const Element a, const Element b) const { const auto s = a.value() + b.value(); // The sum overflowed if and only if a.value() > s. In that case // subtraction of charac() will overflow again in the other direction, // leaving us with the correct result. // @todo: extend precision to rule out overflow without a branch. if (a.value() > s || s >= charac()) { MATHICGB_ASSERT(s - charac() < charac()); return Element(s - charac()); } else return Element(s); } Element plusOne(const Element a) const { const auto s = a.value() + 1; if (s == charac()) return Element(0); else return Element(s); } Element difference(const Element a, const Element b) const { if (a.value() < b.value()) { MATHICGB_ASSERT(a.value() - b.value() + charac() < charac()); return Element(a.value() - b.value() + charac()); } else return Element(a.value() - b.value()); } Element negative(const Element a) const { if (a.value() == 0) return a; else return negativeNonZero(a); } Element negativeNonZero(const Element a) const { MATHICGB_ASSERT(!isZero(a)); return Element(charac() - a.value()); } Element product(const Element a, const Element b) const; /// Returns a times the inverse of b. Element quotient(const Element a, const Element b) const { return product(a, inverse(b)); } /// Returns the multiplicative inverse a^-1 mod charac(). a must not be zero. Element inverse(const Element a) const; private: const T mCharac; }; namespace PrimeFieldInternal { template struct ModularProdType {}; template<> struct ModularProdType {typedef uint16 type;}; template<> struct ModularProdType {typedef uint32 type;}; template<> struct ModularProdType {typedef uint64 type;}; template<> struct ModularProdType {typedef int16 type;}; template<> struct ModularProdType {typedef int32 type;}; template<> struct ModularProdType {typedef int64 type;}; // @todo: Remove this typedef when possible. 64 bits is not enough // to store a 64 bit product. We need it right now because // coefficients are handled as 64 bit in the legacy PolyRing. template<> struct ModularProdType {typedef uint64 type;}; template<> struct ModularProdType {typedef uint64 type;}; template<> struct ModularProdType {typedef uint64 type;}; template<> struct ModularProdType {typedef uint64 type;}; } template auto PrimeField::product( const Element a, const Element b ) const -> Element { typedef typename PrimeFieldInternal::ModularProdType::type BigT; BigT bigProd = static_cast(a.value()) * b.value(); MATHICGB_ASSERT(a.value() == 0 || bigProd / a.value() == static_cast(b.value())); return Element(static_cast(bigProd % charac())); } template auto PrimeField::inverse(const Element elementA) const -> Element { // We do two turns of the extended Euclidian algorithm per // loop. Usually the sign of x changes each time through the loop, // but we avoid that by representing every other x as its negative, // which is the value minusLastX. This way no negative values ever // appear and we do not need any extra bits. auto a = elementA.value(); MATHICGB_ASSERT(0 < a); MATHICGB_ASSERT(a < charac()); auto b = charac(); auto minusLastX = static_cast(0); auto x = static_cast(1); while (true) { MATHICGB_ASSERT(x <= charac()); MATHICGB_ASSERT(minusLastX <= charac()); // first turn if (a == 1) break; const auto firstQuotient = b / a; b -= firstQuotient * a; minusLastX += firstQuotient * x; // second turn if (b == 1) { MATHICGB_ASSERT(!isZero(minusLastX)); MATHICGB_ASSERT(minusLastX < charac()); x = charac() - minusLastX; break; } const auto secondQuotient = a / b; a -= secondQuotient * b; x += secondQuotient * minusLastX; } MATHICGB_ASSERT(x >= 1); MATHICGB_ASSERT(x < charac()); const Element inverseElement(x); MATHICGB_ASSERT(isOne(product(elementA, inverseElement))); return inverseElement; } /// Returns true if a and b are the same object. template bool operator==(const PrimeField& a, const PrimeField& b) { return &a == &b; } /// As !(a == b). template bool operator!=(const PrimeField& a, const PrimeField& b) { return !(a == b); } template std::ostream& operator<<( std::ostream& out, typename PrimeField::Element e ) { out << e.value(); return out; } MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/ClassicGBAlg.cpp0000664000175000017500000005400514560325357014121 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "ClassicGBAlg.hpp" #include "Reducer.hpp" #include "SPairs.hpp" #include "PolyBasis.hpp" #include "Basis.hpp" #include "LogDomain.hpp" #include "MathicIO.hpp" #include #include #include #include MATHICGB_DEFINE_LOG_DOMAIN( SPairDegree, "Displays the degree of the S-pairs being considered in " "Buchberger's algorithm." ); MATHICGB_DEFINE_LOG_DOMAIN( GBInsert, "Outputs polynomials that are inserted into the current " "basis during Groebner basis computation using Buchberger's. " "algorithm." ); MATHICGB_NAMESPACE_BEGIN /// Calculates a classic Grobner basis using Buchberger's algorithm. class ClassicGBAlg { public: ClassicGBAlg( const Basis& basis, Reducer& reducer, int monoLookupType, bool preferSparseReducers, size_t queueType ); // Replaces the current basis with a Grobner basis of the same ideal. void computeGrobnerBasis(); // How many S-pairs were not eliminated before reduction of the // corresponding S-polynomial. unsigned long long sPolyReductionCount() const {return mSPolyReductionCount;} // Returns the current basis. PolyBasis& basis() {return mBasis;} // Shows statistics on what the algorithm has done. void printStats(std::ostream& out) const; void printMemoryUse(std::ostream& out) const; size_t getMemoryUse() const; void setBreakAfter(unsigned int elements) { mBreakAfter = elements; } void setPrintInterval(unsigned int reductions) { mPrintInterval = reductions; } /// A value of zero means to let the algorithm decide a reasonable /// value based on the other settings. void setSPairGroupSize(unsigned int groupSize); void setReducerMemoryQuantum(size_t memoryQuantum) { mReducer.setMemoryQuantum(memoryQuantum); } void setUseAutoTopReduction(bool value) { mUseAutoTopReduction = value; } void setUseAutoTailReduction(bool value) { mUseAutoTailReduction = value; } /// callback is called every once in a while and then it has the /// option of stopping the computation. callback can be null, in /// which case no call is made and the computation continues. void setCallback(std::function callback) { mCallback = std::move(callback); } private: std::function mCallback; unsigned int mBreakAfter; unsigned int mPrintInterval; unsigned int mSPairGroupSize; bool mUseAutoTopReduction; bool mUseAutoTailReduction; // Perform a step of the algorithm. void step(); void autoTailReduce(); void insertReducedPoly(std::unique_ptr poly); // clears polynomials. void insertPolys(std::vector >& polynomials); const PolyRing& mRing; Reducer& mReducer; PolyBasis mBasis; SPairs mSPairs; mic::Timer mTimer; unsigned long long mSPolyReductionCount; }; ClassicGBAlg::ClassicGBAlg( const Basis& basis, Reducer& reducer, int monoLookupType, bool preferSparseReducers, size_t queueType ): mCallback(nullptr), mBreakAfter(0), mPrintInterval(0), mSPairGroupSize(reducer.preferredSetSize()), mUseAutoTopReduction(true), mUseAutoTailReduction(false), mRing(*basis.getPolyRing()), mReducer(reducer), mBasis(mRing, MonoLookup::makeFactory( basis.getPolyRing()->monoid(), monoLookupType )->make(preferSparseReducers, true) ), mSPairs(mBasis, preferSparseReducers), mSPolyReductionCount(0) { // Reduce and insert the generators of the ideal into the starting basis size_t const basisSize = basis.size(); std::vector > polys; for (size_t gen = 0; gen != basisSize; ++gen) polys.push_back(make_unique(*basis.getPoly(gen))); insertPolys(polys); } void ClassicGBAlg::setSPairGroupSize(unsigned int groupSize) { if (groupSize == 0) groupSize = mReducer.preferredSetSize(); else mSPairGroupSize = groupSize; } void ClassicGBAlg::insertPolys( std::vector >& polynomials ) { if (!mUseAutoTopReduction) { for (auto it = polynomials.begin(); it != polynomials.end(); ++it) { MATHICGB_ASSERT(it->get() != 0); if ((*it)->isZero()) continue; if (mBasis.divisor((*it)->leadMono()) != static_cast(-1)) { *it = mReducer.classicReduce(**it, mBasis); if ((*it)->isZero()) continue; } mBasis.insert(std::move(*it)); mSPairs.addPairs(mBasis.size() - 1); } polynomials.clear(); return; } std::vector toRetire; std::vector> toReduce; std::vector> toInsert; std::swap(toInsert, polynomials); while (!toInsert.empty()) { // todo: sort by lead term to avoid insert followed by immediate // removal. // insert polynomials from toInsert with minimal lead term and // extract those from the basis that become non-minimal. for (auto it = toInsert.begin(); it != toInsert.end(); ++it) { MATHICGB_ASSERT(it->get() != 0); if ((*it)->isZero()) continue; // We check for a divisor from mBasis because a new reducer // might have been added since we did the reduction or perhaps a // non-reduced polynomial was passed in. if (mBasis.divisor((*it)->leadMono()) != static_cast(-1)) toReduce.push_back(std::move(*it)); else { MATHICGB_IF_STREAM_LOG(GBInsert) { stream << "Inserting basis element " << mBasis.size() << ": "; MathicIO<>().writePoly(**it, true, stream); stream << '\n'; }; mBasis.insert(std::move(*it)); MATHICGB_ASSERT(toRetire.empty()); mSPairs.addPairsAssumeAutoReduce(mBasis.size() - 1, toRetire); for (auto r = toRetire.begin(); r != toRetire.end(); ++r) toReduce.push_back(mBasis.retire(*r)); toRetire.clear(); } } toInsert.clear(); MATHICGB_ASSERT(toRetire.empty()); // reduce everything in toReduce if (!toReduce.empty()) { mReducer.classicReducePolySet(toReduce, mBasis, toInsert); toReduce.clear(); } } MATHICGB_ASSERT(toRetire.empty()); MATHICGB_ASSERT(toInsert.empty()); MATHICGB_ASSERT(toReduce.empty()); } void ClassicGBAlg::insertReducedPoly( std::unique_ptr polyToInsert ) { MATHICGB_ASSERT(polyToInsert.get() != 0); if (polyToInsert->isZero()) return; MATHICGB_ASSERT(mBasis.divisor(polyToInsert->leadMono()) == static_cast(-1)); if (tracingLevel > 20) { std::cerr << "inserting basis element " << mBasis.size() << ": "; if (tracingLevel > 100) { MathicIO<>().writePoly(*polyToInsert, false, std::cerr); std::cerr << std::endl; } else { mRing.printMonomialFrobbyM2Format (std::cerr, Monoid::toOld(polyToInsert->leadMono())); if (polyToInsert->termCount() > 1) std::cerr << " + [...]"; std::cerr << std::endl; } } if (!mUseAutoTopReduction) { size_t const newGen = mBasis.size(); mBasis.insert(std::move(polyToInsert)); mSPairs.addPairs(newGen); return; } std::vector toRetireAndReduce; std::vector toReduce; try { do { // reduce polynomial and insert into basis { std::unique_ptr reduced; if (toReduce.empty()) // if first iteration reduced = std::move(polyToInsert); else { reduced = mReducer.classicReduce(*toReduce.back(), mBasis); if (tracingLevel > 20) { if (reduced->isZero()) { std::cerr << "auto-top-reduce cascade: " "basis element reduced to zero." << std::endl; } else { std::cerr << "auto-top-reduce cascade: " "inserting reduced poly with lead term " << std::endl; mRing.printMonomialFrobbyM2Format (std::cerr, Monoid::toOld(reduced->leadMono())); std::cerr << '\n'; } } delete toReduce.back(); toReduce.pop_back(); } if (reduced->isZero()) continue; reduced->makeMonic(); mBasis.insert(std::move(reduced)); } // form S-pairs and retire basis elements that become top reducible. const size_t newGen = mBasis.size() - 1; MATHICGB_ASSERT(toRetireAndReduce.empty()); mSPairs.addPairsAssumeAutoReduce(newGen, toRetireAndReduce); for (std::vector::const_iterator it = toRetireAndReduce.begin(); it != toRetireAndReduce.end(); ++it) { toReduce.push_back(0); // allocate space in vector before .release() toReduce.back() = mBasis.retire(*it).release(); } toRetireAndReduce.clear(); } while (!toReduce.empty()); } catch (...) { for (std::vector::iterator it = toReduce.begin(); it != toReduce.end(); ++it) delete *it; throw; } MATHICGB_ASSERT(toReduce.empty()); MATHICGB_ASSERT(toRetireAndReduce.empty()); } void ClassicGBAlg::computeGrobnerBasis() { size_t counter = 0; mTimer.reset(); if (mUseAutoTailReduction) autoTailReduce(); while (!mSPairs.empty()) { if (mCallback != nullptr && !mCallback()) break; step(); if (mBreakAfter != 0 && mBasis.size() > mBreakAfter) { std::cerr << "Stopping Grobner basis computation due to reaching limit of " << mBreakAfter << " basis elements." << std::endl; break; } if (mPrintInterval != 0 && (++counter % mPrintInterval) == 0) printStats(std::cerr); } if (mPrintInterval != 0) printStats(std::cerr); //mReducer->dump(); /* for (size_t i = 0; i < mBasis.size(); ++i) if (!mBasis.retired(i)) mBasis.replaceSameLeadTerm (i, mReducer->classicTailReduce(mBasis.poly(i), mBasis)); */ } void ClassicGBAlg::step() { MATHICGB_ASSERT(!mSPairs.empty()); if (tracingLevel > 30) std::cerr << "Determining next S-pair" << std::endl; MATHICGB_ASSERT(mSPairGroupSize >= 1); std::vector > spairGroup; exponent w = 0; for (unsigned int i = 0; i < mSPairGroupSize; ++i) { auto p = mSPairs.pop(w); if (p.first == static_cast(-1)) { MATHICGB_ASSERT(p.second == static_cast(-1)); break; // no more S-pairs } MATHICGB_ASSERT(p.first != static_cast(-1)); MATHICGB_ASSERT(p.second != static_cast(-1)); MATHICGB_ASSERT(!mBasis.retired(p.first)); MATHICGB_ASSERT(!mBasis.retired(p.second)); spairGroup.push_back(p); } if (spairGroup.empty()) return; // no more s-pairs std::vector> reduced; // w is the negative of the degree of the lcm's of the chosen spairs MATHICGB_LOG(SPairDegree) << spairGroup.size() << " pairs in degree " << -w << std::endl; mReducer.classicReduceSPolySet(spairGroup, mBasis, reduced); // sort the elements to get deterministic behavior. The order will change // arbitrarily when running multithreaded. Also, if preferring older // reducers, it is of benefit to break ties by preferring the sparser // reducer. Age does not have ties, since each element has a distinct // index, but if they all come from the same matrix then there is // really nothing to distinguish them - the relative age is arbitrarily // chosen. If we order sparsest-first, we will effectively make the // arbitrary choice among reducers from the same matrix in favor of sparser // reducers. auto order = [&]( const std::unique_ptr& a, const std::unique_ptr& b ) { const auto aTermCount = a->termCount(); const auto bTermCount = b->termCount(); if (aTermCount < bTermCount) return true; if (aTermCount > bTermCount) return false; auto bIt = b->begin(); const auto aEnd = a->end(); for (auto aIt = a->begin(); aIt != aEnd; ++aIt, ++bIt) { const auto monoCmp = mRing.monoid().compare(aIt.mono(), bIt.mono()); if (monoCmp == LT) return true; if (monoCmp == GT) return false; if (aIt.coef() < bIt.coef()) return true; if (aIt.coef() > bIt.coef()) return false; } return false; }; std::sort(reduced.begin(), reduced.end(), order); insertPolys(reduced); if (mUseAutoTailReduction) autoTailReduce(); } void ClassicGBAlg::autoTailReduce() { MATHICGB_ASSERT(mUseAutoTailReduction); for (size_t i = 0; i < mBasis.size(); ++i) { if (mBasis.retired(i)) continue; if (mBasis.usedAsReducerCount(i) < 1000) continue; mBasis.replaceSameLeadTerm (i, mReducer.classicTailReduce(mBasis.poly(i), mBasis)); } } size_t ClassicGBAlg::getMemoryUse() const { return mBasis.getMemoryUse() + mRing.getMemoryUse() + mReducer.getMemoryUse() + mSPairs.getMemoryUse(); } void ClassicGBAlg::printStats(std::ostream& out) const { out << " reduction type: " << mReducer.description() << '\n'; out << " divisor tab type: " << mBasis.monoLookup().getName() << '\n'; out << " S-pair queue type: " << mSPairs.name() << '\n'; out << " total compute time: " << mTimer.getMilliseconds()/1000.0 << " seconds " << '\n'; out << " S-pair group size: " << mSPairGroupSize << '\n'; mic::ColumnPrinter pr; pr.addColumn(true, " "); pr.addColumn(false, " "); pr.addColumn(true, " "); std::ostream& name = pr[0]; std::ostream& value = pr[1]; std::ostream& extra = pr[2]; const size_t basisSize = mBasis.size(); const double mseconds = mTimer.getMilliseconds(); const size_t pending = mSPairs.pairCount(); name << "Time spent:\n"; value << mTimer << '\n'; extra << mic::ColumnPrinter::oneDecimal(mseconds / basisSize) << " ms per basis element\n"; const double pendingRatio = static_cast(pending) / basisSize; name << "Basis elements:\n"; value << mic::ColumnPrinter::commafy(basisSize) << '\n'; extra << mic::ColumnPrinter::oneDecimal(pendingRatio) << " Sp pend per basis ele\n"; const size_t basisTermCount = mBasis.monomialCount(); name << "Terms for basis:\n"; value << mic::ColumnPrinter::commafy(basisTermCount) << '\n'; extra << mic::ColumnPrinter::ratioInteger(basisTermCount, basisSize) << " terms per basis ele\n"; const size_t minLeadCount = mBasis.minimalLeadCount(); name << "Minimum lead terms:\n"; value << mic::ColumnPrinter::commafy(minLeadCount) << '\n'; extra << mic::ColumnPrinter::percentInteger(minLeadCount, basisSize) << " basis ele have min lead\n"; const size_t lastMinLead = mBasis.maxIndexMinimalLead() + 1; const size_t timeSinceLastMinLead = basisSize - lastMinLead; name << "Index of last min lead:\n"; value << mic::ColumnPrinter::commafy(lastMinLead) << '\n'; extra << mic::ColumnPrinter::percentInteger(timeSinceLastMinLead, basisSize) << " of basis added since then\n"; const unsigned long long considered = mBasis.size() * (mBasis.size() - 1) / 2; name << "S-pairs considered:\n"; value << mic::ColumnPrinter::commafy(considered) << '\n'; extra << '\n'; name << "S-pairs pending:\n"; value << mic::ColumnPrinter::commafy(pending) << '\n'; extra << mic::ColumnPrinter::percentInteger(pending, considered) << " of considered\n"; unsigned long long const reductions = sPolyReductionCount(); name << "S-pairs reduced:\n"; value << mic::ColumnPrinter::commafy(reductions) << '\n'; extra << '\n'; //Reducer::Stats reducerStats = mReducer.sigStats(); SPairs::Stats sPairStats = mSPairs.stats(); unsigned long long const primeElim = sPairStats.relativelyPrimeHits; name << "Rel.prime sp eliminated:\n"; value << mic::ColumnPrinter::commafy(primeElim) << '\n'; extra << mic::ColumnPrinter::percentInteger(primeElim, reductions) << " of late eliminations\n"; /*const unsigned long long singularReductions = reducerStats.singularReductions; name << "Singular reductions:\n"; value << mic::ColumnPrinter::commafy(singularReductions) << '\n'; extra << mic::ColumnPrinter::percentInteger(singularReductions, reductions) << " of reductions\n";*/ /*const unsigned long long zeroReductions = reducerStats.zeroReductions; name << "Reductions to zero:\n"; value << mic::ColumnPrinter::commafy(zeroReductions) << '\n'; extra << mic::ColumnPrinter::percentInteger(zeroReductions, reductions) << " of reductions\n";*/ /*const unsigned long long newReductions = reductions - singularReductions - zeroReductions; name << "Reductions to new ele:\n"; value << mic::ColumnPrinter::commafy(newReductions) << '\n'; extra << mic::ColumnPrinter::percentInteger(newReductions, reductions) << " of reductions\n";*/ /*const unsigned long long redSteps = reducerStats.steps; name << "Sig reduction steps:\n"; value << mic::ColumnPrinter::commafy(redSteps) << '\n'; extra << mic::ColumnPrinter::ratioInteger (redSteps, reductions - singularReductions) << " steps per non-sing reduction\n";*/ /*const unsigned long long longestReduction = reducerStats.maxSteps; name << "Longest sig reduction:\n"; value << mic::ColumnPrinter::commafy(longestReduction) << '\n'; extra << '\n';*/ /*Reducer::Stats classicRedStats = mReducer.classicStats(); const unsigned long long clReductions = classicRedStats.reductions; name << "Classic reductions:\n"; value << mic::ColumnPrinter::commafy(clReductions) << '\n'; extra << '\n';*/ /*const unsigned long long clRedSteps = classicRedStats.steps; const double clStepsRatio = static_cast(clRedSteps) / clReductions; name << "Classic reduction steps:\n"; value << mic::ColumnPrinter::commafy(clRedSteps) << '\n'; extra << mic::ColumnPrinter::ratioInteger(clRedSteps, clReductions) << " steps per reduction\n";*/ /*const unsigned long long clLongestReduction = classicRedStats.maxSteps; name << "Longest classic red:\n"; value << mic::ColumnPrinter::commafy(clLongestReduction) << '\n'; extra << '\n';*/ //SPairs::Stats sPairStats = mSPairs.stats(); unsigned long long marginal = sPairStats.sPairsConsidered; unsigned long long const primeHits = sPairStats.relativelyPrimeHits; name << "Buchb relatively prime:\n"; value << mic::ColumnPrinter::commafy(primeHits) << '\n'; extra << mic::ColumnPrinter::percentInteger(primeHits, marginal) << " of S-pairs\n"; marginal -= primeHits; unsigned long long const simpleHits = sPairStats.buchbergerLcmSimpleHits; name << "Buchb lcm simple hits:\n"; value << mic::ColumnPrinter::commafy(simpleHits) << '\n'; extra << mic::ColumnPrinter::percentInteger(simpleHits, marginal) << " of remaining S-pairs\n"; marginal -= simpleHits; unsigned long long const simpleHitsLate = sPairStats.buchbergerLcmSimpleHitsLate; name << "Buchb late lcm simple hits:\n"; value << mic::ColumnPrinter::commafy(simpleHitsLate) << '\n'; extra << mic::ColumnPrinter::percentInteger(simpleHitsLate, marginal) << " of remaining S-pairs\n"; marginal -= simpleHitsLate; unsigned long long const buchAdvHits = sPairStats.buchbergerLcmAdvancedHits; name << "Buchb lcm adv hits:\n"; value << mic::ColumnPrinter::commafy(buchAdvHits) << '\n'; extra << mic::ColumnPrinter::percentInteger(buchAdvHits, marginal) << " of remaining S-pairs\n"; const unsigned long long buchCache = sPairStats.buchbergerLcmCacheHits; name << "Buchb lcm cache hits:\n"; value << mic::ColumnPrinter::commafy(buchCache) << '\n'; extra << mic::ColumnPrinter::percentInteger(buchCache, simpleHits) << " of simple hits\n"; const unsigned long long buchCacheLate = sPairStats.buchbergerLcmCacheHitsLate; name << "Buchb late lcm cache hits:\n"; value << mic::ColumnPrinter::commafy(buchCacheLate) << '\n'; extra << mic::ColumnPrinter::percentInteger(buchCacheLate, simpleHits) << " of simple hits\n"; out << "***** Classic Buchberger algorithm statistics *****\n" << pr << std::flush; } void ClassicGBAlg::printMemoryUse(std::ostream& out) const { // Set up printer mic::ColumnPrinter pr; pr.addColumn(); pr.addColumn(false); pr.addColumn(false); std::ostream& name = pr[0]; std::ostream& value = pr[1]; std::ostream& extra = pr[2]; const size_t total = getMemoryUse(); { // Grobner basis const size_t basisMem = mBasis.getMemoryUse(); name << "Grobner basis:\n"; value << mic::ColumnPrinter::bytesInUnit(basisMem) << '\n'; extra << mic::ColumnPrinter::percentInteger(basisMem, total) << '\n'; } { // Spairs const size_t sPairMem = mSPairs.getMemoryUse(); name << "S-pairs:\n"; value << mic::ColumnPrinter::bytesInUnit(sPairMem) << '\n'; extra << mic::ColumnPrinter::percentInteger(sPairMem, total) << '\n'; } { // Reducer const size_t reducerMem = mReducer.getMemoryUse(); name << "Reducer:\n"; value << mic::ColumnPrinter::bytesInUnit(reducerMem) << '\n'; extra << mic::ColumnPrinter::percentInteger(reducerMem, total) << '\n'; } { // Signatures const size_t sigMem = mRing.getMemoryUse(); name << "Monomials:\n"; value << mic::ColumnPrinter::bytesInUnit(sigMem) << '\n'; extra << mic::ColumnPrinter::percentInteger(sigMem, total) << '\n'; } // total name << "-------------\n"; value << '\n'; extra << '\n'; name << "Memory used in total:\n"; value << mic::ColumnPrinter::bytesInUnit(total) << "\n"; extra << "\n"; out << "*** Memory use by component ***\n" << pr << std::flush; } Basis computeGBClassicAlg( Basis&& inputBasis, ClassicGBAlgParams params ) { ClassicGBAlg alg( inputBasis, *params.reducer, params.monoLookupType, params.preferSparseReducers, params.sPairQueueType ); alg.setBreakAfter(params.breakAfter); alg.setPrintInterval(params.printInterval); alg.setSPairGroupSize(params.sPairGroupSize); alg.setReducerMemoryQuantum(params.reducerMemoryQuantum); alg.setUseAutoTopReduction(params.useAutoTopReduction); alg.setUseAutoTailReduction(params.useAutoTailReduction); alg.setCallback(params.callback); alg.computeGrobnerBasis(); return std::move(*alg.basis().toBasisAndRetireAll()); } Basis computeModuleGBClassicAlg( Basis&& inputBasis, ClassicGBAlgParams params ) { return computeGBClassicAlg(std::move(inputBasis), params); } MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/ReducerNoDedup.cpp0000664000175000017500000001130514560325357014547 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "ReducerNoDedup.hpp" #include "TypicalReducer.hpp" #include "ReducerHelper.hpp" #include #include MATHICGB_NAMESPACE_BEGIN void reducerNoDedupDependency() {} /// The most straight forward of the reducers. Simply keep a priority queue /// with all the pending terms. If two like monomials are compared in the /// queue, they are not combined - both stay in the queue. The sum of like /// terms is only taken at the end, when the leading term and its /// coefficient is determined. template class Queue> class ReducerNoDedup : public TypicalReducer { public: ReducerNoDedup(const PolyRing& R); virtual ~ReducerNoDedup(); virtual std::string description() const { return mQueue.getName() + "-nodedup"; } virtual void insertTail(NewConstTerm multiplier, const Poly& f); virtual void insert(ConstMonoRef multiplier, const Poly& f); virtual bool leadTerm(NewConstTerm& result); virtual void removeLeadTerm(); virtual size_t getMemoryUse() const; virtual void resetReducer(); private: // This Configuration is designed to work with // mathic::TourTree, mathic::Heap, and mathic::Geobucket class Configuration : public ReducerHelper::PlainConfiguration { public: typedef NewTerm Entry; Configuration(const PolyRing& ring): PlainConfiguration(ring) {} CompareResult compare(const Entry& a, const Entry& b) const { return ring().monoid().lessThan(*a.mono, *b.mono); } }; const PolyRing& mRing; NewTerm mLeadTerm; bool mLeadTermKnown; Queue mQueue; }; template class Q> ReducerNoDedup::ReducerNoDedup(const PolyRing& ring): mRing(ring), mLeadTermKnown(false), mQueue(Configuration(ring)) { mLeadTerm.mono = mRing.monoid().alloc().release(); } template class Q> ReducerNoDedup::~ReducerNoDedup() { resetReducer(); mRing.monoid().freeRaw(*mLeadTerm.mono); } template class Q> void ReducerNoDedup::insertTail(NewConstTerm multiple, const Poly& poly) { if (poly.termCount() <= 1) return; mLeadTermKnown = false; auto it = poly.begin(); const auto end = poly.end(); for (++it; it != end; ++it) { NewTerm t; t.mono = mRing.allocMonomial(); mRing.monoid().multiply(*multiple.mono, it.mono(), *t.mono); mRing.coefficientMult(multiple.coef, it.coef(), t.coef); mQueue.push(t); } } template class Q> void ReducerNoDedup::insert(ConstMonoRef multiple, const Poly& poly) { if (poly.isZero()) return; mLeadTermKnown = false; const auto end = poly.end(); for (auto it = poly.begin(); it != end; ++it) { NewTerm t = {it.coef(), mRing.monoid().alloc().release()}; mRing.monoid().multiply(multiple, it.mono(), *t.mono); mQueue.push(t); } } template class Q> bool ReducerNoDedup::leadTerm(NewConstTerm& result) { if (!mLeadTermKnown) { do { if (mQueue.empty()) return false; mLeadTerm = mQueue.top(); mQueue.pop(); while (true) { if (mQueue.empty()) break; auto entry = mQueue.top(); if (!mRing.monoid().equal(*entry.mono, *mLeadTerm.mono)) break; mRing.coefficientAddTo(mLeadTerm.coef, entry.coef); mRing.monoid().freeRaw(*entry.mono); mQueue.pop(); } } while (mRing.coefficientIsZero(mLeadTerm.coef)); mLeadTermKnown = true; } result = mLeadTerm; return true; } template class Q> void ReducerNoDedup::removeLeadTerm() { if (!mLeadTermKnown) { NewConstTerm dummy; leadTerm(dummy); } mLeadTermKnown = false; } template class Q> void ReducerNoDedup::resetReducer() { class MonomialFree { public: MonomialFree(const PolyRing& ring): mRing(ring) {} bool proceed(NewTerm entry) { mRing.monoid().freeRaw(*entry.mono); return true; } private: const PolyRing& mRing; }; MonomialFree freeer(mRing); mQueue.forAll(freeer); mQueue.clear(); } template class Q> size_t ReducerNoDedup::getMemoryUse() const { return TypicalReducer::getMemoryUse() + mQueue.getMemoryUse(); } MATHICGB_REGISTER_REDUCER( "TourNoDedup", Reducer_TourTree_NoDedup, make_unique>(ring) ); MATHICGB_REGISTER_REDUCER( "HeapNoDedup", Reducer_Heap_NoDedup, make_unique>(ring) ); MATHICGB_REGISTER_REDUCER( "GeoNoDedup", Reducer_Geobucket_NoDedup, make_unique>(ring) ); MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/FixedSizeMonomialMap.h0000664000175000017500000003472714560325357015405 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_FIXED_SIZE_MONOMIAL_MAP_GUARD #define MATHICGB_FIXED_SIZE_MONOMIAL_MAP_GUARD #include "Atomic.hpp" #include "mtbb.hpp" #include "PolyRing.hpp" #include #include #include #include MATHICGB_NAMESPACE_BEGIN /// Concurrent hashtable mapping from monomials to T with a fixed number of /// buckets. Lookups are lockless while insertions grab a lock. /// /// There is no limitation on the number of entries that can be inserted, /// but performance will suffer if the ratio of elements to buckets gets /// high. /// /// You can insert new values but you cannot change the value that an /// already-inserted value maps to. It is possible to clear the table /// but this operation is not safe for concurrency. template class FixedSizeMonomialMap { public: typedef PolyRing::Monoid Monoid; typedef Monoid::Mono Mono; typedef Monoid::MonoRef MonoRef; typedef Monoid::ConstMonoRef ConstMonoRef; typedef Monoid::MonoPtr MonoPtr; typedef Monoid::ConstMonoPtr ConstMonoPtr; typedef T mapped_type; typedef std::pair value_type; /// Iterates through entries in the hash table. class const_iterator; // Construct a hash table with at least requestedBucketCount buckets. There // may be more buckets. Currently the number is rounded up to the next power // of two. FixedSizeMonomialMap( const size_t requestedBucketCount, const PolyRing& ring ): mHashToIndexMask(computeHashMask(requestedBucketCount)), mBuckets( make_unique_array>(hashMaskToBucketCount(mHashToIndexMask)) ), mRing(ring), mNodeAlloc(Node::bytesPerNode(ring.monoid())) { // Calling new int[x] does not zero the array. std::atomic has a trivial // constructor so the same thing is true of new atomic[x]. Calling // new int[x]() is supposed to zero initialize but this apparently // does not work on GCC. So we have to fill the table with nulls // manually. This was wonderful to debug btw. // We can store relaxed as the constructor does not run concurrently. setTableEntriesToNullRelaxed(); } /// Construct a hash table with at least requestedBucketCount buckets and /// insert the elements from the parameter map. /// /// The parameter map remains a valid object that can satisfy queries. /// However, it is an error to call non-const methods on the map other /// than the destructor. Also, insertions into *this may or may not /// be reflected for queries into map and some of the entries currently /// in map will disappear. FixedSizeMonomialMap( const size_t requestedBucketCount, FixedSizeMonomialMap&& map ): mHashToIndexMask(computeHashMask(requestedBucketCount)), mBuckets( make_unique_array>(hashMaskToBucketCount(mHashToIndexMask)) ), mRing(map.ring()), mNodeAlloc(std::move(map.mNodeAlloc)) { // We can store relaxed as the constructor does not run concurrently. const auto relax = std::memory_order_relaxed; setTableEntriesToNullRelaxed(); const auto tableEnd = map.mBuckets.get() + map.bucketCount(); for (auto tableIt = map.mBuckets.get(); tableIt != tableEnd; ++tableIt) { for (Node* node = tableIt->load(); node != 0;) { const size_t index = hashToIndex(monoid().hash(node->mono())); const auto next = node->next(relax); node->setNext(mBuckets[index].load(relax), relax); mBuckets[index].store(node, relax); node = next; } } } /// Return how many buckets the hash table has. size_t bucketCount() const { return hashMaskToBucketCount(mHashToIndexMask); } const PolyRing& ring() const {return mRing;} const Monoid& monoid() const {return mRing.monoid();} /// The range [begin(), end()) contains all entries in the hash table. /// Insertions invalidate all iterators. Beware that insertions can /// happen concurrently. const_iterator begin() const { const auto bucketsBegin = mBuckets.get(); const auto bucketsEnd = bucketsBegin + bucketCount(); return const_iterator(bucketsBegin, bucketsEnd); } const_iterator end() const { const auto bucketsBegin = mBuckets.get(); const auto bucketsEnd = bucketsBegin + bucketCount(); return const_iterator(bucketsEnd, bucketsEnd); } /// Returns the value associated to mono or null if there is no such value. /// Also returns an internal monomial that equals mono if such a monomial /// exists. std::pair find(ConstMonoRef mono) const { const auto monoHash = monoid().hash(mono); const auto* node = bucketAtIndex(hashToIndex(monoHash)); for (; node != 0; node = node->next(std::memory_order_consume)) { // To my surprise, it seems to be faster to comment out this branch. // I guess the hash table has too few collisions to make it worth it. //if (monoHash != mRing.monomialHashValue(node->mono)) // continue; if (monoid().equalHintTrue(mono, node->mono())) return std::make_pair(&node->value, node->mono().ptr()); } return std::make_pair(nullptr, ConstMonoPtr()); } // As find on the product a*b but also returns the monomial that is the // product. MATHICGB_INLINE std::pair findProduct( ConstMonoRef a, ConstMonoRef b ) const { const HashValue abHash = monoid().hashOfProduct(a, b); const Node* node = bucketAtIndex(hashToIndex(abHash)); for (; node != 0; node = node->next(std::memory_order_consume)) { // To my surprise, it seems to be faster to comment out this branch. // I guess the hash table has too few collisions to make it worth it. //if (abHash != mRing.monomialHashValue(node->mono)) // continue; if (monoid().isProductOfHintTrue(a, b, node->mono())) return std::make_pair(&node->value, node->mono().ptr()); } return std::make_pair(nullptr, nullptr); } /// As findProduct but looks for a1*b and a2*b at one time. MATHICGB_INLINE std::pair findTwoProducts( ConstMonoRef a1, ConstMonoRef a2, ConstMonoRef b ) const { const HashValue a1bHash = monoid().hashOfProduct(a1, b); const HashValue a2bHash = monoid().hashOfProduct(a2, b); const Node* const node1 = bucketAtIndex(hashToIndex(a1bHash)); const Node* const node2 = bucketAtIndex(hashToIndex(a2bHash)); if ( node1 != 0 && node2 != 0 && monoid().isTwoProductsOfHintTrue (a1, a2, b, node1->mono(), node2->mono()) ) return std::make_pair(&node1->value, &node2->value); else return std::make_pair(findProduct(a1, b).first, findProduct(a2, b).first); } /// Makes value.first map to value.second unless value.first is already /// present in the map - in that case nothing is done. If p is the returned /// pair then *p.first.first is the value that value.first maps to after the insert /// and p.second is true if an insertion was performed. *p.first.first will not /// equal value.second if an insertion was not performed - unless the /// inserted value equals the already present value. /// /// p.first.second is a internal monomial that equals value.first. std::pair< std::pair, bool> insert(const value_type& value) { const mtbb::lock_guard lockGuard(mInsertionMutex); // find() loads buckets with memory_order_consume, so it may seem like // we need some extra synchronization to make sure that we have the // most up to date view of the bucket that value.first goes in - // what if a pending insert is hiding in a cache of some other processor // somewhere? We in fact have an up to date view of every bucket in the // the table already because inserts only happen while holding the // insertion mutex and by locking that mutex we have synchronized with // all threads that previously did insertions. { const auto found = find(*value.first); if (found.first != 0) { auto p = std::make_pair(found.first, *found.second); return std::make_pair(p, false); // key already present } } const auto node = static_cast(mNodeAlloc.alloc()); const size_t index = hashToIndex(monoid().hash(*value.first)); // the constructor initializes the first field of node->mono, so // it has to be called before copying the monomial. new (node) Node(bucketAtIndex(index), value.second); monoid().copy(*value.first, node->mono()); // we cannot store with memory_order_relaxed here because unlocking the // lock only synchronizes with threads who later grab the lock - it does // not synchronize with reading threads since they do not grab the lock. mBuckets[index].store(node, std::memory_order_release); auto p = std::make_pair(&node->value, node->constMono()); return std::make_pair(p, true); // successful insertion } /// This operation removes all entries from the table. This operation /// requires synchronization with and mutual exclusion from all other /// clients of *this - you need to supply this synchronization manually. void clearNonConcurrent() { #ifdef MATHICGB_DEBUG // requires mutual exclusion from both readers and writers, but we can // only assert on this for the writers. if (mInsertionMutex.try_lock()) mInsertionMutex.unlock(); else { MATHICGB_ASSERT(false); } #endif // we can store relaxed as the client supplies synchronization. setTableEntriesToNullRelaxed(); // This is the reason that we cannot support this operation concurrently - // we have no way to know when it is safe to deallocate the monomials // since readers do no synchronization. mNodeAlloc.freeAllBuffers(); } private: void setTableEntriesToNullRelaxed() { const auto tableEnd = mBuckets.get() + bucketCount(); for (auto tableIt = mBuckets.get(); tableIt != tableEnd; ++tableIt) tableIt->store(0, std::memory_order_relaxed); } class Node { public: Node(Node* next, const mapped_type value): value(value), mNext(next) {} MonoRef mono() {return Monoid::toRef(mMono);} ConstMonoRef mono() const {return Monoid::toRef(mMono);} ConstMonoRef constMono() const {return Monoid::toRef(mMono);} Node* next(std::memory_order order) {return mNext.load(order);} const Node* next(std::memory_order order) const {return mNext.load(order);} void setNext(Node* next, std::memory_order order) { mNext.store(next, order); } const mapped_type value; static size_t bytesPerNode(const Monoid& monoid) { return sizeof(Node) + sizeof(exponent) * (monoid.entryCount() - 1); } private: Atomic mNext; exponent mMono[1]; }; static HashValue computeHashMask(const size_t requestedBucketCount) { // round request up to nearest power of 2. size_t pow2 = 1; while (pow2 < requestedBucketCount && 2 * pow2 != 0) pow2 *= 2; MATHICGB_ASSERT(pow2 > 0 && (pow2 & (pow2 - 1)) == 0); // power of two // If casting to a hash value overflows, then we get the maximum // possible number of buckets based on the range of the hash // value type. Only unsigned overflow is defined, so we need // to assert that the hash type is unsigned. static_assert(!std::numeric_limits::is_signed, ""); const auto hashToIndexMask = static_cast(pow2 - 1); MATHICGB_ASSERT(pow2 == hashMaskToBucketCount(hashToIndexMask)); return hashToIndexMask; } static size_t hashMaskToBucketCount(const HashValue mask) { const auto count = static_cast(mask) + 1u; // should be power of 2 MATHICGB_ASSERT(count > 0 && (count & (count - 1)) == 0); return count; } size_t hashToIndex(HashValue hash) const { const auto index = hash & mHashToIndexMask; MATHICGB_ASSERT(index == hash % bucketCount()); return index; } Node* bucketAtIndex(size_t index) { MATHICGB_ASSERT(index < bucketCount()); return mBuckets[index].load(std::memory_order_consume); } const Node* bucketAtIndex(size_t index) const { MATHICGB_ASSERT(index < bucketCount()); return mBuckets[index].load(std::memory_order_consume); } const HashValue mHashToIndexMask; std::unique_ptr[]> const mBuckets; const PolyRing& mRing; memt::BufferPool mNodeAlloc; // nodes are allocated from here. mtbb::mutex mInsertionMutex; public: class const_iterator { public: typedef std::forward_iterator_tag iterator_category; typedef std::pair value_type; typedef ptrdiff_t difference_type; typedef size_t distance_type; typedef value_type* pointer; typedef value_type& reference; const_iterator(): mNode(0), mBucket(0), mBucketsEnd(0) {} const_iterator& operator++() { MATHICGB_ASSERT(mNode != 0); MATHICGB_ASSERT(mBucket != mBucketsEnd); const Node* const node = mNode->next(std::memory_order_consume); if (node != 0) mNode = node; else advanceBucket(); return *this; } bool operator==(const const_iterator& it) const { MATHICGB_ASSERT(fromSameMap(it)); return mNode == it.mNode; } bool operator!=(const const_iterator& it) const { return !(*this == it); } const value_type operator*() const { MATHICGB_ASSERT(mNode != 0); return std::make_pair(mNode->value, mNode->mono()); } private: friend class FixedSizeMonomialMap; const_iterator( const Atomic* const bucketBegin, const Atomic* const bucketEnd ): mBucket(bucketBegin), mBucketsEnd(bucketEnd) { if (bucketBegin == bucketEnd) { mNode = 0; return; } const Node* const node = bucketBegin->load(std::memory_order_consume); if (node != 0) mNode = node; else advanceBucket(); } void advanceBucket() { MATHICGB_ASSERT(mBucket != mBucketsEnd); while (true) { ++mBucket; if (mBucket == mBucketsEnd) { mNode = 0; break; } const Node* const node = mBucket->load(std::memory_order_consume); if (node != 0) { mNode = node; break; } } } bool fromSameMap(const const_iterator& it) const { return mBucketsEnd == it.mBucketsEnd; } const Node* mNode; const Atomic* mBucket; const Atomic* mBucketsEnd; }; }; MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/Scanner.cpp0000664000175000017500000001112514560325357013270 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "Scanner.hpp" #include #include #include #include MATHICGB_NAMESPACE_BEGIN static const size_t BufferSize = #ifdef MATHICGB_DEBUG 1; #else 10 * 1024; #endif void reportSyntaxError(std::string s, uint64 lineNumber) { std::ostringstream out; out << "Syntax error on line " << lineNumber << ": " << s; mathic::reportError(out.str()); } void Scanner::reportError(std::string msg) const { reportSyntaxError(msg, lineCount()); } Scanner::Scanner(FILE* input): mFile(input), mStream(0), mLineCount(1), mChar(' '), mBuffer(BufferSize), mBufferPos(mBuffer.end()) { get(); } Scanner::Scanner(std::istream& input): mFile(0), mStream(&input), mLineCount(1), mChar(' '), mBuffer(BufferSize), mBufferPos(mBuffer.end()) { get(); } Scanner::Scanner(const char* const input): mFile(0), mStream(0), mLineCount(1), mChar(' '), mBuffer(input, input + std::strlen(input)), mBufferPos(mBuffer.begin()) { get(); } Scanner::Scanner(const std::string& input): mFile(0), mStream(0), mLineCount(1), mChar(' '), mBuffer(input.begin(), input.end()), mBufferPos(mBuffer.begin()) { get(); } bool Scanner::match(const char* const str) { eatWhite(); MATHICGB_ASSERT(str != 0); const auto size = std::strlen(str); if (!ensureBuffer(size)) return false; if (size == 0) return true; if (peek() != *str) return false; if (std::strncmp(&*mBufferPos, str + 1, size - 1) != 0) return false; ignore(size); return true; } bool Scanner::ensureBuffer(size_t min) { const auto got = size_t(std::distance(mBufferPos, mBuffer.end()) + 1); return got >= min || readBuffer(min - got); } void Scanner::expect(const char* str) { MATHICGB_ASSERT(str != 0); eatWhite(); const char* it = str; while (*it != '\0') { int character = get(); if (*it == character) { ++it; continue; } // Read the rest of what is there to improve error message. // TODO: read at least one char in total even if not alnum. std::ostringstream got; if (character == EOF && it == str) got << "no more input"; else { got << '\"' << std::string(str, it); if (isalnum(character)) got << static_cast(character); while (isalnum(peek())) got << static_cast(get()); got << '\"'; } reportErrorUnexpectedToken(str, got.str()); } } void Scanner::expectEOF() { eatWhite(); if (get() != EOF) reportErrorUnexpectedToken("no more input", ""); } void Scanner::errorExpectTwo(char a, char b, int got) { MATHICGB_ASSERT(a != got && b != got); std::ostringstream err; err << '\'' << a << "' or '" << b << '\''; reportErrorUnexpectedToken(err.str(), got); } void Scanner::errorExpectOne(char expected, int got) { MATHICGB_ASSERT(expected != got); std::ostringstream err; err << '\'' << expected << '\''; reportErrorUnexpectedToken(err.str(), got); } void Scanner::reportErrorUnexpectedToken(const std::string& expected, int got) { std::ostringstream gotDescription; if (got == EOF) gotDescription << "no more input"; else gotDescription << '\'' << static_cast(got) << '\''; reportErrorUnexpectedToken(expected, gotDescription.str()); } void Scanner::reportErrorUnexpectedToken( const std::string& expected, const std::string& got ) { std::ostringstream errorMsg; errorMsg << "Expected " << expected; if (got != "") errorMsg << ", but got " << got; errorMsg << '.'; reportError(errorMsg.str()); } bool Scanner::readBuffer(size_t minRead) { auto saveCount = std::distance(mBufferPos, mBuffer.end()); if (mBufferPos != mBuffer.begin() && mBufferPos != mBuffer.end()) std::copy(mBufferPos, mBuffer.end(), mBuffer.begin()); mBuffer.resize(std::max(saveCount + minRead, mBuffer.capacity())); auto readInto = reinterpret_cast(mBuffer.data() + saveCount); auto readCount = mBuffer.size() - saveCount; size_t didReadCount = 0; if (mFile != 0) { didReadCount = fread(readInto, 1, readCount, mFile); } else if (mStream != 0) { mStream->read(readInto, readCount); const std::streamsize maxSizeT = std::numeric_limits::type>::max(); if (mStream->gcount() > maxSizeT) throw std::bad_alloc(); didReadCount = static_cast(mStream->gcount()); } mBuffer.resize(saveCount + didReadCount); mBufferPos = mBuffer.begin(); return didReadCount >= minRead; } MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/F4Reducer.cpp0000664000175000017500000002407414560325357013471 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "F4Reducer.hpp" #include "F4MatrixBuilder.hpp" #include "F4MatrixBuilder2.hpp" #include "F4MatrixReducer.hpp" #include "QuadMatrix.hpp" #include "LogDomain.hpp" #include "CFile.hpp" #include #include MATHICGB_DEFINE_LOG_DOMAIN( F4MatrixRows, "Count number of rows in F4 matrices." ); MATHICGB_DEFINE_LOG_DOMAIN( F4MatrixTopRows, "Count number of top (reducer) rows in F4 matrices." ); MATHICGB_DEFINE_LOG_DOMAIN( F4MatrixBottomRows, "Count number of bottom (reducee) rows in F4 matrices." ); MATHICGB_DEFINE_LOG_DOMAIN( F4MatrixEntries, "Count number of non-zero entries in F4 matrices." ); MATHICGB_DEFINE_LOG_ALIAS( "F4Detail", "F4MatrixEntries,F4MatrixBottomRows,F4MatrixTopRows,F4MatrixRows," "F4MatrixReduce,F4" ); MATHICGB_DEFINE_LOG_ALIAS( "F4", "F4MatrixSizes,F4MatrixBuild,F4MatrixBuild2," "F4MatReduceTop,F4RedBottomRight" ); #include "Reducer.hpp" #include "PolyRing.hpp" #include MATHICGB_NAMESPACE_BEGIN void f4ReducerDependency() {} class F4Reducer : public Reducer { public: enum Type { OldType, NewType }; F4Reducer(const PolyRing& ring, Type type); virtual unsigned int preferredSetSize() const; /// Store all future matrices to file-1.mat, file-2.mat and so on. /// Matrices with less than minEntries non-zero entries are not stored. /// If file is an empty string then no matrices are stored. If this method /// is never called then no matrices are stored. void writeMatricesTo(std::string file, size_t minEntries); virtual std::unique_ptr classicReduce (const Poly& poly, const PolyBasis& basis); virtual std::unique_ptr classicTailReduce (const Poly& poly, const PolyBasis& basis); virtual std::unique_ptr classicReduceSPoly (const Poly& a, const Poly& b, const PolyBasis& basis); virtual void classicReduceSPolySet( std::vector >& spairs, const PolyBasis& basis, std::vector >& reducedOut ); virtual void classicReducePolySet( const std::vector >& polys, const PolyBasis& basis, std::vector >& reducedOut ); virtual std::unique_ptr regularReduce( ConstMonoRef sig, ConstMonoRef multiple, size_t basisElement, const SigPolyBasis& basis ); virtual void setMemoryQuantum(size_t quantum); virtual std::string description() const; virtual size_t getMemoryUse() const; const PolyRing& ring() const {return mRing;} const Monoid& monoid() const {return mRing.monoid();} private: void saveMatrix(const QuadMatrix& matrix); Type mType; std::unique_ptr mFallback; const PolyRing& mRing; size_t mMemoryQuantum; std::string mStoreToFile; /// stem of file names to save matrices to size_t mMinEntryCountForStore; /// don't save matrices with fewer entries size_t mMatrixSaveCount; // how many matrices have been saved }; F4Reducer::F4Reducer(const PolyRing& ring, Type type): mType(type), mFallback(Reducer::makeReducer(Reducer::Reducer_Geobucket_Hashed, ring)), mRing(ring), mMemoryQuantum(0), mStoreToFile(""), mMinEntryCountForStore(0), mMatrixSaveCount(0) { } unsigned int F4Reducer::preferredSetSize() const { return 100000; } void F4Reducer::writeMatricesTo(std::string file, size_t minEntries) { mStoreToFile = std::move(file); mMinEntryCountForStore = minEntries; mMatrixSaveCount = 0; } std::unique_ptr F4Reducer::classicReduce (const Poly& poly, const PolyBasis& basis) { if (tracingLevel >= 2) std::cerr << "F4Reducer: Using fall-back reducer for single classic reduction\n"; return mFallback->classicReduce(poly, basis); } std::unique_ptr F4Reducer::classicTailReduce (const Poly& poly, const PolyBasis& basis) { if (tracingLevel >= 2) std::cerr << "F4Reducer: Using fall-back reducer for single classic tail reduction\n"; return mFallback->classicTailReduce(poly, basis); } std::unique_ptr F4Reducer::classicReduceSPoly( const Poly& a, const Poly& b, const PolyBasis& basis ) { if (tracingLevel >= 2) std::cerr << "F4Reducer: " "Using fall-back reducer for single classic S-pair reduction\n"; return mFallback->classicReduceSPoly(a, b, basis); } void F4Reducer::classicReduceSPolySet( std::vector>& spairs, const PolyBasis& basis, std::vector>& reducedOut ) { if (spairs.size() <= 1) { if (tracingLevel >= 2) std::cerr << "F4Reducer: Using fall-back reducer for " << spairs.size() << " S-pairs.\n"; mFallback->classicReduceSPolySet(spairs, basis, reducedOut); return; } reducedOut.clear(); MATHICGB_ASSERT(!spairs.empty()); if (tracingLevel >= 2) std::cerr << "F4Reducer: Reducing " << spairs.size() << " S-polynomials.\n"; SparseMatrix reduced; QuadMatrix::Monomials monomials; { QuadMatrix qm(basis.ring()); { if (mType == OldType) { F4MatrixBuilder builder(basis, mMemoryQuantum); for (const auto& spair : spairs) builder.addSPolynomialToMatrix (basis.poly(spair.first), basis.poly(spair.second)); builder.buildMatrixAndClear(qm); } else { F4MatrixBuilder2 builder(basis, mMemoryQuantum); for (const auto& spair : spairs) builder.addSPolynomialToMatrix (basis.poly(spair.first), basis.poly(spair.second)); builder.buildMatrixAndClear(qm); } } MATHICGB_LOG_INCREMENT_BY(F4MatrixRows, qm.rowCount()); MATHICGB_LOG_INCREMENT_BY(F4MatrixTopRows, qm.topLeft.rowCount()); MATHICGB_LOG_INCREMENT_BY(F4MatrixBottomRows, qm.bottomLeft.rowCount()); MATHICGB_LOG_INCREMENT_BY(F4MatrixEntries, qm.entryCount()); saveMatrix(qm); reduced = F4MatrixReducer(basis.ring().charac()). reducedRowEchelonFormBottomRight(qm); monomials = std::move(qm.rightColumnMonomials); for (auto& mono : qm.leftColumnMonomials) monoid().freeRaw(mono.castAwayConst()); } for (SparseMatrix::RowIndex row = 0; row < reduced.rowCount(); ++row) { auto p = make_unique(basis.ring()); reduced.rowToPolynomial(row, monomials, *p); reducedOut.push_back(std::move(p)); } for (auto& mono : monomials) monoid().freeRaw(mono.castAwayConst()); } void F4Reducer::classicReducePolySet( const std::vector< std::unique_ptr >& polys, const PolyBasis& basis, std::vector< std::unique_ptr >& reducedOut ) { if (polys.size() <= 1) { if (tracingLevel >= 2) std::cerr << "F4Reducer: Using fall-back reducer for " << polys.size() << " polynomials.\n"; mFallback->classicReducePolySet(polys, basis, reducedOut); return; } reducedOut.clear(); MATHICGB_ASSERT(!polys.empty()); if (tracingLevel >= 2) std::cerr << "F4Reducer: Reducing " << polys.size() << " polynomials.\n"; SparseMatrix reduced; QuadMatrix::Monomials monomials; { QuadMatrix qm(ring()); { if (mType == OldType) { F4MatrixBuilder builder(basis, mMemoryQuantum); for (const auto& poly : polys) builder.addPolynomialToMatrix(*poly); builder.buildMatrixAndClear(qm); } else { F4MatrixBuilder2 builder(basis, mMemoryQuantum); for (const auto& poly : polys) builder.addPolynomialToMatrix(*poly); builder.buildMatrixAndClear(qm); } } MATHICGB_LOG_INCREMENT_BY(F4MatrixRows, qm.rowCount()); MATHICGB_LOG_INCREMENT_BY(F4MatrixTopRows, qm.topLeft.rowCount()); MATHICGB_LOG_INCREMENT_BY(F4MatrixBottomRows, qm.bottomLeft.rowCount()); MATHICGB_LOG_INCREMENT_BY(F4MatrixEntries, qm.entryCount()); saveMatrix(qm); reduced = F4MatrixReducer(basis.ring().charac()). reducedRowEchelonFormBottomRight(qm); monomials = std::move(qm.rightColumnMonomials); for (auto& mono : qm.leftColumnMonomials) monoid().freeRaw(mono.castAwayConst()); } if (tracingLevel >= 2 && false) std::cerr << "F4Reducer: Extracted " << reduced.rowCount() << " non-zero rows\n"; for (SparseMatrix::RowIndex row = 0; row < reduced.rowCount(); ++row) { auto p = make_unique(basis.ring()); reduced.rowToPolynomial(row, monomials, *p); reducedOut.push_back(std::move(p)); } for (auto& mono : monomials) monoid().freeRaw(mono.castAwayConst()); } std::unique_ptr F4Reducer::regularReduce( ConstMonoRef sig, ConstMonoRef multiple, size_t basisElement, const SigPolyBasis& basis ) { if (tracingLevel >= 2) std::cerr << "F4Reducer: Using fall-back reducer for single regular reduction\n"; auto p = mFallback->regularReduce(sig, multiple, basisElement, basis); return p; } void F4Reducer::setMemoryQuantum(size_t quantum) { mMemoryQuantum = quantum; } std::string F4Reducer::description() const { return "F4 reducer"; } size_t F4Reducer::getMemoryUse() const { return 0; // @todo: implement } void F4Reducer::saveMatrix(const QuadMatrix& matrix) { if (mStoreToFile.empty()) return; const auto entryCount = matrix.entryCount(); if (mMinEntryCountForStore > entryCount) return; ++mMatrixSaveCount; std::ostringstream fileName; fileName << mStoreToFile << '-' << mMatrixSaveCount << ".qmat"; if (tracingLevel > 2) std::cerr << "F4Reducer: Saving matrix to " << fileName.str() << '\n'; CFile file(fileName.str(), "wb"); matrix.write (static_cast(mRing.charac()), file.handle()); } std::unique_ptr makeF4Reducer( const PolyRing& ring, bool oldType, std::string file, size_t minEntries ) { auto reducer = oldType ? make_unique(ring, F4Reducer::OldType) : make_unique(ring, F4Reducer::NewType); reducer->writeMatricesTo(file, minEntries); return reducer; } MATHICGB_REGISTER_REDUCER( "F4Old", Reducer_F4_Old, (make_unique(ring, F4Reducer::OldType)) ); MATHICGB_REGISTER_REDUCER( "F4New", Reducer_F4_New, (make_unique(ring, F4Reducer::NewType)) ); MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/SigPolyBasis.cpp0000664000175000017500000003671114560325357014257 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "SigPolyBasis.hpp" #include "Poly.hpp" #include "MathicIO.hpp" #include #include #include #include MATHICGB_NAMESPACE_BEGIN SigPolyBasis::SigPolyBasis( const PolyRing& R0, int monoLookupType, int monTableType, bool preferSparseReducers ): mMonoLookupFactory (MonoLookup::makeFactory(R0.monoid(), monoLookupType)), mRatioSorted(RatioOrder(mSigLeadRatio, R0.monoid())), mMinimalMonoLookup(mMonoLookupFactory->make(preferSparseReducers, true)), mBasis(R0, mMonoLookupFactory->make(preferSparseReducers, true)), mPreferSparseReducers(preferSparseReducers) { mTmp = mBasis.ring().allocMonomial(); const_cast(mBasis.monoLookup()).setSigBasis(*this); mMinimalMonoLookup->setSigBasis(*this); } SigPolyBasis::~SigPolyBasis() { MATHICGB_ASSERT(mBasis.size() == mSignatures.size()); MATHICGB_ASSERT(mBasis.size() == mSigLeadRatio.size()); for (size_t i = 0; i < mBasis.size(); i++) { if (!mSignatures[i].isNull()) monoid().freeRaw(*mSignatures[i]); if (!mSigLeadRatio[i].isNull()) monoid().freeRaw(*mSigLeadRatio[i]); } for (size_t i = 0; i < mSignatureLookup.size(); ++i) delete mSignatureLookup[i]; mBasis.ring().freeMonomial(mTmp); } void SigPolyBasis::addComponent() { std::unique_ptr lookup = mMonoLookupFactory->make(mPreferSparseReducers, true); lookup->setSigBasis(*this); mSignatureLookup.push_back(0); mSignatureLookup.back() = lookup.release(); // only release after alloc } void SigPolyBasis::insert(Mono ownedSig, std::unique_ptr f) { MATHICGB_ASSERT(f.get() != nullptr); MATHICGB_ASSERT(!f->isZero()); MATHICGB_ASSERT(!field().isZero(f->leadCoef())); MATHICGB_ASSERT(!ownedSig.isNull()); MATHICGB_ASSERT(monoid().fromPool(*ownedSig)); const auto index = mSignatures.size(); mSignatures.push_back(ownedSig.release()); auto sig = *mSignatures.back(); const auto component = monoid().component(sig); MATHICGB_ASSERT(component < mSignatureLookup.size()); mSignatureLookup[component]->insert(sig, index); auto ratio = ring().allocMonomial(); monoid().divideToNegative(f->leadMono(), sig, ratio); mSigLeadRatio.push_back(ratio); const auto lead = f->leadMono(); mBasis.insert(std::move(f)); if (mBasis.leadMinimal(mBasis.size() - 1)) { mMinimalMonoLookup->removeMultiples(lead); mMinimalMonoLookup->insert(lead, index); } MATHICGB_ASSERT(mMinimalMonoLookup->type() == 0 || mBasis.minimalLeadCount() == mMinimalMonoLookup->size()); MATHICGB_ASSERT(mSignatures.size() == index + 1); MATHICGB_ASSERT(mBasis.size() == index + 1); if (!mUseRatioRank) return; // compute rank of the ratio auto pos = mRatioSorted.insert(index); again: Rank prevRank; if (pos == mRatioSorted.begin()) prevRank = 0; else { auto prev = pos; --prev; prevRank = mRatioRanks[*prev]; if (monoid().equal(ratio, *mSigLeadRatio[*prev])) { mRatioRanks.push_back(prevRank); return; } } Rank nextRank; auto next = pos; ++next; if (next == mRatioSorted.end()) nextRank = std::numeric_limits::max(); else { nextRank = mRatioRanks[*next]; if (monoid().equal(ratio, *mSigLeadRatio[*next])) { mRatioRanks.push_back(nextRank); return; } } MATHICGB_ASSERT(prevRank < nextRank); // this formula avoids the overflow inherent in prevRank + nextRank; Rank rank = prevRank + (nextRank - prevRank) / 2; // must have at least 1 space between ranks to support // queries for non-basis element rank if (rank == 0 || // must leave space for smaller ratio rank == std::numeric_limits::max() || // shouldn't happen nextRank - prevRank < 4) { // 4 as require: prev, gap, new, gap, next // size plus 1 to account for the gaps at the beginning and end. size_t increment = std::numeric_limits::max() / (mSignatures.size() + 1); if (increment == 0) increment = 2; MATHICGB_ASSERT(!mRatioSorted.empty()); size_t rankSum = increment; // leave a gap at beginning Rank prevRank = *mRatioRanks.begin(); auto end = mRatioSorted.end(); for (auto it = mRatioSorted.begin(); it != end; ++it) { if (it == pos) continue; if (mRatioRanks[*it] != prevRank) rankSum += increment; prevRank = mRatioRanks[*it]; mRatioRanks[*it] = rankSum; } goto again; } MATHICGB_ASSERT(rank > 0); MATHICGB_ASSERT(rank < std::numeric_limits::max()); MATHICGB_ASSERT(prevRank + 1 < rank && rank < nextRank - 1); mRatioRanks.push_back(rank); MATHICGB_ASSERT(mRatioRanks.size() == index + 1); #ifdef MATHICGB_DEBUG // Check that at least one space has been left between every rank MATHICGB_ASSERT(mRatioRanks[*mRatioSorted.begin()] > 0); MATHICGB_ASSERT(mRatioRanks[*mRatioSorted.rbegin()] < std::numeric_limits::max()); auto it2 = mRatioSorted.begin(); for (++it2; it2 != mRatioSorted.end(); ++it2) { auto prev = it2; --prev; MATHICGB_ASSERT(mRatioRanks[*it2] == mRatioRanks[*prev] || mRatioRanks[*it2] - 1 > mRatioRanks[*prev]); } #endif } size_t SigPolyBasis::regularReducer( ConstMonoRef sig, ConstMonoRef term ) const { size_t reducer = monoLookup().regularReducer(sig, term); #ifdef MATHICGB_SLOW_DEBUG const size_t debugValue = regularReducerSlow(sig, term); if (reducer == static_cast(-1)) { MATHICGB_SLOW_ASSERT(debugValue == static_cast(-1)); } else { MATHICGB_SLOW_ASSERT(debugValue != static_cast(-1)); monomial m = ring().allocMonomial(); MATHICGB_SLOW_ASSERT (ring().monomialIsDivisibleBy(term, leadMono(reducer))); ring().monomialDivide(term, leadMono(reducer), m); ring().monomialMultTo(m, signature(reducer)); MATHICGB_SLOW_ASSERT(monoid().lessThan(m, sig)); ring().freeMonomial(m); } #endif return reducer; } size_t SigPolyBasis::regularReducerSlow( ConstMonoRef sig, ConstMonoRef term ) const { monomial m = ring().allocMonomial(); const size_t stop = size(); for (size_t be = 0; be < stop; ++be) { if (!monoid().divides(leadMono(be), term)) continue; monoid().divide(leadMono(be), term, m); monoid().multiplyInPlace(signature(be), m); if (monoid().lessThan(m, sig)) { ring().freeMonomial(m); return be; } } ring().freeMonomial(m); return static_cast(-1); } void SigPolyBasis::lowBaseDivisors( std::vector& divisors, size_t maxDivisors, size_t newGenerator) const { MATHICGB_ASSERT(newGenerator < size()); const auto sigNew = signature(newGenerator); const auto component = monoid().component(sigNew); mSignatureLookup[component]-> lowBaseDivisors(divisors, maxDivisors, newGenerator); #ifdef MATHICGB_DEBUG std::vector debugValue; lowBaseDivisorsSlow(debugValue, maxDivisors, newGenerator); MATHICGB_ASSERT(divisors.size() <= maxDivisors); MATHICGB_ASSERT(debugValue.size() == divisors.size()); for (size_t i = 0; i < divisors.size(); ++i) { MATHICGB_ASSERT(ratioCompare(debugValue[i], divisors[i]) == EQ); } #endif } void SigPolyBasis::lowBaseDivisorsSlow( std::vector& divisors, size_t maxDivisors, size_t newGenerator) const { MATHICGB_ASSERT(newGenerator < size()); divisors.clear(); divisors.reserve(maxDivisors + 1); auto sigNew = signature(newGenerator); for (size_t i = 0; i < newGenerator; ++i) { auto sigi = signature(i); if (monoid().component(sigi) != monoid().component(sigNew)) continue; if (!monoid().divides(sigi, sigNew)) continue; for (size_t j = 0; j <= divisors.size(); ++j) { if (j == divisors.size()) { divisors.push_back(i); break; } if (ratioCompare(i, divisors[j]) == GT) { divisors.insert(divisors.begin() + j, i); break; } } if (divisors.size() > maxDivisors) divisors.pop_back(); MATHICGB_ASSERT(divisors.size() <= maxDivisors); } MATHICGB_ASSERT(divisors.size() <= maxDivisors); } size_t SigPolyBasis::highBaseDivisor(size_t newGenerator) const { MATHICGB_ASSERT(newGenerator < size()); size_t highDivisor = monoLookup().highBaseDivisor(newGenerator); #ifdef MATHICGB_DEBUG size_t debugValue = highBaseDivisorSlow(newGenerator); MATHICGB_ASSERT((highDivisor == static_cast(-1)) == (debugValue == static_cast(-1))); MATHICGB_ASSERT(highDivisor == static_cast(-1) || ratioCompare(debugValue, highDivisor) == EQ); #endif return highDivisor; } size_t SigPolyBasis::highBaseDivisorSlow(size_t newGenerator) const { MATHICGB_ASSERT(newGenerator < size()); auto highDivisor = static_cast(-1); auto leadNew = leadMono(newGenerator); for (size_t i = 0; i < newGenerator; ++i) { // continue if this generator would not be an improvement // even if it does divide. This is a faster check than // checking divisiblity, so do it first. if (highDivisor != static_cast(-1) && ratioCompare(highDivisor, i) == LT) continue; auto leadi = leadMono(i); if (monoid().divides(leadi, leadNew)) highDivisor = i; } return highDivisor; } size_t SigPolyBasis::minimalLeadInSig(ConstMonoRef sig) const { const auto component = monoid().component(sig); const auto minLeadGen = mSignatureLookup[component]->minimalLeadInSig(sig); MATHICGB_ASSERT(minLeadGen == minimalLeadInSigSlow(sig)); return minLeadGen; } size_t SigPolyBasis::minimalLeadInSigSlow(ConstMonoRef sig) const { monomial multiplier = ring().allocMonomial(); monomial minLead = ring().allocMonomial(); size_t minLeadGen = static_cast(-1); const auto sigComponent = monoid().component(sig); const size_t genCount = size(); for (size_t gen = 0; gen < genCount; ++gen) { if (monoid().component(signature(gen)) != sigComponent) continue; if (!monoid().divides(signature(gen), sig)) continue; monoid().divide(signature(gen), sig, multiplier); if (minLeadGen != static_cast(-1)) { auto genLead = leadMono(gen); const auto leadCmp = monoid().compare(minLead, multiplier, genLead); if (leadCmp == Monoid::LessThan) continue; if (leadCmp == Monoid::EqualTo) { // If same lead monomial in signature, pick the one with fewer terms // as that one might be less effort to reduce. const size_t minTerms = poly(minLeadGen).termCount(); const size_t terms = poly(gen).termCount(); if (minTerms > terms) continue; if (minTerms == terms) { // If same number of terms, pick the one with larger signature // before being multiplied into the same signature. That one // might be more reduced as the constraint on regular reduction // is less. const auto minSig = signature(minLeadGen); const auto genSig = signature(gen); const auto sigCmp = monoid().compare(minSig, genSig); // no two generators have same signature MATHICGB_ASSERT(sigCmp != Monoid::EqualTo); if (sigCmp == GT) continue; } } } minLeadGen = gen; monoid().multiply(multiplier, leadMono(gen), minLead); } ring().freeMonomial(multiplier); ring().freeMonomial(minLead); return minLeadGen; } bool SigPolyBasis::isSingularTopReducibleSlow( const Poly& poly, ConstMonoRef sig ) const { if (poly.isZero()) return false; monomial multiplier = ring().allocMonomial(); const size_t genCount = size(); const auto polyLead = poly.leadMono(); for (size_t i = 0; i < genCount; ++i) { if (!monoid().divides(leadMono(i), polyLead)) continue; monoid().divide(leadMono(i), polyLead, multiplier); if (monoid().compare(sig, multiplier, signature(i)) == EQ) return true; } ring().freeMonomial(multiplier); return false; } void SigPolyBasis::display(std::ostream& out) const { for (size_t i = 0; i < mBasis.size(); i++) { out << i << " "; // This is needed for compatibility with old tests. // todo: change the tests so this isn't necessary. if (monoid().isIdentity(*mSignatures[i])) MathicIO<>().writeComponent(monoid(), *mSignatures[i], out); else MathicIO<>().writeMonomial(monoid(), true, *mSignatures[i], out); out << " "; MathicIO<>().writePoly(mBasis.poly(i), false, out); out << '\n'; } } void SigPolyBasis::displayFancy (std::ostream& out, const Processor& processor) const { mathic::ColumnPrinter pr; auto& indexOut = pr.addColumn(false) << "Index\n"; auto& sigOut = pr.addColumn(false) << "sig\n"; auto& polyOut = pr.addColumn() << "poly\n"; pr.repeatToEndOfLine('-'); auto sig = monoid().alloc(); for (size_t i = 0; i < mBasis.size(); i++) { indexOut << i << '\n'; monoid().copy(*mSignatures[i], *sig); processor.postprocess(sig); if (monoid().isIdentity(*sig)) MathicIO<>().writeComponent(monoid(), *sig, out); else MathicIO<>().writeMonomial(monoid(), true, *sig, out); sigOut << '\n'; MathicIO<>().writePoly(mBasis.poly(i), false, polyOut); polyOut << '\n'; } out << pr; } void SigPolyBasis::postprocess(const MonoProcessor& processor) { for (auto& mono : mSignatures) processor.postprocess(*mono); } size_t SigPolyBasis::getMemoryUse() const { // Note: we do not count the signatures as they are counted elsewhere. size_t total = 0; total += mBasis.getMemoryUse(); total += mSignatures.capacity() * sizeof(mSignatures.front()); total += mSigLeadRatio.capacity() * sizeof(mSigLeadRatio.front()); total += mRatioRanks.capacity() * sizeof(mRatioRanks.front()); total += monoLookup().getMemoryUse(); total += mMinimalMonoLookup->getMemoryUse(); // This is an estimate of how much memory mRatioSorted uses per item. // It is based on assuming a tree representation with a left pointer, // a right pointer and a data member for each node. This is probably // an underestimate. const size_t perItemOverhead = 2 * sizeof(void*) + sizeof(*mRatioSorted.begin()); total += mRatioSorted.size() * perItemOverhead; return total; } size_t SigPolyBasis::ratioRank(ConstMonoRef ratio) const { MATHICGB_ASSERT(mUseRatioRank); const size_t index = size(); if (index == 0) return 0; // any value will do as there is nothing to compare to auto& sigLeadRatioNonConst = const_cast&>(mSigLeadRatio); sigLeadRatioNonConst.push_back(ratio.castAwayConst()); auto pos = mRatioSorted.lower_bound(index); sigLeadRatioNonConst.pop_back(); if (pos == mRatioSorted.end()) { MATHICGB_ASSERT (ratioRank(*mRatioSorted.rbegin()) < std::numeric_limits::max()); return std::numeric_limits::max(); } else { if (monoid().equal(ratio, sigLeadRatio(*pos))) return ratioRank(*pos); MATHICGB_ASSERT(ratioRank(*pos) > 0); #ifdef MATHICGB_DEBUG if (pos != mRatioSorted.begin()) { auto prev = pos; --prev; MATHICGB_ASSERT(ratioRank(*pos) - 1 > ratioRank(*prev)); } #endif return ratioRank(*pos) - 1; } } SigPolyBasis::StoredRatioCmp::StoredRatioCmp( ConstMonoRef numerator, ConstMonoRef denominator, const SigPolyBasis& basis ): mBasis(basis), mRatio(basis.monoid().alloc()) { const auto& monoid = basis.ring().monoid(); monoid.divideToNegative(denominator, numerator, mRatio); if (SigPolyBasis::mUseRatioRank) mRatioRank = basis.ratioRank(*mRatio); else mTmp = mBasis.monoid().alloc(); } MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/CFile.hpp0000664000175000017500000000242014560325357012664 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_C_FILE_GUARD #define MATHICGB_C_FILE_GUARD #include #include MATHICGB_NAMESPACE_BEGIN /// RAII handle for a C FILE*. /// /// The purpose of using the C IO interface instead of iostreams is that the /// former is faster to a ridiculous degree. This class wraps the C IO /// interface to be more useful in a C++ context. For example the file is /// automatically closed in the destructor and if the file cannot be opened /// then an exception is thrown instead of returning a null pointer. class CFile { public: struct NoThrowTag {}; /// Sets the handle to null if the file cannot be opened - does not /// throw an exception. The purpose of the NoTrowTag parameter is only /// to indicate that no exception should be thrown on error. CFile(const std::string& fileName, const char* mode, NoThrowTag); /// Opens the file and throws an exception if the file cannot be opened. CFile(const std::string& fileName, const char* mode); ~CFile(); bool hasFile() const {return mFile != 0;} FILE* handle() {return mFile;} void close(); private: FILE* mFile; }; MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/MonoArena.hpp0000664000175000017500000001525014560325357013566 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_MONO_ARENA_GUARD #define MATHICGB_MONO_ARENA_GUARD #include "Range.hpp" #include #include MATHICGB_NAMESPACE_BEGIN /// Like a Monoid::MonoVector, except that references are not /// invalidated when additional memory must be allocated. /// /// Todo: Think of a better name. We can't deallocate at the end, so /// MonoArena is not really an Arena. template class MonoArena; template class MonoArena { public: typedef M Monoid; typedef typename Monoid::Mono Mono; typedef typename Monoid::MonoRef MonoRef; typedef typename Monoid::ConstMonoRef ConstMonoRef; typedef typename Monoid::MonoPtr MonoPtr; typedef typename Monoid::ConstMonoPtr ConstMonoPtr; typedef typename Monoid::MonoVector MonoVector; typedef Flatten::const_iterator> const_iterator; // *** Constructors and assignment MonoArena(const Monoid& monoid) { mVectors.emplace_back(monoid); } MonoArena(const MonoArena& a): mVectors(a.mVectors) {} MonoArena(MonoArena&& a): mVectors(std::move(a.mVectors)) {} MonoArena& operator=(const MonoArena& a) { MATHICGB_ASSERT(monoid() == a.monoid()); mVectors = a.mVectors; return *this; } MonoArena& operator=(MonoArena&& a) { MATHICGB_ASSERT(monoid() == a.monoid()); mVectors = std::move(a.mVectors); return *this; } // *** Iterators const_iterator begin() const { return makeFlatten(std::begin(mVectors), std::end(mVectors)); } const_iterator end() const { return makeFlatten(std::end(mVectors), std::end(mVectors)); } const_iterator cbegin() const {return begin();} const_iterator cend() const {return end();} // *** Size and capacity size_t size() const { auto count = size_t(0); for (const auto& v : mVectors) count += v.size(); return count; } bool empty() const { MATHICGB_ASSERT(!mVectors.empty()); return mVectors.front().empty(); } // *** Element access ConstMonoRef front() const { MATHICGB_ASSERT(!empty()); MATHICGB_ASSERT(!mVectors.front().empty()); return mVectors.front().front(); } MonoRef back() { MATHICGB_ASSERT(!empty()); MATHICGB_ASSERT(!backVector().empty()); return backVector().back(); } ConstMonoRef back() const { MATHICGB_ASSERT(!empty()); MATHICGB_ASSERT(!backVector().empty()); return backVector().back(); } // *** Modifiers /// Appends the identity. void push_back() { MATHICGB_ASSERT(debugAssertValid()); ensureSpace(); return; backVector().push_back(); MATHICGB_ASSERT(debugAssertValid()); MATHICGB_ASSERT(monoid().isIdentity(back())); } void push_back(ConstMonoRef mono) { MATHICGB_ASSERT(debugAssertValid()); MATHICGB_ASSERT(monoid().debugValid(mono)); ensureSpace(); backVector().push_back(mono); MATHICGB_ASSERT(debugAssertValid()); MATHICGB_ASSERT(monoid().equal(back(), mono)); } template void push_back( const Monoid& monoidMono, typename Monoid::ConstMonoRef mono ) { MATHICGB_ASSERT(monoidMono.debugValid(mono)); MATHICGB_ASSERT(debugAssertValid()); ensureSpace(); backVector().push_back(monoidMono, mono); MATHICGB_ASSERT(debugAssertValid()); MATHICGB_ASSERT(monoid().equal(monoidMono, mono, back())); } void swap(MonoArena& a) { MATHICGB_ASSERT(monoid() == a.monoid()); MATHICGB_ASSERT(debugAssertValid()); MATHICGB_ASSERT(a.debugAssertValid()); mVectors.swap(a.mVectors); MATHICGB_ASSERT(debugAssertValid()); MATHICGB_ASSERT(a.debugAssertValid()); } void clear() { MATHICGB_ASSERT(debugAssertValid()); auto last = std::end(mVectors); --last; last->clear(); mVectors.erase(mVectors.begin(), last); MATHICGB_ASSERT(debugAssertValid()); } // *** Other size_t memoryBytesUsed() const { auto sum = size_t(0); for (const auto& v : mVectors) sum += v.memoryBytesUsed(); return sum; } const Monoid& monoid() const {return mVectors.back().monoid();} bool debugAssertValid() const { #ifdef MATHICGB_DEBUG MATHICGB_ASSERT(!mVectors.empty()); for (const auto& p : adjPairRange(mVectors)) { MATHICGB_ASSERT(p.first.monoid() == p.second.monoid()); MATHICGB_ASSERT(p.first.capacity() <= p.second.capacity()); } #endif return true; } private: /// Ensures that there is space for at least one more monomial. /// /// @todo: if monomials ever become variable-size, then this might /// allocate far more than double the memory of the previous /// vector. The problem is that they might actually take up, say, 128 bytes /// but the worst case is 1024k. Then if 1000 monomials fit in the previous /// vector, the next vector will allocate 2 * 1000 * 1024k bytes, which /// is far more than double what the previous vector did. Make it actually /// double the bytes. void ensureSpace() { MATHICGB_ASSERT(debugAssertValid()); if (!backVector().atCapacity()) return; const auto oldSize = backVector().size(); if (oldSize > std::numeric_limits::max() / 2) throw std::bad_alloc(); const auto newSize = 2 * oldSize; mVectors.emplace_back(monoid()); backVector().reserve(newSize); MATHICGB_ASSERT(debugAssertValid()); } MonoVector& backVector() { MATHICGB_ASSERT(!mVectors.empty()); return mVectors.back(); } const MonoVector& backVector() const { MATHICGB_ASSERT(!mVectors.empty()); return mVectors.back(); } std::vector mVectors; }; /// Returns true if a and b contain the same monomials in the same order. template bool operator==(const MonoArena& a, const MonoArena& b) { MATHICGB_ASSERT(a.monoid() == b.monoid()); MATHICGB_ASSERT(a.debugAssertValid()); MATHICGB_ASSERT(b.debugAssertValid()); typedef typename Monoid::ConstMonoRef ConstMonoRef; const auto& monoid = a.monoid(); auto cmpEqual = [&monoid](ConstMonoRef monoA, ConstMonoRef monoB) { return monoid.equal(monoA, monoB); }; return std::equal(std::begin(a), std::end(a), std::begin(b), cmpEqual); } /// As !(*this == v). template bool operator!=(const MonoArena& a, const MonoArena& b) { MATHICGB_ASSERT(a.monoid() == b.monoid()); return !(a == b); } MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/F4MatrixProjection.hpp0000664000175000017500000000340314560325357015377 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_F4_MATRIX_PROJECTION_GUARD #define MATHICGB_F4_MATRIX_PROJECTION_GUARD #include "QuadMatrix.hpp" #include "SparseMatrix.hpp" #include "F4ProtoMatrix.hpp" #include "MonomialMap.hpp" #include "ScopeExit.hpp" #include MATHICGB_NAMESPACE_BEGIN class F4MatrixProjection { public: typedef PolyRing::Monoid Monoid; typedef Monoid::Mono Mono; typedef Monoid::MonoRef MonoRef; typedef Monoid::ConstMonoRef ConstMonoRef; typedef Monoid::MonoPtr MonoPtr; typedef Monoid::ConstMonoPtr ConstMonoPtr; typedef SparseMatrix::RowIndex RowIndex; typedef SparseMatrix::ColIndex ColIndex; typedef SparseMatrix::Scalar Scalar; F4MatrixProjection(const PolyRing& ring, ColIndex colCount); void addProtoMatrix(F4ProtoMatrix&& matrix) {mMatrices.push_back(&matrix);} // No reference to mono is retained. void addColumn(ColIndex index, ConstMonoRef mono, const bool isLeft); QuadMatrix makeAndClear(const size_t quantum); const PolyRing& ring() const {return mRing;} private: QuadMatrix makeAndClearOneStep(const size_t quantum); QuadMatrix makeAndClearTwoStep(const size_t quantum); // Utility class for building a left/right projection. class LeftRight; // Utility class for building a top/bottom projection. template class TopBottom; // This is for projection of columns struct ColProjectTo { ColIndex index; bool isLeft; }; std::vector mColProjectTo; std::vector mMatrices; std::vector mLeftMonomials; std::vector mRightMonomials; const PolyRing& mRing; }; MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/QuadMatrix.cpp0000664000175000017500000002614314560325357013764 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "QuadMatrix.hpp" #include "MathicIO.hpp" #include "mtbb.hpp" #include #include #include MATHICGB_NAMESPACE_BEGIN bool QuadMatrix::debugAssertValid() const { #ifndef MATHICGB_DEBUG return true; #else MATHICGB_ASSERT(topLeft.debugAssertValid()); MATHICGB_ASSERT(bottomLeft.debugAssertValid()); MATHICGB_ASSERT(topRight.debugAssertValid()); MATHICGB_ASSERT(bottomRight.debugAssertValid()); if (!leftColumnMonomials.empty() || !rightColumnMonomials.empty()) { MATHICGB_ASSERT(topLeft.computeColCount() <= leftColumnMonomials.size()); MATHICGB_ASSERT(bottomLeft.computeColCount() <= leftColumnMonomials.size()); MATHICGB_ASSERT(topRight.computeColCount() <= rightColumnMonomials.size()); MATHICGB_ASSERT(bottomRight.computeColCount() <= rightColumnMonomials.size()); } MATHICGB_ASSERT(topLeft.rowCount() == topRight.rowCount()); MATHICGB_ASSERT(bottomRight.rowCount() == bottomLeft.rowCount()); return true; #endif } void QuadMatrix::print(std::ostream& out) const { MATHICGB_ASSERT(debugAssertValid()); mathic::ColumnPrinter printer; printer.addColumn(true, "", ""); printer.addColumn(true, " | ", ""); // column monomials out << "Left columns:"; for (const auto& mono : leftColumnMonomials) { out << ' '; MathicIO<>().writeMonomial(monoid(), false, *mono, out); } out << "\nRight columns:"; for (const auto& mono : rightColumnMonomials) { out << ' '; MathicIO<>().writeMonomial(monoid(), false, *mono, out); } out << '\n'; // left side topLeft.print(printer[0]); printer[0] << '\n'; bottomLeft.print(printer[0]); // right side topRight.print(printer[1]); printer[1] << '\n'; bottomRight.print(printer[1]); out << printer; } size_t QuadMatrix::rowCount() const { return topLeft.rowCount() + bottomLeft.rowCount(); } SparseMatrix::ColIndex QuadMatrix::computeLeftColCount() const { if (!leftColumnMonomials.empty()) { MATHICGB_ASSERT( leftColumnMonomials.size() <= std::numeric_limits::max() ); return static_cast(leftColumnMonomials.size()); } return std::max(topLeft.computeColCount(), bottomLeft.computeColCount()); } SparseMatrix::ColIndex QuadMatrix::computeRightColCount() const { if (!rightColumnMonomials.empty()) { MATHICGB_ASSERT( rightColumnMonomials.size() <= std::numeric_limits::max() ); return static_cast(rightColumnMonomials.size()); } return std::max(topRight.computeColCount(), bottomRight.computeColCount()); } size_t QuadMatrix::entryCount() const { return topLeft.entryCount() + topRight.entryCount() + bottomLeft.entryCount() + bottomRight.entryCount(); } std::string QuadMatrix::toString() const { std::ostringstream out; print(out); return out.str(); } size_t QuadMatrix::memoryUse() const { return topLeft.memoryUse() + topRight.memoryUse() + bottomLeft.memoryUse() + bottomRight.memoryUse(); } size_t QuadMatrix::memoryUseTrimmed() const { return topLeft.memoryUseTrimmed() + topRight.memoryUseTrimmed() + bottomLeft.memoryUseTrimmed() + bottomRight.memoryUseTrimmed(); } void QuadMatrix::printStatistics(std::ostream& out) const { typedef mathic::ColumnPrinter ColPr; ColPr pr; pr.addColumn(false, " ", ""); pr.addColumn(false, "", ""); pr.addColumn(false, "", ""); pr.addColumn(false, "", ""); pr.addColumn(true, "", ""); const auto totalMemory = memoryUse(); auto printDataCol = [&]( std::ostream& out, const SparseMatrix& top, const SparseMatrix& bottom, const SparseMatrix::ColIndex colCount ) { auto printDataCell = [&](const SparseMatrix& matrix) { const auto entryCount = matrix.entryCount(); const uint64 area = static_cast(matrix.rowCount()) * static_cast(colCount); const auto memory = matrix.memoryUse(); out << ColPr::withSIPrefix(entryCount) << " -" << ColPr::percentIntegerFixed(entryCount, area) << " \n" << ColPr::bytesInUnit(memory) << " -" << ColPr::percentIntegerFixed(matrix.memoryUseTrimmed(), memory) << " \n" << ColPr::percentInteger(memory, totalMemory) << " \n"; }; out << ColPr::commafy(colCount) << " \n"; const char* const line = "------------------\n"; out << line; printDataCell(top); out << line; printDataCell(bottom); out << line; }; pr[0] << "\n/\n" << ColPr::commafy(topLeft.rowCount()) << " |\nrows |\n|\n|\n" << ColPr::commafy(bottomLeft.rowCount()) << " |\nrows |\n|\n\\\n"; printDataCol(pr[1], topLeft, bottomLeft, computeLeftColCount()); pr[2] << " \n|\n|\n|\n|\n|\n|\n|\n|\n|\n"; printDataCol(pr[3], topRight, bottomRight, computeRightColCount()); const char* const legend = "| non-zero (density)\n| memory (used)\n| of total memory\n"; pr[4] << " columns\n\\\n" << legend << "|\n" << legend << "/\n"; out << '\n' << pr << " Total memory: " << ColPr::bytesInUnit(memoryUse()) << " (" << ColPr::percentInteger(memoryUseTrimmed(), totalMemory) << " used)\n\n"; } QuadMatrix QuadMatrix::toCanonical() const { class RowComparer { public: RowComparer(const SparseMatrix& matrix): mMatrix(matrix) {} bool operator()(SparseMatrix::RowIndex a, SparseMatrix::RowIndex b) const { auto itA = mMatrix.rowBegin(a); const auto endA = mMatrix.rowEnd(a); auto itB = mMatrix.rowBegin(b); const auto endB = mMatrix.rowEnd(b); for (; itA != endA; ++itA, ++itB) { if (itB == endB) return true; if (itA.index() > itB.index()) return true; if (itA.index() < itB.index()) return false; if (itA.scalar() > itB.scalar()) return false; if (itA.scalar() < itB.scalar()) return true; } return false; } private: const SparseMatrix& mMatrix; }; // todo: eliminate left/right code duplication here QuadMatrix matrix(ring()); { // left side std::vector rows; for (SparseMatrix::RowIndex row = 0; row < topLeft.rowCount(); ++row) rows.push_back(row); { RowComparer comparer(topLeft); std::sort(rows.begin(), rows.end(), comparer); } matrix.topLeft.clear(); matrix.topRight.clear(); for (SparseMatrix::RowIndex i = 0; i < rows.size(); ++i) { matrix.topLeft.appendRow(topLeft, rows[i]); matrix.topRight.appendRow(topRight, rows[i]); } } { // right side std::vector rows; for (SparseMatrix::RowIndex row = 0; row < bottomLeft.rowCount(); ++row) rows.push_back(row); { RowComparer comparer(bottomLeft); std::sort(rows.begin(), rows.end(), comparer); } matrix.bottomLeft.clear(); matrix.bottomRight.clear(); for (SparseMatrix::RowIndex i = 0; i < rows.size(); ++i) { matrix.bottomLeft.appendRow(bottomLeft, rows[i]); matrix.bottomRight.appendRow(bottomRight, rows[i]); } } matrix.leftColumnMonomials = leftColumnMonomials; matrix.rightColumnMonomials = rightColumnMonomials; return matrix; } std::ostream& operator<<(std::ostream& out, const QuadMatrix& qm) { qm.print(out); return out; } namespace { template class ColumnComparer { public: ColumnComparer(const Monoid& monoid): mMonoid(monoid) {} template bool operator()(const Pair& a, const Pair b) const { return mMonoid.lessThan(*b.first, *a.first); } private: const Monoid& mMonoid; }; std::vector sortColumnMonomialsAndMakePermutation( QuadMatrix::Monomials& monomials, const QuadMatrix::Monoid& monoid ) { typedef SparseMatrix::ColIndex ColIndex; MATHICGB_ASSERT(monomials.size() <= std::numeric_limits::max()); const ColIndex colCount = static_cast(monomials.size()); // Monomial needs to be non-const as we are going to put these // monomials back into the vector of monomials which is not const. std::vector> columns; columns.reserve(colCount); for (ColIndex col = 0; col < colCount; ++col) columns.push_back(std::make_pair(monomials[col], col)); std::sort( columns.begin(), columns.end(), ColumnComparer(monoid) ); // Apply sorting permutation to monomials. This is why it is necessary to // copy the values in monomial out of there: in-place application of a // permutation is messy. MATHICGB_ASSERT(columns.size() == colCount); MATHICGB_ASSERT(monomials.size() == colCount); for (size_t col = 0; col < colCount; ++col) { MATHICGB_ASSERT( col == 0 || monoid.lessThan(*columns[col].first, *columns[col - 1].first) ); monomials[col] = columns[col].first; } // Construct permutation of indices to match permutation of monomials std::vector permutation(colCount); for (ColIndex col = 0; col < colCount; ++col) { // The monomial for column columns[col].second is now the // monomial for col, so we need the inverse map for indices. permutation[columns[col].second] = col; } return permutation; } } void QuadMatrix::sortColumnsLeftRightParallel() { typedef SparseMatrix::ColIndex ColIndex; std::vector leftPermutation; std::vector rightPermutation; mtbb::parallel_for(0, 2, 1, [&](int i) { if (i == 0) leftPermutation = sortColumnMonomialsAndMakePermutation(leftColumnMonomials, monoid()); else rightPermutation = sortColumnMonomialsAndMakePermutation(rightColumnMonomials, monoid()); }); mtbb::parallel_for(0, 4, 1, [&](int i) { if (i == 0) topRight.applyColumnMap(rightPermutation); else if (i == 1) bottomRight.applyColumnMap(rightPermutation); else if (i == 2) topLeft.applyColumnMap(leftPermutation); else { MATHICGB_ASSERT(i == 3); bottomLeft.applyColumnMap(leftPermutation); } }); } void QuadMatrix::write( const SparseMatrix::Scalar modulus, FILE* file ) const { MATHICGB_ASSERT(file != 0); topLeft.write(modulus, file); topRight.write(modulus, file); bottomLeft.write(modulus, file); bottomRight.write(modulus, file); } SparseMatrix::Scalar QuadMatrix::read(FILE* file) { MATHICGB_ASSERT(file != 0); leftColumnMonomials.clear(); rightColumnMonomials.clear(); const auto topLeftModulus = topLeft.read(file); #ifdef MATHICGB_DEBUG const auto topRightModulus = topRight.read(file); const auto bottomLeftModulus = bottomLeft.read(file); const auto bottomRightModulus = bottomRight.read(file); #endif // todo: this should throw some kind of invalid format exception instead of // these asserts. MATHICGB_ASSERT(topLeftModulus == topRightModulus); MATHICGB_ASSERT(bottomLeftModulus == topRightModulus); MATHICGB_ASSERT(bottomRightModulus == topRightModulus); MATHICGB_ASSERT(debugAssertValid()); return topLeftModulus; } MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/PolyRing.cpp0000664000175000017500000001434114560325357013445 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "PolyRing.hpp" #include #include #include #include #include #include #include #include MATHICGB_NAMESPACE_BEGIN PolyRing::PolyRing(const Field& field, Monoid&& monoid): mField(field), mMonoid(std::move(monoid)) {} PolyRing::PolyRing( coefficient p0, int nvars, bool lexBaseOrder, std::vector&& weights ): mField(p0), mMonoid( MonoOrder( nvars, std::move(weights), lexBaseOrder ? MonoOrder::LexBaseOrderFromRight : MonoOrder::RevLexBaseOrderFromRight ) ) {} /////////////////////////////////////// // (New) Monomial Routines //////////// /////////////////////////////////////// void PolyRing::setWeightsAndHash(Monomial& a1) const { setWeightsOnly(a1); setHashOnly(a1); } int PolyRing::monomialCompare(ConstMonomial sig, ConstMonomial m2, ConstMonomial sig2) const // returns LT, EQ, or GT, depending on sig ? (m2 * sig2). { return monoid().compare(sig, m2, sig2); } void PolyRing::monomialSetIdentity(Monomial& result) const { monoid().setIdentity(result); } void PolyRing::monomialEi(Monoid::Component i, Monomial &result) const { monoid().setIdentity(result); monoid().setComponent(i, result); } void PolyRing::monomialMultTo(Monomial &a, ConstMonomial b) const { monoid().multiplyInPlace(b, a); } void PolyRing::monomialCopy(ConstMonomial a, Monomial& result) const { monoid().copy(a, result); } void PolyRing::monomialQuotientAndMult(ConstMonomial a, ConstMonomial b, ConstMonomial c, Monomial& result) const { monoid().colonMultiply(b, a, c, result); } void PolyRing::monomialFindSignature(ConstMonomial v1, ConstMonomial v2, ConstMonomial u1, Monomial& t1) const { monoid().colonMultiply(v1, v2, u1, t1); } size_t PolyRing::monomialSizeOfSupport(ConstMonomial m) const { return monoid().sizeOfSupport(m); } void PolyRing::mysteriousSPairMonomialRoutine(ConstMonomial newSig, ConstMonomial newLead, ConstMonomial baseDivSig, ConstMonomial baseDivLead, Monomial result) const { result[0] = 0; // set component for (size_t i = 1; i <= varCount(); ++i) { exponent x = newSig[i] - baseDivSig[i] + baseDivLead[i]; if (newLead[i] <= x) x = std::numeric_limits::max(); result[i] = std::max(baseDivLead[i], x); } } // The following two read/write monomials in the form: // letter number letter number ... letter number < number > // allowed letters: a-zA-Z // also allowed instead of letter: [ number ], [0] refers to first var, etc. // What about errors?? void PolyRing::monomialParse(std::istream &i, Monomial& result) const { // monoid().parseM2(i, result); // first initialize result: for (size_t j=0; j< maxMonomialSize(); j++) result[j] = 0; uint64 e; int v, x; // now look at the next char for (;;) { char next = i.peek(); if (isalpha(next)) { // determine variable v = next - 'a'; if (v > 25 || v < 0) v = next - 'A' + 26; if (v < 0 || v > 51) std::cerr << "variable out of range" << std::endl; i.get(); // move past the letter next = i.peek(); e = 1; if (isdigit(next)) i >> e; result[v+1] = static_cast(e); } else if (next == '<') { // get component i.get(); i >> x; *result = x; // place component if (i.peek() == '>') i.get(); } else { break; // We assume that we are at the end of the monomial } } setWeightsAndHash(result); } void PolyRing::monomialDisplay(std::ostream &o, ConstMonomial a, bool print_comp, bool print_one) const { // We display a monomial in the form that can be used with monomialParse // print_one: only is consulted in print_comp is false. bool printed_any = false; for (size_t i=0; i< varCount(); i++) { if (a[i+1] != 0) { printed_any = true; if (i <= 25) o << static_cast('a' + i); else o << static_cast('A' + (i - 26)); if (a[i+1] != 1) o << static_cast(a[i+1]); } } if (print_comp) o << '<' << static_cast(*a.mValue) << '>'; else if (!printed_any && print_one) o << "1"; } void PolyRing::monomialDisplay(FILE* file, ConstMonomial mono, bool printComponent, bool printOne) const { const unsigned int letterCount = 26; MATHICGB_ASSERT(getNumVars() <= 2 * letterCount); bool printedAny = false; for (size_t var = 0; var < varCount(); ++var) { exponent e = monomialExponent(mono, var); if (e == 0) continue; printedAny = true; char varChar; if (var < letterCount) varChar = static_cast('a' + var); else varChar = static_cast('A' + (var - letterCount)); fputc(varChar, file); if (e != 1) fprintf(file, "%i", e); } if (printComponent) fprintf(file, "<%i>", mono.component()); else if (!printedAny && printOne) fputc('1', file); } void PolyRing::printMonomialFrobbyM2Format(std::ostream& out, ConstMonomial m) const { out << " "; bool isOne = true; for (size_t i = 0; i < varCount(); ++i) { const auto e = m[i + 1]; if (e == 0) continue; if (!isOne) out << '*'; else isOne = false; out << 'x' << (i + 1) << '^' << e; } if (isOne) out << '1'; } MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/ModuleMonoSet.hpp0000664000175000017500000000475614560325357014452 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_MODULE_MONO_SET_GUARD #define MATHICGB_MODULE_MONO_SET_GUARD #include "PolyRing.hpp" #include #include #include MATHICGB_NAMESPACE_BEGIN /// Represents the ideal generated by a set of module monomials. class ModuleMonoSet { public: typedef PolyRing::Monoid Monoid; typedef Monoid::ConstMonoRef ConstMonoRef; typedef Monoid::ConstMonoPtr ConstMonoPtr; virtual ~ModuleMonoSet(); /// Inserts mono into this set if it is not already a member of the /// ideal generated by this set. Returns true if mono was inserted. /// If this set was constructed to allow removals, any other module /// monomials divisible by mono will be removed. A reference to /// mono is retained but ownership is not passed. virtual bool insert(ConstMonoRef mono) = 0; /// Returns true if mono is a member of the ideal generated by this set. virtual bool member(ConstMonoRef mono) = 0; /// Prints a human-readable representation of this set to out. virtual void display(std::ostream& out) const = 0; /// Returns the number of module monomials in this set. Take care not to /// confuse this with the number of components. virtual size_t elementCount() const = 0; class EntryOutput { public: virtual void proceed(ConstMonoRef mono) = 0; }; /// Calls consumer.proceed(mono) for each mono in this set. virtual void forAllVirtual(EntryOutput& consumer) = 0; /// Calls func(mono) for eac mono in this set. template void forAll(Func&& func) { struct Wrap : EntryOutput { Wrap(Func&& func): mFunc(std::forward(func)) {} virtual void proceed(ConstMonoRef mono) {mFunc(mono);} Func&& mFunc; } wrap(std::forward(func)); forAllVirtual(wrap); } /// Returns a descriptive name for the implementation of this set. virtual std::string name() const = 0; virtual size_t getMemoryUse() const = 0; /// Prints a human-readable description of the type codes for the /// implementations of this interface. static void displayCodes(std::ostream& out); /// This is how you should instantiate classes that implement this interface. static std::unique_ptr make( const Monoid& monoid, int type, // the type code - which implementation do you want? size_t componentCount, bool allowRemovals ); }; MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/SigSPairQueue.cpp0000664000175000017500000001441114560325357014366 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "SigSPairQueue.hpp" #include "SigPolyBasis.hpp" MATHICGB_NAMESPACE_BEGIN SigSPairQueue::~SigSPairQueue() {} namespace { class Comparer { public: typedef PolyRing::Monoid Monoid; Comparer(const Monoid& monoid): mMonoid(monoid) {} bool operator()(const PreSPair& a, const PreSPair& b) const { return mMonoid.lessThan(*a.signature, *b.signature); } private: const Monoid& mMonoid; }; // Iterator that accesses the field i based on a passed-in iterator. template class IndexIterator { public: typedef typename PairIterator::iterator_category iterator_category; typedef decltype(reinterpret_cast(0)->i) value_type; typedef typename PairIterator::difference_type difference_type; typedef value_type* pointer; typedef value_type& reference; IndexIterator(PairIterator pairIterator): mIterator(pairIterator) {} IndexIterator& operator++() {++mIterator; return *this;} const value_type operator*() const {return mIterator->i;} difference_type operator-(const IndexIterator& it) const { return mIterator - it.mIterator; } bool operator==(const IndexIterator& it) const { return mIterator == it.mIterator; } bool operator!=(const IndexIterator& it) const { return mIterator != it.mIterator; } private: PairIterator mIterator; }; } class ConcreteSigSPairQueue : public SigSPairQueue { public: ConcreteSigSPairQueue(SigPolyBasis const& basis): mPairQueue(Configuration(basis)) {} virtual Mono popSignature(Pairs& pairs) { pairs.clear(); if (mPairQueue.empty()) return 0; auto sig = monoid().alloc(); monoid().copy(*mPairQueue.topPairData(), *sig); do { pairs.push_back(mPairQueue.topPair()); mPairQueue.pop(); } while ( !mPairQueue.empty() && monoid().equal(*mPairQueue.topPairData(), *sig) ); return sig; } virtual void pushPairs(size_t pairWith, IndexSigs& pairs) { #ifdef MATHICGB_DEBUG { auto tmp = monoid().alloc(); for (size_t i = 0; i < pairs.size(); ++i) { MATHICGB_ASSERT(pairs[i].i < columnCount()); mPairQueue.configuration().computePairData (columnCount(), pairs[i].i, tmp.ptr()); MATHICGB_ASSERT(monoid().equal(*tmp, *pairs[i].signature)); } } #endif if (columnCount() >= std::numeric_limits::max()) throw std::overflow_error ("Too large basis element index in constructing S-pairs."); // sort and insert new column Comparer cmp(ring().monoid()); std::sort(pairs.begin(), pairs.end(), cmp); typedef IndexIterator::const_iterator> Iter; mPairQueue.addColumnDescending(Iter(pairs.begin()), Iter(pairs.end())); // free signatures for (auto& spair : pairs) monoid().freeRaw(spair.signature); pairs.clear(); } virtual std::string name() const {return "todo";} virtual size_t memoryUse() const {return mPairQueue.getMemoryUse();} virtual size_t pairCount() const {return mPairQueue.pairCount();} virtual size_t columnCount() const {return mPairQueue.columnCount();} private: ConcreteSigSPairQueue(const ConcreteSigSPairQueue&); // not available void operator=(const ConcreteSigSPairQueue&); // not available // Configuration of mathic::PairTriangle for use with signature queues. class Configuration { public: Configuration(SigPolyBasis const& basis): mBasis(basis) {} typedef MonoPtr PairData; void computePairData(size_t col, size_t row, PairData sig) { MATHICGB_ASSERT(mBasis.ratioCompare(col, row) != EQ); // ensure that ratio(col) > ratio(row) if (mBasis.ratioCompare(col, row) == LT) std::swap(col, row); monoid().colonMultiply( mBasis.leadMono(col), mBasis.leadMono(row), mBasis.signature(col), *sig ); } typedef bool CompareResult; bool compare(int colA, int rowA, PairData a, int colB, int rowB, PairData b) const { return mBasis.ring().monoid().lessThan(*b, *a); } bool cmpLessThan(bool v) const {return v;} SigPolyBasis const& basis() const {return mBasis;} const PolyRing& ring() const {return basis().ring();} const Monoid& monoid() const {return ring().monoid();} private: SigPolyBasis const& mBasis; }; // the compiler should be able to resolve these accessors into a direct // offset as though these were member variables. const SigPolyBasis& basis() const { return mPairQueue.configuration().basis(); } const PolyRing& ring() const {return basis().ring();} const Monoid& monoid() const {return ring().monoid();} mathic::PairQueue mPairQueue; friend struct mathic::PairQueueNamespace::ConstructPairDataFunction; friend struct mathic::PairQueueNamespace::DestructPairDataFunction; }; std::unique_ptr SigSPairQueue::create( SigPolyBasis const& basis ) { return make_unique(basis); } MATHICGB_NAMESPACE_END namespace mathic { namespace PairQueueNamespace { template<> struct ConstructPairDataFunction { inline static void function( void* memory, Index col, Index row, mgb::ConcreteSigSPairQueue::Configuration& conf ) { MATHICGB_ASSERT(memory != 0); MATHICGB_ASSERT(col > row); auto pd = new (memory) mgb::ConcreteSigSPairQueue::Configuration::PairData (conf.basis().ring().allocMonomial()); conf.computePairData(col, row, *pd); } }; template<> struct DestructPairDataFunction { inline static void function( mgb::ConcreteSigSPairQueue::Configuration::PairData* pd, Index col, Index row, mgb::ConcreteSigSPairQueue::Configuration& conf ) { MATHICGB_ASSERT(pd != nullptr); MATHICGB_ASSERT(col > row); conf.monoid().freeRaw(*pd); } }; } } mathicgb-1.1/src/mathicgb/F4Reducer.hpp0000664000175000017500000000147314560325357013474 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_F4_REDUCER_GUARD #define MATHICGB_F4_REDUCER_GUARD #include MATHICGB_NAMESPACE_BEGIN class Reducer; class PolyRing; /// Create an F4 reducer with extra parameters for writing out the matrix. /// Set file to "" to disable writing of matrices. std::unique_ptr makeF4Reducer( const PolyRing& ring, bool oldType, std::string file, size_t minEntries ); // This translation unit has to expose something that is needed elsewhere. // Otherwise, the compiler will think it is not needed and exclude the // whole thing, despite there being important global objects in the .cpp file. void f4ReducerDependency(); MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/ReducerPackDedup.hpp0000664000175000017500000000105114560325357015053 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_REDUCER_PACK_DEDUP_GUARD #define MATHICGB_REDUCER_PACK_DEDUP_GUARD MATHICGB_NAMESPACE_BEGIN // This translation unit has to expose something that is needed elsewhere. // Otherwise, the compiler will think it is not needed and exclude the // whole thing, despite there being important global objects in the .cpp file. void reducerPackDedupDependency(); MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/QuadMatrixBuilder.hpp0000664000175000017500000001500714560325357015275 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_QUAD_MATRIX_BUILDER_GUARD #define MATHICGB_QUAD_MATRIX_BUILDER_GUARD #include "MonomialMap.hpp" #include "SparseMatrix.hpp" #include "PolyRing.hpp" #include #include #include #include #include #include MATHICGB_NAMESPACE_BEGIN class QuadMatrix; /// Builder for QuadMatrix. This is not quite the builder pattern in /// that the interface is not virtual and the implementation cannot be /// swapped out - it only follows the builder pattern in that it is a /// class that allows step-wise construction of a final product. class QuadMatrixBuilder { public: typedef PolyRing::Monoid Monoid; typedef Monoid::Mono Mono; typedef Monoid::MonoRef MonoRef; typedef Monoid::ConstMonoRef ConstMonoRef; typedef Monoid::MonoPtr MonoPtr; typedef Monoid::ConstMonoPtr ConstMonoPtr; typedef SparseMatrix::RowIndex RowIndex; typedef SparseMatrix::ColIndex ColIndex; typedef SparseMatrix::Scalar Scalar; /// The index of a column that can be either on the left or the /// right side. The largest representable ColIndex is an invalid /// index. This is the default value. The only allowed method to /// call for an invalid index is valid(). class LeftRightColIndex { public: LeftRightColIndex(): mRawIndex(std::numeric_limits::max()), mLeft(false) {} LeftRightColIndex(ColIndex index, bool left): mRawIndex(index), mLeft(left) {} ColIndex leftIndex() const { MATHICGB_ASSERT(left()); return index(); } ColIndex rightIndex() const { MATHICGB_ASSERT(right()); return index(); } /// Use leftIndex() or rightIndex() instead if you know what side /// you are expecting, as those do an assert on your expectation. ColIndex index() const { MATHICGB_ASSERT(valid()); return mRawIndex; } bool left() const { MATHICGB_ASSERT(valid()); return mLeft; } bool right() const { MATHICGB_ASSERT(valid()); return !left(); } bool valid() const { return mRawIndex != std::numeric_limits::max(); } bool operator==(const LeftRightColIndex& index) const { return mRawIndex == index.mRawIndex && mLeft == index.mLeft; } bool operator!=(const LeftRightColIndex& index) const { return !(*this == index); } private: ColIndex mRawIndex; bool mLeft; }; typedef MonomialMap Map; typedef std::vector Monomials; QuadMatrixBuilder( const PolyRing& ring, Map& map, Monomials& monomialsLeft, Monomials& monomialsRight, size_t memoryQuantum = 0 ); /// Inserts the rows from builder. To avoid an assert either the matrix must /// have no column monomials specified or the monomials that are specified /// must match exactly to the column monomials for this object --- including /// the ordering of the monomials. void takeRowsFrom(QuadMatrix&& matrix); size_t memoryQuantum() const { return mTopLeft.memoryQuantum(); } // **** Appending entries to top matrices. // Same interface as SparseMatrix except with two matrices and here // you have to create columns before you can use them. void appendEntryTopLeft(ColIndex col, Scalar scalar) { mTopLeft.appendEntry(col, scalar); } void appendEntryTopRight(ColIndex col, Scalar scalar) { mTopRight.appendEntry(col, scalar); } void appendEntryTop(LeftRightColIndex col, Scalar scalar) { MATHICGB_ASSERT(col.valid()); if (col.left()) appendEntryTopLeft(col.leftIndex(), scalar); else appendEntryTopRight(col.rightIndex(), scalar); } void rowDoneTopLeftAndRight() { mTopLeft.rowDone(); mTopRight.rowDone(); } // **** Appending entries to bottom matrices // Same interface as SparseMatrix except with two matrices and here // you have to create columns before you can use them. void appendEntryBottomLeft(ColIndex col, Scalar scalar) { mBottomLeft.appendEntry(col, scalar); } void appendEntryBottomRight(ColIndex col, Scalar scalar) { mBottomRight.appendEntry(col, scalar); } void appendEntryBottom(LeftRightColIndex col, Scalar scalar) { MATHICGB_ASSERT(col.valid()); if (col.left()) appendEntryBottomLeft(col.leftIndex(), scalar); else appendEntryBottomRight(col.rightIndex(), scalar); } void rowDoneBottomLeftAndRight() { mBottomLeft.rowDone(); mBottomRight.rowDone(); } // *** Creating and reordering columns // You have to create columns before you can append entries in those columns. // All passed in monomials are copied so that ownership of the memory is // not taken over. The creation methods return a LeftRightColIndex instead // of just a ColIndex to allow more of a chance for asserts to catch errors // and to avoid the need for the client to immediately construct a // LeftRightColIndex based on the return value. /// Creates a new column associated to the monomial /// monomialToBeCopied to the left matrices. There must not already /// exist a column for this monomial on the left or on the right. std::pair createColumnLeft(ConstMonoRef monomialToBeCopied); /// Creates a new column associated to the monomial monomialToBeCopied /// to the right matrices. There must not already exist a column for /// this monomial on the left or on the right. std::pair createColumnRight(ConstMonoRef monomialToBeCopied); // *** Querying columns const SparseMatrix& topLeft() const {return mTopLeft;} const SparseMatrix& topRight() const {return mTopRight;} const SparseMatrix& bottomLeft() const {return mBottomLeft;} const SparseMatrix& bottomRight() const {return mBottomRight;} const PolyRing& ring() const {return mMonomialToCol.ring();} const Monoid& monoid() const {return ring().monoid();} /// Returns the built matrix and sets the builder to a state /// with no columns and no rows. QuadMatrix buildMatrixAndClear(); private: Monomials& mMonomialsLeft; /// stores one monomial per left column Monomials& mMonomialsRight; /// stores one monomial per right column /// Used for fast determination of which column has a given monomial. Map& mMonomialToCol; SparseMatrix mTopLeft; SparseMatrix mTopRight; SparseMatrix mBottomLeft; SparseMatrix mBottomRight; }; MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/SigSPairs.hpp0000664000175000017500000001060514560325357013552 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_SIG_S_PAIRS_GUARD #define MATHICGB_SIG_S_PAIRS_GUARD #include "PolyRing.hpp" #include "KoszulQueue.hpp" #include "SigSPairQueue.hpp" #include #include #include MATHICGB_NAMESPACE_BEGIN class Poly; class ModuleMonoSet; class SigPolyBasis; class Reducer; // Handles S-pairs in signature Grobner basis algorithms. Responsible // for eliminating S-pairs, storing S-pairs and ordering S-pairs. class SigSPairs { public: typedef PolyRing::Monoid Monoid; typedef Monoid::Mono Mono; typedef Monoid::MonoRef MonoRef; typedef Monoid::ConstMonoRef ConstMonoRef; typedef Monoid::MonoPtr MonoPtr; typedef Monoid::ConstMonoPtr ConstMonoPtr; SigSPairs( const PolyRing *R0, const SigPolyBasis *GB0, ModuleMonoSet *Hsyz0, Reducer* reducer, bool postponeKoszuls, bool useBaseDivisors, bool useSingularCriterionEarly, size_t queueType); ~SigSPairs(); typedef std::vector > PairContainer; Mono popSignature(PairContainer& pairs); // fills in all the S-pairs with i. void newPairs(size_t i); struct Stats { unsigned long long spairsConstructed; // all spairs unsigned long long spairsFinal; // spairs given to client unsigned long long nonregularSPairs; // spairs eliminated by being non-regular unsigned long long highBaseDivisorHits; // spairs eliminated by high base divisor unsigned long long lowBaseDivisorHits; // spairs eliminated by low base divisor unsigned long long hasHighBaseDivisor; // generators that have a high base divisor unsigned long long hasLowBaseDivisor; // generators that have a low base divisor unsigned long long syzygyModuleHits; // spairs eliminated by syzygy module unsigned long long earlyRelativelyPrimePairs; unsigned long long earlySingularCriterionPairs; unsigned long long queuedPairs; // number actually placed on spair triangle unsigned long long duplicateSignatures; // number of spairs removed due to duplicate signature Stats(): spairsConstructed(0), spairsFinal(0), nonregularSPairs(0), highBaseDivisorHits(0), lowBaseDivisorHits(0), hasHighBaseDivisor(0), hasLowBaseDivisor(0), syzygyModuleHits(0), earlyRelativelyPrimePairs(0), earlySingularCriterionPairs(0), queuedPairs(0), duplicateSignatures(0) {} }; Stats getStats() const {return mStats;} size_t pairCount() const; size_t getMemoryUse() const; size_t getKnownSyzygyBitsMemoryUse() const; // Informs the s-pair handler that the syzygy between gen1 and gen2 // is a known syzygy. void setKnownSyzygy(size_t gen1, size_t gen2); void setKnownSyzygies(std::vector >& pairs); const PolyRing& ring() {return *R;} const Monoid& monoid() {return ring().monoid();} std::string name(); private: void makePreSPairs(size_t newGen); struct BaseDivisor { // a low ratio base divisor size_t baseDivisor; // the index of the generator that is the base divisor size_t ratioLessThan; // consider generators with ratio less than this monomial baseMonomial; // the monomial that has to divide to get a hit }; typedef std::vector BaseDivContainer; void setupBaseDivisors( BaseDivisor& divisor1, BaseDivisor& divisor2, size_t& highDivisorCmp, size_t newGenerator); const PolyRing *R; // if true, apply the early singular criterion bool const mUseSingularCriterionEarly; // true if low ratio base divisors are used to speed up S-pair elimination. const bool mUseBaseDivisors; // True if high ratio base divisors are used to speed up S-pair elimination. // The syzygy should have already been inserted into the syzygy module. const bool mUseHighBaseDivisors; // one entry for every s-pair, which is set to true if the // s-pair is known to be a syzygy. Only used if // mUseBaseDivisors is true. mathic::BitTriangle mKnownSyzygyTri; // From elsewhere ModuleMonoSet *Hsyz; // we often modify this const SigPolyBasis *GB; // Reducer* mReducer; const bool mPostponeKoszuls; typedef std::vector PrePairContainer; std::unique_ptr mQueue; SigSPairQueue::IndexSigs mIndexSigs; mutable Stats mStats; }; MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/ReducerPackDedup.cpp0000664000175000017500000002306514560325357015057 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "ReducerPackDedup.hpp" #include "TypicalReducer.hpp" #include "ReducerHelper.hpp" #include #include MATHICGB_NAMESPACE_BEGIN void reducerPackDedupDependency() {} /// As ReducerPack, with an extra feature: if two items with the same current /// monomial in the queue are compared by the queue, then combine the first /// into the second. That way, the second can be removed from the queue. /// This requires keeping a linked list with each entry of the other entries /// that have been combined into it, since we need to move on to the next term /// of all of those entries. This technique further reduces the number of /// entries in the queue. /// /// Note that the linked lists are circular to make it fast to append two /// linked lists. The trick is that you can combine two distinct circular /// lists by swapping the next pointers of any one node in the first list and /// of any one node in the second list. template class Queue> class ReducerPackDedup : public TypicalReducer { public: ReducerPackDedup(const PolyRing& ring); virtual ~ReducerPackDedup(); virtual std::string description() const { return mQueue.getName() + "-packed"; } virtual void insertTail(NewConstTerm multiplier, const Poly& f); virtual void insert(ConstMonoRef multiplier, const Poly& f); virtual bool leadTerm(NewConstTerm& result); virtual void removeLeadTerm(); virtual size_t getMemoryUse() const; virtual void resetReducer(); private: // Represents a term multiple of a polynomial, // together with a current term of the multiple. struct MultipleWithPos { MultipleWithPos(const Poly& poly, NewConstTerm multiple); Poly::ConstTermIterator pos; const Poly::ConstTermIterator end; NewTerm multiple; // invariant: current is the monomial product of multiple.monom // and pos.mono(). MonoPtr current; // Ensures the invariant, so sets current to the product of // multiple.monom and pos.mono(). void computeCurrent(const PolyRing& ring); void currentCoefficient(const PolyRing& ring, Coefficient& coeff); void addCurrentCoefficient(const PolyRing& ring, Coefficient& coeff); void destroy(const PolyRing& ring); // Points to a circular list of entries that have the same current // monomial. If no other such entries have been discovered, then // chain points to this object itself. We use a circular linked list // as those allow merging in O(1) time. MultipleWithPos* chain; void mergeChains(MultipleWithPos& entry) { // This only works if *this and entry are not already in the // same chain! std::swap(chain, entry.chain); } }; class Configuration : public ReducerHelper::DedupConfiguration { public: typedef MultipleWithPos* Entry; Configuration(const PolyRing& ring): DedupConfiguration(ring) {} CompareResult compare(const Entry& a, const Entry& b) const { return ring().monoid().compare(*a->current, *b->current); } Entry deduplicate(Entry a, Entry b) const { a->mergeChains(*b); return a; } }; private: class MonomialFree; const PolyRing& mRing; NewTerm mLeadTerm; bool mLeadTermKnown; Queue mQueue; memt::BufferPool mPool; }; template class Q> ReducerPackDedup::ReducerPackDedup(const PolyRing& ring): mRing(ring), mLeadTermKnown(false), mQueue(Configuration(ring)), mPool(sizeof(MultipleWithPos)) { mLeadTerm.mono = mRing.monoid().alloc().release(); } template class Q> ReducerPackDedup::~ReducerPackDedup() { resetReducer(); mRing.monoid().freeRaw(*mLeadTerm.mono); } template class Q> void ReducerPackDedup::insertTail(NewConstTerm multiple, const Poly& poly) { if (poly.termCount() <= 1) return; mLeadTermKnown = false; auto entry = new (mPool.alloc()) MultipleWithPos(poly, multiple); ++entry->pos; entry->computeCurrent(poly.ring()); mQueue.push(entry); } template class Q> void ReducerPackDedup::insert(ConstMonoRef multiple, const Poly& poly) { if (poly.isZero()) return; mLeadTermKnown = false; NewConstTerm termMultiple = {1, multiple.ptr()}; auto entry = new (mPool.alloc()) MultipleWithPos(poly, termMultiple); entry->computeCurrent(poly.ring()); mQueue.push(entry); } template class Q> ReducerPackDedup::MultipleWithPos::MultipleWithPos( const Poly& poly, NewConstTerm multipleParam ): pos(poly.begin()), end(poly.end()), current(poly.ring().monoid().alloc().release()), chain(this) { multiple.mono = poly.ring().monoid().alloc().release(); poly.ring().monoid().copy(*multipleParam.mono, *multiple.mono); multiple.coef = multipleParam.coef; } template class Q> void ReducerPackDedup::MultipleWithPos::computeCurrent( const PolyRing& ring ) { ring.monoid().multiply(*multiple.mono, pos.mono(), *current); } template class Q> void ReducerPackDedup::MultipleWithPos::currentCoefficient( const PolyRing& ring, Coefficient& coef ) { ring.coefficientMult(multiple.coef, pos.coef(), coef); } template class Q> void ReducerPackDedup::MultipleWithPos::addCurrentCoefficient( const PolyRing& ring, Coefficient& coeff ) { Coefficient tmp; ring.coefficientMult(multiple.coef, pos.coef(), tmp); ring.coefficientAddTo(coeff, tmp); } template class Q> void ReducerPackDedup::MultipleWithPos::destroy(const PolyRing& ring) { MultipleWithPos* entry = this; do { ring.monoid().freeRaw(*entry->current); ring.monoid().freeRaw(*entry->multiple.mono); MultipleWithPos* next = entry->chain; MATHICGB_ASSERT(next != 0); // Call the destructor to destruct the iterators into std::vector. // In debug mode MSVC puts those in a linked list and the destructor // has to be called since it takes an iterator off the list. There were // memory corruption problems in debug mode on MSVC before doing this. entry->~MultipleWithPos(); entry = next; } while (entry != this); } template class Q> bool ReducerPackDedup::leadTerm(NewConstTerm& result) { if (!mLeadTermKnown) { do { if (mQueue.empty()) return false; auto entry = mQueue.top(); entry->currentCoefficient(mRing, mLeadTerm.coef); while (true) { // store the chained elements const auto chainBegin = entry->chain; const auto chainEnd = entry; // the list is circular entry->chain = entry; // detach any chained elements // handle the entry itself std::swap(mLeadTerm.mono, entry->current); ++entry->pos; if (entry->pos == entry->end) { mQueue.pop(); entry->destroy(mRing); mPool.free(entry); } else { entry->computeCurrent(mRing); // Inserted spans must be in descending order MATHICGB_ASSERT(mQueue.getConfiguration().ring(). monoid().lessThan(*entry->current, *mLeadTerm.mono)); mQueue.decreaseTop(entry); } // handle any chained elements auto chain = chainBegin; while (chain != chainEnd) { MATHICGB_ASSERT(chain != 0); MATHICGB_ASSERT(mRing.monoid().equal(*chain->current, *mLeadTerm.mono)); const auto next = chain->chain; chain->chain = chain; // detach from remaining chained elements chain->addCurrentCoefficient(mRing, mLeadTerm.coef); ++chain->pos; if (chain->pos == chain->end) { chain->destroy(mRing); mPool.free(chain); } else { chain->computeCurrent(mRing); // Inserted spans must be in descending order MATHICGB_ASSERT(mQueue.getConfiguration().ring(). monoid().lessThan(*chain->current, *mLeadTerm.mono)); mQueue.push(chain); } chain = next; } if (mQueue.empty()) break; entry = mQueue.top(); if (!mRing.monoid().equal(*entry->current, *mLeadTerm.mono)) break; entry->addCurrentCoefficient(mRing, mLeadTerm.coef); } } while (mRing.coefficientIsZero(mLeadTerm.coef)); mLeadTermKnown = true; } result = mLeadTerm; return true; } template class Q> void ReducerPackDedup::removeLeadTerm() { if (!mLeadTermKnown) { NewConstTerm dummy; leadTerm(dummy); } mLeadTermKnown = false; } template class Q> void ReducerPackDedup::resetReducer() { class MonomialFree { public: MonomialFree(const PolyRing& ring): mRing(ring) {} bool proceed(MultipleWithPos* entry) { entry->destroy(mRing); return true; } private: const PolyRing& mRing; }; MonomialFree freeer(mRing); mQueue.forAll(freeer); mQueue.clear(); } template class Q> size_t ReducerPackDedup::getMemoryUse() const { return TypicalReducer::getMemoryUse() + mQueue.getMemoryUse() + mPool.getMemoryUse(); } MATHICGB_REGISTER_REDUCER( "TourDedupPack", Reducer_TourTree_Dedup_Packed, make_unique>(ring) ); MATHICGB_REGISTER_REDUCER( "HeapDedupPack", Reducer_Heap_Dedup_Packed, make_unique>(ring) ); MATHICGB_REGISTER_REDUCER( "GeoDedupPack", Reducer_Geobucket_Dedup_Packed, make_unique>(ring) ); MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/PolyHashTable.cpp0000664000175000017500000000444214560325357014402 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "PolyHashTable.hpp" #include #include #include MATHICGB_NAMESPACE_BEGIN PolyHashTable::PolyHashTable(const PolyRing& ring): mHashToIndexMask(computeHashMask(1000)), mBuckets (make_unique_array(hashMaskToBucketCount(mHashToIndexMask))), mRing(ring), mNodes(sizeofNode(ring) ), mSize() { mMaxSize = static_cast(bucketCount() * maxLoadFactor()); std::fill_n(mBuckets.get(), bucketCount(), nullptr); } void PolyHashTable::rehash(const size_t requestedBucketCount) { const auto newHashToIndexMask = computeHashMask(requestedBucketCount); const auto newBucketCount = hashMaskToBucketCount(newHashToIndexMask); auto newBuckets = make_unique_array(newBucketCount); std::fill_n(newBuckets.get(), newBucketCount, nullptr); const auto bucketsEnd = mBuckets.get() + bucketCount(); for (auto bucket = mBuckets.get(); bucket != bucketsEnd; ++bucket) { for (auto node = *bucket; node != 0;) { const auto hash = monoid().hash(node->mono()); const auto newIndex = hashToIndex(hash, newHashToIndexMask); const auto next = node->next(); node->next() = newBuckets[newIndex]; newBuckets[newIndex] = node; node = next; } } mHashToIndexMask = newHashToIndexMask; mBuckets = std::move(newBuckets); mMaxSize = static_cast(bucketCount() * maxLoadFactor()); } HashValue PolyHashTable::computeHashMask(const size_t requestedBucketCount) { // round request up to nearest power of 2. size_t pow2 = 1; while (pow2 < requestedBucketCount && 2 * pow2 != 0) pow2 *= 2; MATHICGB_ASSERT(pow2 > 0 && (pow2 & (pow2 - 1)) == 0); // power of two // If casting to a hash value overflows, then we get the maximum // possible number of buckets based on the range of the hash // value type. Only unsigned overflow is defined, so we need // to assert that the hash type is unsigned. static_assert(!std::numeric_limits::is_signed, ""); const auto hashToIndexMask = static_cast(pow2 - 1); MATHICGB_ASSERT(pow2 == hashMaskToBucketCount(hashToIndexMask)); return hashToIndexMask; } MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/F4MatrixReducer.hpp0000664000175000017500000000311014560325357014647 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_F4_MATRIX_REDUCER_GUARD #define MATHICGB_F4_MATRIX_REDUCER_GUARD #include "SparseMatrix.hpp" MATHICGB_NAMESPACE_BEGIN class QuadMatrix; class PolyRing; /// Class that reduces an F4 matrix represented as a QuadMatrix. The /// answer that you get is the submatrix that contains new pivots. /// /// All QuadMatrix parameters passed into methods on this class are /// assumed to have a permutation of the top rows and left columns so /// that the top left matrix is upper unitriangular. In this way the /// lower left part of the matrix becomes all-zero after row reduction. class F4MatrixReducer { public: /// The ring used is Z/pZ where modulus is the prime p. F4MatrixReducer(coefficient modulus); /// Reduces the bottom rows by the top rows and returns the bottom right /// submatrix of the resulting quad matrix. The lower left submatrix /// is not returned because it is always zero after row reduction. SparseMatrix reduceToBottomRight(const QuadMatrix& matrix); /// Returns the reduced row echelon form of matrix. SparseMatrix reducedRowEchelonForm(const SparseMatrix& matrix); /// Returns the lower right submatrix of the reduced row echelon /// form of matrix. The lower left part is not returned because it is /// always zero after row reduction. SparseMatrix reducedRowEchelonFormBottomRight(const QuadMatrix& matrix); private: const SparseMatrix::Scalar mModulus; }; MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/LogDomain.cpp0000664000175000017500000000524614560325357013557 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "LogDomain.hpp" #include "LogDomainSet.hpp" #include #include MATHICGB_NAMESPACE_BEGIN static const auto logDomainGlobalStartTime = mtbb::tick_count::now(); LogDomain::LogDomain( const char* const name, const char* const description, const bool enabled, const bool streamEnabled ): mEnabled(enabled), mOriginallyEnabled(enabled), mStreamEnabled(streamEnabled), mOriginallyStreamEnabled(streamEnabled), mName(name), mDescription(description), mInterval(), mHasTime(false), mCount(0), mHasCount(false) { LogDomainSet::singleton().registerLogDomain(*this); } void LogDomain::reset() { mEnabled = mOriginallyEnabled; mStreamEnabled = mOriginallyStreamEnabled; mInterval = TimeInterval(); mHasTime = false; mCount = 0; mHasCount = false; } std::ostream& LogDomain::stream() { return std::cerr; } LogDomain::Timer LogDomain::timer() { return Timer(*this); } double LogDomain::loggedSecondsReal() const { return mInterval.realSeconds; } void LogDomain::TimeInterval::print(std::ostream& out) const { const auto oldFlags = out.flags(); const auto oldPrecision = out.precision(); out.precision(3); out << std::fixed << realSeconds << "s (real)"; // todo: restore the stream state using RAII, since the above code might // throw an exception. out.precision(oldPrecision); out.flags(oldFlags); } void LogDomain::recordTime(TimeInterval interval) { if (!enabled()) return; mInterval.realSeconds += interval.realSeconds; mHasTime = true; if (streamEnabled()) { MATHICGB_ASSERT(mName != 0); stream() << mName << " time recorded: "; interval.print(stream()); stream() << std::endl; } } LogDomain::Timer::Timer(LogDomain& logger): mLogger(logger), mTimerRunning(false), mRealTicks() { start(); } LogDomain::Timer::~Timer() { stop(); } void LogDomain::Timer::stop() { if (!running()) return; mTimerRunning = false; if (!mLogger.enabled()) return; TimeInterval interval; interval.realSeconds = (mtbb::tick_count::now() - mRealTicks).seconds(); mLogger.recordTime(interval); return; } void LogDomain::Timer::start() { if (!mLogger.enabled() || mTimerRunning) return; mTimerRunning = true; mRealTicks = mtbb::tick_count::now(); } LogDomainInternal::LogAliasRegisterer::LogAliasRegisterer(const char* alias, const char* of) { LogDomainSet::singleton().registerLogAlias(alias, of); } MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/NonCopyable.hpp0000664000175000017500000000150614560325357014117 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_NON_COPYABLE_GUARD #define MATHICGB_NON_COPYABLE_GUARD MATHICGB_NAMESPACE_BEGIN /// Derive from this class to disable the compiler-generated copy /// constructor and assignment. T should be the class that is deriving /// from NonCopyable. /// /// The purpose of the template parameter is to avoid any chance of /// getting a diamond-graph inheritance graph. Diamond graphs can lead /// to runtime overhead. template class NonCopyable { public: NonCopyable() {} NonCopyable(NonCopyable&&) {} // still movable. private: NonCopyable(const NonCopyable&); // unavailable void operator=(const NonCopyable&); // unavailable }; MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/ReducerDedup.cpp0000664000175000017500000001125314560325357014254 #include #include "memtailor.h" // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "ReducerDedup.hpp" #include "TypicalReducer.hpp" #include "ReducerHelper.hpp" #include #include MATHICGB_NAMESPACE_BEGIN void reducerDedupDependency() {} /// As ReducerNoDedup, except that if two like terms are compared, then /// they are removed and replaced by their sum. template class Queue> class ReducerDedup : public TypicalReducer { public: ReducerDedup(const PolyRing& R); virtual ~ReducerDedup(); virtual std::string description() const { return mQueue.getName() + "-dedup"; } virtual void insertTail(NewConstTerm multiplier, const Poly& f); virtual void insert(ConstMonoRef multiplier, const Poly& f); virtual bool leadTerm(NewConstTerm& result); virtual void removeLeadTerm(); virtual size_t getMemoryUse() const; virtual void resetReducer(); public: // This Configuration is designed to work with // mathic::TourTree, mathic::Heap, and mathic::Geobucket class Configuration : public ReducerHelper::DedupConfiguration { public: typedef NewTerm Entry; Configuration(const PolyRing& ring): DedupConfiguration(ring) {} CompareResult compare(const Entry& a, const Entry& b) const { return ring().monoid().compare(*a.mono, *b.mono); } Entry deduplicate(Entry a, Entry b) const { // change a.coeff, and free b.monom ring().coefficientAddTo(a.coef, b.coef); ring().monoid().freeRaw(*b.mono); return a; } }; private: const PolyRing& mRing; NewTerm mLeadTerm; bool mLeadTermKnown; Queue mQueue; }; template class Q> ReducerDedup::ReducerDedup(const PolyRing& ring): mRing(ring), mLeadTermKnown(false), mQueue(Configuration(ring)) { mLeadTerm.mono = mRing.monoid().alloc().release(); } template class Q> ReducerDedup::~ReducerDedup() { resetReducer(); mRing.monoid().freeRaw(*mLeadTerm.mono); } template class Q> void ReducerDedup::insertTail(NewConstTerm multiple, const Poly& poly) { if (poly.termCount() <= 1) return; mLeadTermKnown = false; auto it = poly.begin(); const auto end = poly.end(); for (++it; it != end; ++it) { NewTerm t; t.mono = mRing.monoid().alloc().release(); mRing.monoid().multiply(*multiple.mono, it.mono(), *t.mono); mRing.coefficientMult(multiple.coef, it.coef(), t.coef); mQueue.push(t); } } template class Q> void ReducerDedup::insert(ConstMonoRef multiple, const Poly& poly) { if (poly.isZero()) return; mLeadTermKnown = false; const auto end = poly.end(); for (auto it = poly.begin(); it != end; ++it) { NewTerm t = {it.coef(), mRing.monoid().alloc().release()}; mRing.monoid().multiply(multiple, it.mono(), *t.mono); mQueue.push(t); } } template class Q> bool ReducerDedup::leadTerm(NewConstTerm& result) { if (!mLeadTermKnown) { do { if (mQueue.empty()) return false; mLeadTerm = mQueue.top(); mQueue.pop(); while (!mQueue.empty()) { auto entry = mQueue.top(); if (!mRing.monoid().equal(*entry.mono, *mLeadTerm.mono)) break; mRing.coefficientAddTo(mLeadTerm.coef, entry.coef); mRing.monoid().freeRaw(*entry.mono); mQueue.pop(); } } while (mRing.coefficientIsZero(mLeadTerm.coef)); mLeadTermKnown = true; } result = mLeadTerm; return true; } template class Q> void ReducerDedup::removeLeadTerm() { if (!mLeadTermKnown) { NewConstTerm dummy; leadTerm(dummy); } mLeadTermKnown = false; } template class Q> void ReducerDedup::resetReducer() { class MonomialFree { public: MonomialFree(const PolyRing& ring): mRing(ring) {} bool proceed(NewTerm entry) { mRing.monoid().freeRaw(*entry.mono); return true; } private: const PolyRing& mRing; }; MonomialFree freeer(mRing); mQueue.forAll(freeer); mQueue.clear(); } template class Q> size_t ReducerDedup::getMemoryUse() const { return TypicalReducer::getMemoryUse() + mQueue.getMemoryUse(); } MATHICGB_REGISTER_REDUCER( "TourDedup", Reducer_TourTree_Dedup, make_unique>(ring) ); MATHICGB_REGISTER_REDUCER( "HeapDedup", Reducer_Heap_Dedup, make_unique>(ring) ); MATHICGB_REGISTER_REDUCER( "GeoDedup", Reducer_Geobucket_Dedup, make_unique>(ring) ); MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/PolyBasis.cpp0000664000175000017500000001256214560325357013612 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "PolyBasis.hpp" #include "Basis.hpp" MATHICGB_NAMESPACE_BEGIN PolyBasis::PolyBasis( const PolyRing& ring, std::unique_ptr monoLookup ): mRing(ring), mMonoLookup(std::move(monoLookup)) { MATHICGB_ASSERT(mMonoLookup.get() != 0); mMonoLookup->setBasis(*this); } PolyBasis::~PolyBasis() { EntryIter const stop = mEntries.end(); for (EntryIter it = mEntries.begin(); it != stop; ++it) { if (it->retired) continue; MATHICGB_ASSERT(it->poly != 0); delete it->poly; } } std::unique_ptr PolyBasis::initialIdeal() const { std::unique_ptr basis(new Basis(mRing)); size_t const basisSize = size(); for (size_t gen = 0; gen != basisSize; ++gen) { if (!retired(gen) && leadMinimal(gen)) { std::unique_ptr p(new Poly(mRing)); p->append(1, leadMono(gen)); basis->insert(std::move(p)); } } basis->sort(); return basis; } void PolyBasis::insert(std::unique_ptr poly) { MATHICGB_ASSERT(poly.get() != 0); MATHICGB_ASSERT(!poly->isZero()); poly->makeMonic(); const size_t index = size(); const auto lead = poly->leadMono(); #ifdef MATHICGB_DEBUG EntryIter const stop = mEntries.end(); // lead monomials must be unique among basis elements for (EntryIter it = mEntries.begin(); it != stop; ++it) { if (it->retired) continue; MATHICGB_ASSERT(!monoid().equal(lead, it->poly->leadMono())); } #endif // Update information about minimal lead terms. const bool leadMinimal = (divisor(lead) == static_cast(-1)); if (leadMinimal) { class MultipleOutput : public MonoLookup::EntryOutput { public: MultipleOutput(EntryCont& entries): mEntries(entries) {} virtual bool proceed(size_t index) { MATHICGB_ASSERT(index < mEntries.size()); mEntries[index].leadMinimal = false; return true; } private: EntryCont& mEntries; }; MultipleOutput out(mEntries); monoLookup().multiples(lead, out); } mMonoLookup->insert(lead, index); mEntries.push_back(Entry()); Entry& entry = mEntries.back(); entry.poly = poly.release(); entry.leadMinimal = leadMinimal; MATHICGB_ASSERT(mEntries.back().poly != 0); } std::unique_ptr PolyBasis::retire(size_t index) { MATHICGB_ASSERT(index < size()); MATHICGB_ASSERT(!retired(index)); mMonoLookup->remove(leadMono(index)); std::unique_ptr poly(mEntries[index].poly); mEntries[index].poly = 0; mEntries[index].retired = true; return poly; } std::unique_ptr PolyBasis::toBasisAndRetireAll() { auto basis = make_unique(ring()); for (size_t i = 0; i < size(); ++i) if (!retired(i)) basis->insert(retire(i)); return basis; } size_t PolyBasis::divisor(ConstMonoRef mono) const { size_t index = monoLookup().divisor(mono); MATHICGB_ASSERT((index == static_cast(-1)) == (divisorSlow(mono) == static_cast(-1))); MATHICGB_ASSERT(index == static_cast(-1) || monoid().divides(leadMono(index), mono)); return index; } size_t PolyBasis::classicReducer(ConstMonoRef mono) const { const auto index = monoLookup().classicReducer(mono); MATHICGB_ASSERT((index == static_cast(-1)) == (divisorSlow(mono) == static_cast(-1))); MATHICGB_ASSERT(index == static_cast(-1) || monoid().divides(leadMono(index), mono)); return index; } size_t PolyBasis::divisorSlow(ConstMonoRef mono) const { const size_t stop = size(); for (size_t i = 0; i != stop; ++i) if (!retired(i) && monoid().dividesWithComponent(leadMono(i), mono)) return i; return static_cast(-1); } bool PolyBasis::leadMinimalSlow(size_t index) const { MATHICGB_ASSERT(index < size()); MATHICGB_ASSERT(!retired(index)); const auto lead = leadMono(index); EntryCIter const skip = mEntries.begin() + index; EntryCIter const stop = mEntries.end(); for (EntryCIter it = mEntries.begin(); it != stop; ++it) { if (it->retired) continue; const auto itLead = it->poly->leadMono(); if (monoid().divides(itLead, lead) && it != skip) return false; } return true; } size_t PolyBasis::minimalLeadCount() const { // todo: use iterators size_t minCount = 0; const size_t stop = size(); for (size_t i = 0; i != stop; ++i) if (!retired(i) && leadMinimal(i)) ++minCount; return minCount; } size_t PolyBasis::maxIndexMinimalLead() const { // todo: use iterators size_t i = size() - 1; for (; i != static_cast(-1); --i) if (!retired(i) && leadMinimal(i)) break; return i; } size_t PolyBasis::monomialCount() const { size_t sum = 0; EntryCIter const stop = mEntries.end(); for (EntryCIter it = mEntries.begin(); it != stop; ++it) if (!it->retired) sum += it->poly->termCount(); return sum; } size_t PolyBasis::getMemoryUse() const { size_t sum = mEntries.capacity() * sizeof(mEntries.front()); EntryCIter const stop = mEntries.end(); for (EntryCIter it = mEntries.begin(); it != stop; ++it) if (!it->retired) sum += it->poly->getMemoryUse(); return sum; } PolyBasis::Entry::Entry(): poly(0), leadMinimal(0), retired(false), usedAsStartCount(0), usedAsReducerCount(0), possibleReducerCount(0), nonSignatureReducerCount(0) {} MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/Atomic.hpp0000664000175000017500000003707214560325357013131 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_ATOMIC_GUARD #define MATHICGB_ATOMIC_GUARD // We need this include for std::memory_order even if we are not // using std::atomic. #include MATHICGB_NAMESPACE_BEGIN namespace AtomicInternal { /// Tells the compiler (not the CPU) to not reorder reads across this line. inline void compilerReadMemoryBarrier(); /// Tells the compiler (not the CPU) to not reorder writes across this line. inline void compilerWriteMemoryBarrier(); /// Tells the compiler (not the CPU) to not reorder reads and writes across /// this line. inline void compilerReadWriteMemoryBarrier(); /// Tells the CPU and also the compiler to not reorder reads and writes /// across this line. inline void cpuReadWriteMemoryBarrier(); /// Stores a variable with sequentially consistent ordering. The variable /// must be aligned and have a size such that aligned reads of that size /// are atomic. This requies a locked instruction like XHCG according to /// http://goo.gl/U8xTK . template void seqCstStore(const T value, T& ref); } #if defined(_MSC_VER) && defined(MATHICGB_USE_CUSTOM_ATOMIC_X86_X64) MATHICGB_NAMESPACE_END #include MATHICGB_NAMESPACE_BEGIN namespace AtomicInternal { template struct SeqCst {}; #ifdef MATHICGB_USE_CUSTOM_ATOMIC_4BYTE template struct SeqCst { static void store(const T value, T& ref) { _InterlockedExchange((volatile LONG*)&ref, (LONG)value); } }; #endif #ifdef MATHICGB_USE_CUSTOM_ATOMIC_8BYTE template struct SeqCst { static void store(const T value, T& ref) { _InterlockedExchange64((volatile _LONGLONG*)&ref, (_LONGLONG)value); } }; #endif inline void compilerReadMemoryBarrier() {_ReadBarrier();} inline void compilerWriteMemoryBarrier() {_WriteBarrier();} inline void compilerReadWriteMemoryBarrier() {_ReadWriteBarrier();} inline void cpuReadWriteMemoryBarrier() {MemoryBarrier();} template void seqCstStore(const T value, T& ref) {SeqCst::store(value, ref);} } #endif #if defined(__GNUC__) && defined(MATHICGB_USE_CUSTOM_ATOMIC_X86_X64) namespace AtomicInternal { inline void compilerReadMemoryBarrier() { // As far as I can tell there is no way to do a partial optimization // barrier on GCC, so we have to do the full barrier every time. compilerReadWriteMemoryBarrier(); } inline void compilerWriteMemoryBarrier() {compilerReadWriteMemoryBarrier();} inline void compilerReadWriteMemoryBarrier() { // As far as I can tell this is not documented to work, but it is the // only way to do this on GCC and it is what the Linux kernel does, so // that will have to be good enough. __asm__ __volatile__ ("" ::: "memory"); } inline void cpuReadWriteMemoryBarrier() {__sync_synchronize();} template void seqCstStore(const T value, T& ref) { const auto ptr = static_cast(&ref); while (!__sync_bool_compare_and_swap(ptr, *ptr, value)) {} } } #endif namespace AtomicInternal { #ifdef MATHICGB_USE_FAKE_ATOMIC // This class has the same interface as the actual custom atomic // class but it does absolutely no synchronization and it does not // constrain compiler optimizations in any way. The purpose of this class // is to enable it while running only a single thread to determine the // overhead imposed by the atomic operations. template class FakeAtomic { public: FakeAtomic(): mValue() {} FakeAtomic(T value): mValue(value) {} T load(const std::memory_order) const {return mValue;} void store(const T value, const std::memory_order order) {mValue = value;} private: T mValue; }; template struct ChooseAtomic { typedef FakeAtomic type; }; #else /// Class for deciding which implementation of atomic to use. The default is /// to use std::atomic which is a fine choice if std::atomic is implemented /// in a reasonable way by the standard library implementation you are using. template struct ChooseAtomic { typedef std::atomic type; }; #endif } #ifdef MATHICGB_USE_CUSTOM_ATOMIC_X86_X64 namespace AtomicInternal { /// Custom Atomic class for x86 and x64. Uses special compiler directives /// for barriers. Only instantiate this for sizes where aligned reads and /// writes are guaranteed to be atomic - this class only takes care of the /// ordering constraints using CPU and compiler fences. Since the directives /// to achieve this are coming from the compiler it is surprising that /// any compiler ships with a std::atomic that is worse than this - but /// that is very much the case. Though implementing atomic load and store /// is very little code, as you can see, it is quite tricky and took me /// a long time to understand everything well enough to actually know what /// those few lines of code should say. Perhaps compiler vendors have /// postponed fast atomics just because they want to focus on other things /// since it's not that easy to figure out how to do right (on that topic, /// bug reports on this code are welcome!). /// /// There are 5 kinds of reorderings that we are concerned with here. Let /// S,S' be stores and let L,L' be stores. Note that these short-hands may /// be idiosyncratic - feel free to find some standard terminology from /// some prominent source and fix this to reflect that. /// /// SS: Store-after-store: Reorder S,S' to S',S /// SL: Store-after-load: Reorder S,L to L,S /// LS: Load-after-store: Reorder L,S to S,L /// LL: Load-after-load: Reorder L,L' to L',L /// DLL: Dependent-load-after-load: As LL but L' depends on L. For example /// reordering the load of p->a to before the load of p is a DLL. /// /// The DEC Alpha processor will perform all of these reorderings in the /// absense of memory barriers telling it not to do that, including DLL. /// DLL can happen on DEC Alpha if p->a is cached locally while p is not. /// Then p will be loaded from memory while p->a is loaded from the cache, /// which is functionally identical to loading p->a before p since we may /// see a value of p->a from the past while we get an up to date value of p. /// This can happen even if the processor that stored p did a full memory /// barrier between storing p->a and storing p. /// /// Compilers will also perform all of these reorderings to optimize the /// code - even including DLL. DLL happens if the compiler guesses what /// the value of p is, loads p->a and then checks that the guess for p /// was correct. This directly causes p->a to be actually loaded before p. /// These kinds of optimizations turn up in profile-driven optimization. /// /// You can check this out here: /// http://en.wikipedia.org/wiki/Memory_ordering /// /// On x86 and x64 only SL is done by the CPU, so we need a CPU barrier to /// prevent that and nothing else. The compiler is free to perform all of /// these reorderings, so we need lots of compiler optimization barriers /// to deal with all of these cases. /// /// Some of the quotes below are from: /// http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1525.htm /// /// Also interesting: ///http://bartoszmilewski.com/2008/11/05/who-ordered-memory-fences-on-an-x86/ template class CustomAtomicX86X64 { public: CustomAtomicX86X64(): mValue() {} CustomAtomicX86X64(T value): mValue(value) {} MATHICGB_INLINE T load(const std::memory_order order) const { switch (order) { case std::memory_order_relaxed: // There are two constraints for memory_order_relaxed. The first // constraint is that if you read *p, then you will never // after that read a value of *p that was stored before the value // you just read, where "before" is in terms of either the same thread // that did the writing or external synchronization of another thread // with this thread. This is automaticaly guaranteed on this platform // and the compiler cannot break this guarantee. // // The second constraint is that writes performed by other threads will // appear "in a timely manner" when reading the written-to memory // location. It is not clear how much time is allowed to elapse before // this constraint is broken, but clearly the written value must turn // up eventually. This constraint could be broken in cases like this: // // while (x.load(std::memory_order_relaxed) == 0) { // // do something that does not write to x // } // // The problem is that the compiler might observe that x is not being // written to inside the loop, so the expression x.load(...) should be // the value for every iteration, so the code can safely be transformed // to: // // if (x.load(std::memory_order_relaxed) == 0) { // while (true) { // // ... // } // } // // So we need to tell the compiler that the value can change due to // code not in view of the current thread of execution. There are two // solutions that I have considered: // // * A compiler read memory barrier. This is overkill because it stops // the compiler from moving all reads across this line. // // * A volatile read. This is pretty much exactly what we need on gcc, // but on MSVC it provides extra guarantees that we do not need here: // http://msdn.microsoft.com/en-us/library/12a04hfd%28v=vs.80%29.aspx // // I do not think there is any best choice on MSVC, so I went for a // volatile read since it is the best choice on GCC. return const_cast(mValue); case std::memory_order_consume: { // Loads in this thread that depend on the loaded value must not be // reordered to before this load. So no DLL reorderings past this // load from after to before (up). So we need a read barrier AFTER the // load. It is a compiler only barrier since x86 and x64 CPUs do not do // DLL reorderings. const auto value = mValue; compilerReadMemoryBarrier(); return value; } case std::memory_order_acquire: { // Loads in this thread must not be reordered to before this load. // So no LL reorderings past this load from after to before (up). // So we need a read barrier AFTER the load. It is a compiler only // barrier since x86 and x64 CPUs do not do LL reorderings. const auto value = mValue; compilerReadMemoryBarrier(); return value; } case std::memory_order_seq_cst: { // There must be some global order in which all sequentially consistent // atomic operations are considered to have happened in. On x86 and x64 // this is guaranteed by just a normal read as long as all writes use // locked instructions like XHCG. See: http://goo.gl/U8xTK // // We still need to prevent the compiler from reordering the reads, // which is the same constraint as for std::memory_order_acquire. const auto value = mValue; compilerReadMemoryBarrier(); return value; } case std::memory_order_release: // not available for load case std::memory_order_acq_rel: // not available for load default: // specified value is not a known std::memory_order MATHICGB_UNREACHABLE; } } MATHICGB_INLINE void store(const T value, const std::memory_order order) { switch (order) { case std::memory_order_relaxed: // There are no reordering constraints here but we need to tell the // compiler that it must actually write out the value to memory in // a scenario like this: // // x.store(1, std::memory_order_relaxed); // while (true) {} // // So as for relaxed store we need either a volatile access or a memory // barrier. I chose a volatile access for the same reason as for the // store: MSVC has no best choice and for GCC the volatile is perfect. const_cast(mValue) = value; break; case std::memory_order_release: // Stores in this thread must not be reordered to after this store. // So no SS reorderings past this load from before to after (down). // So we need a barrier BEFORE the load. It is a compiler only barrier // since x86 and x64 CPUs do not do SS reorderings. compilerWriteMemoryBarrier(); mValue = value; break; case std::memory_order_acq_rel: // Combine the guarantees for std::memory_order_acquire and // std::memory_order_release. So no loads moved up past here (SL) and // no stores moved down past here (LL). We need a compiler barrier // BEFORE the load to avoid LL and a CPU (+compiler) barrier AFTER the // load to avoid SL, since x86 and x64 CPUs can in fact do SL // reordering. compilerWriteMemoryBarrier(); mValue = value; cpuReadWriteMemoryBarrier(); break; case std::memory_order_seq_cst: // All operations happen in a globally consistent total order. seqCstStore(value, mValue); break; case std::memory_order_consume: // not available for store case std::memory_order_acquire: // not available for store default: // specified value is not a known std::memory_order MATHICGB_UNREACHABLE; } } private: T mValue; }; #ifdef MATHICGB_USE_CUSTOM_ATOMIC_4BYTE template struct ChooseAtomic { typedef CustomAtomicX86X64 type; }; #endif #ifdef MATHICGB_USE_CUSTOM_ATOMIC_8BYTE template struct ChooseAtomic { typedef CustomAtomicX86X64 type; }; #endif } #endif /// This class is equivalent to std::atomic. Some functions from the /// interface of std::atomic are missing - add them as necessary. Do not add /// operator= and operator T() --- it is better to make the code explicit /// about when and how loading and storing of atomic variables occurs. /// /// The purpose of the class is that it performs far better than /// std::atomic for some implementations. For example the std::atomic in MSVC /// 2012 performs a compare-and-swap operation on a load even with the /// paramter std::memory_order_relaxed. /// /// We force all the functions to be inline because they can contain switches /// on the value of std::memory_order. This will usually be a compile-time /// constant parameter so that after inlining the switch will disappear. Yet /// the code size of the switch may make some compilers avoid the inline. template class Atomic { public: Atomic(): mValue() {} Atomic(T value): mValue(value) {} MATHICGB_INLINE T load(const std::memory_order order = std::memory_order_seq_cst) const { MATHICGB_ASSERT(debugAligned()); return mValue.load(order); } MATHICGB_INLINE void store( const T value, const std::memory_order order = std::memory_order_seq_cst ) { MATHICGB_ASSERT(debugAligned()); mValue.store(value, order); } private: Atomic(const Atomic&); // not available void operator=(const Atomic&); // not available bool debugAligned() const { return reinterpret_cast(&mValue) % sizeof(T) == 0; } typename AtomicInternal::ChooseAtomic::type mValue; }; MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/MonoLookup.hpp0000664000175000017500000000661214560325357014013 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_MONO_LOOKUP_GUARD #define MATHICGB_MONO_LOOKUP_GUARD #include "PolyRing.hpp" #include MATHICGB_NAMESPACE_BEGIN class PolyBasis; class SigPolyBasis; // Supports queries on the lead terms of the monomials in a PolyBasis. // todo: rename to MonomialLookup. class MonoLookup { public: typedef PolyRing::Monoid Monoid; typedef Monoid::ConstMonoRef ConstMonoRef; typedef Monoid::ConstMonoPtr ConstMonoPtr; virtual ~MonoLookup(); // Call after construction. Can be called multiple times, but only if the // parameter object is the same each time. virtual void setBasis(const PolyBasis& basis) = 0; // Call after construction. Can be called multiple times, but only if the // parameter object is the same each time. virtual void setSigBasis(const SigPolyBasis& sigBasis) = 0; virtual void insert(ConstMonoRef mono, size_t index) = 0; // Returns the index of a basis element that regular reduces mono in // signature sig. Returns -1 if no such element exists. A basis element // u is a regular reducer if leadTerm(u) divides mono // and (mono / leadTerm(u)) * signature(u) < sig. virtual size_t regularReducer(ConstMonoRef sig, ConstMonoRef mono) const = 0; // Returns the index of a basis element whose lead term divides mono. The // strategy used to break ties is up to the implementation of the interface, // but the outcome must be deterministic. virtual size_t classicReducer(ConstMonoRef mono) const = 0; virtual std::string getName() const = 0; virtual size_t getMemoryUse() const = 0; virtual size_t highBaseDivisor(size_t newGenerator) const = 0; virtual void lowBaseDivisors( std::vector& divisors, size_t maxDivisors, size_t newGenerator ) const = 0; virtual size_t minimalLeadInSig(ConstMonoRef sig) const = 0; virtual int type() const = 0; /// Prints a human-readable description of the type codes for the /// implementations of this interface. static void displayCodes(std::ostream& out); class Factory { public: virtual std::unique_ptr make (bool preferSparseReducers, bool allowRemovals) const = 0; virtual ~Factory() {} }; static std::unique_ptr makeFactory (const Monoid& monoid, int type); class EntryOutput { public: // Stop whatever is happening if proceed returns false. virtual bool proceed(size_t index) = 0; }; // Calls consumer.proceed(index) for each element whose lead term // divides mono. Stops the search if proceed returns false. virtual void multiples(ConstMonoRef mono, EntryOutput& consumer) const = 0; // Returns the index of a basis element whose lead term divides mono. virtual size_t divisor(ConstMonoRef mono) const = 0; // Calls consumer.proceed(index) for each element whose term // mono divides. Stops the search if proceed returns false. virtual void divisors(ConstMonoRef mono, EntryOutput& consumer) const = 0; // Removes multiples of mono. An element equal to mono counts as a multiple. virtual void removeMultiples(ConstMonoRef mono) = 0; // Removes entries whose monomial are equal to mono. virtual void remove(ConstMonoRef mono) = 0; // Returns how many elements are in the data structure. virtual size_t size() const = 0; }; MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/Reducer.cpp0000664000175000017500000000760014560325357013273 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "Reducer.hpp" #include "ReducerPack.hpp" #include "ReducerNoDedup.hpp" #include "ReducerPackDedup.hpp" #include "ReducerDedup.hpp" #include "ReducerHash.hpp" #include "ReducerHashPack.hpp" #include "F4Reducer.hpp" #include "SigPolyBasis.hpp" #include #include MATHICGB_NAMESPACE_BEGIN // Calling these dummy methods from the various reducer file headers ensures // that those translation units are registered as necessary. Without this, // they will not be linked in, because apparently the linker does not consider // the presense of global object constructors as a reason to include a // translation unit into the library. It will simply note that no other // translation unit has a dependency on anything in that translation unit // and then not include it in the library. This was wonderful to diagnose. void dummyLinkerFix() { reducerPackDependency(); reducerNoDedupDependency(); reducerPackDedupDependency(); reducerDedupDependency(); reducerHashDependency(); reducerHashPackDependency(); f4ReducerDependency(); } Reducer::~Reducer() { // Has to be called somewhere or GCC will eliminate it. dummyLinkerFix(); } /// Vector that stores the registered reducer typers. This has to be a /// function rather than just a naked object to ensure that the object /// gets initialized before it is used. std::vector& reducerTypes() { static std::vector types; return types; } Reducer::Registration::Registration( const char* name, ReducerType id, std::unique_ptr (*create)(const PolyRing&) ): mName(name), mId(id), mCreate(create) { reducerTypes().push_back(this); } std::unique_ptr Reducer::makeReducer( ReducerType type, PolyRing const& ring ) { std::unique_ptr reducer = makeReducerNullOnUnknown(type, ring); if (reducer.get() == 0) { std::ostringstream error; error << "Unknown or unimplemented reducer type " << type << ".\n"; throw std::runtime_error(error.str()); } return reducer; } std::unique_ptr Reducer::makeReducerNullOnUnknown( ReducerType type, PolyRing const& ring ) { for (const auto& r : reducerTypes()) { if (type == r->mId) return r->mCreate(ring); } return nullptr; } Reducer::ReducerType Reducer::reducerType(int type) { switch (type) { case 7: return Reducer_TourTree_NoDedup; case 8: return Reducer_TourTree_Dedup; case 9: return Reducer_TourTree_Hashed; case 10: return Reducer_TourTree_NoDedup_Packed; case 11: return Reducer_TourTree_Dedup_Packed; case 12: return Reducer_TourTree_Hashed_Packed; case 13: return Reducer_Heap_NoDedup; case 14: return Reducer_Heap_Dedup; case 15: return Reducer_Heap_Hashed; case 16: return Reducer_Heap_NoDedup_Packed; case 17: return Reducer_Heap_Dedup_Packed; case 18: return Reducer_Heap_Hashed_Packed; case 19: return Reducer_Geobucket_NoDedup; case 20: return Reducer_Geobucket_Dedup; case 21: return Reducer_Geobucket_Hashed; case 22: return Reducer_Geobucket_NoDedup_Packed; case 23: return Reducer_Geobucket_Dedup_Packed; case 24: return Reducer_Geobucket_Hashed_Packed; case 25: return Reducer_F4_Old; case 26: return Reducer_F4_New; default: return Reducer_Geobucket_Hashed; } } void Reducer::displayReducerTypes(std::ostream& out) { mathic::ColumnPrinter pr; auto& id = pr.addColumn(false, " "); auto& desc = pr.addColumn(true, " "); auto types = reducerTypes(); auto cmp = [](const Registration* a, const Registration* b) { return a->mId < b->mId; }; std::sort(types.begin(), types.end(), cmp); for (const auto& r : types) { id << r->mId << '\n'; desc << r->mName << '\n'; } out << "Reducer types:\n" << pr; } MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/F4MatrixBuilder2.hpp0000664000175000017500000000774314560325357014746 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_F4_MATRIX_BUILDER_2_GUARD #define MATHICGB_F4_MATRIX_BUILDER_2_GUARD #include "SparseMatrix.hpp" #include "Poly.hpp" #include "PolyRing.hpp" #include "PolyBasis.hpp" #include "QuadMatrix.hpp" #include "MonomialMap.hpp" #include "F4ProtoMatrix.hpp" #include "mtbb.hpp" #include MATHICGB_NAMESPACE_BEGIN /// Class for constructing an F4 matrix. /// /// @todo: this class does not offer exception guarantees. It's just not /// very workable without an RAII monomial handle or a scope exit /// functionality, so add one of those before fixing this. class F4MatrixBuilder2 { public: typedef PolyRing::Field Field; typedef PolyRing::Monoid Monoid; typedef Monoid::Mono Mono; typedef Monoid::MonoRef MonoRef; typedef Monoid::ConstMonoRef ConstMonoRef; typedef Monoid::MonoPtr MonoPtr; typedef Monoid::ConstMonoPtr ConstMonoPtr; /// memoryQuantum is how much to increase the memory size by each time the /// current amount of memory is exhausted. A value of 0 indicates to start /// small and double the quantum at each exhaustion. F4MatrixBuilder2(const PolyBasis& basis, size_t memoryQuantum = 0); /// Schedules a row representing the S-polynomial between polyA and /// polyB to be added to the matrix. No ownership is taken, but polyA /// and polyB must remain valid until the matrix is constructed. /// /// Currently, the two monomials must be monic, though this is just /// because they happen always to be monic so there was no reason to /// support the non-monic case. void addSPolynomialToMatrix(const Poly& polyA, const Poly& polyB); /// Schedules a row representing multiple*poly to be added to the /// matrix. No ownership is taken, but poly must remain valid until /// the matrix is constructed. multiple is copied, so it need not /// remain valid. void addPolynomialToMatrix(ConstMonoRef multiple, const Poly& poly); /// As the overload with a multiple, where the multiple is 1. void addPolynomialToMatrix(const Poly& poly); /// Builds an F4 matrix to the specifications given. Also clears the /// information in this object. /// /// The right columns are in order of strictly decreasing monomial. /// The left columns are ordered in some way so that the leading non-zero /// entry in each top row has the maximal column monomial out of all /// non-zero entries in that row. /// /// The monomials that can be reduced by some element of the basis go on /// the left while the remaining monomials go on the right. The upper left /// matrix is upper triangular, thus having a reducer/pivot row for every /// column. /// /// There is no guarantee that the bottom part of the matrix contains rows /// that exactly correspond to the polynomials that have been scheduled to /// be added to the matrix. It is only guaranteed that the whole matrix has /// the same row-space as though that had been the case. void buildMatrixAndClear(QuadMatrix& matrix); const PolyRing& ring() const {return mBasis.ring();} const Monoid& monoid() const {return ring().monoid();} const Field& field() const {return ring().field();} private: /// Represents the task of adding a row to the matrix. If sPairPoly is null /// then the row to add is multiply * poly. Otherwise, the row to add is /// multiply * poly - sPairMultiply * sPairPoly /// where multiply and sPairMultiply are such that the leading terms become /// desiredLead. struct RowTask { ConstMonoPtr desiredLead; // multiply a monomial onto poly to get this lead const Poly* poly; const Poly* sPairPoly; }; class Builder; /// How much memory to allocate every time more memory is needed. const size_t mMemoryQuantum; /// The basis that supplies reducers. const PolyBasis& mBasis; /// Stores the rows that have been scheduled to be added. std::vector mTodo; }; MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/MonoMonoid.hpp0000664000175000017500000017747514560325357014007 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_MONO_MONOID_GUARD #define MATHICGB_MONO_MONOID_GUARD #include "MonoOrder.hpp" #include "NonCopyable.hpp" #include #include #include #include #include #include #include #include #include #include #include #include MATHICGB_NAMESPACE_BEGIN /// Implements the monoid of (monic) monomials with integer /// non-negative exponents. Exponent must be an unsigned integer type that is /// used to store each exponent of a monomial. template< class Exponent, bool HasComponent = true, bool StoreHash = true, bool StoreOrder = true > class MonoMonoid; namespace MonoMonoidInternal { template class Base { public: static const bool HasComponent = HC; static const bool StoreHash = SH; static const bool StoreOrder = SO; typedef size_t VarIndex; typedef E Exponent; typedef typename std::make_unsigned::type Component; typedef typename std::make_unsigned::type HashValue; typedef const Exponent* const_iterator; typedef MonoOrder Order; Base(const Order& order): mVarCount(order.varCount()), mGradingCount( order.gradingCount() + (order.componentBefore() != Order::ComponentAfterBaseOrder) ), mOrderIndexBegin(HasComponent + order.varCount()), mOrderIndexEnd(mOrderIndexBegin + StoreOrder * mGradingCount), mEntryCount(std::max(mOrderIndexEnd + StoreHash, 1)), mComponentGradingIndex( reverseComponentGradingIndex(mGradingCount, order.componentBefore()) ), mHashCoefficients(makeHashCoefficients(order.varCount())), mOrderIsTotalDegreeRevLex( !order.hasLexBaseOrder() && order.isTotalDegree() && order.componentBefore() == Order::ComponentAfterBaseOrder ), mLexBaseOrder(order.hasLexBaseOrder()), mGradings(makeGradings(order)), mVarsReversed(order.hasFromLeftBaseOrder()) { MATHICGB_ASSERT(order.isMonomialOrder()); MATHICGB_ASSERT(mGradings.size() == gradingCount() * varCount()); } VarIndex varCount() const {return mVarCount;} VarIndex gradingCount() const {return mGradingCount;} VarIndex entryCount() const {return mEntryCount;} VarIndex orderIndexEnd() const {return mOrderIndexEnd;} VarIndex orderIndexBegin() const {return mOrderIndexBegin;} VarIndex hashIndex() const {return mOrderIndexEnd;} VarIndex componentGradingIndex() const {return mComponentGradingIndex;} bool varsReversed() const {return mVarsReversed;} protected: typedef std::vector HashCoefficients; typedef std::vector Gradings; static Gradings makeGradings(const Order& order) { auto gradings = order.gradings(); if (order.componentBefore() != Order::ComponentAfterBaseOrder) insertZeroRow(order.varCount(), order.componentBefore(), gradings); reverseGradings(order.varCount(), gradings); if (order.hasFromLeftBaseOrder()) reverseVarsInGradings(order.varCount(), gradings); if (!order.hasLexBaseOrder()) negateGradings(gradings); return gradings; } /// Reverse the relative order among the gradings - the first one /// becomes the last one, the second first becomes the second last /// and so on. static void reverseGradings(const VarIndex varCount, Gradings& gradings) { if (varCount == 0) return; MATHICGB_ASSERT(gradings.size() % varCount == 0); const auto gradingCount = gradings.size() / varCount; for (VarIndex grading = 0; grading < gradingCount / 2; ++grading) { for (VarIndex var = 0; var < varCount; ++var) { const auto index = gradingsIndex(grading, var, varCount); const auto oppositeIndex = gradingsOppositeRowIndex (grading, gradingCount, var, varCount); std::swap(gradings[index], gradings[oppositeIndex]); } } } /// Replace each entry in the grading matrix with its negative. static void negateGradings(Gradings& gradings) { const auto size = gradings.size(); for (size_t i = 0; i < size; ++i) gradings[i] = -gradings[i]; } static void insertZeroRow( const VarIndex varCount, const size_t insertBeforeRow, Gradings& gradings ) { if (varCount == 0) return; MATHICGB_ASSERT(gradings.size() % varCount == 0); MATHICGB_ASSERT(insertBeforeRow <= gradings.size() / varCount); gradings.resize(gradings.size() + varCount); const auto rowBegin = gradings.begin() + insertBeforeRow * varCount; std::copy_backward(rowBegin, gradings.end() - varCount, gradings.end()); std::fill_n(rowBegin, varCount, 0); } static void removeZeroRow( const VarIndex varCount, const size_t row, Gradings& gradings ) { if (varCount == 0) return; MATHICGB_ASSERT(gradings.size() % varCount == 0); MATHICGB_ASSERT(row < gradings.size() / varCount); const auto rowBegin = gradings.begin() + row * varCount; std::copy(rowBegin + varCount, gradings.end(), rowBegin); gradings.resize(gradings.size() - varCount); } /// Replace each row (e_0, e_1, ..., e_n) with (e_n, ..., e_1, e_0). static void reverseVarsInGradings( const size_t varCount, Gradings& gradings ) { if (varCount == 0) return; MATHICGB_ASSERT(gradings.size() % varCount == 0); auto rowBegin = gradings.begin(); while (rowBegin != gradings.end()) { const auto rowEnd = rowBegin + varCount; std::reverse(rowBegin, rowEnd); rowBegin = rowEnd; } } /// Since comparisons go opposite direction, we need to reverse /// the component grading index, unless it's the special value /// indicating that it goes last. static VarIndex reverseComponentGradingIndex( const VarIndex gradingCount, const VarIndex componentGradingIndex ) { if (componentGradingIndex == Order::ComponentAfterBaseOrder) return Order::ComponentAfterBaseOrder; else return gradingCount - 1 - componentGradingIndex; } const HashCoefficients& hashCoefficients() const {return mHashCoefficients;} bool orderIsTotalDegreeRevLex() const {return mOrderIsTotalDegreeRevLex;} Gradings& gradings() {return mGradings;} // todo: remove this overload const Gradings& gradings() const {return mGradings;} bool isLexBaseOrder() const {return mLexBaseOrder;} static size_t gradingsIndex( const VarIndex grading, const VarIndex var, const VarIndex varCount ) { MATHICGB_ASSERT(var < varCount); return grading * static_cast(varCount) + var; } size_t gradingsIndex(const VarIndex grading, const VarIndex var) const { MATHICGB_ASSERT(grading < gradingCount()); MATHICGB_ASSERT(var < varCount()); const auto index = gradingsIndex(grading, var, varCount()); MATHICGB_ASSERT(index < gradings().size()); return index; } static size_t gradingsOppositeRowIndex( const VarIndex grading, const VarIndex gradingCount, const VarIndex var, const VarIndex varCount ) { MATHICGB_ASSERT(grading < gradingCount); MATHICGB_ASSERT(var < varCount); return gradingsIndex(gradingCount - 1 - grading, var, varCount); } size_t gradingsOppositeRowIndex( const VarIndex grading, const VarIndex var ) const { MATHICGB_ASSERT(grading < gradingCount()); MATHICGB_ASSERT(var < varCount()); const auto index = gradingsOppositeRowIndex(grading, gradingCount(), var, varCount()); MATHICGB_ASSERT(index < gradings().size()); return index; } private: HashCoefficients static makeHashCoefficients(const VarIndex varCount) { std::srand(0); // To use the same hash coefficients every time. HashCoefficients coeffs(varCount); for (VarIndex var = 0; var < varCount; ++var) coeffs[var] = static_cast(std::rand()); return coeffs; } const VarIndex mVarCount; const VarIndex mGradingCount; const VarIndex mOrderIndexBegin; const VarIndex mOrderIndexEnd; const VarIndex mEntryCount; const VarIndex mComponentGradingIndex; /// Take dot product of exponents with this vector to get hash value. const HashCoefficients mHashCoefficients; /// This is initialized before mGradings, so it has to be ordered /// above mGradings. const bool mOrderIsTotalDegreeRevLex; /// If true then lex is used to break ties. Otherwise, revlex is /// used. This applies as well to degrees, which implies that /// degrees have to be stored negated if doing revlex. const bool mLexBaseOrder; /// Defines a matrix where each row is a grading. The degree of a /// monomial with respect to grading g is the dot product of the /// exponent vector of that monomial with row g of the matrix /// (starting at g=0). The matrix is stored in row-major order. If /// mOrderIsTotalDegreeRevLex is true then mGradings is empty but /// implicitly it is a single grading consisting of all 1s and the /// base order is revlex. std::vector mGradings; /// All base comparison considers exponents starting from the right, /// yet we need to support base orders starting from the left. This /// is achieved by reversing the order of the variables. The value /// of this variable indicates whether this has happened, in which /// case it needs to be done again before showing a monomial to the /// outside world. const bool mVarsReversed; }; } template class MonoMonoid : private MonoMonoidInternal::Base { private: typedef MonoMonoidInternal::Base Base; public: static_assert(std::numeric_limits::is_signed, ""); // *** Types // Integer index representing a variable. Indices start at 0 and go // up to varCount() - 1 where varCount() is the number of variables. typedef typename Base::VarIndex VarIndex; /// The type of each exponent of a monomial. typedef typename Base::Exponent Exponent; /// Is true if the monomials come from a module. using Base::HasComponent; /// Is true if the hash value is stored rather than computed at each /// hash request. This imposes extra computation when updating a monomial, /// but for most operations that overhead is much less than the time for /// computing a hash value from scratch. using Base::StoreHash; /// Is true if data to compare monomials is stored rather than computed /// at each comparison. As storeHash, there is overhead for this, but it /// is not much for most operations. using Base::StoreOrder; /// Type used to indicate the component of a module monomial. For example, /// the component of xe_3 is 3. typedef typename Base::Component Component; /// Type used to store hash values of monomials. typedef typename Base::HashValue HashValue; /// Iterator for the exponents in a monomial. typedef typename Base::const_iterator const_iterator; /// Represents a monomial and manages the memory underlying it. To /// refer to a non-owned monomial or to refer to a Mono, use MonoRef /// or ConstMonoRef. Do not use Mono& or Mono* if you do not have /// to, since that implies a double indirection when accessing the /// monomial. class Mono; /// A reference to a non-const monomial. Cannot be null, cannot be /// reassigned to refer to a different monomial and does not connote /// ownership - the same semantics as C++ references. class MonoRef; /// A reference to a monomial. As MonoRef, but you cannot change the /// monomial through this reference. Prefer this class over the /// other reference/pointer classes unless there is a reason not to. class ConstMonoRef; /// A pointer to a non-const monomial. Can be null and can be /// reassigned to refer to a different monomial - the same semantics /// as C++ pointers. Does not connote ownership. class MonoPtr; /// A pointer to a monomial. As MonoPtr, but you cannot change the /// monomial through this pointer. class ConstMonoPtr; /// A pool of memory for monomials. /// /// @todo: This approach is a poor fit for variable-sized /// monomials. So prefer other solutions where reasonable. class MonoPool; /// A vector of monomials. The interface is a subset of /// std::vector. Monomials can be appended (push_back). Only the /// last monomial can be mutated and monomials cannot be reordered /// or removed. These restrictions should make it easier to support /// variable-sized monomials in future. Change it if you need to /// break these restrictions, but first try to find an alternative. class MonoVector; /// For indicating the result of comparing one monomial to another. enum CompareResult { LessThan = -1, EqualTo = 0, GreaterThan = 1 }; /// Used to describe a monomial order when constructing a monoid. typedef typename Base::Order Order; // *** Temporary compatibility code for migrating off PolyRing friend class PolyRing; friend class Poly; static MonoRef toRef(Exponent* e) {return MonoRef(e);} static ConstMonoRef toRef(const Exponent* e) {return ConstMonoRef(e);} static Exponent* toOld(MonoRef e) {return rawPtr(e);} static const Exponent* toOld(ConstMonoRef e) {return rawPtr(e);} static Exponent* toOld(Mono& e) {return rawPtr(e);} static const Exponent* toOld(const Mono& e) {return rawPtr(e);} // *** Constructors and accessors MonoMonoid(MonoMonoid&& monoid): Base(std::move(monoid)), mPool(*this) { MATHICGB_ASSERT(debugAssertValid()); } MonoMonoid(const MonoMonoid& monoid): Base(monoid), mPool(*this) { MATHICGB_ASSERT(debugAssertValid()); } MonoMonoid(const Order& order): Base(order), mPool(*this) { MATHICGB_ASSERT(debugAssertValid()); } /// Creates a compatible copy of monoid. template static MonoMonoid create(const MonoMonoid& monoid) { return MonoMonoid(monoid.makeOrder(false, false)); } /// Returns an Order object that is equivalent to the order that /// this monoid was constructed with. The settings not handled by /// the monoid, and therefore not known by the monoid, are passed in /// as parameters. The purpose of that is to make it clear that this /// information must be supplied separately. Order makeOrder( const bool componentsAscendingDesired, const bool schreyering ) const { std::vector orderGradings(gradings()); reverseGradings(varCount(), orderGradings); if (!isLexBaseOrder()) negateGradings(orderGradings); const auto componentIndex = Base::reverseComponentGradingIndex (gradingCount(), componentGradingIndex()); if (componentIndex != Order::ComponentAfterBaseOrder) Base::removeZeroRow(varCount(), componentIndex, orderGradings); return Order( varCount(), std::move(orderGradings), isLexBaseOrder() ? Order::LexBaseOrderFromRight : Order::RevLexBaseOrderFromRight, componentIndex, componentsAscendingDesired, schreyering ); } /// Returns true if higher component is considered greater when /// comparing module monomials. Only relevant once actually /// considering the component. This is only relevant for module /// monomials. bool componentsAscending() const {return isLexBaseOrder();} /// Returns the number of variables. This is also the number of /// exponents in the exponent vector of a monomial. using Base::varCount; /// Returns true if the variables in this ring have been reversed /// so that the first one becomes the last one and so on. Use /// MonoProcessor to reverse monomials for input and output. using Base::varsReversed; // *** Monomial accessors and queries /// Returns iterator to the first exponent. const_iterator begin(ConstMonoRef mono) const { return ptr(mono, exponentsIndexBegin()); } /// Returns iterator to one-past-the-end of the range of exponents. const_iterator end(ConstMonoRef mono) const { return ptr(mono, exponentsIndexEnd()); } /// The indices of variables might be permuted in this monoid in order to /// implement certain monomial orders in a fast way. This method returns /// the unpermuted index that gets permuted to var. Knowing this mapping /// is necessary when importing monomials from and when exporting monomials /// to a party that does not use this scheme. For example when writing a /// monomial to a file in a format that is intended to be readable by /// other programs or by a human. VarIndex externalVar(const VarIndex var) const { // At the moment, this method happens to be its own inverse. Do not depend // on that. MATHICGB_ASSERT(var < varCount()); const auto eVar = varsReversed() ? varCount() - 1 - var : var; MATHICGB_ASSERT(eVar < varCount()); return eVar; } /// The inverse mapping of externalVar(). VarIndex internalVar(const VarIndex var) const { // Do not depend on knowing that this is the implementation. return externalVar(var); } /// Returns the exponent of var in mono. Exponent exponent(ConstMonoRef mono, const VarIndex var) const { MATHICGB_ASSERT(var < varCount()); return access(mono, exponentsIndexBegin() + var); } // The exponent of var as it would be if variables were not permuted. Exponent externalExponent(ConstMonoRef mono, const VarIndex var) const { MATHICGB_ASSERT(var < varCount()); return exponent(mono, externalVar(var)); } /// Returns the component of the monomial. Monomials not from a /// module have component zero. In a module mono*e_i has component /// i. @todo: Have different monoids for module monomials and /// monomials and only offer this method for the module monomials. Component component(ConstMonoRef mono) const { MATHICGB_ASSERT(HasComponent); return access(mono, componentIndex()); } /// Returns a hash value for the monomial. These are not guaranteed /// to be unique. HashValue hash(ConstMonoRef mono) const { MATHICGB_ASSERT(debugHashValid(mono)); if (StoreHash) return static_cast(access(mono, hashIndex())); else return computeHash(mono); } /// Returns true if a and b are equal. Includes check for component. bool equal(ConstMonoRef a, ConstMonoRef b) const { for (auto i = entriesIndexBegin(); i != exponentsIndexEnd(); ++i) if (access(a, i) != access(b, i)) return false; return true; } template bool equal( const MonoidA& monoidA, typename MonoidA::ConstMonoRef a, ConstMonoRef b ) const { // todo: assert compatible for (VarIndex var = 0; var < varCount(); ++var) if (monoidA.exponent(a, var) != exponent(b, var)) return false; return true; } /// As equal(), but optimized for the case where true is returned. bool equalHintTrue(ConstMonoRef a, ConstMonoRef b) const { // if a[i] != b[i] then a[i] ^ b[i] != 0, so the or of all xors is zero // if and only if a equals b. This way we avoid having a branch to check // equality for every iteration of the loop, which is a win in the case // that none of the early-exit branches are taken - that is, when a equals // b. Exponent orOfXor = 0; for (VarIndex i = lastExponentIndex(); i != beforeEntriesIndexBegin(); --i) orOfXor |= access(a, i) ^ access(b, i); MATHICGB_ASSERT((orOfXor == 0) == equal(a, b)); return orOfXor == 0; } bool isProductOf( ConstMonoRef a, ConstMonoRef b, ConstMonoRef ab ) const { for (VarIndex i = entriesIndexBegin(); i != exponentsIndexEnd(); ++i) if (access(ab, i) != access(a, i) + access(b, i)) return false; return true; } bool isProductOfHintTrue( ConstMonoRef a, ConstMonoRef b, ConstMonoRef ab ) const { // We compare more than one exponent at a time using 64 bit integers. This // might go one 32 bit value at the end too far, but since that space is // either a degree or a hash value that is fine --- those values will also // match if the monomials are equal. This does not work for negative // exponents since the overflowing bit will go into the next word. // It is OK that the degree field can be negative (a field we might go // into without caring about it because it shares a 64 bit field with // the last exponent), because it is at the end so the overflowing // bit will not interfere. For this reason we need to have a degree // or a hash value stored there - otherwise two equal monomials could // have different things stored next to them which would confuse this code. // todo: ensure 8 byte alignment. Though there seem to be no ill effects // for unaligned access. Performance seems to be no worse than for using // 32 bit integers directly. if (sizeof(Exponent) != 4 || (!StoreHash && !StoreOrder) || __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) return isProductOf(a, b, ab); uint64 orOfXor = 0; for (VarIndex i = varCount() / 2; i != beforeEntriesIndexBegin(); --i) { MATHICGB_ASSERT(access(a, i*2) >= 0); MATHICGB_ASSERT(i == varCount() / 2 || access(a, i*2+1) >= 0); uint64 A, B, AB; // We have to use std::memcpy here because just casting to a int64 breaks // the strict aliasing rule which implies undefined behavior. Both MSVC and // gcc don't actually call memcpy here. MSVC is a tiny bit slower for this // code than for casting while GCC seems to be exactly the same speed. std::memcpy(&A, ptr(a, i*2), 8); std::memcpy(&B, ptr(b, i*2), 8); std::memcpy(&AB, ptr(ab, i*2), 8); orOfXor |= AB ^ (A + B); } MATHICGB_ASSERT((orOfXor == 0) == isProductOf(a, b, ab)); return orOfXor == 0; } MATHICGB_INLINE bool isTwoProductsOfHintTrue( ConstMonoRef a1, ConstMonoRef a2, ConstMonoRef b, ConstMonoRef a1b, ConstMonoRef a2b ) const { if (sizeof(Exponent) != 4 || (!StoreHash && !StoreOrder) || __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) return (isProductOf(a1, b, a1b) && isProductOf(a2, b, a2b)); uint64 orOfXor = 0; for (VarIndex i = varCount() / 2; i != beforeEntriesIndexBegin(); --i) { uint64 A1, A2, B, A1B, A2B; std::memcpy(&A1, ptr(a1, i*2), 8); std::memcpy(&A2, ptr(a2, i*2), 8); std::memcpy(&B, ptr(b, i*2), 8); std::memcpy(&A1B, ptr(a1b, i*2), 8); std::memcpy(&A2B, ptr(a2b, i*2), 8); orOfXor |= (A1B ^ (A1 + B)) | (A2B ^ (A2 + B)); } MATHICGB_ASSERT ((orOfXor == 0) == (isProductOf(a1, b, a1b) && isProductOf(a2, b, a2b))); return orOfXor == 0; } /// Returns the hash of the product of a and b. HashValue hashOfProduct(ConstMonoRef a, ConstMonoRef b) const { // See computeHash() for an explanation of all the casts. const auto hashA = static_cast(hash(a)); const auto hashB = static_cast(hash(b)); return static_cast(static_cast(hashA + hashB)); } /// Returns true if all the exponents of mono are zero. In other /// words, returns true if mono is the identity for multiplication /// of monomials. bool isIdentity(ConstMonoRef mono) const { return std::all_of(begin(mono), end(mono), [](Exponent e) {return e == 0;}); } /// Returns true if a divides b. Equal monomials divide each other. /// Doesn't take component into account - see dividesWithComponent. bool divides(ConstMonoRef div, ConstMonoRef into) const { // todo: enable this when the code works with it - see // dividesWithComponent. //if (HasComponent && component(div) != component(into)) // return false; for (auto i = exponentsIndexBegin(); i < exponentsIndexEnd(); ++i) if (access(div, i) > access(into, i)) return false; return true; } /// Returns true if a divides b. Equal monomials divide each other. /// This also takes the component into account. Once the code base is /// fixed to properly observe the distinction between monomials and /// module monomials, there will only need to be the one divides() /// which takes component into account if and only if HasComponent is /// true. For now, we're left with this imperfect solution of two /// overloads. /// /// @todo: get rid of this method. bool dividesWithComponent(ConstMonoRef div, ConstMonoRef into) const { if (HasComponent && component(div) != component(into)) return false; for (auto i = exponentsIndexBegin(); i < exponentsIndexEnd(); ++i) if (access(div, i) > access(into, i)) return false; return true; } template bool divides( const MonoidA& monoidA, typename MonoidA::ConstMonoRef a, ConstMonoRef b ) const { // todo: fix other divisibility functions to work properly for component too. MATHICGB_ASSERT(monoidA.varCount() == varCount()); MATHICGB_ASSERT(!MonoidA::HasComponent || HasComponent); MATHICGB_ASSERT(monoidA.debugValid(a)); MATHICGB_ASSERT(debugValid(b)); // todo: enable this when the code works with it //if (HasComponent && component(div) != component(into)) // return false; //if ( // MonoidA::HasComponent && // HasComponent && // monoidA.component(a) != component(b) //) // return false; for (VarIndex var = 0; var < varCount(); ++var) if (monoidA.exponent(a, var) > exponent(b, var)) return false; return true; } /// @todo: get rid of this -- see other overload. template bool dividesWithComponent( const MonoidA& monoidA, typename MonoidA::ConstMonoRef a, ConstMonoRef b ) const { // todo: fix other divisibility functions to work properly for component too. MATHICGB_ASSERT(monoidA.varCount() == varCount()); MATHICGB_ASSERT(!MonoidA::HasComponent || HasComponent); MATHICGB_ASSERT(monoidA.debugValid(a)); MATHICGB_ASSERT(debugValid(b)); if ( MonoidA::HasComponent && HasComponent && monoidA.component(a) != component(b) ) return false; for (VarIndex var = 0; var < varCount(); ++var) if (monoidA.exponent(a, var) > exponent(b, var)) return false; return true; } /// Returns true if div divides lcm(a, b). bool dividesLcm(ConstMonoRef div, ConstMonoRef a, ConstMonoRef b) const { MATHICGB_ASSERT(debugLcmCheck(*this, a, *this, b)); MATHICGB_ASSERT(debugValid(div)); for (auto i = exponentsIndexBegin(); i != exponentsIndexEnd(); ++i) { //const auto dive = access(div, i); if (access(div, i) > access(a, i) && access(div, i) > access(b, i)) return false; } return true; } template bool dividesLcm( const MonoidDiv& monoidDiv, typename MonoidDiv::ConstMonoRef div, const MonoidA& monoidA, typename MonoidA::ConstMonoRef a, ConstMonoRef b ) const { MATHICGB_ASSERT(monoidDiv.debugLcmCheck(monoidA, a, *this, b)); MATHICGB_ASSERT(monoidDiv.debugValid(div)); for (VarIndex var = 0; var < varCount(); ++var) { const auto e = monoidDiv.exponent(div, var); if (e > monoidA.exponent(a, var) && e > exponent(b, var)) return false; } return true; } /// Returns true if lcm(a,b) == lcmAB. bool isLcm(ConstMonoRef a, ConstMonoRef b, ConstMonoRef lcmAB) const { MATHICGB_ASSERT(debugLcmCheck(*this, a, *this, b)); MATHICGB_ASSERT(debugValid(lcmAB)); for (auto i = exponentsIndexBegin(); i != exponentsIndexEnd(); ++i) if (access(lcmAB, i) != std::max(access(a, i), access(b, i))) return false; return true; } template bool isLcm( const MonoidA& monoidA, typename MonoidA::ConstMonoRef a, const MonoidB& monoidB, typename MonoidB::ConstMonoRef b, ConstMonoRef lcmAB ) const { MATHICGB_ASSERT(debugLcmCheck(monoidA, a, monoidB, b)); MATHICGB_ASSERT(debugValid(lcmAB)); if (HasComponent) { if (MonoidA::HasComponent) { if (monoidA.component(a) != component(lcmAB)) return false; } else { MATHICGB_ASSERT(MonoidB::HasComponent); if (monoidB.component(b) != component(lcmAB)) return false; } } for (VarIndex var = 0; var < varCount(); ++var) { if ( ptr(lcmAB, exponentsIndexBegin())[var] != std::max(monoidA.exponent(a, var), monoidB.exponent(b, var)) ) return false; } return true; } CompareResult compare(ConstMonoRef a, ConstMonoRef b) const { MATHICGB_ASSERT(debugOrderValid(a)); MATHICGB_ASSERT(debugOrderValid(b)); VarIndex index; if (StoreOrder) index = orderIndexEnd(); else { // Check the degrees seperately since they are not stored. auto grading = gradingCount(); while (grading != 0) { --grading; const auto cmp = degree(a, grading) - degree(b, grading); if (cmp < 0) return isLexBaseOrder() ? LessThan : GreaterThan; if (cmp > 0) return isLexBaseOrder() ? GreaterThan : LessThan; } index = exponentsIndexEnd(); } // If StoreOrder is true then this first checks the degrees. // Then the exponents are checked. // Finally, if HasComponent is true, the component is checked. while (index != entriesIndexBegin()) { --index; const auto cmp = access(a, index) - access(b, index); if (cmp < 0) return isLexBaseOrder() ? LessThan : GreaterThan; if (cmp > 0) return isLexBaseOrder() ? GreaterThan : LessThan; } return EqualTo; } /// Compares a to b1*b2. /// @todo: Test this method. Also, is this method actually useful, or could /// it just as well be replaced by a multiplication and a comparison? CompareResult compare(ConstMonoRef a, ConstMonoRef b1, ConstMonoRef b2) const { MATHICGB_ASSERT(debugOrderValid(a)); MATHICGB_ASSERT(debugOrderValid(b1)); MATHICGB_ASSERT(debugOrderValid(b2)); VarIndex index; if (StoreOrder) index = orderIndexEnd(); else { // Check the degrees seperately since they are not stored. auto grading = gradingCount(); while (grading != 0) { --grading; const auto cmp = degree(a, grading) - (degree(b1, grading) + degree(b2, grading)); if (cmp < 0) return isLexBaseOrder() ? LessThan : GreaterThan; if (cmp > 0) return isLexBaseOrder() ? GreaterThan : LessThan; } index = exponentsIndexEnd(); } // If StoreOrder is true then this first checks the degrees. // Then the exponents are checked. // Finally, if HasComponent is true, the component is checked. while (index != entriesIndexBegin()) { --index; const auto cmp = access(a, index) - (access(b1, index) + access(b2, index)); if (cmp < 0) return isLexBaseOrder() ? LessThan : GreaterThan; if (cmp > 0) return isLexBaseOrder() ? GreaterThan : LessThan; } return EqualTo; } bool lessThan(ConstMonoRef a, ConstMonoRef b) const { return compare(a, b) == LessThan; } /// Returns true if gcd(a, b) == 1. bool relativelyPrime(ConstMonoRef a, ConstMonoRef b) const { for (auto i = exponentsIndexBegin(); i != exponentsIndexEnd(); ++i) if (access(a, i) > 0 && access(b, i) > 0) return false; return true; } // If this method returns true for monomials a and b then it is // guaranteed that multiplying a and b together will not overflow // the integers in the representation. bool hasAmpleCapacity(ConstMonoRef mono) const { const auto halfMin = std::numeric_limits::min() / 2; const auto halfMax = std::numeric_limits::max() / 2; MATHICGB_ASSERT(halfMin <= 0); const auto limit = std::min(-halfMin, halfMax); const auto inRange = [&](Exponent value) {return -limit <= value && value <= limit;}; for (VarIndex i = exponentsIndexBegin(); i != exponentsIndexEnd(); ++i) if (!inRange(access(mono, i))) return false; for (VarIndex grading = 0; grading < gradingCount(); ++grading) if (!inRange(degree(mono, grading))) return false; return true; } /// Returns the degree of mono using the most significant grading on /// the monoid. This is the grading with index gradingCount() - /// 1. This object must have at least one grading associated to it /// before calling this method. Exponent degree(ConstMonoRef mono) const { MATHICGB_ASSERT(gradingCount() > 0); return degree(mono, gradingCount() - 1); } /// Returns the degree of mono according to the grading with the /// given index. Exponent degree(ConstMonoRef mono, VarIndex grading) const { MATHICGB_ASSERT(grading < gradingCount()); MATHICGB_ASSERT(debugOrderValid(mono)); if (StoreOrder) return access(mono, orderIndexBegin() + grading); else return computeDegree(mono, grading); } /// Returns the number of gradings. using Base::gradingCount; /// Returns the number of entries per monomial. This includes entries /// used fo r internal book-keeping, so it can be greater than varCount(). using Base::entryCount; // *** Monomial mutating computations /// Copes the parameter from to the parameter to. void copy(ConstMonoRef from, MonoRef to) const { MATHICGB_ASSERT(debugValid(from)); std::copy_n(rawPtr(from), entryCount(), rawPtr(to)); MATHICGB_ASSERT(debugValid(to)); } template void copy( const MonoidFrom& monoidFrom, typename MonoidFrom::ConstMonoRef from, MonoRef to ) const { // todo: extract this in checker method MATHICGB_ASSERT(HasComponent == MonoidFrom::HasComponent); MATHICGB_ASSERT(monoidFrom.debugValid(from)); MATHICGB_ASSERT(monoidFrom.varCount() == varCount()); MATHICGB_ASSERT(monoidFrom.varsReversed() == varsReversed()); MATHICGB_ASSERT ((std::is_same::value)); if (HasComponent) access(to, componentIndex()) = monoidFrom.component(from); const auto expsTo = ptr(to, exponentsIndexBegin()); for (VarIndex var = 0; var < varCount(); ++var) expsTo[var] = monoidFrom.exponent(from, var); if (StoreOrder) { const auto degrees = ptr(to, orderIndexBegin()); for (VarIndex grading = 0; grading < gradingCount(); ++grading) degrees[grading] = monoidFrom.degree(from, grading); } if (StoreHash) access(to, hashIndex()) = monoidFrom.hash(from); MATHICGB_ASSERT(debugValid(to)); // todo: check equal } /// Set the exponent of var to newExponent in mono. void setExponent( const VarIndex var, const Exponent newExponent, MonoRef mono ) const { MATHICGB_ASSERT(var < varCount()); auto& exponent = access(mono, exponentsIndexBegin() + var); const auto oldExponent = exponent; exponent = newExponent; updateOrderData(var, oldExponent, newExponent, mono); updateHashExponent(var, oldExponent, newExponent, mono); MATHICGB_ASSERT(debugValid(mono)); } /// Sets an exponent based on external/unpermtuted var. /// After this, exponent(mono, internvalVar(exVar)) is newExponent. void setExternalExponent( const VarIndex exVar, const Exponent newExponent, MonoRef mono ) const { setExponent(internalVar(exVar), newExponent, mono); } /// Sets all the exponents of mono from an external/unpermuted array. /// exponents must point to an array of size varCount(). /// After this, exponent(mono, var) is exponents[externalVar(var)]. /// The value of exponents[var] becomes the exponent of internalVar(var). /// Does not set the component. void setExternalExponents(const Exponent* exponents, MonoRef mono) const { MATHICGB_ASSERT(exponents != 0); for (VarIndex iVar = 0; iVar < varCount(); ++iVar) { const auto eVar = externalVar(iVar); access(mono, exponentsIndexBegin() + iVar) = exponents[eVar]; } setOrderData(mono); setHash(mono); MATHICGB_ASSERT(debugValid(mono)); } /// Sets mono to 1, which is the identity for multiplication. void setIdentity(MonoRef mono) const { std::fill_n(rawPtr(mono), entryCount(), 0); MATHICGB_ASSERT(debugValid(mono)); MATHICGB_ASSERT(isIdentity(mono)); } /// Sets the component of mono to newComponent. void setComponent(Component newComponent, MonoRef mono) const { MATHICGB_ASSERT(HasComponent); auto& component = access(mono, componentIndex()); const auto oldComponent = component; component = newComponent; updateHashComponent(oldComponent, newComponent, mono); updateOrderComponent(newComponent, mono); MATHICGB_ASSERT(debugValid(mono)); } /// Sets prod to a*b. void multiply(ConstMonoRef a, ConstMonoRef b, MonoRef prod) const { MATHICGB_ASSERT(debugValid(a)); MATHICGB_ASSERT(debugValid(b)); for (auto i = lastEntryIndex(); i != beforeEntriesIndexBegin(); --i) access(prod, i) = access(a, i) + access(b, i); MATHICGB_ASSERT(debugValid(prod)); } /// Sets prod to a*prod. void multiplyInPlace(ConstMonoRef a, MonoRef prod) const { MATHICGB_ASSERT(debugValid(a)); MATHICGB_ASSERT(debugValid(prod)); for (auto i = entriesIndexBegin(); i < entriesIndexEnd(); ++i) access(prod, i) += access(a, i); MATHICGB_ASSERT(debugValid(prod)); } /// Sets quo to num/by. by must divide num. void divide(ConstMonoRef by, ConstMonoRef num, MonoRef quo) const { MATHICGB_ASSERT(divides(by, num)); MATHICGB_ASSERT(debugValid(num)); MATHICGB_ASSERT(debugValid(by)); for (auto i = entriesIndexBegin(); i < entriesIndexEnd(); ++i) access(quo, i) = access(num, i) - access(by, i); MATHICGB_ASSERT(debugValid(quo)); } /// Sets num to num/by. by must divide num. void divideInPlace(ConstMonoRef by, MonoRef num) const { MATHICGB_ASSERT(divides(by, num)); MATHICGB_ASSERT(debugValid(by)); MATHICGB_ASSERT(debugValid(num)); for (auto i = entriesIndexBegin(); i < entriesIndexEnd(); ++i) access(num, i) -= access(by, i); MATHICGB_ASSERT(debugValid(num)); } /// Sets quo to num/by. If by does not divide num then quo will have /// negative exponents. void divideToNegative(ConstMonoRef by, ConstMonoRef num, MonoRef quo) const { MATHICGB_ASSERT(debugValid(num)); MATHICGB_ASSERT(debugValid(by)); MATHICGB_ASSERT( !HasComponent || component(by) == 0 || component(by) == component(num) ); for (auto i = entriesIndexBegin(); i < entriesIndexEnd(); ++i) access(quo, i) = access(num, i) - access(by, i); MATHICGB_ASSERT(debugValid(quo)); } /// Set out to (colonBy : colonNum) * mult. /// @todo: test void colonMultiply( ConstMonoRef colonBy, ConstMonoRef colonNum, ConstMonoRef mult, MonoRef out ) const { // todo: consider what happens with exponent overflow here if (HasComponent) { MATHICGB_ASSERT(component(colonBy) == component(colonNum)); access(out, componentIndex()) = component(mult); } for (auto i = exponentsIndexBegin(); i != exponentsIndexEnd(); ++i) { const auto colon = access(colonNum, i) - access(colonBy, i); auto result = access(mult, i); if (colon > 0) result += colon; access(out, i) = result; } setOrderData(out); setHash(out); MATHICGB_ASSERT(debugValid(out)); } /// Returns the number of variables that divide mono. /// @todo: test VarIndex sizeOfSupport(ConstMonoRef mono) const { VarIndex count = 0; for (VarIndex var = 0; var < varCount(); ++var) if (exponent(mono, var) != 0) ++count; return count; } /// Sets aColonB to a:b and bColonA to b:a. void colons( ConstMonoRef a, ConstMonoRef b, MonoRef aColonB, MonoRef bColonA ) const { MATHICGB_ASSERT(debugValid(a)); MATHICGB_ASSERT(debugValid(b)); if (HasComponent) { MATHICGB_ASSERT(component(a) == component(b)); access(aColonB, componentIndex()) = 0; access(bColonA, componentIndex()) = 0; } for (auto i = exponentsIndexBegin(); i != exponentsIndexEnd(); ++i) { const auto ae = access(a, i); const auto be = access(b, i); const auto max = std::max(ae, be); access(aColonB, i) = max - be; access(bColonA, i) = max - ae; } setOrderData(aColonB); setHash(aColonB); setOrderData(bColonA); setHash(bColonA); MATHICGB_ASSERT(debugValid(aColonB)); MATHICGB_ASSERT(debugValid(bColonA)); } /// Sets lcmAB to the lcm of a and b. void lcm(ConstMonoRef a, ConstMonoRef b, MonoRef lcmAB) const { if (HasComponent) { MATHICGB_ASSERT(component(a) == component(b)); access(lcmAB, componentIndex()) = access(a, componentIndex()); } for (auto i = exponentsIndexBegin(); i != exponentsIndexEnd(); ++i) access(lcmAB, i) = std::max(access(a, i), access(b, i)); setOrderData(lcmAB); setHash(lcmAB); MATHICGB_ASSERT(debugValid(lcmAB)); MATHICGB_ASSERT(isLcm(a, b, lcmAB)); } template void lcm( const MonoidA& monoidA, typename MonoidA::ConstMonoRef a, const MonoidB& monoidB, typename MonoidB::ConstMonoRef b, MonoRef lcmAB ) const { MATHICGB_ASSERT(debugLcmCheck(monoidA, a, monoidB, b)); if (HasComponent) { access(lcmAB, componentIndex()) = MonoidA::HasComponent ? monoidA.component(a) : monoidB.component(b); } for (VarIndex var = 0; var < varCount(); ++var) { ptr(lcmAB, exponentsIndexBegin())[var] = std::max(monoidA.exponent(a, var), monoidB.exponent(b, var)); } setOrderData(lcmAB); setHash(lcmAB); MATHICGB_ASSERT(debugValid(lcmAB)); MATHICGB_ASSERT(isLcm(monoidA, a, monoidB, b, lcmAB)); } Mono alloc() const {return mPool.alloc();} void free(Mono&& mono) const {mPool.free(std::move(mono));} void freeRaw(MonoRef mono) const {mPool.freeRaw(mono);} void freeRaw(MonoPtr mono) const { if (mono != nullptr) freeRaw(*mono); } bool fromPool(ConstMonoRef mono) const {return mPool.fromPool(mono);} // *** Classes for holding and referring to monomials class ConstMonoPtr { public: ConstMonoPtr(): mMono(nullptr) {} ConstMonoPtr(std::nullptr_t): mMono(nullptr) {} ConstMonoPtr(const ConstMonoPtr& mono): mMono(rawPtr(mono)) {} ConstMonoPtr operator=(const ConstMonoPtr& mono) { mMono = mono.mMono; return *this; } ConstMonoRef operator*() const {return ConstMonoRef(*this);} /// @todo: Get rid of this as soon as all code has been migrated /// to observe the ptr/ref distinction. Kill it with fire! operator ConstMonoRef() const {return ConstMonoRef(*this);} bool isNull() const {return mMono == nullptr;} void toNull() {mMono = nullptr;} bool operator==(std::nullptr_t) const {return isNull();} bool operator!=(std::nullptr_t) const {return !isNull();} MonoPtr castAwayConst() const { return MonoPtr(const_cast(mMono)); } private: friend class MonoMonoid; const Exponent* internalRawPtr() const {return mMono;} ConstMonoPtr(const Exponent* mono): mMono(mono) {} const Exponent* mMono; }; class MonoPtr { public: MonoPtr(): mMono(nullptr) {} MonoPtr(std::nullptr_t): mMono(nullptr) {} MonoPtr(const MonoPtr& mono): mMono(mono.mMono) {} MonoPtr operator=(const MonoPtr& mono) { mMono = mono.mMono; return *this; } MonoRef operator*() const {return MonoRef(*this);} /// @todo: Get rid of this as soon as all code has been migrated /// to observe the ptr/ref distinction. Kill it with fire! operator MonoRef() const {return MonoRef(*this);} bool isNull() const {return mMono == nullptr;} void toNull() {mMono = nullptr;} bool operator==(std::nullptr_t) const {return isNull();} bool operator!=(std::nullptr_t) const {return !isNull();} operator ConstMonoPtr() const {return ConstMonoPtr(mMono);} private: friend class MonoMonoid; friend class ConstMonoPtr; friend class PolyRing; // todo: remove friend class Poly; // todo: remove Exponent* internalRawPtr() const {return mMono;} MonoPtr(Exponent* mono): mMono(mono) {} Exponent* mMono; }; class Mono : public NonCopyable { public: Mono(): mMono(), mPool(nullptr) {} Mono(std::nullptr_t): mMono(), mPool(nullptr) {} /// Passes ownership of the resources of mono to this object. Mono must /// have been allocated from pool and it must have no other owner. /// In particular, it must have been release()'ed from its original /// owner. Mono(MonoRef mono, MonoPool& pool): mMono(mono.ptr()), mPool(&pool) { MATHICGB_ASSERT(pool.fromPool(mono)); } Mono(Mono&& mono): mMono(mono.mMono), mPool(mono.mPool) { mono.mMono.toNull(); mono.mPool = nullptr; } ~Mono() {toNull();} void operator=(Mono&& mono) { toNull(); mMono = mono.mMono; mono.mMono.toNull(); mPool = mono.mPool; mono.mPool = nullptr; } /// Sets this object to null but does NOT free the resources previously /// held by this object. The returned MonoPtr points to the resources /// that this object had prior to calling release(). If this object was /// already null then the returned MonoPtr is also null. MonoPtr release() { const auto oldPtr = ptr(); mMono.toNull(); mPool = nullptr; return oldPtr; } bool isNull() const {return mMono.isNull();} void toNull() {mPool->free(std::move(*this));} MonoPtr ptr() {return mMono;} ConstMonoPtr ptr() const {return mMono;} MonoRef operator*() { MATHICGB_ASSERT(!isNull()); return *mMono; } ConstMonoRef operator*() const { MATHICGB_ASSERT(!isNull()); return *mMono; } operator MonoPtr() const {return ptr();} operator ConstMonoPtr() const {return ptr();} /// @todo: Get rid of this as soon as all code has been migrated /// to observe the ptr/ref distinction. Kill it with fire! operator MonoRef() const { MATHICGB_ASSERT(!isNull()); return *mMono; } /// @todo: Get rid of this as soon as all code has been migrated /// to observe the ptr/ref distinction. Kill it with fire! operator ConstMonoRef() const { MATHICGB_ASSERT(!isNull()); return *mMono; } private: friend class MonoMonoid; Exponent* internalRawPtr() const {return rawPtr(mMono);} MonoPtr mMono; MonoPool* mPool; }; class MonoRef { public: MonoRef(const MonoRef& mono): mMono(mono.ptr()) {} MonoPtr ptr() const {return mMono;} MonoPtr operator&() const {return ptr();} /// @todo: Get rid of this as soon as all code has been migrated /// to observe the ptr/ref distinction. Kill it with fire! operator MonoPtr() const {return ptr();} operator ConstMonoRef() const {return *static_cast(mMono);} private: void operator=(const MonoRef&); // not available friend class MonoMonoid; friend class ConstMonoRef; MonoRef(MonoPtr mono): mMono(mono) {} Exponent* internalRawPtr() const {return rawPtr(mMono);} const MonoPtr mMono; }; class ConstMonoRef { public: ConstMonoRef(const ConstMonoRef& mono): mMono(mono.ptr()) {} ConstMonoRef(const Mono& mono): mMono(mono.ptr()) { MATHICGB_ASSERT(!mono.isNull()); } ConstMonoPtr ptr() const {return mMono;} ConstMonoPtr operator&() const {return ptr();} /// @todo: Get rid of this as soon as all code has been migrated /// to observe the ptr/ref distinction. Kill it with fire! operator ConstMonoPtr() const {return ptr();} MonoRef castAwayConst() const {return MonoRef(mMono.castAwayConst());} private: void operator=(const MonoRef&); // not available friend class MonoMonoid; ConstMonoRef(ConstMonoPtr mono): mMono(mono) {} const Exponent* internalRawPtr() const {return rawPtr(mMono);} const ConstMonoPtr mMono; }; // *** Classes that provide memory resources for monomials class MonoPool : public NonCopyable { public: MonoPool(const MonoMonoid& monoid): mMonoid(monoid), mPool(sizeof(Exponent) * mMonoid.entryCount()) {} MonoPool(MonoPool&& pool): mMonoid(pool.mMonoid), mPool(std::move(pool.mPool)) {} Mono alloc() { const auto ptr = static_cast(mPool.alloc()); Mono mono(*MonoPtr(ptr), *this); monoid().setIdentity(mono); return mono; } void free(Mono&& mono) { if (mono.isNull()) return; freeRaw(mono); mono.mMono.toNull(); mono.mPool = nullptr; } void freeRaw(MonoRef mono) {mPool.free(rawPtr(mono));} const MonoMonoid& monoid() const {return mMonoid;} bool fromPool(ConstMonoRef mono) const { return mPool.fromPool(rawPtr(mono)); } private: const MonoMonoid& mMonoid; memt::BufferPool mPool; }; class MonoVector { private: typedef std::vector RawVector; public: /// Class for iterating through the monomials in a MonoVector. /// /// There is no operator->() since MonoRef does not have any /// relevant methods to call. Implement it if you need it. /// /// There are no postfix increment operator as prefix is /// better. Add it if you need it (you probably do not). /// /// We could make this a random access iterator, but that would /// make it tricky to support variable-sized exponent vectors /// (e.g. sparse) in future and so far we have not needed random /// access. class const_iterator { public: typedef std::forward_iterator_tag iterator_category; typedef ConstMonoRef value_type; typedef ptrdiff_t difference_type; typedef ConstMonoPtr pointer; typedef ConstMonoRef reference; const_iterator(): mIt(), mEntriesPerMono(0) {} // The following is replaced by the default copy constructor. Remove these 3 lines of comments once it is known to be working. //const_iterator(const const_iterator& it): // mIt(it.mIt), mEntriesPerMono(it.mEntriesPerMono) {} const_iterator(const const_iterator& it) = default; const_iterator& operator=(const const_iterator& it) = default; bool operator==(const const_iterator& it) const {return mIt == it.mIt;} bool operator!=(const const_iterator& it) const {return mIt != it.mIt;} ConstMonoRef operator*() const { MATHICGB_ASSERT(debugValid()); return *ConstMonoPtr(&*mIt); } const_iterator operator++() { MATHICGB_ASSERT(debugValid()); mIt += mEntriesPerMono; return *this; } private: friend class MonoVector; bool debugValid() const {return mEntriesPerMono > 0;} const_iterator( typename RawVector::const_iterator it, size_t entryCount ): mIt(it), mEntriesPerMono(entryCount) {} typename RawVector::const_iterator mIt; size_t mEntriesPerMono; }; // *** Constructors and assignment MonoVector(const MonoMonoid& monoid): mMonoid(monoid) {} MonoVector(const MonoVector& v): mMonos(v.mMonos), mMonoid(v.monoid()) {} MonoVector(MonoVector&& v): mMonos(std::move(v.mMonos)), mMonoid(v.monoid()) {} MonoVector& operator=(const MonoVector& v) { MATHICGB_ASSERT(monoid() == v.monoid()); mMonos = v.mMonos; return *this; } MonoVector& operator=(MonoVector&& v) { MATHICGB_ASSERT(monoid() == v.monoid()); mMonos = std::move(v.mMonos); return *this; } // *** Iterators const_iterator begin() const { return const_iterator(mMonos.begin(), mMonoid.entryCount()); } const_iterator end() const { return const_iterator(mMonos.end(), mMonoid.entryCount()); } const_iterator cbegin() const {return begin();} const_iterator cend() const {return end();} // *** Operators /// Returns true if *this and v contain the same monomials in the same /// order. This ought to be a free-standing function, but it cannot be, /// because template argument deduction cannot deduce a type T from /// something of the form A::MonoVector. bool operator==(const MonoVector& v) const { MATHICGB_ASSERT(monoid() == v.monoid()); return mMonos == v.mMonos; } /// As !(*this == v). bool operator!=(const MonoVector& v) const { MATHICGB_ASSERT(monoid() == v.monoid()); return !(*this == v); } // *** Size and capacity size_t size() const {return mMonos.size() / monoid().entryCount();} bool empty() const {return mMonos.empty();} size_t capacity() const {return mMonos.capacity() / monoid().entryCount();} bool atCapacity() const {return size() == capacity();} // *** Element access ConstMonoRef front() const { MATHICGB_ASSERT(!empty()); return *begin(); } MonoRef back() { MATHICGB_ASSERT(!empty()); const auto offset = mMonos.size() - monoid().entryCount(); return *MonoPtr(mMonos.data() + offset); } ConstMonoRef back() const { MATHICGB_ASSERT(!empty()); const auto offset = mMonos.size() - monoid().entryCount(); return *ConstMonoPtr(mMonos.data() + offset); } // *** Modifiers void reserve(size_t count) { mMonos.reserve(count * monoid().entryCount()); } /// Appends the identity. void push_back() { const auto offset = mMonos.size(); mMonos.resize(offset + monoid().entryCount()); MATHICGB_ASSERT(monoid().isIdentity(back())); MATHICGB_ASSERT(monoid().debugValid(back())); } void push_back(ConstMonoRef mono) { MATHICGB_ASSERT(monoid().debugValid(mono)); const auto offset = mMonos.size(); mMonos.resize(offset + monoid().entryCount()); monoid().copy(mono, *MonoPtr(mMonos.data() + offset)); MATHICGB_ASSERT(monoid().debugValid(back())); MATHICGB_ASSERT(monoid().equal(back(), mono)); } template void push_back( const Monoid& monoidMono, typename Monoid::ConstMonoRef mono ) { MATHICGB_ASSERT(monoidMono.debugValid(mono)); const auto offset = mMonos.size(); mMonos.resize(offset + monoid().entryCount()); monoid().copy(monoidMono, mono, *MonoPtr(mMonos.data() + offset)); MATHICGB_ASSERT(monoid().debugValid(back())); MATHICGB_ASSERT(monoid().equal(monoidMono, mono, back())); } void swap(MonoVector& v) { MATHICGB_ASSERT(monoid() == v.monoid()); mMonos.swap(v.mMonos); } void clear() {mMonos.clear();} // *** Other size_t memoryBytesUsed() const { return mMonos.capacity() * sizeof(mMonos.front()); } const MonoMonoid& monoid() const {return mMonoid;} private: RawVector mMonos; const MonoMonoid& mMonoid; }; bool debugValid(ConstMonoRef mono) const { MATHICGB_ASSERT(debugOrderValid(mono)); MATHICGB_ASSERT(debugHashValid(mono)); return true; } private: void operator=(MonoMonoid&); // not available // Grants access to other template instantiations. template friend class MonoMonoid; // The main point here is to grant access to rawPtr(). friend class Mono; friend class MonoRef; friend class ConstMonoRef; friend class MonoPtr; friend class ConstMonoPtr; friend class MonoVector; friend class MonoPool; friend class PolyHashTable; typedef typename Base::Gradings Gradings; bool debugAssertValid() const { #ifdef MATHICGB_DEBUG // ** Order checks MATHICGB_ASSERT(orderIndexBegin() == exponentsIndexEnd()); const auto storedDegrees = StoreOrder * gradingCount(); MATHICGB_ASSERT(orderIndexEnd() == orderIndexBegin() + storedDegrees); MATHICGB_ASSERT(orderIndexEnd() <= entryCount()); if (orderIndexEnd() + StoreHash == 0) { MATHICGB_ASSERT(entryCount() == 1); } else { MATHICGB_ASSERT(entryCount() == orderIndexEnd() + StoreHash); } MATHICGB_ASSERT(isLexBaseOrder() || varCount() == 0 || gradingCount() >= 1); MATHICGB_ASSERT(gradings().size() == gradingCount() * varCount()); if (orderIsTotalDegreeRevLex()) { MATHICGB_ASSERT(!isLexBaseOrder()); MATHICGB_ASSERT(gradingCount() == 1); } if (componentGradingIndex() != Order::ComponentAfterBaseOrder) { MATHICGB_ASSERT(componentGradingIndex() < gradingCount()); for (VarIndex var = 0; var < varCount(); ++var) { const auto index = gradingsIndex(componentGradingIndex(), var); MATHICGB_ASSERT(gradings()[index] == 0); } } // ** Hash checks if (StoreHash) { MATHICGB_ASSERT(hashIndex() < entryCount()); MATHICGB_ASSERT(hashIndex() == orderIndexEnd()); } MATHICGB_ASSERT(hashCoefficients().size() == varCount()); #endif return true; } template bool debugLcmCheck( const MonoidA& monoidA, typename MonoidA::ConstMonoRef a, const MonoidB& monoidB, typename MonoidB::ConstMonoRef b ) const { MATHICGB_ASSERT(monoidA.varCount() == varCount()); MATHICGB_ASSERT(monoidB.varCount() == varCount()); MATHICGB_ASSERT ((std::is_same::value)); MATHICGB_ASSERT ((std::is_same::value)); MATHICGB_ASSERT (HasComponent == (MonoidA::HasComponent || MonoidB::HasComponent)); MATHICGB_ASSERT(monoidA.debugValid(a)); MATHICGB_ASSERT(monoidB.debugValid(b)); MATHICGB_ASSERT( !HasComponent || !MonoidA::HasComponent || !MonoidB::HasComponent || monoidA.component(a) == monoidB.component(b) ); return true; } static MonoPtr toMonoPtr(Exponent* raw) {return MonoPtr(raw);} static ConstMonoPtr toMonoPtr(const Exponent* raw) { return ConstMonoPtr(raw); } // *** Accessing fields of a monomial template static auto rawPtr(M&& m) -> decltype(m.internalRawPtr()) { return m.internalRawPtr(); } Exponent* ptr(MonoRef& m, const VarIndex index) const { MATHICGB_ASSERT(index <= entryCount()); return rawPtr(m) + index; } const Exponent* ptr(ConstMonoRef& m, const VarIndex index) const { MATHICGB_ASSERT(index <= entryCount()); return rawPtr(m) + index; } Exponent& access(MonoRef& m, const VarIndex index) const { MATHICGB_ASSERT(index < entryCount()); return rawPtr(m)[index]; } const Exponent& access(ConstMonoRef& m, const VarIndex index) const { MATHICGB_ASSERT(index < entryCount()); return rawPtr(m)[index]; } // *** Implementation of monomial ordering using Base::gradingsOppositeRowIndex; using Base::gradingsIndex; using Base::reverseGradings; using Base::negateGradings; bool debugOrderValid(ConstMonoRef mono) const { #ifdef MATHICGB_DEBUG if (!StoreOrder) return true; // Check the order data of mono const auto degrees = ptr(mono, orderIndexBegin()); for (VarIndex grading = 0; grading < gradingCount(); ++grading) { MATHICGB_ASSERT(degrees[grading] == computeDegree(mono, grading)); } #endif return true; } void setOrderData(MonoRef mono) const { if (!StoreOrder) return; const auto degrees = ptr(mono, orderIndexBegin()); for (VarIndex grading = 0; grading < gradingCount(); ++grading) degrees[grading] = computeDegree(mono, grading); MATHICGB_ASSERT(debugOrderValid(mono)); } void updateOrderData( const VarIndex var, const Exponent oldExponent, const Exponent newExponent, MonoRef mono ) const { if (!StoreOrder) return; MATHICGB_ASSERT(var < varCount()); if (orderIsTotalDegreeRevLex()) rawPtr(mono)[orderIndexBegin()] -= newExponent - oldExponent; else { MATHICGB_ASSERT(gradings().size() == gradingCount() * varCount()); const auto degrees = ptr(mono, orderIndexBegin()); for (VarIndex grading = 0; grading < gradingCount(); ++grading) { const auto index = gradingsIndex(grading, var); degrees[grading] += gradings()[index] * ( newExponent - oldExponent); } } MATHICGB_ASSERT(debugOrderValid(mono)); } void updateOrderComponent(const VarIndex newComponent, MonoRef mono) const { if (componentGradingIndex() != Order::ComponentAfterBaseOrder) ptr(mono, orderIndexBegin())[componentGradingIndex()] = static_cast(newComponent); } Exponent computeDegree(ConstMonoRef mono, VarIndex grading) const { MATHICGB_ASSERT(grading < gradingCount()); Exponent degree = 0; if (orderIsTotalDegreeRevLex()) { MATHICGB_ASSERT(grading == 0); for (auto var = size_t(0); var < varCount(); ++var) degree -= exponent(mono, var); } else if (HasComponent && componentGradingIndex() == grading) return component(mono); else { MATHICGB_ASSERT(gradings().size() == gradingCount() * varCount()); for (auto var = size_t(0); var < varCount(); ++var) { const auto index = gradingsIndex(grading, var); degree += exponent(mono, var) * gradings()[index]; } } return degree; } // *** Implementation of hash value computation bool debugHashValid(ConstMonoRef mono) const { if (!StoreHash) return true; // We cannot call hash() here since it calls this method. // todo: we cannot make this check right now because the legacy // integration with PolyRing can create monomials with unset hash. // MATHICGB_ASSERT(rawPtr(mono)[hashIndex()] == computeHash(mono)); return true; } HashValue computeHash(ConstMonoRef mono) const { HashValue hash = HasComponent ? component(mono) : 0; for (VarIndex var = 0; var < varCount(); ++var) { hash += static_cast(exponent(mono, var)) * hashCoefficients()[var]; } // Hash values are stored as exponents. If the cast to an exponent // changes the value, then we need computeHashValue to match that // change by casting to an exponent and back. Otherwise the computed // hash value will not match a hash value that has been stored. return static_cast(static_cast(hash)); } void setHash(MonoRef mono) const { if (!StoreHash) return; rawPtr(mono)[hashIndex()] = computeHash(mono); MATHICGB_ASSERT(debugHashValid(mono)); } void updateHashComponent( const Exponent oldComponent, const Exponent newComponent, MonoRef mono ) const { if (!StoreHash) return; rawPtr(mono)[hashIndex()] += newComponent - oldComponent; MATHICGB_ASSERT(debugHashValid(mono)); } void updateHashExponent( const VarIndex var, const Exponent oldExponent, const Exponent newExponent, MonoRef mono ) const { if (!StoreHash) return; MATHICGB_ASSERT(var < varCount()); rawPtr(mono)[hashIndex()] += (newExponent - oldExponent) * hashCoefficients()[var]; MATHICGB_ASSERT(debugHashValid(mono)); } // *** Code determining the layout of monomials in memory // Layout in memory: // [component] [exponents...] [order data...] [hash] VarIndex componentIndex() const { //static_assert(HasComponent, ""); return 0; } VarIndex exponentsIndexBegin() const {return HasComponent;} VarIndex exponentsIndexEnd() const {return exponentsIndexBegin() + varCount();} VarIndex lastExponentIndex() const {return exponentsIndexEnd() - 1;} using Base::orderIndexBegin; using Base::orderIndexEnd; using Base::hashIndex; using Base::orderIsTotalDegreeRevLex; using Base::gradings; using Base::isLexBaseOrder; using Base::componentGradingIndex; VarIndex entriesIndexBegin() const {return 0;} VarIndex entriesIndexEnd() const {return entryCount();} VarIndex beforeEntriesIndexBegin() const {return entriesIndexBegin() - 1;} VarIndex lastEntryIndex() const {return entriesIndexEnd() - 1;} using Base::hashCoefficients; mutable MonoPool mPool; }; /// Returns true if a and b are the same object. template bool operator==( const MonoMonoid& a, const MonoMonoid& b ) { return &a == &b; } /// As !(a == b). template bool operator!=( const MonoMonoid& a, const MonoMonoid& b ) { return !(a == b); } MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/SPairs.hpp0000664000175000017500000002524514560325357013115 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_S_PAIRS_GUARD #define MATHICGB_S_PAIRS_GUARD #include "PolyBasis.hpp" #include #include #include MATHICGB_NAMESPACE_BEGIN class PolyBasis; // Stores the set of pending S-pairs for use in the classic Buchberger // algorithm. Also eliminates useless S-pairs and orders the S-pairs. class SPairs { public: typedef PolyRing::Monoid Monoid; typedef Monoid::Exponent Exponent; typedef Monoid::Mono Mono; typedef Monoid::MonoPtr MonoPtr; typedef Monoid::ConstMonoPtr ConstMonoPtr; typedef Monoid::MonoRef MonoRef; typedef Monoid::ConstMonoRef ConstMonoRef; /// This monoid is used for computations to determine whether to eliminate /// an S-pair. These computations do not require anything beyond just /// considering the exponents. Since recomputing characteristics of /// lcms such as hash and degree is expensive (unlike for a product), it is /// worthwhile to disable those characteristics that we do not need. typedef MonoMonoid BareMonoid; /// This monoid is used to order S-pairs by their lcm. Here we need to /// to store the ordering data for fast comparison, but we do not need /// hashes. typedef MonoMonoid OrderMonoid; SPairs(const PolyBasis& basis, bool preferSparseSPairs); // Returns the number of S-pairs in the data structure. size_t pairCount() const {return mQueue.pairCount();} // Returns true if no pending S-pairs remain. bool empty() const {return mQueue.empty();} // Removes the minimal S-pair from the data structure and returns it. // The S-polynomial of that pair is assumed to reduce to zero, either // because it already does, or because it did not reduce to zero and then // that caused the addition of another basis element. If this assumption // is broken, S-pair elimination may give incorrect results. // // Returns the pair (invalid,invalid) if there are no S-pairs left to // return, where invalid is static_cast(-1). This can happen even // if empty() returned false prior to calling pop(), since the S-pairs in // the queue may have been found to be useless. std::pair pop(); // As pop(), but only pops S-pairs whose lcm have the passed-in // weight. If deg is already 0, then instead set deg to the weight // of the returned S-pair, if any. std::pair pop(exponent& w); // Add the pairs (index,a) to the data structure for those a such that // a < index. Some of those pairs may be eliminated if they can be proven // to be useless. index must be a valid index of a basis element // and must only be called once per basis element and must be 1 more // than the value of index for the previous call to addPairs, starting // at zero for the first call. void addPairs(size_t index); // As addPairs, but assuming auto-reduction of the basis will happen. // This method assumes that if lead(index) divides lead(x) for a basis // element x, then x will be retired from the basis and reduced. toReduce // will contain those indices x. void addPairsAssumeAutoReduce(size_t index, std::vector& toRetireAndReduce); // Returns true if the S-pair (a,b) is known to be useless. Even if the // S-pair is not useless now, it will become so later. At the latest, an // S-pair becomes useless when its S-polynomial has been reduced to zero. bool eliminated(size_t a, size_t b) const { return mEliminated.bitUnordered(a, b); } const Monoid& monoid() const {return mMonoid;} const PolyBasis& basis() const {return mBasis;} size_t getMemoryUse() const; struct Stats { Stats(): sPairsConsidered(0), relativelyPrimeHits(0), buchbergerLcmSimpleHits(0), buchbergerLcmAdvancedHits(0), buchbergerLcmCacheHits(0), late(false), buchbergerLcmSimpleHitsLate(0), buchbergerLcmCacheHitsLate(0) {} unsigned long long sPairsConsidered; unsigned long long relativelyPrimeHits; unsigned long long buchbergerLcmSimpleHits; unsigned long long buchbergerLcmAdvancedHits; unsigned long long buchbergerLcmCacheHits; bool late; // if set to true then simpleBuchbergerLcmCriterion sets the following 2 instead: unsigned long long buchbergerLcmSimpleHitsLate; unsigned long long buchbergerLcmCacheHitsLate; }; Stats stats() const; std::string name() const; private: const BareMonoid& bareMonoid() const {return mBareMonoid;} const OrderMonoid& orderMonoid() const {return mOrderMonoid;} // Returns true if Buchberger's second criterion for eliminating useless // S-pairs applies to the pair (a,b). Define // l(a,b) = lcm(lead(a), lead(b)). // The criterion says that if there is some other basis element c such that // lead(c)|l(a,b) // and // l(a,c) has a representation and // l(b,c) has a representation // then (a,b) has a representation too, so we do not need to reduce it. // // This criterion is easy to get wrong in cases where // l(a,b) = l(a,c) = l(b,c) // since then there is the potential to erroneously eliminate all the three // pairs among a,b,c on the assumption that the other two pairs will reduce // to zero. In fact only one of the pairs should be eliminated. We leave such // cases to the advanced criterion, except if an S-pair has already been // eliminated - in that case we do not check to see if the lcm's are the same // as it is not necessary to do so. bool simpleBuchbergerLcmCriterion( size_t a, size_t b, BareMonoid::ConstMonoRef lcmAB ) const; // As the non-slow version, but uses simpler and slower code. bool simpleBuchbergerLcmCriterionSlow(size_t a, size_t b) const; // Improves on Buchberger's second criterion by using connection in a graph // to determine if an S-pair can be eliminated. This can eliminate some pairs // that cannot be eliminated by looking at any one triple of generators. // // The algorithm is based on considering an undirected graph G. // Each vertex of G represents a basis element whose lead monomial divides // lcmAB. There is an edge (c,d) if lcm(c,d) != lcm(a,b) or if (c,d) has // been eliminated. It is a theorem that if there is a path from a to b // in G then (a,b) is a useless S-pair that can be eliminated. bool advancedBuchbergerLcmCriterion (size_t a, size_t b, BareMonoid::ConstMonoRef lcmAB) const; // As the non-slow version, but uses simpler and slower code. bool advancedBuchbergerLcmCriterionSlow(size_t a, size_t b) const; const Monoid& mMonoid; OrderMonoid mOrderMonoid; BareMonoid mBareMonoid; class QueueConfiguration { public: QueueConfiguration( const PolyBasis& basis, const OrderMonoid& orderMonoid, const bool preferSparseSPairs ): mBasis(basis), mMonoid(basis.ring().monoid()), mOrderMonoid(orderMonoid), mPreferSparseSPairs(preferSparseSPairs) {} typedef OrderMonoid::Mono PairData; void computePairData (size_t col, size_t row, OrderMonoid::MonoRef m) const; typedef bool CompareResult; bool compare( size_t colA, size_t rowA, OrderMonoid::ConstMonoPtr a, size_t colB, size_t rowB, OrderMonoid::ConstMonoPtr b ) const { const auto cmp = orderMonoid().compare(*a, *b); if (cmp == GT) return true; if (cmp == LT) return false; const bool aRetired = mBasis.retired(rowA) || mBasis.retired(colA); const bool bRetired = mBasis.retired(rowB) || mBasis.retired(colB); if (aRetired || bRetired) return !bRetired; if (mPreferSparseSPairs) { const auto termCountA = mBasis.basisElement(colA).termCount() + mBasis.basisElement(rowA).termCount(); const auto termCountB = mBasis.basisElement(colB).termCount() + mBasis.basisElement(rowB).termCount(); if (termCountA > termCountB) return true; if (termCountA < termCountB) return false; } return colA + rowA > colB + rowB; } bool cmpLessThan(bool v) const {return v;} // The following methods are not required of a configuration. OrderMonoid::Mono allocPairData() {return orderMonoid().alloc();} void freePairData(OrderMonoid::Mono&& mono) { return orderMonoid().free(std::move(mono)); } private: const Monoid& monoid() const {return mMonoid;} const OrderMonoid& orderMonoid() const {return mOrderMonoid;} const PolyBasis& mBasis; const Monoid& mMonoid; const OrderMonoid& mOrderMonoid; const bool mPreferSparseSPairs; }; typedef mathic::PairQueue Queue; Queue mQueue; // The bit at (i,j) is set to true if it is known that the S-pair between // basis element i and j does not have to be reduced. This can be due to a // useless S-pair criterion eliminating that pair, or it can be because the // S-polynomial of that pair has already been reduced. mathic::BitTriangle mEliminated; const PolyBasis& mBasis; mutable Stats mStats; static const bool mUseBuchbergerLcmHitCache = true; mutable std::vector mBuchbergerLcmHitCache; enum Connection { // used in advancedBuchbergerLcmCriterion(). NotConnected, // not known to be connected to a or b ConnectedA, // connected to a ConnectedB // connected to b }; // Variable used only inside advancedBuchbergerLcmCriterion(). mutable std::vector > mAdvancedBuchbergerLcmCriterionGraph; friend void mathic::PairQueueNamespace::constructPairData (void*, mathic::PairQueueNamespace::Index, mathic::PairQueueNamespace::Index, QueueConfiguration&); friend void mathic::PairQueueNamespace::destructPairData (OrderMonoid::Mono*, mathic::PairQueueNamespace::Index, mathic::PairQueueNamespace::Index, QueueConfiguration&); }; MATHICGB_NAMESPACE_END namespace mathic { namespace PairQueueNamespace { template<> inline void constructPairData( void* memory, const Index col, const Index row, mgb::SPairs::QueueConfiguration& conf ) { MATHICGB_ASSERT(memory != 0); MATHICGB_ASSERT(col > row); auto pd = new (memory) mgb::SPairs::OrderMonoid::Mono(conf.allocPairData()); conf.computePairData(col, row, *pd); } template<> inline void destructPairData( mgb::SPairs::OrderMonoid::Mono* pd, const Index col, const Index row, mgb::SPairs::QueueConfiguration& conf ) { MATHICGB_ASSERT(pd != 0); MATHICGB_ASSERT(col > row); conf.freePairData(std::move(*pd)); } } } #endif mathicgb-1.1/src/mathicgb/Poly.hpp0000664000175000017500000002125214560325357012631 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_POLY_GUARD #define MATHICGB_POLY_GUARD #include "PolyRing.hpp" #include "Range.hpp" #include #include #include #include #include MATHICGB_NAMESPACE_BEGIN /// Stores a polynomial. class Poly { public: typedef PolyRing::Field Field; typedef Field::Element Coef; typedef Field::ConstElementRef ConstCoefRef; typedef PolyRing::Monoid Monoid; typedef Monoid::Mono Mono; typedef Monoid::MonoRef MonoRef; typedef Monoid::ConstMonoRef ConstMonoRef; typedef Monoid::MonoPtr MonoPtr; typedef Monoid::ConstMonoPtr ConstMonoPtr; /// Constructs the zero polynomial in the given ring. Poly(const PolyRing& ring): mRing(ring), mMonos(ring.monoid()) {} Poly(const Poly& poly): mRing(poly.ring()), mCoefs(poly.mCoefs), mMonos(poly.mMonos) {} Poly(const Poly&& poly): mRing(poly.ring()), mCoefs(std::move(poly.mCoefs)), mMonos(std::move(poly.mMonos)) {} const PolyRing& ring() const {return mRing;} const Monoid& monoid() const {return ring().monoid();} const Field& field() const {return ring().field();} bool isZero() const {return mCoefs.empty();} size_t termCount() const {return mCoefs.size();} size_t getMemoryUse() const { return sizeof(mCoefs.front()) * mCoefs.capacity() + mMonos.memoryBytesUsed(); } /// Returns a polynomial whose terms have been permuted to be in /// descending order. /// /// Making the copy is not wasteful, because doing the permutation in-place /// would be require swapping monomials which is slow if they are large. /// The returned object is not copy (return value optimization) and using /// move assignment this code will only create the single copy of a Poly /// p that is necessary to avoid an in-place operation: /// /// p = p.polyWithTermsDescending() Poly polyWithTermsDescending() { // *** Sort terms in descending order of monomial. // It would be possible but cumbersome to implement a sort directly // on mMonos. That way no allocation would need to happen, however // it is not clear that that would be any faster, since swapping around // monomials in-place is slow. Swapping terms is faster, since terms // just refer to the monomials. This way is also easier to implement. // /// @todo: make a separate TermSorter object that allows the temporary /// vector to be reused between sorts. This should matter for sorting input /// ideals where there might be a lot of polynomials to go through. auto greaterOrEqual = [&](const NewConstTerm& a, const NewConstTerm& b) { return monoid().lessThan(*b.mono, *a.mono); }; auto terms = rangeToVector(*this); std::sort(std::begin(terms), std::end(terms), greaterOrEqual); // *** Make a new polynomial with terms in that order Poly poly(ring()); poly.reserve(termCount()); poly.append(terms); MATHICGB_ASSERT(poly.termsAreInDescendingOrder()); MATHICGB_ASSERT(poly.termCount() == termCount()); return poly; } /// Appends the given term as the last term in the polynomial. void append(ConstCoefRef coef, ConstMonoRef mono) { mCoefs.push_back(coef); mMonos.push_back(mono); } /// Appends the given term as the last term in the polynomial. void append(const NewConstTerm& term) { MATHICGB_ASSERT(term.mono != nullptr); append(term.coef, *term.mono); } /// Appends each term in the range r to the end of the polynomial. template void append(const Range& r) { for (const auto& term : r) append(term); } /// As append(range(termsBegin, termsEnd)) template void append( const ForwardIterator& termsBegin, const ForwardIterator& termsEnd ) { append(range(termsBegin, termsEnd)); } /// Hint that space for the give number of terms is going to be needed. /// This serves the same purpose as std::vector<>::reserve. void reserve(size_t spaceForThisManyTerms) { mMonos.reserve(spaceForThisManyTerms * monoid().entryCount()); } /// Makes the polynomial monic by multiplying by the multiplicative inverse /// of leadCoef(). Calling this method is an error if isZero(). void makeMonic() { MATHICGB_ASSERT(!isZero()); if (isMonic()) return; auto multiplier = field().inverse(leadCoef()); for (auto& coef : mCoefs) coef = field().product(coef, multiplier); MATHICGB_ASSERT(isMonic()); } void setToZero() { mCoefs.clear(); mMonos.clear(); } Poly& operator=(const Poly& poly) {return *this = Poly(poly);} Poly& operator=(Poly&& poly) { MATHICGB_ASSERT(&ring() == &poly.ring()); mCoefs = std::move(poly.mCoefs); mMonos = std::move(poly.mMonos); return *this; } // *** Accessing the coefficients of the terms in the polynomial. /// Returns the coefficient of the leading term. const Coef& leadCoef() const { MATHICGB_ASSERT(!isZero()); return mCoefs.front(); } /// Returns true if the polynomial is monic. A polynomial is monic if /// the coefficient of the leading monomial is 1. If you are asking this /// question about a polynomial, that likely means that you are expecting /// the polynomial not to be zero. So it is an error to ask if the zero /// polynomial is monic - you'll get an assert to help pinpoint the error. bool isMonic() const { MATHICGB_ASSERT(!isZero()); return field().isOne(leadCoef()); } typedef Field::ElementVector CoefVector; typedef CoefVector::const_iterator ConstCoefIterator; typedef Range ConstCoefIteratorRange; ConstCoefIterator coefBegin() const {return mCoefs.begin();} ConstCoefIterator coefEnd() const {return mCoefs.end();} ConstCoefIteratorRange coefRange() const { return range(coefBegin(), coefEnd()); } // *** Accessing the monomials of the terms in the polynomial /// Returns the monomial of the leading term. ConstMonoRef leadMono() const { MATHICGB_ASSERT(!isZero()); return mMonos.front(); } /// Returns the monomial of the last term. ConstMonoRef backMono() const { MATHICGB_ASSERT(!isZero()); return mMonos.back(); } /// Returns true if the terms are in descending order. The terms are in /// descending order when mono(0) >= mono(1) >= ... >= backMono. /// The coefficient of the terms are not considered in this comparison. bool termsAreInDescendingOrder() const { auto greaterThanOrEqual = [&](ConstMonoRef a, ConstMonoRef b) { return !monoid().lessThan(a, b); }; return std::is_sorted(monoBegin(), monoEnd(), greaterThanOrEqual); } typedef Monoid::MonoVector MonoVector; typedef MonoVector::const_iterator ConstMonoIterator; typedef Range ConstMonoIteratorRange; ConstMonoIterator monoBegin() const {return mMonos.begin();} ConstMonoIterator monoEnd() const {return mMonos.end();} ConstMonoIteratorRange monoRange() const { return range(monoBegin(), monoEnd()); } // *** Iteration through terms class ConstTermIterator { public: typedef std::forward_iterator_tag iterator_category; typedef NewConstTerm value_type; typedef ptrdiff_t difference_type; typedef value_type* pointer; typedef value_type& reference; ConstTermIterator() {} ConstTermIterator& operator++() { ++mIt; return *this; } value_type operator*() const { auto pair = *mIt; NewConstTerm term = {pair.first, pair.second}; return term; } bool operator==(const ConstTermIterator& it) const {return mIt == it.mIt;} bool operator!=(const ConstTermIterator& it) const {return mIt != it.mIt;} const Coef& coef() const {return (*mIt).first;} ConstMonoRef mono() const {return (*mIt).second;} private: friend class Poly; typedef Zip Iterator; ConstTermIterator(const Iterator& it): mIt(it) {} Iterator mIt; }; typedef Range ConstTermIteratorRange; ConstTermIterator begin() const {return makeZip(coefBegin(), monoBegin());} ConstTermIterator end() const {return makeZip(coefEnd(), monoEnd());} ConstTermIteratorRange termRange() const {return range(begin(), end());} NewConstTerm leadTerm() const { MATHICGB_ASSERT(!isZero()); NewConstTerm term = {leadCoef(), leadMono().ptr()}; return term; } private: friend bool operator==(const Poly &a, const Poly &b); const PolyRing& mRing; CoefVector mCoefs; MonoVector mMonos; }; inline bool operator==(const Poly& a, const Poly& b) { MATHICGB_ASSERT(a.ring() == b.ring()); return a.mCoefs == b.mCoefs && a.mMonos == b.mMonos; } MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/ReducerHashPack.cpp0000664000175000017500000001610314560325357014674 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "ReducerHashPack.hpp" #include "TypicalReducer.hpp" #include "ReducerHelper.hpp" #include "PolyHashTable.hpp" #include #include MATHICGB_NAMESPACE_BEGIN void reducerHashPackDependency() {} /// A combination of ReducerHash and ReducerPack. Each entry in the queue /// corresponds to a term (times a multiplier) of a polynomial. When such a /// term is taken off the queue, we advance it to the next term of the /// corresponding polynomial and push that back into the queue. Each entry /// in the queue is also associated to a hash table entry, where the /// data is stored - the entries in the queue are just pointers into /// hash table nodes. There are no like terms to add up in the queue, since /// the hash table identifies such before insertion into the queue. /// /// There is no need for the complexity of chaining as in ReducerPackDedup, /// since we simply keep advancing through the terms in a polynomial until /// there are no more terms or we get a term that is unlike any other term /// in the queue. We could have stored a list of like terms for each /// entry in the queue as in ReducerPackDedup, which might reduce the size of /// the queue, but this is a good compromise that leads to simpler code. template class Queue> class ReducerHashPack : public TypicalReducer { public: ReducerHashPack(const PolyRing& R); virtual ~ReducerHashPack(); virtual std::string description() const { return mQueue.getName() + "-hashed-packed"; } virtual void insertTail(NewConstTerm multiplier, const Poly& f); virtual void insert(ConstMonoRef multiplier, const Poly& f); virtual bool leadTerm(NewConstTerm& result); virtual void removeLeadTerm(); virtual size_t getMemoryUse() const; virtual void resetReducer(); private: // Represents a term multiple of a polynomial, // together with a current term of the multiple. struct MultipleWithPos { MultipleWithPos(const Poly& poly, NewConstTerm multiple); Poly::ConstTermIterator pos; const Poly::ConstTermIterator end; NewTerm multiple; PolyHashTable::Node* node; void destroy(const PolyRing& ring); }; class Configuration : public ReducerHelper::PlainConfiguration { public: typedef MultipleWithPos* Entry; Configuration(const PolyRing& ring) : PlainConfiguration(ring) {} CompareResult compare(const Entry& a, const Entry& b) const { return ring().monoid().lessThan(a->node->mono(), b->node->mono()); } }; void insertEntry(MultipleWithPos* entry); const PolyRing& mRing; Queue mQueue; PolyHashTable mHashTable; memt::BufferPool mPool; }; template class Q> ReducerHashPack::ReducerHashPack(const PolyRing& ring): mRing(ring), mQueue(Configuration(ring)), mHashTable(ring), mPool(sizeof(MultipleWithPos)) {} template class Q> ReducerHashPack::~ReducerHashPack() { resetReducer(); } template class Q> void ReducerHashPack::insertTail(NewConstTerm multiple, const Poly& poly) { MATHICGB_ASSERT(&poly.ring() == &mRing); if (poly.termCount() <= 1) return; auto entry = new (mPool.alloc()) MultipleWithPos(poly, multiple); ++entry->pos; insertEntry(entry); } template class Q> void ReducerHashPack::insert(ConstMonoRef multiple, const Poly& poly) { MATHICGB_ASSERT(&poly.ring() == &mRing); if (poly.isZero()) return; NewConstTerm termMultiple = {1, multiple.ptr()}; insertEntry(new (mPool.alloc()) MultipleWithPos(poly, termMultiple)); } template class Q> ReducerHashPack::MultipleWithPos::MultipleWithPos( const Poly& poly, NewConstTerm multipleParam ): pos(poly.begin()), end(poly.end()), node(0) { multiple.mono = poly.ring().monoid().alloc().release(); poly.ring().monoid().copy(*multipleParam.mono, *multiple.mono); multiple.coef = multipleParam.coef; } template class Q> void ReducerHashPack::MultipleWithPos::destroy(const PolyRing& ring) { ring.monoid().freeRaw(*multiple.mono); // Call the destructor to destruct the iterators into std::vector. // In debug mode MSVC puts those in a linked list and the destructor // has to be called since it takes an iterator off the list. There were // memory corruption problems in debug mode on MSVC before doing this. this->~MultipleWithPos(); } template class Q> bool ReducerHashPack::leadTerm(NewConstTerm& result) { while (!mQueue.empty()) { auto entry = mQueue.top(); MATHICGB_ASSERT(entry != nullptr); if (!mRing.coefficientIsZero(entry->node->value())) { result.coef = entry->node->value(); result.mono = entry->node->mono().ptr(); return true; } removeLeadTerm(); } return false; } template class Q> void ReducerHashPack::removeLeadTerm() { MATHICGB_ASSERT(!mQueue.empty()); auto entry = mQueue.top(); MATHICGB_ASSERT(entry != 0); // remove node from hash table first since we are going to be changing // the monomial after this, and if we do that before the hash value will // change. That might prompt an assert inside the hash table. mHashTable.remove(entry->node); MATHICGB_ASSERT(entry->pos != entry->end); while (true) { ++entry->pos; if (entry->pos == entry->end) { mQueue.pop(); entry->destroy(mRing); mPool.free(entry); break; } const auto p = mHashTable.insertProduct(entry->multiple, *entry->pos); if (p.second) { entry->node = p.first; mQueue.decreaseTop(entry); break; } } } template class Q> void ReducerHashPack::insertEntry(MultipleWithPos* entry) { MATHICGB_ASSERT(entry != 0); for (; entry->pos != entry->end; ++entry->pos) { const auto p = mHashTable.insertProduct(entry->multiple, *entry->pos); if (p.second) { entry->node = p.first; mQueue.push(entry); return; } } entry->destroy(mRing); mPool.free(entry); } template class Q> void ReducerHashPack::resetReducer() { class MonomialFree { public: MonomialFree(const PolyRing& ring): mRing(ring) {} bool proceed(MultipleWithPos* entry) { entry->destroy(mRing); return true; } private: const PolyRing& mRing; }; MonomialFree freeer(mRing); mQueue.forAll(freeer); mQueue.clear(); mHashTable.clear(); } template class Q> size_t ReducerHashPack::getMemoryUse() const { return mQueue.getMemoryUse() + mPool.getMemoryUse() + mHashTable.getMemoryUse(); } MATHICGB_REGISTER_REDUCER( "TourHashPack", Reducer_TourTree_Hashed_Packed, make_unique>(ring) ); MATHICGB_REGISTER_REDUCER( "HeapHashPack", Reducer_Heap_Hashed_Packed, make_unique>(ring) ); MATHICGB_REGISTER_REDUCER( "GeoHashPack", Reducer_Geobucket_Hashed_Packed, make_unique>(ring) ); MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/LogDomainSet.hpp0000664000175000017500000000605414560325357014236 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_LOG_DOMAIN_SET_GUARD #define MATHICGB_LOG_DOMAIN_SET_GUARD #include "LogDomain.hpp" #include "mtbb.hpp" #include #include #include #include #include MATHICGB_NAMESPACE_BEGIN class LogDomainSet { public: void registerLogDomain(LogDomain& domain); void registerLogDomain(const LogDomain& domain) {} void registerLogAlias(const char* alias, const char* of); /// A log command has the format AXB, where /// X the name of a compile-time enabled log domain /// A a prefix /// B a suffix /// The possible values of A are /// enable X (this is the empty string) /// + enable X /// - disable X /// 0 do nothing /// The possible values of B are /// do nothing (this is the empty string) /// + stream-enabled X /// - stream-disable X /// 0 do nothing /// /// No white-space is allowed. /// If the command cannot be parsed then you will get an exception. /// /// *** Example *** /// Consider this sequence of commands: /// "+MyLog-" will enabled MyLog, but silence any streaming from it. /// "+MyLog" will make no difference, as MyLog is already enabled. /// "-MyLog+" will disable MyLog, but set the streaming state to enabled. /// As MyLog is disabled there will still be no streaming output. /// "+MyLog" will enabled MyLog. Since the streaming state was enabled /// before, we now get streaming. /// void performLogCommand(std::string cmd) {performLogCommandInternal(' ', std::move(cmd), ' ');} /// Performs a comma-seperated list of commands. No white-space is allowed. void performLogCommands(const std::string& cmds) {performLogCommandsInternal(' ', cmds, ' ');} LogDomain* logDomain(const char* const name); const char* alias(const char* name); const std::vector*>& logDomains() const {return mLogDomains;} const std::vector>& aliases() const {return mAliases;} void printReport(std::ostream& out) const; void printTimeReport(std::ostream& out) const; void printCountReport(std::ostream& out) const; /// Resets the logging system as though the program had just started up. /// This resets all counts, all recorded time and the enabledness of all logs. /// You should not have a timer running for a log when you call this method. void reset(); static LogDomainSet& singleton(); private: void performLogCommandInternal( char prefix, std::string name, char suffix ); void performLogCommandsInternal( const char prefix, const std::string& cmds, const char suffix ); LogDomainSet(); // private for singleton std::vector*> mLogDomains; std::vector> mAliases; mtbb::tick_count mStartTime; }; MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/ReducerHashPack.hpp0000664000175000017500000000104614560325357014701 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_REDUCER_HASH_PACK_GUARD #define MATHICGB_REDUCER_HASH_PACK_GUARD MATHICGB_NAMESPACE_BEGIN // This translation unit has to expose something that is needed elsewhere. // Otherwise, the compiler will think it is not needed and exclude the // whole thing, despite there being important global objects in the .cpp file. void reducerHashPackDependency(); MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/SigSPairQueue.hpp0000664000175000017500000000553614560325357014403 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_SIG_S_PAIR_QUEUE_GUARD #define MATHICGB_SIG_S_PAIR_QUEUE_GUARD #include "PolyRing.hpp" #include #include MATHICGB_NAMESPACE_BEGIN typedef unsigned short SmallIndex; typedef unsigned int BigIndex; struct PreSPair { BigIndex i; PolyRing::Monoid::MonoPtr signature; }; class SigPolyBasis; // A priority queue on S-pairs where the priority is based on a // signature as in signature Grobner basis algorithms. The class is // not responsible for eliminating S-pairs or doing anything beyond // order the S-pairs. class SigSPairQueue { public: typedef PolyRing::Monoid Monoid; typedef Monoid::Mono Mono; typedef Monoid::MonoRef MonoRef; typedef Monoid::ConstMonoRef ConstMonoRef; typedef Monoid::MonoPtr MonoPtr; typedef Monoid::ConstMonoPtr ConstMonoPtr; virtual ~SigSPairQueue(); typedef std::pair Pair; typedef std::vector Pairs; //typedef std::pair IndexSig; typedef PreSPair IndexSig; typedef std::vector IndexSigs; // Takes the minimal signature in the queue and adds all S-pairs of // that signature to pairs. Clears pairs first. Returns null and // leaves pairs empty if the queue is empty. // // This class does not have an empty() method on purpose - you are // supposed to call this method until it returns null. virtual Mono popSignature(Pairs& pairs) = 0; // If (x, sig) is an element of pairsConsumed then (pairWith, x) is // added to the queue. sig must be the signature of the S-pair // (pairWith, x). // // ATTENTION: the calls to pushPairs must have pairWith in the // sequence 0, 1, 2, 3 and so on. It follows from this that the // queue can figure out what pairWith is without being told. Thus // the purpose of pairWith is to make it possible to make an // assertion saying that the caller and the queue agree on what // pairWith is. // // ATTENTION: pairsConsumed will be cleared and the signatures in it // will be freed on the ring. This is because the queue will need to // alter pairsConsumed in various ways and clearing it after that is // cleaner than exposing what's being done to // pairsConsumed. Especially since after you did pushPairs there // would not be a reason to care about what its content was. virtual void pushPairs(size_t pairWith, IndexSigs& pairsConsumed) = 0; // Returns a string that describes the queue. virtual std::string name() const = 0; // Returns the number of pairs currently in the queue. virtual size_t pairCount() const = 0; // Returns number of bytes of memory used. virtual size_t memoryUse() const = 0; static std::unique_ptr create(SigPolyBasis const& basis); }; MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/MonoLookup.cpp0000664000175000017500000001170014560325357014000 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "MonoLookup.hpp" #include "SigPolyBasis.hpp" #include "StaticMonoMap.hpp" #include MATHICGB_NAMESPACE_BEGIN namespace { template< bool UseKDTree, bool AllowRemovals, bool UseDivMask > class ConcreteMonoLookup : public MonoLookup { public: ConcreteMonoLookup( const Monoid& monoid, int type, bool preferSparseReducers ): mLookup(monoid), mType(type), mPreferSparseReducers(preferSparseReducers), mBasis(0), mSigBasis(0) {} const Monoid& monoid() const {return mLookup.monoid();} bool preferSparseReducers() const {return mPreferSparseReducers;} // *** Virtual interface follows virtual void setBasis(const PolyBasis& basis) { if (mBasis == &basis) return; MATHICGB_ASSERT(mBasis == 0); MATHICGB_ASSERT(&monoid() == &basis.ring().monoid()); mBasis = &basis; } virtual void setSigBasis(const SigPolyBasis& sigBasis) { if (mSigBasis == &sigBasis) return; MATHICGB_ASSERT(mSigBasis == 0); MATHICGB_ASSERT(mBasis == 0 || mBasis == &sigBasis.basis()); MATHICGB_ASSERT(&monoid() == &sigBasis.basis().ring().monoid()); mSigBasis = &sigBasis; setBasis(sigBasis.basis()); } const SigPolyBasis& sigBasis() const { MATHICGB_ASSERT(mSigBasis != 0); return *mSigBasis; } const PolyBasis& basis() const { MATHICGB_ASSERT(mBasis != 0); return *mBasis; } virtual void insert(ConstMonoRef mono, size_t index) { mLookup.insert(mono, index); } virtual size_t regularReducer(ConstMonoRef sig, ConstMonoRef mono) const { return mLookup.regularReducer (sig, mono, sigBasis(), preferSparseReducers()); } virtual size_t classicReducer(ConstMonoRef mono) const { return mLookup.classicReducer(mono, basis(), preferSparseReducers()); } virtual std::string getName() const {return mLookup.getName();} virtual size_t getMemoryUse() const {return mLookup.getMemoryUse();} virtual size_t highBaseDivisor(size_t newGenerator) const { return mLookup.highBaseDivisor(newGenerator, sigBasis()); } virtual void lowBaseDivisors( std::vector& divisors, size_t maxDivisors, size_t newGenerator ) const { return mLookup.lowBaseDivisors (divisors, maxDivisors, newGenerator, sigBasis()); } virtual size_t minimalLeadInSig(ConstMonoRef sig) const { return mLookup.minimalLeadInSig(sig, sigBasis()); } virtual int type() const {return mType;} virtual void multiples(ConstMonoRef mono, EntryOutput& consumer) const { mLookup.multiples(mono, consumer); } virtual size_t divisor(ConstMonoRef mono) const { const auto entry = mLookup.divisor(mono); return entry == 0 ? size_t(-1) : entry->data(); } virtual void divisors(ConstMonoRef mono, EntryOutput& consumer) const { mLookup.divisors(mono, consumer); } virtual void removeMultiples(ConstMonoRef mono) { mLookup.removeMultiples(mono); } virtual void remove(ConstMonoRef mono) { return mLookup.remove(mono); } virtual size_t size() const {return mLookup.size();} private: StaticMonoLookup mLookup; const int mType; const bool mPreferSparseReducers; PolyBasis const* mBasis; SigPolyBasis const* mSigBasis; }; class ConcreteFactory : public MonoLookup::Factory { public: ConcreteFactory(const Monoid& monoid, int type): mMonoid(monoid), mType(type) {} virtual std::unique_ptr make( bool preferSparseReducers, bool allowRemovals ) const { Params params = {mMonoid, mType, preferSparseReducers}; return staticMonoLookupMake >(mType, allowRemovals, params); } private: struct Params { const Monoid& monoid; int type; bool preferSparseReducers; }; template struct Make { static std::unique_ptr make(const Params& params) { auto p = new ConcreteMonoLookup (params.monoid, params.type, params.preferSparseReducers); return std::unique_ptr(p); } }; const Monoid& mMonoid; const int mType; }; } MonoLookup::~MonoLookup() {} std::unique_ptr MonoLookup::makeFactory( const Monoid& monoid, const int type ) { return std::unique_ptr(new ConcreteFactory(monoid, type)); } void MonoLookup::displayCodes(std::ostream& out) { out << " 1 list, using divmasks\n" " 2 KD-tree, using divmasks\n" " 3 list\n" " 4 KD-tree\n"; } MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/PolyBasis.hpp0000664000175000017500000001667014560325357013623 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_POLY_BASIS_GUARD #define MATHICGB_POLY_BASIS_GUARD #include "Poly.hpp" #include "MonoLookup.hpp" #include #include MATHICGB_NAMESPACE_BEGIN class PolyRing; class Basis; /// Stores a basis of polynomials. Designed for use in Groebner basis /// algorithms. class PolyBasis { public: typedef PolyRing::Monoid Monoid; typedef Monoid::Mono Mono; typedef Monoid::MonoRef MonoRef; typedef Monoid::ConstMonoRef ConstMonoRef; typedef Monoid::MonoPtr MonoPtr; typedef Monoid::ConstMonoPtr ConstMonoPtr; PolyBasis( const PolyRing& ring, std::unique_ptr monoLookup ); ~PolyBasis(); /// Returns a basis of the initial ideal. std::unique_ptr initialIdeal() const; /// Inserts a polynomial into the basis at index size() - or index size() - 1 /// after calling, since size() will increase by one. /// Lead monomials must be unique among basis elements. void insert(std::unique_ptr poly); /// Returns the index of a basis element whose lead term divides mon. /// Returns -1 if there is no such basis element. size_t divisor(ConstMonoRef mon) const; /// As divisor(mon), but if there is more than one divisor then the divisor /// is chosen according to some notion of which reducer is better. size_t classicReducer(ConstMonoRef mon) const; /// Replaces basis element at index with the given new polynomial. The lead /// term of the new polynomial must be the same as the previous one. /// This is useful for auto-tail-reduction. void replaceSameLeadTerm(size_t index, std::unique_ptr newValue) { MATHICGB_ASSERT(index < size()); MATHICGB_ASSERT(!retired(index)); MATHICGB_ASSERT(newValue.get() != nullptr); MATHICGB_ASSERT(!newValue->isZero()); MATHICGB_ASSERT (monoid().equal(leadMono(index), newValue->leadMono())); mMonoLookup->remove(leadMono(index)); delete mEntries[index].poly; mEntries[index].poly = newValue.release(); mMonoLookup->insert(leadMono(index), index); MATHICGB_ASSERT(mEntries[index].poly != nullptr); } /// Returns the number of basis elements, including retired elements. size_t size() const {return mEntries.size();} const PolyRing& ring() const {return mRing;} const Monoid& monoid() const {return ring().monoid();} /// Returns a data structure containing the lead monomial of each basis /// element. const MonoLookup& monoLookup() const {return *mMonoLookup;} /// Retires the basis element at index, which returns ownership of the /// polynomial to the caller and frees most resources associated to /// that basis elements. std::unique_ptr retire(size_t index); /// Returns an basis containing all non-retired basis elements and /// retires all those basis elements. The point of the simultaneous /// retirement is that this way no polynomials need be copied. std::unique_ptr toBasisAndRetireAll(); /// Returns true if the basis element at index has been retired. bool retired(size_t index) const { MATHICGB_ASSERT(index < size()); return mEntries[index].retired; } /// Returns the basis element polynomial at index. Poly& poly(size_t index) { MATHICGB_ASSERT(index < size()); MATHICGB_ASSERT(!retired(index)); return *mEntries[index].poly; } /// Returns the basis element polynomial at index. const Poly& poly(size_t index) const { MATHICGB_ASSERT(index < size()); MATHICGB_ASSERT(!retired(index)); return *mEntries[index].poly; } /// Returns the lead monomial of poly(index). ConstMonoRef leadMono(size_t index) const { MATHICGB_ASSERT(index < size()); MATHICGB_ASSERT(!retired(index)); return poly(index).leadMono(); } /// Returns the lead coefficient of poly(index). coefficient leadCoef(size_t index) const { MATHICGB_ASSERT(index < size()); MATHICGB_ASSERT(!retired(index)); return poly(index).leadCoef(); } /// Returns true if the leading monomial of the basis element at index is not /// divisible by the lead monomial of any other basis element. Lead /// monomials are required to be unique among basis elements, so the case /// of several equal lead monomials does not occur. bool leadMinimal(size_t index) const { MATHICGB_ASSERT(index < size()); MATHICGB_ASSERT(!retired(index)); MATHICGB_SLOW_ASSERT(mEntries[index].leadMinimal == leadMinimalSlow(index)); return mEntries[index].leadMinimal; } /// Returns true if the lead monomial of poly is not divisible by the /// lead monomial of any basis element. Equality counts as divisibility. bool leadMinimal(const Poly& poly) const { return mMonoLookup->divisor(poly.leadMono()) != static_cast(-1); } /// Returns the number of basis elements with minimal lead monomial. size_t minimalLeadCount() const; /// Returns the index of the basis element of maximal index /// whose lead monomial is minimal. size_t maxIndexMinimalLead() const; /// Returns the basis element polynomial at index. const Poly& basisElement(size_t index) const { MATHICGB_ASSERT(index < size()); MATHICGB_ASSERT(!retired(index)); return *mEntries[index].poly; } /// Returns the number of monomials across all the basis elements. /// Monomials that appear in more than one basis element are counted more /// than once. size_t monomialCount() const; /// Returns how many bytes has been allocated by this object. size_t getMemoryUse() const; void usedAsStart(size_t index) const { MATHICGB_ASSERT(index < size()); ++mEntries[index].usedAsStartCount; } unsigned long long usedAsStartCount(size_t index) const { MATHICGB_ASSERT(index < size()); return mEntries[index].usedAsStartCount; } void usedAsReducer(size_t index) const { MATHICGB_ASSERT(index < size()); ++mEntries[index].usedAsReducerCount; } unsigned long long usedAsReducerCount(size_t index) const { MATHICGB_ASSERT(index < size()); return mEntries[index].usedAsReducerCount; } void wasPossibleReducer(size_t index) const { MATHICGB_ASSERT(index < size()); ++mEntries[index].possibleReducerCount; } unsigned long long wasPossibleReducerCount(size_t index) const { MATHICGB_ASSERT(index < size()); return mEntries[index].possibleReducerCount; } void wasNonSignatureReducer(size_t index) const { MATHICGB_ASSERT(index < size()); ++mEntries[index].nonSignatureReducerCount; } unsigned long long wasNonSignatureReducerCount(size_t index) const { MATHICGB_ASSERT(index < size()); return mEntries[index].nonSignatureReducerCount; } private: // Slow versions use simpler code. Used to check results in debug mode. bool leadMinimalSlow(size_t index) const; size_t divisorSlow(ConstMonoRef mon) const; class Entry { public: Entry(); Poly* poly; bool leadMinimal; bool retired; // Statistics on reducer choice in reduction mutable unsigned long long usedAsStartCount; mutable unsigned long long usedAsReducerCount; mutable unsigned long long possibleReducerCount; mutable unsigned long long nonSignatureReducerCount; }; typedef std::vector EntryCont; typedef EntryCont::iterator EntryIter; typedef EntryCont::const_iterator EntryCIter; const PolyRing& mRing; std::unique_ptr mMonoLookup; std::vector mEntries; }; MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/SigPolyBasis.hpp0000664000175000017500000002045114560325357014256 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_SIG_POLY_BASIS_GUARD #define MATHICGB_SIG_POLY_BASIS_GUARD #include "PolyRing.hpp" #include "Poly.hpp" #include "MonoLookup.hpp" #include "PolyBasis.hpp" #include "MonoProcessor.hpp" #include #include MATHICGB_NAMESPACE_BEGIN #ifndef MATHICGB_USE_RATIO_RANK #define MATHICGB_USE_RATIO_RANK true #endif /// Stores a basis of polynomials that each have a signature. Designed for /// use in signature Groebner basis algorithms. class SigPolyBasis { public: typedef PolyRing::Field Field; typedef PolyRing::Monoid Monoid; typedef Monoid::Mono Mono; typedef Monoid::MonoRef MonoRef; typedef Monoid::ConstMonoRef ConstMonoRef; typedef Monoid::MonoPtr MonoPtr; typedef Monoid::ConstMonoPtr ConstMonoPtr; typedef MonoProcessor Processor; SigPolyBasis( const PolyRing& R, int monoLookupType, int monTableType, bool preferSparseReducers ); ~SigPolyBasis(); const PolyRing& ring() const {return mBasis.ring();} const Monoid& monoid() const {return ring().monoid();} const Field& field() const {return ring().field();} const Poly& poly(size_t index) const {return mBasis.poly(index);} size_t size() const {return mBasis.size();} const PolyBasis& basis() const {return mBasis;} ConstMonoRef leadMono(size_t gen) const { MATHICGB_ASSERT(gen < size()); return mBasis.leadMono(gen); } coefficient leadCoef(size_t gen) const { MATHICGB_ASSERT(gen < size()); return mBasis.leadCoef(gen); } ConstMonoRef sigLeadRatio(size_t gen) const { MATHICGB_ASSERT(gen < size()); return *mSigLeadRatio[gen]; } // Signifies that the module has taken on another e_i. // Must call this before adding a polynomial to the basis with // a signature in the new component. void addComponent(); // Takes over ownership of sig and f. sig must come from the pool // of ring(). void insert(Mono sig, std::unique_ptr f); ConstMonoRef signature(size_t gen) const { MATHICGB_ASSERT(gen < size()); return *mSignatures[gen]; } // Returns the index of a basis element that regular reduces term in // signature sig. Returns -1 if no such element exists. A basis element // u is a regular reducer if leadTerm(u) divides term // and (term / leadTerm(u)) * signature(u) < sig. size_t regularReducer(ConstMonoRef sig, ConstMonoRef term) const; // Uses the functionality in the divisor finder for // computing up to maxDivisors low ratio base divisors. // The divisors are placed into divisors. void lowBaseDivisors( std::vector& divisors, size_t maxDivisors, size_t newGenerator ) const; // Uses the functionality in the divisor finder for // computing a high base divisor. Returns the index // of the divisor or -1 if none are found. size_t highBaseDivisor(size_t newGenerator) const; // Find the basis element g_i whose signature S divides sig // such that (S/sig)g_i has minimal leading term. Returns i. size_t minimalLeadInSig(ConstMonoRef sig) const; // Returns true if poly can be singular reduced in signature sig. // In other words, returns true if there is a basis element with // lead term M and signature S such that M divides the lead term N // of poly and such that N/M*S == sig. This is slow because it is // currently only used for asserts - implement a fast version if // that changes. bool isSingularTopReducibleSlow(const Poly& poly, ConstMonoRef sig) const; void display(std::ostream& out) const; void displayFancy(std::ostream& out, const Processor& processor) const; size_t getMemoryUse() const; // Compares the signature/lead ratio of basis element a to basis element b // and returns LT, EQ or GT. inline int ratioCompare(size_t a, size_t b) const; /// Post processes all signatures. This currently breaks all sorts /// of internal invariants - it's supposed to be a temporary hack. void postprocess(const Processor& processor); class StoredRatioCmp { public: // Stores the ratio numerator/denominator and prepares it for comparing // to the sig/lead ratios in basis. StoredRatioCmp( ConstMonoRef numerator, ConstMonoRef denominator, const SigPolyBasis& basis); // compares the stored ratio to the basis element with index be. inline int compare(size_t be) const; private: StoredRatioCmp(const StoredRatioCmp&); // not available void operator=(const StoredRatioCmp&); // not available const SigPolyBasis& mBasis; size_t mRatioRank; Mono mRatio; mutable Mono mTmp; }; private: // Slow versions use simpler code. Used to check results in debug mode. size_t regularReducerSlow(ConstMonoRef sig, ConstMonoRef term) const; size_t minimalLeadInSigSlow(ConstMonoRef sig) const; size_t highBaseDivisorSlow(size_t newGenerator) const; void lowBaseDivisorsSlow( std::vector& divisors, size_t maxDivisors, size_t newGenerator ) const; friend class StoredRatioCmp; const MonoLookup& monoLookup() const {return mBasis.monoLookup();} std::unique_ptr const mMonoLookupFactory; /// The ratio rank can change at each insert! size_t ratioRank(size_t index) const { MATHICGB_ASSERT(index < size()); return mRatioRanks[index]; } // Only useful for comparing to basis elements. Two ratios might get the same // rank without being equal. All ranks can change when a new generator // is added. size_t ratioRank(ConstMonoRef ratio) const; std::vector mSignatures; // the ratio signature/initial term including negative entries and module component std::vector mSigLeadRatio; // true if giving each generator an integer id based on its // position in a sorted order of sig-lead ratios. static const bool mUseRatioRank = MATHICGB_USE_RATIO_RANK; static const bool mUseStoredRatioRank = MATHICGB_USE_RATIO_RANK; class RatioOrder { public: RatioOrder(std::vector& ratio, const Monoid& monoid): mRatio(ratio), mMonoid(monoid) {} bool operator()(size_t a, size_t b) const { return mMonoid.lessThan(*mRatio[a], *mRatio[b]); } private: std::vector& mRatio; const Monoid& mMonoid; }; typedef std::multiset RatioSorted; typedef size_t Rank; RatioSorted mRatioSorted; std::vector mRatioRanks; std::vector mSignatureLookup; // Contains those lead terms that are minimal. std::unique_ptr const mMinimalMonoLookup; PolyBasis mBasis; bool const mPreferSparseReducers; mutable monomial mTmp; }; inline int SigPolyBasis::ratioCompare(size_t a, size_t b) const { if (mUseRatioRank) { #ifdef MATHICGB_DEBUG int const value = monoid().compare(sigLeadRatio(a), sigLeadRatio(b)); #endif if (mRatioRanks[a] < mRatioRanks[b]) { MATHICGB_ASSERT_NO_ASSUME(value == LT); return LT; } else if (mRatioRanks[a] > mRatioRanks[b]) { MATHICGB_ASSERT_NO_ASSUME(value == GT); return GT; } else { MATHICGB_ASSERT_NO_ASSUME(value == EQ); return EQ; } } else { // A/a < B/b <=> A < (B/b)a monoid().divideToNegative(signature(b), leadMono(b), mTmp); monoid().multiplyInPlace(leadMono(a), mTmp); const auto value = monoid().compare(signature(a), mTmp); MATHICGB_ASSERT (value == monoid().compare(sigLeadRatio(a), sigLeadRatio(b))); return value; } } inline int SigPolyBasis::StoredRatioCmp::compare(size_t be) const { if (SigPolyBasis::mUseStoredRatioRank) { #ifdef MATHICGB_DEBUG const auto value = mBasis.monoid().compare(*mRatio, mBasis.sigLeadRatio(be)); #endif SigPolyBasis::Rank otherRank = mBasis.ratioRank(be); if (mRatioRank < otherRank) { MATHICGB_ASSERT_NO_ASSUME(value == LT); return LT; } else if (mRatioRank > otherRank) { MATHICGB_ASSERT_NO_ASSUME(value == GT); return GT; } else { MATHICGB_ASSERT_NO_ASSUME(value == EQ); return EQ; } } else { mBasis.monoid().multiply(*mRatio, mBasis.leadMono(be), *mTmp); const auto value = mBasis.monoid().compare(*mTmp, mBasis.signature(be)); MATHICGB_ASSERT (value == mBasis.monoid().compare(*mRatio, mBasis.sigLeadRatio(be))); return value; } } MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/ReducerPack.hpp0000664000175000017500000000103014560325357014066 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_REDUCER_PACK_GUARD #define MATHICGB_REDUCER_PACK_GUARD MATHICGB_NAMESPACE_BEGIN // This translation unit has to expose something that is needed elsewhere. // Otherwise, the compiler will think it is not needed and exclude the // whole thing, despite there being important global objects in the .cpp file. void reducerPackDependency(); MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/PolyHashTable.hpp0000664000175000017500000001205614560325357014407 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_POLY_HASH_TABLE_GUARD #define MATHICGB_POLY_HASH_TABLE_GUARD #include "PolyRing.hpp" #include "Poly.hpp" #include #include #include MATHICGB_NAMESPACE_BEGIN class PolyHashTable { public: typedef PolyRing::Monoid Monoid; typedef Monoid::ConstMonoRef ConstMonoRef; typedef Monoid::MonoRef MonoRef; typedef coefficient Value; class Node { public: ConstMonoRef mono() const {return *Monoid::toMonoPtr(mMono);} MonoRef mono() {return *Monoid::toMonoPtr(mMono);} Value& value() {return mValue;} const Value& value() const {return mValue;} private: friend class PolyHashTable; Node*& next() {return mNext;} Node* next() const {return mNext;} Node* mNext; Value mValue; exponent mMono[1]; }; // Construct a hash table with at least requestedBucketCount buckets. There // may be more buckets. Currently the number is rounded up to the next power // of two. PolyHashTable(const PolyRing& ring); const PolyRing::Monoid& monoid() const {return mRing.monoid();} /// Return how many buckets the hash table has. size_t bucketCount() const { return hashMaskToBucketCount(mHashToIndexMask); } /// Return the number of elements (not the number of buckets). size_t size() const {return mSize;} MATHICGB_INLINE std::pair insertProduct(ConstMonoRef a, ConstMonoRef b) { auto newNode = new (mNodes.alloc()) Node(); monoid().multiply(a, b, newNode->mono()); const auto abHash = monoid().hash(newNode->mono()); auto& bucket = mBuckets[hashToIndex(abHash)]; for (auto node = bucket; node != nullptr; node = node->next()) { if (abHash != monoid().hash(node->mono())) continue; if (monoid().equal(newNode->mono(), node->mono())) { mNodes.free(newNode); return std::make_pair(node, false); // found a*b. } } mRing.coefficientSet(newNode->value(), 0); newNode->next() = bucket; bucket = newNode; ++mSize; if (mSize >= mMaxSize) rehash(bucketCount() * 2); return std::make_pair(newNode, true); // inserted mono } MATHICGB_INLINE std::pair insertProduct (ConstMonoRef a, ConstMonoRef b, Value add) { auto p = insertProduct(a, b); mRing.coefficientAddTo(p.first->value(), add); return p; } MATHICGB_INLINE std::pair insertProduct(NewConstTerm a, NewConstTerm b) { Value prod; mRing.coefficientMult(a.coef, b.coef, prod); return insertProduct(*a.mono, *b.mono, prod); } MATHICGB_INLINE void remove(Node* nodeToRemove) { MATHICGB_ASSERT(nodeToRemove != 0); MATHICGB_ASSERT(mNodes.fromPool(nodeToRemove)); const auto index = hashToIndex(monoid().hash(nodeToRemove->mono())); auto nodePtr = &mBuckets[index]; while (*nodePtr != nodeToRemove) { MATHICGB_ASSERT(*nodePtr != nullptr); nodePtr = &(*nodePtr)->next(); } *nodePtr = nodeToRemove->next(); mNodes.free(nodeToRemove); --mSize; } /// Removes all elements and optimizes internal resources. This is /// fast if there are no elements, so if you know that there are no /// elements and that many operations have happened since the last clear, /// then call clear for better cache performance. If there is even one /// element, then this takes linear time in the number of buckets. void clear() { if (!empty()) { std::fill_n(mBuckets.get(), bucketCount(), nullptr); mSize = 0; } mNodes.freeAllBuffers(); } bool empty() const {return mSize == 0;} size_t getMemoryUse() const { return bucketCount() * sizeof(mBuckets[0]) + mNodes.getMemoryUse(); } private: /// Change the number of buckets and put all the nodes into their new /// places. The bucket array gets put into new memory, but all the nodes /// stay where they are. void rehash(const size_t requestedBucketCount); static HashValue computeHashMask(const size_t requestedBucketCount); static size_t hashMaskToBucketCount(const HashValue mask) { const auto count = static_cast(mask) + 1u; // should be power of 2 MATHICGB_ASSERT(count > 0 && (count & (count - 1)) == 0); return count; } static size_t sizeofNode(const PolyRing& ring) { return sizeof(Node) + sizeof(Value) - sizeof(exponent) + ring.maxMonomialByteSize(); } /// The maximum allowed value of size() / bucketCount() before a rehash /// is done. static double maxLoadFactor() {return 0.10;} size_t hashToIndex(const HashValue hash) const { const auto index = hashToIndex(hash, mHashToIndexMask); MATHICGB_ASSERT(index == hash % bucketCount()); return index; } static size_t hashToIndex(const HashValue hash, const HashValue mask) { return hash & mask; } HashValue mHashToIndexMask; std::unique_ptr mBuckets; const PolyRing& mRing; memt::BufferPool mNodes; size_t mSize; size_t mMaxSize; }; MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/F4ProtoMatrix.cpp0000664000175000017500000000426414560325357014367 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "F4ProtoMatrix.hpp" MATHICGB_NAMESPACE_BEGIN auto F4ProtoMatrix::row(const RowIndex row) const -> Row { MATHICGB_ASSERT(row < mRows.size()); const auto& r = mRows[row]; Row rr; rr.indices = mIndices.data() + r.indicesBegin; rr.entryCount = r.entryCount; if (!r.scalarsStoredExternally) { rr.scalars = mScalars.data() + r.scalarsBegin; } else { rr.scalars = nullptr; rr.externalScalars = r.externalScalars; } return rr; } auto F4ProtoMatrix::makeRowWithTheseScalars(const Poly& scalars) -> ColIndex* { MATHICGB_ASSERT(rowCount() < std::numeric_limits::max()); MATHICGB_ASSERT(scalars.termCount() < std::numeric_limits::max()); InternalRow row; row.indicesBegin = mIndices.size(); row.scalarsBegin = std::numeric_limits::max(); row.entryCount = static_cast(scalars.termCount()); row.scalarsStoredExternally = true; row.externalScalars = scalars.coefBegin(); mRows.push_back(row); mIndices.resize(mIndices.size() + row.entryCount); return mIndices.data() + row.indicesBegin; } auto F4ProtoMatrix::makeRow(ColIndex entryCount) -> std::pair { MATHICGB_ASSERT(rowCount() < std::numeric_limits::max()); InternalRow row; row.indicesBegin = mIndices.size(); row.scalarsBegin = mScalars.size(); row.entryCount = entryCount; row.scalarsStoredExternally = false; mRows.push_back(row); mIndices.resize(mIndices.size() + entryCount); mScalars.resize(mScalars.size() + entryCount); return std::make_pair( mIndices.data() + row.indicesBegin, mScalars.data() + row.scalarsBegin ); } void F4ProtoMatrix::removeLastEntries(const RowIndex row, const ColIndex count) { MATHICGB_ASSERT(row < rowCount()); MATHICGB_ASSERT(mRows[row].entryCount >= count); mRows[row].entryCount -= count; if (row != rowCount() - 1) return; mIndices.resize(mIndices.size() - count); if (!mRows[row].scalarsStoredExternally) mScalars.resize(mScalars.size() - count); } MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/ReducerHelper.hpp0000664000175000017500000000554514560325357014446 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_REDUCER_HELPER_GUARD #define MATHICGB_REDUCER_HELPER_GUARD // This namespace contains functions and classees that are useful for // writing subclasses of Reducer. #include "PolyRing.hpp" MATHICGB_NAMESPACE_BEGIN namespace ReducerHelper { // ************** Configurations ********************** // Common base class for the configurations offered here. // The configurations are designed to work with // mathic::TourTree, mathic::Heap and mathic::Geobucket. class ConfigurationBasics { public: ConfigurationBasics(const PolyRing& ring): mRing(ring) {} const PolyRing& ring() const {return mRing;} // Special fields for TourTree and Heap static const bool fastIndex = true; // Special fields for Geobuckets: static const size_t geoBase = 4; static const size_t minBucketSize = 8; static const bool minBucketBinarySearch = false; static const bool trackFront = true; static const bool premerge = false; static const bool collectMax = false; static const int bucketStorage = 1; static const size_t insertFactor = 1; private: const PolyRing& mRing; }; // Base class for a configuration with deduplication turned off. // This cannot be a template since then all the names would be hidden // in any subclasses. class PlainConfiguration : public ConfigurationBasics { public: PlainConfiguration(const PolyRing& ring): ConfigurationBasics(ring) {} static const bool supportDeduplication = false; typedef bool CompareResult; bool cmpLessThan(bool r) const {return r;} // These last two members are not supposed to be called. // The dummy deduplicate function has to be a template since we do not // know what type Entry is. template Entry deduplicate(Entry a, Entry b) const { MATHICGB_ASSERT(false); return a; } bool cmpEqual(bool) const { MATHICGB_ASSERT(false); return false; } }; // Base class for a configuration with deduplication turned on. // This cannot be a template since then all the names would be hidden // in any subclasses. class DedupConfiguration : public ConfigurationBasics { public: DedupConfiguration(const PolyRing& ring): ConfigurationBasics(ring) {} static const bool supportDeduplication = true; typedef int CompareResult; bool cmpLessThan(int r) const {return r == LT;} bool cmpEqual(int r) const {return r == EQ;} }; // ************** Utility functions ********************** inline const_term allocTermCopy(const PolyRing& ring, const_term term) { monomial mono = ring.allocMonomial(); ring.monomialCopy(term.monom, mono); return const_term(term.coeff, mono); } } MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/Range.hpp0000664000175000017500000004064214560325357012746 // MathicGB copyright 2013 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_RANGE_GUARD #define MATHICGB_RANGE_GUARD #include #include #include #include #include MATHICGB_NAMESPACE_BEGIN // Read on, this file contains several free-standing functions that make use // of the range concept and Range class. /// An object that combines two iterators into a range suitable for use with /// C++11's range for. It is most conveniently used with the function range. /// For example: /// /// std::vector v; /// for (int x : range(v.begin(), v.end()) {} /// /// std::vector already has begin and end members, so range() is not necessary /// here. range() is useful when a class does not have begin or end members, or /// if it offers several different ranges that can be iterated through - /// then the default range can only offer one of those ranges. template class Range { public: typedef Iter Iterator; Range(Iterator begin, Iterator end): mBegin(begin), mEnd(end) {} Range(std::pair pair): mBegin(pair.first), mEnd(pair.second) {} Iterator begin() const {return mBegin;} Iterator end() const {return mEnd;} private: Iterator mBegin; Iterator mEnd; }; /// Convenience function for constructing a Range object. This function /// removes the need to explicitly specify the types involved. template Range range(Iterator begin, Iterator end) { return Range(begin, end); } /// As range(std::begin(r), std::end(r)). template auto range(RangeParam&& r) -> decltype(range(std::begin(r), std::end(r))) { return range(std::begin(r), std::end(r)); } // *** Zipping ranges together /// Zip ties two iterators together into a single iterator. The point /// is to enable the zip() function defined further down in this header. /// /// Note that equality is defined ONLY by equality of the first iterator! template class Zip { public: typedef decltype(*std::declval()) ValueType1; typedef decltype(*std::declval()) ValueType2; /// It would be possible to do something fancy to infer the strongest /// iterator category that both sub-iterators can support. Since this /// is intended mainly to be used for things like range-for, I did not /// implement that since I do not need it. typedef std::forward_iterator_tag iterator_category; typedef std::pair value_type; typedef ptrdiff_t difference_type; typedef value_type* pointer; typedef value_type& reference; Zip() {} Zip(Iterator1 it1, Iterator2 it2): mIt1(it1), mIt2(it2) {} Zip& operator++() { ++mIt1; ++mIt2; return *this; } value_type operator*() const { // We cannot use std::make_pair here. If .first or .second is a // reference, then std::make_pair will remove the reference and then the // conversion to value_type will add the reference back in - but now the // reference is not what was originally referenced, instead it is a // reference to the temporary object returned by std::make_pair, which // then promptly goes out of scope, leading to undefined behavior. return value_type(*mIt1, *mIt2); } /// Compares only the first iterator! bool operator!=(const Zip& it) const {return mIt1 != it.mIt1;} /// Compares only the first iterator! bool operator==(const Zip& it) const {return mIt1 == it.mIt1;} private: Iterator1 mIt1; Iterator2 mIt2; }; /// Creates a Zip iterator out of it1 and it2. This is a convenience function /// that removes the need to specify the iterator types explicitly. /// /// There would rarely (never?) be a need to call this function directly. /// Prefer to call zip() directly. template auto makeZip( const Iterator1& it1, const Iterator2& it2 ) -> Zip { return Zip(it1, it2); } /// As zip(range(begin1, end1), range(begin2, end2)). template auto zip( const Iterator1& begin1, const Iterator1& end1, const Iterator2& begin2, const Iterator2& end2 ) -> decltype(range(makeZip(begin1, begin2), makeZip(end1, end2))) { return range(makeZip(begin1, begin2), makeZip(end1, end2)); } /// Zips two ranges into a single range of pairs. /// /// Example: /// std::vector a = {"hello", "world"}; /// std::vector b = {4, 2, 1, 0}; /// for (const auto& p : zip(a, b)) /// std::cout << p.first << p.second << ' '; /// /// The output will be "hello4 world2 ". If the ranges have different lengths /// then the length of the range will be the length of the first range. If the /// first range is longer than the second one, this means you will likely /// run into undefined behavior. We can't even do an assert for that because /// it's perfectly reasonable to use giant implicitly represented ranges for /// the second parameter and if that's a forward iterator, doing std::distance /// on it might never terminate or take a very long time. template auto zip(Range1&& range1, Range2&& range2) -> decltype( zip( std::begin(range1), std::end(range1), std::begin(range2), std::end(range2) ) ) { return zip( std::begin(range1), std::end(range1), std::begin(range2), std::end(range2) ); } // *** Implicitly represented ranges of integers /// An Iterator that wraps an integer. template class IntIterator { public: /// It could perfectly well be a random access iterator, I just do not /// need that functionality right now, so I'm not implementing it. typedef std::forward_iterator_tag iterator_category; typedef Integer value_type; typedef ptrdiff_t difference_type; typedef value_type* pointer; typedef value_type& reference; IntIterator(Integer integer): mInteger(integer) {} value_type operator*() const {return mInteger;} IntIterator& operator++() { ++mInteger; return *this; } bool operator==(const IntIterator& it) const {return **this == *it;} bool operator!=(const IntIterator& it) const {return **this != *it;} private: Integer mInteger; }; /// Constructs a half-open interval of integers [begin, end) that is /// compatible with range-for. /// /// Example: /// for (auto x : intRange(5, 10) /// std::cout << ' ' << x; /// The output will be " 5 6 7 8 9". See indexRange() for further examples /// of how this sort of thing can be useful. template Range> intRange(Integer begin, Integer end) { return Range>(begin, end); } /// As intRange(Integer(0), end). template auto intRange(Integer end) -> decltype(intRange(0, 0)) { return intRange(Integer(0), end); } /// As intRange(0, max) where max is the maximum representable /// integer of type Integer as indicated by std::numeric_limits. inline auto intRange() -> decltype(intRange(0, 0)) { return intRange(0, std::numeric_limits::max()); } /// Adds indices to the elements of the range, specifying the offset of each /// element in the range. Equivalent to zip(range(begin, end), intRange()). /// /// Example: /// const char*[] strs = {"hello", "world", "!"}; /// for (const auto& p : indexRange(strs)) /// std::cout << ' ' << p.first << p.second; /// /// The output will be " hello0 world1 !2". template auto indexRange( const Iterator& begin, const Iterator& end ) -> decltype(zip(range(begin, end), intRange())) { return zip(range(begin, end), intRange()); } /// As indexRange(std::begin(r), std::end(r)). template auto indexRange( Range&& r ) -> decltype(indexRange(std::begin(r), std::end(r))) { return indexRange(std::begin(r), std::end(r)); } // *** Conversion from range to container /// As rangeToVector(range(begin, end)). template auto rangeToVector( Iterator begin, Iterator end ) -> decltype( std::vector::type>(begin, end) ) { return std::vector::type>(begin, end); } /// Converts a range into a vector. This is a convenience function. /// When using this function, it is not necessary to name the type of the /// vector. It is also not necessary to give a name to the range object. /// /// Example: /// const char*[] strs = {"hello", "world", "!"}; /// auto v = rangeToVector(indexRange(strs)); /// /// Without rangeToVector, the last line would have to be replaced by /// /// auto r = indexRange(strs); /// std::vector> v(r.begin(), r.end()); /// /// The return type is std::vector where T is whatever type is contained /// in the range, after stripping references and other qualifiers. So if /// the iterators in the range return const T&, the return type will still /// be std::vector. More precisely, if the returned type is S, the returned /// type will be std::vector::type>. template auto rangeToVector( RangeParam&& range ) -> decltype(rangeToVector(std::begin(range), std::end(range))) { return rangeToVector(std::begin(range), std::end(range)); } // *** Range of adjacent pairs /// Wraps an iterator of pairs to be an iterator of opposite pairs, so that /// if *it == (a, b) then *OppositePairIterator(it) == (b, a). template class OppositePairIterator { public: typedef decltype((*std::declval()).first) InnerValueType1; typedef decltype((*std::declval()).second) InnerValueType2; typedef typename Iterator::iterator_category iterator_category; typedef std::pair value_type; typedef typename Iterator::difference_type difference_type; typedef value_type *pointer; typedef value_type &reference; OppositePairIterator() {} OppositePairIterator(const Iterator& it): mIt(it) {} OppositePairIterator& operator++() { ++mIt; return *this; } value_type operator*() const { return value_type((*mIt).second, (*mIt).first); } bool operator!=(const OppositePairIterator& it) const {return mIt != it.mIt;} bool operator==(const OppositePairIterator& it) const {return mIt == it.mIt;} private: Iterator mIt; }; /// As oppositePairRange(range(begin, end)). template Range> oppositePairRange( const Iterator& begin, const Iterator& end ) { return range>(begin, end); } /// Swaps the elements of the pairs in a range of pairs. /// /// Example: /// auto print = [](std::pair p) { /// std::cout << '(' << p.first << ',' << p.second << ')'; /// auto r = zip(intRange(1, 3), intRange(101, 103)); /// for (auto p : r) /// print(p); /// std::cout << '\n'; /// for (auto p : oppositePairRange(r)) /// print(p); /// /// The output will be /// /// (1,101)(2,102)(3,103) /// (101,1)(102,2)(103,3) template auto oppositePairRange( RangeParam&& r ) -> decltype(oppositePairRange(std::begin(r), std::end(r))) { return oppositePairRange(std::begin(r), std::end(r)); } /// As adjPairRange(range(begin, end)). template auto adjPairRange( const Iterator& begin, const Iterator& end ) -> decltype(oppositePairRange(zip(end, end, end, end))) { if (begin == end) return oppositePairRange(zip(end, end, end, end)); // This is a bit tricky. What we really want is // zip(begin, end - 1, begin + 1, end) // The -1 is bad because we want this to work for forward iterators // that do not have operator--(). We cannot just leave out the -1 because // zip defines the length of the range according to the first component // range. However, if we swap the ranges around to // zip(begin + 1, end, begin, end - 1) // then we can replace this by // zip(begin + 1, end, begin, end) // because zip does not actually care about the length of the second range. // The problem now is that the pairs of elements will be the wrong way // around, but oppositePairRange solves that nicely. auto pastBegin = begin; ++pastBegin; return oppositePairRange(zip(pastBegin, end, begin, end)); } template auto adjPairRange( RangeParam&& r ) -> decltype(adjPairRange(std::begin(r), std::end(r))) { return adjPairRange(std::begin(r), std::end(r)); } // *** Flatten range of ranges into a single range namespace FlattenNamespace { template struct InnerIteratorType { typedef typename std::decay::type type; }; } /// Flatten is an iterator that iterates through each range in a range /// of ranges. The point is to enable the flatten() function defined /// further down in this header. This iterator is invalidated whenever /// the outer range or any of the inner ranges invalidate any iterator /// or change their number of elements. template class Flatten { public: // Yes, it would inded make more sense to inline what InnerIteratorType<> // does here. That worked fine on gcc 4.7.3. It did not compile on // MSVC 2012. I spent a lot of time trying to track down the problem // and as far as I can tell, it is a compiler bug. The work-around // with InnerIteratorType works and I'm going to leave it at that. typedef typename FlattenNamespace::InnerIteratorType::type InnerIterator; typedef typename std::iterator_traits::difference_type difference_type; typedef typename std::iterator_traits::value_type value_type; typedef typename std::iterator_traits::pointer pointer; typedef typename std::iterator_traits::reference reference; // It would be possible to do something fancy here to identify the exact // most general iterator category. I have not done that since I have not // needed it so far. typedef std::forward_iterator_tag iterator_category; Flatten() {} Flatten(const OuterIterator outerBegin, const OuterIterator outerEnd): mOuter(outerBegin), mOuterEnd(outerEnd) { adjustOuter(); MATHICGB_ASSERT(debugAssertValid()); } Flatten& operator++() { MATHICGB_ASSERT(debugAssertValid()); MATHICGB_ASSERT(!atEnd()); MATHICGB_ASSERT(mInner != std::end(*mOuter)); ++mInner; if (mInner == std::end(*mOuter)) { ++mOuter; adjustOuter(); } MATHICGB_ASSERT(debugAssertValid()); return *this; } decltype(*std::declval()) operator*() const { MATHICGB_ASSERT(!atEnd()); return *mInner; } bool equal(const Flatten& f) const { MATHICGB_ASSERT(debugAssertValid()); MATHICGB_ASSERT(f.debugAssertValid()); if (atEnd()) return f.atEnd(); else if (f.atEnd()) return false; else return mInner == f.mInner; } bool debugAssertValid() const { MATHICGB_ASSERT(atEnd() || mInner != std::end(*mOuter)); return true; } private: bool atEnd() const {return mOuter == mOuterEnd;} void adjustOuter() { for (; !atEnd(); ++mOuter) { if (std::begin(*mOuter) != std::end(*mOuter)) { mInner = std::begin(*mOuter); return; } } } InnerIterator mInner; OuterIterator mOuter; OuterIterator mOuterEnd; }; template bool operator==( const Flatten& a, const Flatten& b ) { return a.equal(b); } template bool operator!=( const Flatten& a, const Flatten& b ) { return !(a == b); } template Flatten makeFlatten( OuterIterator outerIterator, OuterIterator outerEnd ) { return Flatten(outerIterator, outerEnd); } /// As flatten(range(begin, end)). template Range> flatten( OuterIterator outerBegin, OuterIterator outerEnd ) { return range( makeFlatten(outerBegin, outerEnd), makeFlatten(outerEnd, outerEnd) ); } /// Constructs a range of the union of all (inner) ranges in outerRange. /// /// Example: /// std::vector> v(3); /// v[0].push_back(1); /// v[2].push_back(2); /// v[2].push_back(3); /// for (const auto& i : flatten(v)) /// std::cout << i << ' '; /// /// The output is "1 2 3 "; template auto flatten( OuterRange&& outerRange ) -> decltype(flatten(std::begin(outerRange), std::end(outerRange))) { return flatten(std::begin(outerRange), std::end(outerRange)); } MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/Unchar.hpp0000664000175000017500000000260314560325357013125 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_UNCHAR_GUARD #define MATHICGB_UNCHAR_GUARD #include MATHICGB_NAMESPACE_BEGIN /// std::ostream and std::istream handle characters differently from /// other integers. That is not desired when using char as an /// integer. Use Unchar and unchar() to cast chars to a different type /// that get handled as other integers do. template struct Unchar {typedef T type;}; // Strange but true: char, signed char and unsigned char are 3 // distinct types. Also, the signedness of char is unspecified. This // is in contrast to all the other built-in types. For example, int // and signed int are always the exact same type. namespace UncharInternal { // Two cases depending on whether char is signed or not. template::value> struct ExtendedChar {typedef signed short type;}; template<> struct ExtendedChar {typedef unsigned short type;}; }; template<> struct Unchar { typedef UncharInternal::ExtendedChar<>::type type; }; template<> struct Unchar {typedef short type;}; template<> struct Unchar {typedef unsigned short type;}; template typename Unchar::type unchar(const T& t) {return t;} MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/PolyRing.hpp0000664000175000017500000005406014560325357013454 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_POLY_RING_GUARD #define MATHICGB_POLY_RING_GUARD #include "MonoMonoid.hpp" #include "PrimeField.hpp" #include #include #include #include #include #include #include MATHICGB_NAMESPACE_BEGIN #define LT (-1) #define EQ 0 #define GT 1 template PrimeField< typename std::make_unsigned< typename std::remove_reference::type >::type > makeField(T charac) { return charac; } /** Returns a^-1 mod modulus. It is required that 0 < a < modulus. */ template T modularInverse(T a, T modulus) { MATHICGB_ASSERT(0 < a); MATHICGB_ASSERT(a < modulus); auto f = makeField(modulus); return f.inverse(f.toElementInRange(a)).value(); } template struct ModularProdType {}; template<> struct ModularProdType {typedef uint16 type;}; template<> struct ModularProdType {typedef uint32 type;}; template<> struct ModularProdType {typedef uint64 type;}; template<> struct ModularProdType {typedef int16 type;}; template<> struct ModularProdType {typedef int32 type;}; template<> struct ModularProdType {typedef int64 type;}; /** Returns a*b mod modulus. It is required that 0 <= a, b < modulus. */ template T modularProduct(T a, T b, T modulus) { MATHICGB_ASSERT(0 < a); MATHICGB_ASSERT(a < modulus); MATHICGB_ASSERT(0 <= b); MATHICGB_ASSERT(b < modulus); auto f = makeField(modulus); return f.product(f.toElementInRange(a), f.toElementInRange(b)).value(); } /** Returns a+b mod modulus. It is required that 0 <= a, b < modulus. */ template T modularSum(T a, T b, T modulus) { MATHICGB_ASSERT(0 < a); MATHICGB_ASSERT(a < modulus); MATHICGB_ASSERT(0 <= b); MATHICGB_ASSERT(b < modulus); auto f = makeField(modulus); return f.sum(f.toElementInRange(a), f.toElementInRange(b)).value(); } /** Returns -a mod modulus. It is required that 0 <= a < modulus. */ template T modularNegative(T a, T modulus) { MATHICGB_ASSERT(0 < a); MATHICGB_ASSERT(a < modulus); auto f = makeField(modulus); return f.negative(f.toElementInRange(a)).value(); } /** Returns -a mod modulus. It is required that 0 < a < modulus. */ template T modularNegativeNonZero(T a, T modulus) { MATHICGB_ASSERT(0 < a); MATHICGB_ASSERT(a < modulus); auto f = makeField(modulus); return f.negativeNonZero(f.toElementInRange(a)).value(); } typedef int32 exponent ; typedef uint32 HashValue; typedef long coefficient; typedef MonoMonoid Monoid; /// This typedef should really be for an unsigned type. typedef PrimeField Field; typedef exponent* vecmonomial; // includes a component typedef coefficient const_coefficient; #define OLDMON #ifdef OLDMON class Monomial; class ConstMonomial { friend class PolyRing; friend class OrderA; friend class OrderB; friend class OrderC; friend class OrderD; friend class OrderE; public: //* Wrap a raw pointer to create a monomial // Assumptions: // 1. This is done in the presence of a PolyRing // 2. Space for the monomial has been created ConstMonomial() : mValue(0) {} ConstMonomial(const exponent *val) : mValue(val) {} inline const Monomial& castAwayConst() const; bool isNull() const { return mValue == 0; } exponent const * unsafeGetRepresentation() const { return mValue; } exponent component() const { return *mValue; } operator Monoid::ConstMonoRef() const { MATHICGB_ASSERT(!isNull()); return Monoid::toRef(mValue); } operator Monoid::ConstMonoPtr() const { return Monoid::toRef(mValue).ptr(); } private: const exponent& operator[](size_t index) const { return mValue[index]; } const exponent& operator*() const { return *mValue; } protected: exponent const* mValue; }; class Monomial : public ConstMonomial { friend class PolyRing; friend class OrderA; friend class OrderB; friend class OrderC; friend class OrderD; friend class OrderE; public: //* Wrap a raw pointer to create a monomial // Assumptions: // 1. This is done in the presence of a PolyRing // 2. Space for the monomial has been created Monomial() : ConstMonomial() {} Monomial(exponent *val) : ConstMonomial(val) {} void swap(Monomial& monomial) { std::swap(mValue, monomial.mValue); } exponent * unsafeGetRepresentation() { return const_cast(mValue); } exponent const * unsafeGetRepresentation() const { return mValue; } operator Monoid::MonoRef() { MATHICGB_ASSERT(!isNull()); return Monoid::toRef(unsafeGetRepresentation()); } operator Monoid::MonoPtr() { return Monoid::toRef(unsafeGetRepresentation()).ptr(); } private: const exponent& operator[](size_t index) const { return mValue[index]; } exponent& operator[](size_t index) { return unsafeGetRepresentation()[index]; } const exponent& operator*() const { return *mValue; } exponent& operator*() { return * const_cast(mValue); } }; inline const Monomial& ConstMonomial::castAwayConst() const { return reinterpret_cast(*this); } typedef Monomial monomial; typedef ConstMonomial const_monomial; #else typedef MonoMonoid::MonoPtr monomial; typedef MonoMonoid::MonoPtr Monomial; typedef MonoMonoid::ConstMonoPtr const_monomial; typedef MonoMonoid::ConstMonoPtr ConstMonomial; #endif struct NewConstTerm { coefficient coef; MonoMonoid::ConstMonoPtr mono; }; struct NewTerm { coefficient coef; MonoMonoid::MonoPtr mono; operator NewConstTerm() const { NewConstTerm t = {coef, mono}; return t; } }; struct const_term { const_term() {} const_term(const_coefficient c, const_monomial m) : coeff(c), monom(m) {} const_coefficient coeff; const_monomial monom; }; struct term { term() {} term(coefficient c, monomial m) : coeff(c), monom(m) {} coefficient coeff; monomial monom; operator const_term() const {return const_term(coeff, monom);} }; class PolyRing { public: typedef MonoMonoid Monoid; /// This typedef should really be for an unsigned type. typedef PrimeField Field; /// @todo: make this dependent on the monoid and field once all code /// has been migrated from ::term to PolyRing::Term. typedef mgb::term Term; PolyRing( coefficient charac, int nvars, bool lexBaseOrder, std::vector&& weights ); PolyRing(const Field& field, Monoid&& monoid); size_t getMemoryUse() const { // todo: Make this more accurate. return 0; } coefficient charac() const { return mField.charac(); } size_t getNumVars() const { return varCount();} size_t varCount() const {return monoid().varCount();} // Allocate a monomial from an arena A. // This monomial may only be freed if no other elements that were allocated // later are live on A. In this case, use freeMonomial(A,m) to free 'm'. Monomial allocMonomial(memt::Arena &A) const { exponent* ptr = static_cast(A.alloc(maxMonomialByteSize())); #ifdef MATHICGB_DEBUG // fill with value that do not make sense to catch bugs in debug // mode. The maximum value of setting all bits increases the // chances of getting an assert. std::fill_n(reinterpret_cast(ptr), maxMonomialByteSize(), ~static_cast(0)); #endif return ptr; } // Free monomial 'm' obtained by allocMonomial(A) by calling // freeMonomial(A,m) Recall this only works if this was the last // thing allocated in A. void freeTopMonomial(memt::Arena &A, Monomial m) const { A.freeTop(m.unsafeGetRepresentation()); } // Allocate a monomial from a pool that has had its size set to // maxMonomialByteSize() // Free monomials here using the SAME pool Monomial allocMonomial(memt::BufferPool &P) const { exponent* ptr = static_cast(P.alloc()); #ifdef MATHICGB_DEBUG // fill with value that do not make sense to catch bugs in debug // mode. The maximum value of setting all bits increases the // chances of getting an assert. std::fill_n(reinterpret_cast(ptr), maxMonomialByteSize(), ~static_cast(0)); #endif return ptr; } // Free monomial 'm' obtained by allocMonomial(P) // by calling freeMonomial(P,m) void freeMonomial(memt::BufferPool &P, Monomial m) const { P.free(m.unsafeGetRepresentation()); } // Only call this method for monomials returned by allocMonomial(). void freeMonomial(Monomial m) const { monoid().freeRaw(Monoid::MonoPtr(m)); } // Free monomials allocated here by calling freeMonomial(). monomial allocMonomial() const { return Monoid::rawPtr(monoid().alloc().release()); } bool fromPool(ConstMonomial m) const { return monoid().fromPool(m); } coefficient toCoefficient(int64 value) const; coefficient coefficientNegate(coefficient coeff) const; coefficient coefficientNegateNonZero(coefficient coeff) const; coefficient coefficientSubtract(coefficient a, coefficient b) const; void coefficientFromInt(coefficient &result, int a) const; void coefficientSetOne(coefficient &result) const { result = 1; } void coefficientAddOneTo(coefficient &result) const; void coefficientReciprocalTo(coefficient &result) const; void coefficientNegateTo(coefficient &result) const; // result = -result void coefficientAddTo(coefficient &result, coefficient a, coefficient b) const; // result += a*b void coefficientAddTo(coefficient &result, coefficient a) const; // result += a void coefficientMultTo(coefficient &result, coefficient a) const; // result *= a void coefficientMult(coefficient a, coefficient b, coefficient &result) const; // result = a*b void coefficientDivide(coefficient a, coefficient b, coefficient &result) const; // result /= a void coefficientSet(coefficient &result, coefficient a) const { result = a; } bool coefficientIsZero(coefficient a) const { return a == 0; } bool coefficientIsOne(coefficient a) const { return a == 1; } bool coefficientEQ(coefficient a, coefficient b) const { return a == b; } size_t maxMonomialByteSize() const { return maxMonomialSize() * sizeof(exponent); } size_t maxMonomialSize() const { return monoid().entryCount(); } /////////////////////////////////////////// // Monomial Routines ////////////////////// /////////////////////////////////////////// HashValue monomialHashValue(ConstMonomial m) const { return monoid().hash(m); } void monomialSetExponent(Monomial m, size_t var, exponent c) const { monoid().setExponent(var, c, m); } void monomialSetExternalExponents(Monomial m, exponent* exponents) const { monoid().setExternalExponents(exponents, m); } exponent monomialExponent(ConstMonomial m, size_t var) const { return monoid().exponent(m, var); } // This function only sets component and the monomial itself. NOT weights, degree, or hash value //TODO: get Bjarke to name this function!! void mysteriousSPairMonomialRoutine(ConstMonomial newSig, ConstMonomial newLead, ConstMonomial baseDivSig, ConstMonomial baseDivLead, Monomial result) const; // Returns the weight (degree) of a. Takes the first weight if // working with several weight vectors. exponent weight(ConstMonomial a) const; void setWeightsAndHash(Monomial& a) const; inline void setWeightsOnly(Monomial& a) const; inline void setHashOnly(Monomial& a) const; // returns LT, EQ, or GT, depending on sig ? (m2 * sig2). int monomialCompare(ConstMonomial a, ConstMonomial b) const; // returns LT, EQ or GT int monomialCompare(ConstMonomial sig, ConstMonomial m2, ConstMonomial sig2) const; // If this method returns true for monomials a and b then it is guaranteed // the multiplying a and b together will not overflow the underlying // exponent integer. Does not work for negative exponents. bool monomialHasAmpleCapacity(ConstMonomial mono) const; bool monomialLT(ConstMonomial a, ConstMonomial b) const { return monoid().lessThan(a, b); } bool monomialEQ(ConstMonomial a, ConstMonomial b) const; /// as monomialEQ, but optimized for the case that the answer is true. bool monomialEqualHintTrue(ConstMonomial a, ConstMonomial b) const; exponent monomialGetComponent(ConstMonomial a) const { return *a.mValue; } void monomialChangeComponent(Monomial a, int x) const { monoid().setComponent(x, a); } void monomialSetIdentity(Monomial& result) const; void monomialEi(Monoid::Component i, Monomial &result) const; void monomialMult(ConstMonomial a, ConstMonomial b, Monomial &result) const; void monomialMultTo(Monomial &a, ConstMonomial b) const; // a *= b /// Result is set to b/a. a must divide b. void monomialDivide(ConstMonomial a, ConstMonomial b, Monomial &result) const; /// sets result to a/b, even if that produces negative exponents. void monomialDivideToNegative(ConstMonomial a, ConstMonomial b, Monomial &result) const; /// Sets aColonB = a:b and bColonA = b:a. void monomialColons(ConstMonomial a, ConstMonomial b, monomial aColonB, monomial bColonA) const; /// returns true if b divides a. Components are ignored. bool monomialIsDivisibleBy(ConstMonomial a, ConstMonomial b) const; /// Returns true if ab is the product of a and b. bool monomialIsProductOf (ConstMonomial a, ConstMonomial b, ConstMonomial ab) const; /// As monomialIsProductOf but optimized for the case that the result /// is true. bool monomialIsProductOfHintTrue (ConstMonomial a, ConstMonomial b, ConstMonomial ab) const; /// As monomialIsProductOfHintTwo(), but checks two products are equal. /// The return value is true if a1*b = a1b and a2*b = a2b. MATHICGB_INLINE bool monomialIsTwoProductsOfHintTrue( ConstMonomial a1, ConstMonomial a2, ConstMonomial b, ConstMonomial a1b, ConstMonomial a2b) const; /// Returns the hash of the product of a and b. HashValue monomialHashOfProduct(ConstMonomial a, ConstMonomial b) const { return monoid().hashOfProduct(a, b); } void monomialCopy(ConstMonomial a, Monomial &result) const; void monomialQuotientAndMult(ConstMonomial a, ConstMonomial b, ConstMonomial c, Monomial& result) const; // result is set to (a//b) * c inline bool monomialRelativelyPrime(ConstMonomial a, ConstMonomial b) const; void monomialFindSignature(ConstMonomial v1, ConstMonomial v2, ConstMonomial u1, Monomial& t1) const; // answer into the already allocated t1 size_t monomialSizeOfSupport(ConstMonomial m) const; inline void monomialLeastCommonMultiple(ConstMonomial a, ConstMonomial b, Monomial& l) const; bool monomialIsLeastCommonMultiple(ConstMonomial a, ConstMonomial b, ConstMonomial l) const; // Returns true if there is a variable var such that hasLarger raises var to // a strictly greater exponent than both smaller1 and smaller2 does. inline bool monomialHasStrictlyLargerExponent( ConstMonomial hasLarger, ConstMonomial smaller1, ConstMonomial smaller2) const; void monomialParse(std::istream& i, Monomial& result) const; void monomialDisplay(std::ostream& o, ConstMonomial a, bool print_comp=true, bool print_one=true) const; void monomialDisplay(FILE* file, ConstMonomial a, bool printComponent = true, bool printOne = true) const; void printMonomialFrobbyM2Format(std::ostream& out, ConstMonomial m) const; /////////////////////////////////////////// /////////////////////////////////////////// const Monoid& monoid() const {return mMonoid;} const Field& field() const {return mField;} private: Field mField; Monoid mMonoid; }; inline exponent PolyRing::weight(ConstMonomial a) const { return monoid().degree(a); } //////////////////////////////////////////////// // New Monomial Routines /////////////////////// //////////////////////////////////////////////// inline bool PolyRing::monomialEQ(ConstMonomial a, ConstMonomial b) const { return monoid().equal(a, b); } inline bool PolyRing::monomialEqualHintTrue( const ConstMonomial a, const ConstMonomial b ) const { return monoid().equalHintTrue(a, b); } inline bool PolyRing::monomialIsProductOfHintTrue( const ConstMonomial a, const ConstMonomial b, const ConstMonomial ab ) const { return monoid().isProductOfHintTrue(a, b, ab); } MATHICGB_INLINE bool PolyRing::monomialIsTwoProductsOfHintTrue( const ConstMonomial a1, const ConstMonomial a2, const ConstMonomial b, const ConstMonomial a1b, const ConstMonomial a2b ) const { return monoid().isTwoProductsOfHintTrue(a1, a2, b, a1b, a2b); } inline bool PolyRing::monomialIsProductOf( ConstMonomial a, ConstMonomial b, ConstMonomial ab ) const { return monoid().isProductOf(a, b, ab); } inline void PolyRing::monomialMult(ConstMonomial a, ConstMonomial b, Monomial &result) const { monoid().multiply(a, b, result); } inline void PolyRing::setWeightsOnly(Monomial& a1) const { monoid().setOrderData(a1); } inline void PolyRing::setHashOnly(Monomial& a1) const { monoid().setHash(a1); } inline int PolyRing::monomialCompare(ConstMonomial a, ConstMonomial b) const // returns LT, EQ or GT { return monoid().compare(a, b); } inline bool PolyRing::monomialIsDivisibleBy(ConstMonomial a, ConstMonomial b) const { return monoid().divides(b, a); } inline void PolyRing::monomialDivide(ConstMonomial a, ConstMonomial b, Monomial& result) const { return monoid().divide(b, a, result); } inline void PolyRing::monomialColons( ConstMonomial a, ConstMonomial b, monomial aColonB, monomial bColonA ) const { monoid().colons(a, b, aColonB, bColonA); } inline void PolyRing::monomialDivideToNegative(ConstMonomial a, ConstMonomial b, Monomial& result) const { monoid().divideToNegative(b, a, result); } inline bool PolyRing::monomialRelativelyPrime(ConstMonomial a, ConstMonomial b) const { return monoid().relativelyPrime(a, b); } inline void PolyRing::monomialLeastCommonMultiple( ConstMonomial a, ConstMonomial b, Monomial& l) const { monoid().lcm(a, b, l); } inline bool PolyRing::monomialHasStrictlyLargerExponent( ConstMonomial hasLarger, ConstMonomial smaller1, ConstMonomial smaller2) const { return !monoid().dividesLcm(hasLarger, smaller1, smaller2); } //////////////////////////////////////////////// // Old Monomial Routines /////////////////////// //////////////////////////////////////////////// inline bool PolyRing::monomialIsLeastCommonMultiple( ConstMonomial a, ConstMonomial b, ConstMonomial l) const { return monoid().isLcm(a, b, l); } inline void PolyRing::coefficientReciprocalTo(coefficient& result) const { result = field().inverse(field().toElementInRange(result)).value(); } inline void PolyRing::coefficientDivide(coefficient a, coefficient b, coefficient &result) const // result = a/b { result = field().quotient (field().toElementInRange(a), field().toElementInRange(b)).value(); } inline void PolyRing::coefficientFromInt(coefficient &result, int a) const { result = field().toElement(a).value(); } inline void PolyRing::coefficientAddOneTo(coefficient &result) const { result = field().plusOne(field().toElementInRange(result)).value(); } inline void PolyRing::coefficientNegateTo(coefficient& result) const { result = field().negative(field().toElementInRange(result)).value(); } inline coefficient PolyRing::toCoefficient(const int64 value) const { return field().toElement(value).value(); } inline coefficient PolyRing::coefficientNegate(const coefficient coeff) const { return field().negative(field().toElementInRange(coeff)).value(); } inline coefficient PolyRing::coefficientNegateNonZero( const coefficient coeff ) const { return field().negativeNonZero(field().toElementInRange(coeff)).value(); } inline coefficient PolyRing::coefficientSubtract( const coefficient a, const coefficient b ) const { return field().difference (field().toElementInRange(a), field().toElementInRange(b)).value(); } inline void PolyRing::coefficientAddTo (coefficient &result, coefficient a, coefficient b) const // result += a*b { const auto prod = field().product(field().toElementInRange(a), field().toElementInRange(b)); result = field().sum(field().toElementInRange(result), prod).value(); } inline void PolyRing::coefficientAddTo(coefficient &result, coefficient a) const // result += a { result = field().sum (field().toElementInRange(result), field().toElementInRange(a)).value(); } inline void PolyRing::coefficientMultTo (coefficient &result, coefficient a) const // result *= a { result = field().product (field().toElementInRange(result), field().toElementInRange(a)).value(); } inline void PolyRing::coefficientMult (coefficient a, coefficient b, coefficient &result) const { result = field().product (field().toElementInRange(a), field().toElementInRange(b)).value(); } inline bool PolyRing::monomialHasAmpleCapacity(ConstMonomial mono) const { return monoid().hasAmpleCapacity(mono); } /// Returns true if a and b are the same object. inline bool operator==(const PolyRing& a, const PolyRing& b) { return &a == &b; } /// As !(a == b). inline bool operator!=(const PolyRing& a, const PolyRing& b) { return !(a == b); } MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/SparseMatrix.hpp0000664000175000017500000003502414560325357014332 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_SPARSE_MATRIX_GUARD #define MATHICGB_SPARSE_MATRIX_GUARD #include "RawVector.hpp" #include "PolyRing.hpp" #include #include #include #include #include #include #include MATHICGB_NAMESPACE_BEGIN class Poly; /** A class that implements a sparse matrix. These are the mathematical concepts involved: Sparse matrix: a sequence of sparse rows. Sparse row: a seqence of entries. Entry: a pair (i,s) where i is a column index and s is a scalar. You add a row by adding all entries in the row and then calling rowDone(). You cannot add entries to a row once it has been created, so in that sense this class is append-only. However, you are free to change the indices and the scalars in the entries that are already there. Entries are not automatically reordered by this class, so your rows will be in increasing order of index only if you make them like that. Adding an entry or a row can invalidate all pointers/references to entries in the matrix and all iterators. This is true even if the entry has been added but it has not been put in a new row yet by calling rowDone. There is no special treatment of entries whose scalar is zero. For example they still count as entries in relation to entryCount(). Currently this is not a template class so you can get by without using the typedefs offered, for example using uint16 instead of SparseMatrix::Scalar. Please use the typedefs to make it easier to support a wider range of types of matrices in future. */ class SparseMatrix { public: typedef uint32 RowIndex; typedef uint32 ColIndex; typedef uint16 Scalar; class ConstRowIterator; class RowIterator; /// Construct a matrix with no rows. SparseMatrix(const size_t memoryQuantum = 0): mMemoryQuantum(memoryQuantum) {} SparseMatrix(SparseMatrix&& matrix): mRows(std::move(matrix.mRows)), mBlock(std::move(matrix.mBlock)), mMemoryQuantum(matrix.mMemoryQuantum) { } SparseMatrix& operator=(SparseMatrix&& matrix) { this->~SparseMatrix(); new (this) SparseMatrix(std::move(matrix)); return *this; } SparseMatrix(const SparseMatrix& matrix) { *this = matrix; } ~SparseMatrix() {clear();} SparseMatrix& operator=(const SparseMatrix&); void swap(SparseMatrix& matrix); bool operator==(const SparseMatrix& matrix) const; bool operator!=(const SparseMatrix& matrix) const { return !(*this == matrix); } // Removes all rows from *this. void clear(); /// Appends the rows from matrix to this object. Avoids most of the copies /// that would otherwise be required for a big matrix insert by taking /// the memory out of matrix. void takeRowsFrom(SparseMatrix&& matrix); RowIndex rowCount() const {return static_cast(mRows.size());} ColIndex computeColCount() const; size_t memoryQuantum() const {return mMemoryQuantum;} /// Returns number of non-zero entries divide by the product of the number of /// rows times the number of columns. So it is the proportion of non-zero /// entries. float computeDensity() const; /// Returns the number of entries in the whole matrix. Is not constant time /// so avoid calling too many times. size_t entryCount() const; /// Returns the number of bytes of memory allocated by this object. Is not /// constant time so avoid calling too many times. size_t memoryUse() const; size_t memoryUseTrimmed() const; /// Returns the number of entries in the given row. ColIndex entryCountInRow(RowIndex row) const { MATHICGB_ASSERT(row < rowCount()); return mRows[row].size(); } /// Returns true if the given row has no entries. bool emptyRow(RowIndex row) const { MATHICGB_ASSERT(row < rowCount()); return mRows[row].empty(); } ConstRowIterator rowBegin(RowIndex row) const { MATHICGB_ASSERT(row < rowCount()); const Row& r = mRows[row]; return ConstRowIterator(r.mIndicesBegin, r.mScalarsBegin); } RowIterator rowBegin(RowIndex row) { MATHICGB_ASSERT(row < rowCount()); const Row& r = mRows[row]; return RowIterator(r.mIndicesBegin, r.mScalarsBegin); } ConstRowIterator rowEnd(RowIndex row) const { MATHICGB_ASSERT(row < rowCount()); const Row& r = mRows[row]; return ConstRowIterator(r.mIndicesEnd, r.mScalarsEnd); } RowIterator rowEnd(RowIndex row) { MATHICGB_ASSERT(row < rowCount()); const Row& r = mRows[row]; return RowIterator(r.mIndicesEnd, r.mScalarsEnd); } /// Returns the index of the first entry in the given row. This is /// the first entry that you added to the row - so not necessarily the /// minimum column index in that row. The row in question must have at /// least one entry. ColIndex leadCol(RowIndex row) const { MATHICGB_ASSERT(row < rowCount()); MATHICGB_ASSERT(!emptyRow(row)); return *mRows[row].mIndicesBegin; } /// Prints the matrix in a human readable format to out. /// Useful for debugging. void print(std::ostream& out) const; void printStatistics(std::ostream& out) const; std::string toString() const; /// Removes the leading trimThisMany columns. The columns are /// removed by replacing all column indices col by col - /// trimThisMany. No entry can have a column index less than /// trimThisMany, even if the scalar of that entry is set to zero. void trimLeadingZeroColumns(ColIndex trimThisMany); /// Ensure that there is enough space for at least freeCount additional /// entries without needing to allocate more memory for entries. /// Pending entries that are not fixed into a row yet do not count as /// free for this calculation. void reserveFreeEntries(size_t freeCount); /// Preallocate space for at least count rows. This is separate from the /// space to store the entries in those rows. void reserveRows(size_t count) {mRows.reserve(count);} /// Adds a new row that contains all terms that have been appended /// since the last time a row was added or the matrix was created. void rowDone() { MATHICGB_ASSERT(mBlock.mColIndices.size() == mBlock.mScalars.size()); Row row; row.mIndicesEnd = mBlock.mColIndices.end(); row.mScalarsEnd = mBlock.mScalars.end(); if (mBlock.mHasNoRows) { row.mIndicesBegin = mBlock.mColIndices.begin(); row.mScalarsBegin = mBlock.mScalars.begin(); mBlock.mHasNoRows = false; } else { row.mIndicesBegin = mRows.back().mIndicesEnd; row.mScalarsBegin = mRows.back().mScalarsEnd; } mRows.push_back(row); } /// Appends an entry to the matrix. Will not appear in the matrix /// until rowDone is called. Do not call other methods that add rows /// after calling this method until rowDone has been called. inline void appendEntry(ColIndex colIndex, Scalar scalar) { MATHICGB_ASSERT(mBlock.mColIndices.size() == mBlock.mScalars.size()); MATHICGB_ASSERT(mBlock.mScalars.atCapacity() == mBlock.mColIndices.atCapacity()); if (mBlock.mScalars.atCapacity()) growEntryCapacity(); MATHICGB_ASSERT(!mBlock.mScalars.atCapacity()); MATHICGB_ASSERT(!mBlock.mColIndices.atCapacity()); mBlock.mColIndices.rawPushBack(colIndex); mBlock.mScalars.rawPushBack(scalar); MATHICGB_ASSERT(mBlock.mColIndices.size() == mBlock.mScalars.size()); } void appendRowAndNormalize(const SparseMatrix& matrix, RowIndex row, Scalar modulus); void appendRow(const SparseMatrix& matrix, RowIndex row); void appendRowWithModulus(const std::vector& v, Scalar modulus); template void appendRow(const std::vector& v, ColIndex leadCol = 0); void appendRowWithModulusNormalized(const std::vector& v, Scalar modulus); // Returns true if the row was non-zero. Otherwise the row was not // appended. bool appendRowWithModulusIfNonZero(const std::vector& v, Scalar modulus); /// Replaces all column indices i with colMap[i]. void applyColumnMap(const std::vector& colMap); void multiplyRow(RowIndex row, Scalar multiplier, Scalar modulus); /// Let poly be the dot product of colMonomials and the given row. void rowToPolynomial( RowIndex row, const std::vector& colMonomials, Poly& poly); /// Reorders the rows so that the index of the leading column in /// each row is weakly increasing going from top to bottom. Quite /// slow and it makes a copy internally. void sortRowsByIncreasingPivots(); /// Write *this and modulus to file. void write(Scalar modulus, FILE* file) const; /// Set *this to a matrix read from file and return the modulus from the file. Scalar read(FILE* file); /// Write a 0-1 bitmap in PBM format to file. This is useful for /// debugging as it allows visual inspection of large matrices. void writePBM(FILE* file); /// Iterates through the entries in a row. class ConstRowIterator { public: typedef const std::pair value_type; typedef ptrdiff_t difference_type; typedef size_t distance_type; typedef value_type* pointer; typedef value_type& reference; typedef std::random_access_iterator_tag iterator_category; ConstRowIterator& operator++() { ++mScalarIt; ++mColIndexIt; return *this; } ConstRowIterator& operator+=(difference_type i) { mScalarIt += i; mColIndexIt += i; return *this; } value_type operator*() const {return value_type(index(), scalar());} bool operator<(const ConstRowIterator& it) const { return mColIndexIt < it.mColIndexIt; } difference_type operator-(const ConstRowIterator& it) const { return mColIndexIt - it.mColIndexIt; } bool operator==(const ConstRowIterator& it) const { return mColIndexIt == it.mColIndexIt; } bool operator!=(const ConstRowIterator& it) const {return !(*this == it);} const Scalar& scalar() const {return *mScalarIt;} const ColIndex& index() const {return *mColIndexIt;} private: friend class SparseMatrix; ConstRowIterator( const ColIndex* const indicesIt, const Scalar* const scalarIt ): mColIndexIt(indicesIt), mScalarIt(scalarIt) { } const ColIndex* mColIndexIt; const Scalar* mScalarIt; }; /// Iterates through the entries in a row. class RowIterator { public: typedef const std::pair value_type; typedef ptrdiff_t difference_type; typedef size_t distance_type; typedef value_type* pointer; typedef value_type& reference; typedef std::random_access_iterator_tag iterator_category; RowIterator& operator++() { ++mScalarIt; ++mColIndexIt; return *this; } RowIterator& operator+=(difference_type i) { mScalarIt += i; mColIndexIt += i; return *this; } value_type operator*() const {return value_type(index(), scalar());} bool operator<(const RowIterator& it) const { return mColIndexIt < it.mColIndexIt; } difference_type operator-(const RowIterator& it) const { return mColIndexIt - it.mColIndexIt; } bool operator==(const RowIterator& it) const { return mColIndexIt == it.mColIndexIt; } bool operator!=(const RowIterator& it) const {return !(*this == it);} const Scalar& scalar() const {return *mScalarIt;} const ColIndex& index() const {return *mColIndexIt;} void setScalar(const Scalar scalar) {*mScalarIt = scalar;} void setIndex(const ColIndex index) {*mColIndexIt = index;} private: friend class SparseMatrix; RowIterator( ColIndex* const indicesIt, Scalar* const scalarIt ): mColIndexIt(indicesIt), mScalarIt(scalarIt) { } ColIndex* mColIndexIt; Scalar* mScalarIt; }; bool debugAssertValid() const; private: MATHICGB_NO_INLINE void growEntryCapacity(); /// Contains information about a row in the matrix. struct Row { Row(): mScalarsBegin(0), mScalarsEnd(0), mIndicesBegin(0), mIndicesEnd(0) {} Scalar* mScalarsBegin; Scalar* mScalarsEnd; ColIndex* mIndicesBegin; ColIndex* mIndicesEnd; bool empty() const {return mIndicesBegin == mIndicesEnd;} ColIndex size() const { return static_cast(std::distance(mIndicesBegin, mIndicesEnd)); } }; std::vector mRows; /// Memory is allocated a block at a time. This avoids the need for copying /// that a std::vector normally does on reallocation. Believe it or not, /// copying sparse matrix memory due to reallocation was accounting for 5% /// of the running time before this change. struct Block { Block(): mPreviousBlock(0), mHasNoRows(true) {} Block(Block&& block): mColIndices(std::move(block.mColIndices)), mScalars(std::move(block.mScalars)), mPreviousBlock(block.mPreviousBlock), mHasNoRows(block.mHasNoRows) { block.mPreviousBlock = 0; block.mHasNoRows = true; } void swap(Block& block) { std::swap(mColIndices, block.mColIndices); std::swap(mScalars, block.mScalars); std::swap(mPreviousBlock, block.mPreviousBlock); std::swap(mHasNoRows, block.mHasNoRows); } Block& operator=(Block&& block) { this->~Block(); new (this) Block(std::move(block)); return *this; } size_t memoryUse() const; size_t memoryUseTrimmed() const; /// We need a RawVector here to tie the checks for the need to reallocate /// together between mColIndices and mEntries. We only need to check /// the capacity once, which, believe it or not, is a significant performance /// win. Not least because it decreases the amount of code and therefore /// causes better compiler inlining decisions. RawVector mColIndices; RawVector mScalars; Block* mPreviousBlock; /// is null if there are no previous blocks bool mHasNoRows; /// true if no rows have been made from this block yet }; Block mBlock; size_t mMemoryQuantum; }; template void SparseMatrix::appendRow( std::vector const& v, const ColIndex leadCol ) { #ifdef MATHICGB_DEBUG for (auto col = leadCol; col < leadCol; ++col) { MATHICGB_ASSERT(v[col] == 0); } #endif const auto count = static_cast(v.size()); for (ColIndex col = leadCol; col < count; ++col) { MATHICGB_ASSERT(v[col] < std::numeric_limits::max()); if (v[col] != 0) appendEntry(col, static_cast(v[col])); } rowDone(); } inline void swap(SparseMatrix& a, SparseMatrix& b) { a.swap(b); } std::ostream& operator<<(std::ostream& out, const SparseMatrix& matrix); MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/io-util.hpp0000664000175000017500000000237014560325357013270 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_IO_UTIL_GUARD #define MATHICGB_IO_UTIL_GUARD #include "PolyRing.hpp" MATHICGB_NAMESPACE_BEGIN class Poly; class SigPolyBasis; class ModuleMonoSet; class PolyBasis; class Basis; std::unique_ptr ringFromString(std::string ringinfo); monomial monomialFromString(const PolyRing *R, std::string mon); monomial monomialParseFromString(const PolyRing *R, std::string mon); std::string monomialToString(const PolyRing *R, const_monomial mon); std::string monomialDisplay(const PolyRing *R, const_monomial mon); Monomial stringToMonomial(const PolyRing *R, std::string mon); std::string monomialToString(const PolyRing *R, const Monomial& mon); std::string toString(SigPolyBasis *); std::string toString(ModuleMonoSet *); std::string toString(SigPolyBasis *, int unused); // also displays signature std::string toString(Basis *); std::string toString(const Poly *); std::unique_ptr basisParseFromString(std::string str); std::unique_ptr polyParseFromString (const PolyRing *R, const std::string &s); void output(std::ostream &o, const PolyBasis &I); MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/RawVector.hpp0000664000175000017500000002035114560325357013621 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_RAW_VECTOR_GUARD #define MATHICGB_RAW_VECTOR_GUARD #include #include #include #include #include #include #include #include MATHICGB_NAMESPACE_BEGIN /// RawVector mimics std::vector except that it does not do memory management. /// So you can directly access the pointers to memory and you can replace them /// with any other pointers that you need to. /// /// Warning: RawVector is called raw because it does not allocate any memory, /// so it is an error to insert elements that there is not enough space for - /// you need to make sure ahead of time that there is enough space. /// /// This class makes it possible to have a lot of the convenience of the /// std::vector interface even in places where std::vector cannot be used /// because of a need for manual memory management. template class RawVector { public: typedef T& reference; typedef const T& const_reference; typedef T* iterator; typedef const T* const_iterator; typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef T* pointer; typedef const T* const_pointer; typedef std::reverse_iterator reverse_iterator; typedef std::reverse_iterator const_reverse_iterator; /// Initializes to the null state. RawVector(): mBegin(0), mEnd(0), mCapacityEnd(0) {} /// Copies the pointers from v. It is a shallow copy. RawVector(const RawVector& v): mBegin(v.mBegin), mEnd(v.mEnd), mCapacityEnd(v.mCapacityEnd) {} /// Copies the pointers from v. It is a shallow copy. Sets v to a null state. RawVector(RawVector&& v): mBegin(v.mBegin), mEnd(v.mEnd), mCapacityEnd(v.mCapacityEnd) { v.releaseMemory(); } RawVector(pointer begin, pointer end): mBegin(begin), mEnd(end), mCapacityEnd(end) {} RawVector(pointer begin, pointer end, pointer capacityEnd): mBegin(begin), mEnd(end), mCapacityEnd(capacityEnd) {} /// As clear() --- does not free memory. ~RawVector() { clear(); } /// There is no operator== to avoid confusion about whether it compares /// pointers or contents. Instead, there is this. bool contentsEqual(const RawVector& v) const { return std::equal(begin(), end(), v.begin()); } /// Copies the pointers from v. It is a shallow copy. RawVector& operator=(const RawVector& v) { mBegin = v.mBegin; mEnd = v.mEnd; mCapacityEnd = v.mCapacityEnd; return *this; } /// Copies the pointers from v. It is a shallow copy. Sets v to the null state. RawVector& operator=(RawVector&& v) { mBegin = v.mBegin; mEnd = v.mEnd; mCapacityEnd = v.mCapacityEnd; v.releaseMemory(); return *this; } iterator begin() {return mBegin;} const_iterator begin() const {return mBegin;} iterator end() {return mEnd;} const_iterator end() const {return mEnd;} reverse_iterator rbegin() {return reverse_iterator(end());} const_reverse_iterator rbegin() const {return const_reverse_iterator(end());} reverse_iterator rend() {return reverse_iterator(begin());} const_reverse_iterator rend() const {return const_reverse_iterator(begin());} size_type size() const {return mEnd - mBegin;} size_type max_size() const {return std::numeric_limits::max();} /// There must be enough capacity for the new size. void resize(const size_type newSize) { MATHICGB_ASSERT(newSize <= capacity()); while (newSize > size()) { new (mEnd) T(); ++mEnd; } while (newSize < size()) { --mEnd; mEnd->~T(); } MATHICGB_ASSERT(newSize == size()); } size_type capacity() const {return mCapacityEnd - mBegin;} bool empty() const {return mBegin == mEnd;} reference operator[](size_type index) { MATHICGB_ASSERT(index < size()); return mBegin[index]; } const_reference operator[](size_type index) const { MATHICGB_ASSERT(index < size()); return mBegin[index]; } reference at(size_type index) { if (index >= size()) throw std::out_of_range("Invalid index in RawVector::at."); return mBegin[index]; } const_reference at(size_type index) const { if (index >= size()) throw std::out_of_range("Invalid index in RawVector::at."); return mBegin[index]; } reference front() { MATHICGB_ASSERT(!empty()); return *mBegin; } const_reference front() const { MATHICGB_ASSERT(!empty()); return *mBegin; } reference back() { MATHICGB_ASSERT(!empty()); return *(mEnd - 1); } const_reference back() const { MATHICGB_ASSERT(!empty()); return *(mEnd - 1); } size_t memoryUse() const { return capacity() * sizeof(value_type); } size_t memoryUseTrimmed() const { return size() * sizeof(value_type); } /// There must be enough capacity for the new size. template void rawAssign(Iter begin, Iter end) { const size_t count = std::distance(begin, end); MATHICGB_ASSERT(count <= capacity()); if (count > size()) resize(count); std::copy(begin, end, mBegin); } /// There must be enough capacity for the new size. void rawAssign(size_type count, const T& t) { MATHICGB_ASSERT(count <= capacity()); if (count > size()) resize(count); std::fill_n(begin(), count, t); } /// There must be enough capacity for the new size. This is why there is no /// push_back and only a rawPushBack --- to remind you of the changed /// contract. void rawPushBack(const T& t) { MATHICGB_ASSERT(size() < capacity()); new (mEnd) T(t); ++mEnd; } void pop_back() { MATHICGB_ASSERT(!empty()); mEnd->~T(); --mEnd; } void swap(RawVector& v) { std::swap(mBegin, v.mBegin); std::swap(mEnd, v.mEnd); std::swap(mCapacityEnd, v.mCapacityEnd); } void clear() { while (!empty()) pop_back(); } // **** Extra functionality not available on std::vector // memcpy onto the end of the vector. void memcpy(const T* from, size_t countOfT) { MATHICGB_ASSERT(countOfT <= capacityToGo()); std::memcpy(mEnd, from, countOfT * sizeof(T)); mEnd += countOfT; } /// Unused capacity. size_t capacityToGo() const { return mCapacityEnd - mEnd; } /// Returns true if there is no more capacity left. That is, if /// capacity() == size(). bool atCapacity() const { return mEnd == mCapacityEnd; } /// Sets this object to its null state without destructing memory. Returns /// a pointer to the previous beginning of the buffer. pointer releaseMemory() { const auto oldBegin = mBegin; mBegin = 0; mEnd = 0; mCapacityEnd = 0; return oldBegin; } /// Takes over the new memory that is passed in, copies the old values to the /// new memory and destructs the old values. Returns a pointer to the previous /// beginning of the buffer. pointer setMemoryAndCopy( pointer begin, pointer capacityEnd ) { MATHICGB_ASSERT(size() <= static_cast(std::distance(begin, capacityEnd))); const auto oldBegin = mBegin; const auto end = std::copy(mBegin, mEnd, begin); *this = RawVector(begin, end, capacityEnd); return oldBegin; } /// Takes over the new memory that is passed in without destructing memory. /// Returns a pointer to the previous beginning of the buffer. pointer releaseAndSetMemory( pointer begin, pointer end, pointer capacityEnd ) { const auto oldBegin = mBegin; mBegin = begin; mEnd = end; mCapacityEnd = capacityEnd; return oldBegin; } /// Destructs memory and then takes over the new memory that is passed in. /// Does not deallocate the backing memory. Returns a pointer to the previous /// beginning of the buffer. pointer clearAndSetMemory( pointer begin, pointer end, pointer capacityEnd ) { clear(); const auto oldBegin = mBegin; mBegin = begin; mEnd = end; mCapacityEnd = capacityEnd; return oldBegin; } private: T* mBegin; T* mEnd; T* mCapacityEnd; }; MATHICGB_NAMESPACE_END namespace std { template void swap(mgb::RawVector& a, mgb::RawVector& b) { a.swap(b); } } #endif mathicgb-1.1/src/mathicgb/Basis.hpp0000664000175000017500000000255114560325357012750 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_BASIS_GUARD #define MATHICGB_BASIS_GUARD #include "Poly.hpp" #include "PolyRing.hpp" #include #include #include #include MATHICGB_NAMESPACE_BEGIN class Poly; /// A collection of polynomials. @todo: replace with just std::vector. // Really: a list of polynomials // BUT ALSO maybe: includes memory areas for the polynomials? class Basis { public: Basis(const PolyRing &R) : mRing(R) {} Basis(Basis&& basis): mRing(basis.ring()), mGenerators(std::move(basis.mGenerators)) {} void insert(std::unique_ptr&& p); const PolyRing& ring() const { return mRing; } const PolyRing *getPolyRing() const { return &mRing; } const std::vector< std::unique_ptr>& viewGenerators() { return mGenerators; } const Poly *getPoly(size_t i) const { MATHICGB_ASSERT(i < size()); return mGenerators[i].get(); } size_t size() const {return mGenerators.size();} bool empty() const {return mGenerators.empty();} void reserve(size_t size) {mGenerators.reserve(size);} void sort(); private: Basis(const Basis&); // not available const PolyRing& mRing; std::vector< std::unique_ptr> mGenerators; }; MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/LogDomain.hpp0000664000175000017500000002520014560325357013554 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_LOG_DOMAIN_GUARD #define MATHICGB_LOG_DOMAIN_GUARD #include "mtbb.hpp" #include #include #include MATHICGB_NAMESPACE_BEGIN /// A named area of logging that can be turned on or off at runtime and at /// compile time. /// /// A logger that is turned off at compile time emits no code /// into the executable and all the code that writes to that logger is also /// removed by the optimizer if it is written in the correct way. Use the /// logging macroes to ensure proper use so that compile-time disabled /// LogDomains properly have zero overhead. LogDomains can be turned on /// and off at compile time and at runtime individually. /// /// Compile-time enabled loggers automatically register themselves at start-up /// with LogDomainSet::singleton(). /// /// @todo: support turning all loggers off globally with a macro, regardless /// of their individual compile-time on/off setting. template class LogDomain {}; template<> class LogDomain { public: static const bool compileTimeEnabled = true; LogDomain( const char* const name, const char* const description, const bool enabled, const bool streamEnabled ); const char* name() const {return mName;} const char* description() const {return mDescription;} bool enabled() const {return mEnabled;} bool streamEnabledPure() const {return mStreamEnabled;} bool streamEnabled() const {return enabled() && streamEnabledPure();} void setEnabled(const bool enabled) {mEnabled = enabled;} void setStreamEnabled(const bool enabled) {mStreamEnabled = enabled;} std::ostream& stream(); /// Class for recording time that is logged. Movable. class Timer; /// Returns a started timer. Timer timer(); /// Returns true if any time has been logged on this logger, even if the /// duration of that time was zero (that is., less than the resolution /// of the timer). bool hasTime() const {return mHasTime;} double loggedSecondsReal() const; typedef unsigned long long Counter; Counter count() const {return mCount;} void setCount(const Counter counter) { if (enabled()) { mCount = counter; mHasCount = true; } } /// Returns true if setCount has been called. bool hasCount() const {return mHasCount;} /// Resets this object to the state it had when it was /// constructed. void reset(); private: struct TimeInterval { // todo: support user time too. clock() doesn't seem to sum the time // for all threads, so that didn't work. double realSeconds; void print(std::ostream& out) const; }; void recordTime(TimeInterval interval); bool mEnabled; const bool mOriginallyEnabled; bool mStreamEnabled; const bool mOriginallyStreamEnabled; const char* mName; const char* mDescription; TimeInterval mInterval; /// Total amount of time recorded on this log. bool mHasTime; /// Whether any time has been registered (even if 0s). Counter mCount; bool mHasCount; /// Whether the count has been set (even if set to zero) }; class LogDomain::Timer { public: /// Start the timer running. The elapsed time will be logged to the logger /// once the timer is stopped or destructed. Timer(LogDomain& logger); /// Stops the timer. ~Timer(); /// Returns true if the timer is currently recording time. bool running() const {return mTimerRunning;} /// Stops recording time and logs the elapsed time to the logger. /// /// This is a no-op if the timer is not running. If the logger /// is disabled then no time is logged. void stop(); /// Start recording time on a stopped timer. /// /// This is a no-op if the timer is already running or if the logger is /// disabled. void start(); private: LogDomain& mLogger; bool mTimerRunning; mtbb::tick_count mRealTicks; // high precision }; /// This is a compile-time disabled logger. You are not supposed to dynamically /// call any non-const methods on it other than the constructor. Code that /// calls other code will compile but it is an error if any of those /// methods get called at runtime. template<> class LogDomain { public: static const bool compileTimeEnabled = false; LogDomain(const char* const, const char* const, const bool) {} bool enabled() const {return false;} bool streamEnabled() const {return false;} class Timer { public: Timer(LogDomain&) {} bool running() const {return false;} void stop() {MATHICGB_ASSERT(false);} void start() {MATHICGB_ASSERT(false);} }; Timer timer() { MATHICGB_ASSERT(false); return Timer(*this); } std::ostream& stream() { MATHICGB_ASSERT(false); abort(); //return *static_cast< std::ostream*>(0); } typedef unsigned long long Counter; Counter count() const {return 0;} void setCount(const Counter counter) {MATHICGB_ASSERT(false);} bool hasCount() const {return false;} void reset() {} }; namespace LogDomainInternal { // Helpers for the logging macroes template struct SelectValue {static const bool value = Default;}; template struct Tag_ {}; template struct Tag_0 {}; template struct Tag_1 {}; template struct SelectValue, Default> {static const bool value = false;}; template struct SelectValue, Default> {static const bool value = true;}; template struct LambdaRunner {L& log;}; template LambdaRunner lambdaRunner(L& l) { LambdaRunner r = {l}; return r; } template void operator+(LambdaRunner runner, T&& lambda) { lambda(runner.log, runner.log.stream()); } struct LogAliasRegisterer { LogAliasRegisterer(const char* alias, const char* of); }; } MATHICGB_NAMESPACE_END /// Defines LogDomainInternal::value_##NAME to be equal to the value of /// the macro MATHICGB_LOG_##NAME if that macro expands to 0 or 1. Otherwise /// the macro MATHICGB_LOG_##NAME is ignored and instead DEFAULT_VALUE is used. #define MATHICGB_CAPTURE_LOG_ENABLED(NAME, DEFAULT_VALUE) \ namespace mgb{namespace LogDomainInternal { \ template struct Tag_MATHICGB_LOG_##NAME {}; \ typedef MATHICGB_CONCATENATE_AFTER_EXPANSION(Tag_, MATHICGB_LOG_##NAME) \ SelectedTag_##NAME; \ static const bool value_##NAME = \ SelectValue::value; \ }} /// Defines a LogDomain with the given name and description. /// /// The logger is default compile-time enabled depending on MATHICGB_LOG_##NAME /// (see MATHICGB_CAPTURE_LOG_ENABLED) and it is initially runtime /// enabled depending on the value of DEFAULT_RUNTIME_ENABLED. It is default /// runtime enabled for streaming (when also enabled in general) depending on /// DEFAULT_RUNTIME_STREAM_ENABLED. #define MATHICGB_DEFINE_LOG_DOMAIN_WITH_DEFAULTS( \ NAME, DESCRIPTION, \ DEFAULT_RUNTIME_ENABLED, \ DEFAULT_RUNTIME_STREAM_ENABLED, \ DEFAULT_COMPILE_TIME_ENABLED \ ) \ MATHICGB_CAPTURE_LOG_ENABLED(NAME, DEFAULT_COMPILE_TIME_ENABLED); \ namespace mgb{namespace logs { \ typedef LogDomain< ::mgb::LogDomainInternal::value_##NAME> Type##NAME; \ Type##NAME NAME( \ #NAME, \ DESCRIPTION, \ DEFAULT_RUNTIME_ENABLED, \ DEFAULT_RUNTIME_STREAM_ENABLED \ ); \ }} /// Defines a LogDomain with the given name and description. /// /// The defaults for the logger are as follows. /// compile-time: enabled, /// runtime: disabled, /// runtime streaming: enabled (only takes effect if also enabled) #define MATHICGB_DEFINE_LOG_DOMAIN(NAME, DESCRIPTION) \ MATHICGB_DEFINE_LOG_DOMAIN_WITH_DEFAULTS(NAME, DESCRIPTION, 0, 1, 1); #define MATHICGB_DEFINE_LOG_ALIAS(ALIAS, OF) \ namespace mgb{namespace LogDomainInternal { \ LogAliasRegisterer MATHICGB_CONCATENATE_AFTER_EXPANSION(reg_, __LINE__) \ (ALIAS, OF); \ }} /// This expression yields an l-value reference to the indicated logger. /// /// Example: /// auto timer = MATHICGB_LOGGER(MyDomain).timer(); #define MATHICGB_LOGGER(DOMAIN) ::mgb::logs::DOMAIN /// This expression yields the type of the indicated logger. /// /// Example: /// if (MATHICGB_LOGGER_TYPE(MyDomain)::compileTimeEnabled) /// std::ostream << "MyDomain is compiled time enabled"; #define MATHICGB_LOGGER_TYPE(DOMAIN) ::mgb::logs::Type##DOMAIN /// Runs the code in the following scope delimited by braces {} if the /// indicated logger is enabled for streaming - otherwise does /// nothing. Within the following scope there is a local reference /// variable log that refers to the indicated logger and a local /// reference variable stream that refers to log.stream(). /// /// Example: /// MATHICGB_IF_STREAM_LOG(MyDomain) { /// std::string msg; /// expensiveFunction(msg); /// stream << msg; // or log.stream() << msg; /// } #define MATHICGB_IF_STREAM_LOG(DOMAIN) \ if (MATHICGB_LOGGER(DOMAIN).streamEnabled()) \ LogDomainInternal::lambdaRunner(MATHICGB_LOGGER(DOMAIN)) + \ [&](MATHICGB_LOGGER_TYPE(DOMAIN)& log, std::ostream& stream) /// Display information to the log using <<. /// If domain is not enabled and stream enabled then the log message is not /// displayed and the code after << is not executed. /// /// Example: (f() only called if logger is enabled) /// MATHICGB_LOG(domain) << "f() = " << f(); #define MATHICGB_LOG(DOMAIN) \ if (MATHICGB_LOGGER(DOMAIN).streamEnabled()) MATHICGB_LOGGER(DOMAIN).stream() /// Will log the time to execute the remaining code in the current scope /// to the indicated domain. Also supports printing a message using <<. /// The message is printed right away while the time is printed when /// the scope ends. /// /// Example: /// MATHICGB_LOG_SCOPE_TIME(MyDomain) << "Starting timed task"; #define MATHICGB_LOG_TIME(DOMAIN) \ auto MATHICGB_CONCATENATE_AFTER_EXPANSION( \ DOMAIN, MATHICGB_CONCATENATE_AFTER_EXPANSION(_timer_, __LINE__)) \ (MATHICGB_LOGGER(DOMAIN).timer()); \ MATHICGB_LOG(DOMAIN) /// Increments the count of DOMAIN by the value of the expression BY. The /// expression BY is evaluated at most once and it is not evaluated if /// DOMAIN is disabled. /// /// Example: /// MATHICGB_LOG_INCREMENT_BY(MyDomain, 3); #define MATHICGB_LOG_INCREMENT_BY(DOMAIN, BY) \ do { \ auto& MGBLOG_log = MATHICGB_LOGGER(DOMAIN); \ if (MGBLOG_log.enabled()) { \ MGBLOG_log.setCount(MGBLOG_log.count() + BY); \ } \ } while (false) /// Increments the count of DOMAIN by 1. #define MATHICGB_LOG_INCREMENT(DOMAIN) \ MATHICGB_LOG_INCREMENT_BY(DOMAIN, 1) #endif mathicgb-1.1/src/mathicgb/Scanner.hpp0000664000175000017500000001746714560325357013314 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_SCANNER_GUARD #define MATHICGB_SCANNER_GUARD #include "PrimeField.hpp" #include "Unchar.hpp" #include #include #include #include #include #include #include #include MATHICGB_NAMESPACE_BEGIN /// This class offers an input interface which is more convenient and /// often more efficient than dealing with a FILE* or std::istream /// directly. It keeps track of the current line number to report /// better error messages. Only one Scanner should be reading from a /// given FILE* or std::istream due to buffering and line number counting. /// /// All input methods whose documentation does not specifically say /// otherwise skip whitespace. /// /// There are four concepts for consuming input through a Scanner: /// /// Read X: Require an X to be in the input, and return what is read. /// /// Expect X: Require the exact value X to be in the input and skip past it. /// /// Match X: Return true if the exact value X is in the input, and in that case /// skip past it. Otherwise return false and do nothing else. /// /// MatchRead X: Return true of an X is in the input. In that case, /// read the X into a reference parameter and return true. /// /// Peek X: Return true if X is the next thing int he input. Do not skip /// past anything. May or may not skip whitespace depending on what X is. /// /// If a requirement is not met, Scanner reports a syntax error. class Scanner { public: /// Construct a Scanner object reading from the input FILE*. Scanner(FILE* input); /// Construct a Scanner object reading from the input std::istream. Scanner(std::istream& input); /// Construct a Scanner object reading from the input string. Scanner(const char* const input); /// Construct a Scanner object reading from the input string. Scanner(const std::string& input); /// Reads a single character from the stream. int get(); /// Takes count characters off the stream. void ignore(size_t count); /// Return true if the next character is c, and in that case skip /// past it. bool match(char c); /// Return true if no more input. bool matchEOF(); bool match(const char* const str); /// Require the next character to be equal to expected. This /// character is skipped past. void expect(char expected); /// Require the next character to be equal to a or b. This character /// is skipped past. void expect(char a, char b); /// Require the following characters to be equal to str. These /// characters are skipped past. void expect(const char* str); /// Require the following characters to be equal to str. These /// characters are skipped past. void expect(const std::string& str) {expect(str.c_str());} /// Require that there is no more input. void expectEOF(); /// Reads a T. T must be an integer type with a std::numeric_limits /// specialization. Negative numbers are allows if T is signed. template T readInteger(bool negate = false); template typename PrimeField::Element readModular( const PrimeField& field, const bool negate = false ); /// Reads a T if it is there. Does not recognize + or - as the start /// of an integer. template bool matchReadIntegerNoSign(T& t, bool negate = false); /// Returns the next character or EOF. Does not skip whitespace. int peek() {return mChar;} /// Returns true if the next character is a digit. Does not skip /// whitespace. bool peekDigit() {return std::isdigit(peek());} bool peekAlpha() {return std::isalpha(peek());} /// Returns true if the next character is whitespace. Does not skip /// whitespace. Whitespace is defined by std::isspace(). bool peekWhite() {return isspace(peek());} /// Returns true if the next character is + or -. Does not skip /// whitespace. bool peekSign() {return peek() == '+' || peek() == '-';} /// Returns the number of newlines seen plus one. Does not skip /// whitespace. uint64 lineCount() const {return mLineCount;} /// Reads past any whitespace. inline void eatWhite(); void reportError(std::string msg) const; private: void errorExpectTwo(char a, char b, int got); void errorExpectOne(char expected, int got); void reportErrorUnexpectedToken(const std::string& expected, int got); void reportErrorUnexpectedToken (const std::string& expected, const std::string& got); bool ensureBuffer(size_t min); bool readBuffer(size_t minRead); FILE* mFile; std::istream* mStream; uint64 mLineCount; int mChar; // next character on stream std::vector mBuffer; std::vector::iterator mBufferPos; }; inline bool Scanner::matchEOF() { eatWhite(); return peek() == EOF; } inline bool Scanner::match(char c) { eatWhite(); if (c == peek()) { get(); return true; } else return false; } inline void Scanner::expect(char a, char b) { eatWhite(); int got = get(); if (got != a && got != b) errorExpectTwo(a, b, got); } inline void Scanner::expect(char expected) { eatWhite(); int got = get(); if (got != expected) errorExpectOne(expected, got); } inline void Scanner::eatWhite() { while (peekWhite()) get(); } inline int Scanner::get() { if (mChar == '\n') ++mLineCount; int oldChar = mChar; if (mBufferPos == mBuffer.end() && !readBuffer(1)) mChar = EOF; else { mChar = *mBufferPos; ++mBufferPos; } return oldChar; } inline void Scanner::ignore(size_t count) { for (size_t i = 0; i < count; ++i) get(); } template T Scanner::readInteger(const bool negate) { static_assert(std::numeric_limits::is_integer, ""); eatWhite(); const bool minus = !match('+') && match('-'); const bool positive = minus == negate; if (!peekDigit()) reportErrorUnexpectedToken("an integer", ""); // Skip leading zeroes and return if the number is zero. if (peek() == '0') { while (peek() == '0') get(); if (!peekDigit()) return static_cast(0); } MATHICGB_ASSERT(peekDigit()); MATHICGB_ASSERT(peek() != 0); // Checking this here allows us to recognize -0 as non-negative. if (!positive && !std::numeric_limits::is_signed) reportErrorUnexpectedToken("a positive integer", ""); const auto min = std::numeric_limits::min(); const auto max = std::numeric_limits::max(); auto t = static_cast(0); while (peekDigit()) { const auto c = static_cast(get()); const auto d = positive ? c - '0' : -(c - '0'); if (positive ? t > (max - d) / 10 : t < (min - d) / 10) { std::ostringstream err; err << "an integer in the range [" << unchar(min) << ", " << unchar(max) << ']'; reportErrorUnexpectedToken(err.str(), ""); } t = t * 10 + d; } MATHICGB_ASSERT(t != static_cast(0)); // We already handled zero above. return t; } template typename PrimeField::Element Scanner::readModular( const PrimeField& field, const bool negate ) { static_assert(std::numeric_limits::is_integer, ""); // Otherwise we need to consider that the most negative value's // negative cannot be represented as a positive number when reading. // todo: reinstate this assert once we get rid of signed coefficients. //static_assert(!std::is_signed::value, ""); eatWhite(); const bool minus = !match('+') && match('-'); const bool positive = minus == negate; if (!peekDigit()) reportErrorUnexpectedToken("an integer", ""); const auto e = field.toElement(readInteger(false)); return positive ? e : field.negative(e); } template bool Scanner::matchReadIntegerNoSign(T& t, bool negate) { if (peekDigit()) { t = readInteger(negate); return true; } else return false; } MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/SignatureGB.hpp0000664000175000017500000000562614560325357014067 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_SIGNATURE_G_B_GUARD #define MATHICGB_SIGNATURE_G_B_GUARD #include "PolyRing.hpp" #include "ModuleMonoSet.hpp" #include "SigPolyBasis.hpp" #include "SigSPairs.hpp" #include "Reducer.hpp" #include "KoszulQueue.hpp" #include "SPairs.hpp" #include "MonoProcessor.hpp" #include MATHICGB_NAMESPACE_BEGIN class SigSPairs; class SignatureGB { public: typedef PolyRing::Monoid Monoid; typedef Monoid::Mono Mono; typedef Monoid::ConstMonoRef ConstMonoRef; typedef Monoid::ConstMonoPtr ConstMonoPtr; typedef Monoid::MonoVector MonoVector; typedef MonoProcessor Processor; typedef Monoid::Component Component; SignatureGB( Basis&& basis, Processor&& processor, Reducer::ReducerType reductiontyp, int divlookup_type, int montable_type, bool postponeKoszul, bool useBaseDivisors, bool preferSparseReducers, bool useSingularCriterionEarly, size_t queueType); void computeGrobnerBasis(); SigPolyBasis* getGB() { return GB.get(); } ModuleMonoSet* getSyzTable() { return mProcessor->processingNeeded() ? Hsyz2.get() : Hsyz.get(); } SigSPairs* getSigSPairs() { return SP.get(); } size_t getMemoryUse() const; void displayStats(std::ostream& out) const; void displayPaperStats(std::ostream& out) const; void displayMemoryUse(std::ostream& out) const; void displaySomeStats(std::ostream& out) const; void setBreakAfter(unsigned int elements) { mBreakAfter = elements; } void setPrintInterval(unsigned int reductions) { mPrintInterval = reductions; } const Monoid& monoid() const {return R->monoid();} private: unsigned int mBreakAfter; unsigned int mPrintInterval; bool processSPair(Mono sig, const SigSPairs::PairContainer& pairs); bool step(); const PolyRing *R; bool const mPostponeKoszul; // Currently we use either both criteria (high and loow) or neither. bool const mUseBaseDivisors; SigSPairs::PairContainer mSpairTmp; // use only for getting S-pairs // stats ////////// size_t stats_sPairSignaturesDone; // distinct S-pair signatures done size_t stats_sPairsDone; // total S-pairs done size_t stats_koszulEliminated; // S-pairs eliminated due to Koszul queue size_t stats_SignatureCriterionLate; // # spairs removed due to being a syz signature // S-pairs eliminated due to relatively prime criterion size_t stats_relativelyPrimeEliminated; size_t stats_pairsReduced; // # spairs actually sent for reduction mic::Timer mTimer; double stats_nsecs; std::unique_ptr GB; KoszulQueue mKoszuls; std::unique_ptr Hsyz; std::unique_ptr Hsyz2; std::unique_ptr reducer; std::unique_ptr SP; std::unique_ptr> mProcessor; }; MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/KoszulQueue.hpp0000664000175000017500000000427614560325357014211 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_KOSZUL_QUEUE_GUARD #define MATHICGB_KOSZUL_QUEUE_GUARD #include "PolyRing.hpp" #include "NonCopyable.hpp" #include MATHICGB_NAMESPACE_BEGIN /// Used to keep track of pending Koszul syzygy signatures in the signature /// basis algorithm. class KoszulQueue : public NonCopyable { public: typedef PolyRing::Monoid Monoid; typedef Monoid::Mono Mono; typedef Monoid::ConstMonoRef ConstMonoRef; typedef Monoid::MonoPool MonoPool; KoszulQueue(const Monoid& monoid): mPool(monoid), mQueue(Configuration(monoid, mPool)) {} KoszulQueue(KoszulQueue&& kq): mPool(std::move(kq.mPool)), mQueue(std::move(kq.mQueue)) {} ConstMonoRef top() const { MATHICGB_ASSERT(!empty()); return *mQueue.top(); } void pop() { MATHICGB_ASSERT(!empty()); mPool.freeRaw(*mQueue.pop()); } void push(ConstMonoRef sig) { auto m = mPool.alloc(); monoid().copy(sig, m); mQueue.push(m.release()); } bool empty() const {return mQueue.empty();} size_t size() const {return mQueue.size();} size_t getMemoryUse() const {return mQueue.getMemoryUse();} const Monoid& monoid() const {return mQueue.getConfiguration().monoid();} private: class Configuration { public: typedef Monoid::MonoPtr Entry; Configuration(const Monoid& monoid, MonoPool& pool): mMonoid(monoid), mPool(pool) {} typedef Monoid::CompareResult CompareResult; CompareResult compare(const Entry& a, const Entry& b) const { return monoid().compare(*a, *b); } bool cmpLessThan(CompareResult r) const {return r == Monoid::GreaterThan;} static const bool fastIndex = false; static const bool supportDeduplication = true; bool cmpEqual(CompareResult r) const {return r == Monoid::EqualTo;} Entry deduplicate(Entry a, Entry b) { mPool.freeRaw(*b); return a; } const Monoid& monoid() const {return mMonoid;} private: const Monoid& mMonoid; MonoPool& mPool; }; MonoPool mPool; mic::Heap mQueue; }; MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/ReducerDedup.hpp0000664000175000017500000000103314560325357014254 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_REDUCER_DEDUP_GUARD #define MATHICGB_REDUCER_DEDUP_GUARD MATHICGB_NAMESPACE_BEGIN // This translation unit has to expose something that is needed elsewhere. // Otherwise, the compiler will think it is not needed and exclude the // whole thing, despite there being important global objects in the .cpp file. void reducerDedupDependency(); MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/ReducerPack.cpp0000664000175000017500000001544014560325357014073 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "ReducerPack.hpp" #include "TypicalReducer.hpp" #include "ReducerHelper.hpp" #include #include MATHICGB_NAMESPACE_BEGIN void reducerPackDependency() {} /// Keep a priority queue with entries that represent a term of a polynomial /// times a multiplier. When an entry is popped, move on to the next /// term of the polynomial, if any, and push that back into the queue. The /// idea is that this reduces the number of elements in the queue, leading /// to faster queue operations. Memory is also saved compared to expanding /// each new polynomial with n terms into n entries in the queue. template class Queue> class ReducerPack : public TypicalReducer { public: ReducerPack(const PolyRing& ring): mRing(ring), mLeadTermKnown(false), mQueue(Configuration(ring)), mPool(sizeof(MultipleWithPos)) { mLeadTerm.mono = mRing.monoid().alloc().release(); } virtual ~ReducerPack() { resetReducer(); mRing.monoid().freeRaw(*mLeadTerm.mono); } virtual std::string description() const { return mQueue.getName() + "-packed"; } virtual void insertTail(NewConstTerm multiplier, const Poly& f); virtual void insert(ConstMonoRef multiplier, const Poly& f); virtual bool leadTerm(NewConstTerm& result); virtual void removeLeadTerm(); virtual size_t getMemoryUse() const; private: virtual void resetReducer(); // Represents a term multiple of a polynomial, // together with a current term of the multiple. struct MultipleWithPos { MultipleWithPos(const Poly& poly, NewConstTerm multiple); Poly::ConstTermIterator pos; const Poly::ConstTermIterator end; NewTerm multiple; // invariant: current is the monomial product of multiple.monom // and pos.getMonomial(). MonoPtr current; // Ensures the invariant, so sets current to the product of // multiple.monom and pos.getMonomial(). void computeCurrent(const PolyRing& ring); void currentCoefficient(const PolyRing& ring, coefficient& coeff); void destroy(const PolyRing& ring); }; class Configuration : public ReducerHelper::PlainConfiguration { public: typedef MultipleWithPos* Entry; Configuration(const PolyRing& ring) : PlainConfiguration(ring) {} CompareResult compare(const Entry& a, const Entry& b) const { return ring().monoid().lessThan(*a->current, *b->current); } }; private: const PolyRing& mRing; NewTerm mLeadTerm; bool mLeadTermKnown; Queue mQueue; memt::BufferPool mPool; }; template class Q> void ReducerPack::insertTail(NewConstTerm multiple, const Poly& poly) { if (poly.termCount() <= 1) return; mLeadTermKnown = false; MultipleWithPos* entry = new (mPool.alloc()) MultipleWithPos(poly, multiple); ++entry->pos; entry->computeCurrent(poly.ring()); mQueue.push(entry); } template class Q> void ReducerPack::insert(ConstMonoRef multiple, const Poly& poly) { if (poly.isZero()) return; mLeadTermKnown = false; NewConstTerm termMultiple = {1, multiple.ptr()}; auto entry = new (mPool.alloc()) MultipleWithPos(poly, termMultiple); entry->computeCurrent(poly.ring()); mQueue.push(entry); } template class Q> ReducerPack::MultipleWithPos::MultipleWithPos( const Poly& poly, NewConstTerm multipleParam ): pos(poly.begin()), end(poly.end()), current(poly.ring().allocMonomial()) { multiple.mono = poly.ring().monoid().alloc().release(); poly.ring().monoid().copy(*multipleParam.mono, *multiple.mono); multiple.coef = multipleParam.coef; } template class Q> void ReducerPack::MultipleWithPos::computeCurrent(const PolyRing& ring) { ring.monoid().multiply(*multiple.mono, pos.mono(), *current); } template class Q> void ReducerPack::MultipleWithPos::currentCoefficient (const PolyRing& ring, coefficient& coeff) { ring.coefficientMult(multiple.coef, pos.coef(), coeff); } template class Q> void ReducerPack::MultipleWithPos::destroy(const PolyRing& ring) { ring.monoid().freeRaw(*current); ring.monoid().freeRaw(*multiple.mono); // Call the destructor to destruct the iterators into std::vector. // In debug mode MSVC puts those in a linked list and the destructor // has to be called since it takes an iterator off the list. There were // memory corruption problems in debug mode before doing this on MSVC. this->~MultipleWithPos(); } template class Q> bool ReducerPack::leadTerm(NewConstTerm& result) { if (!mLeadTermKnown) { do { if (mQueue.empty()) return false; MultipleWithPos* entry = mQueue.top(); std::swap(mLeadTerm.mono, entry->current); entry->currentCoefficient(mRing, mLeadTerm.coef); while (true) { ++entry->pos; if (entry->pos == entry->end) { mQueue.pop(); entry->destroy(mRing); mPool.free(entry); } else { entry->computeCurrent(mRing); mQueue.decreaseTop(entry); } if (mQueue.empty()) break; entry = mQueue.top(); if (!mRing.monoid().equal(*entry->current, *mLeadTerm.mono)) break; coefficient coef; entry->currentCoefficient(mRing, coef); mRing.coefficientAddTo (mLeadTerm.coef, const_cast(coef)); } } while (mRing.coefficientIsZero(mLeadTerm.coef)); } result = mLeadTerm; mLeadTermKnown = true; return true; } template class Q> void ReducerPack::removeLeadTerm() { if (!mLeadTermKnown) { NewConstTerm dummy; leadTerm(dummy); } mLeadTermKnown = false; } template class Q> void ReducerPack::resetReducer() { class MonomialFree { public: MonomialFree(const PolyRing& ring): mRing(ring) {} bool proceed(MultipleWithPos* entry) { entry->destroy(mRing); return true; } private: const PolyRing& mRing; }; MonomialFree freeer(mRing); mQueue.forAll(freeer); mQueue.clear(); } template class Q> size_t ReducerPack::getMemoryUse() const { return TypicalReducer::getMemoryUse() + mQueue.getMemoryUse() + mPool.getMemoryUse(); } MATHICGB_REGISTER_REDUCER( "TourNoDedupPack", Reducer_TourTree_NoDedup_Packed, make_unique>(ring) ); MATHICGB_REGISTER_REDUCER( "HeapNoDedupPack", Reducer_Heap_NoDedup_Packed, make_unique>(ring) ); MATHICGB_REGISTER_REDUCER( "GeoNoDedupPack", Reducer_Geobucket_NoDedup_Packed, make_unique>(ring) ); MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/TypicalReducer.cpp0000664000175000017500000001556014560325357014625 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "TypicalReducer.hpp" #include "SigPolyBasis.hpp" #include "PolyBasis.hpp" #include "MathicIO.hpp" #include MATHICGB_NAMESPACE_BEGIN unsigned int TypicalReducer::preferredSetSize() const { return 1; } void TypicalReducer::reset() { mArena.freeAllAllocs(); resetReducer(); } size_t TypicalReducer::getMemoryUse() const { return mArena.getMemoryUse(); } std::unique_ptr TypicalReducer::regularReduce( ConstMonoRef sig, ConstMonoRef multiple, size_t basisElement, const SigPolyBasis& basis) { const PolyRing& ring = basis.ring(); const auto& monoid = ring.monoid(); monomial tproduct = ring.allocMonomial(mArena); monomial u = ring.allocMonomial(mArena); monoid.multiply(multiple, basis.leadMono(basisElement), tproduct); auto reducer = basis.regularReducer(sig, tproduct); if (reducer == static_cast(-1)) { mArena.freeAllAllocs(); return nullptr; // singular reduction: no regular top reduction possible } monoid.divide(basis.leadMono(reducer), tproduct, u); coefficient coef; ring.coefficientSet(coef, 1); insertTail(const_term(coef, Monoid::toOld(multiple)), &basis.poly(basisElement)); MATHICGB_ASSERT(ring.coefficientIsOne(basis.leadCoef(reducer))); ring.coefficientFromInt(coef, -1); insertTail(const_term(coef, u), &basis.poly(reducer)); basis.basis().usedAsReducer(reducer); auto result = make_unique(ring); unsigned long long steps = 2; // number of steps in this reduction for (const_term v; leadTerm(v);) { MATHICGB_ASSERT(v.coeff != 0); reducer = basis.regularReducer(sig, v.monom); if (reducer == static_cast(-1)) { // no reducer found result->append(v.coeff, v.monom); removeLeadTerm(); } else { // reduce by reducer ++steps; basis.basis().usedAsReducer(reducer); monomial mon = ring.allocMonomial(mArena); monoid.divide(basis.leadMono(reducer), v.monom, mon); ring.coefficientDivide(v.coeff, basis.leadCoef(reducer), coef); ring.coefficientNegateTo(coef); removeLeadTerm(); insertTail(const_term(coef, mon), &basis.poly(reducer)); } } if (!result->isZero()) result->makeMonic(); reset(); return result; } std::unique_ptr TypicalReducer::classicReduce(const Poly& poly, const PolyBasis& basis) { monomial identity = basis.ring().allocMonomial(mArena); basis.ring().monomialSetIdentity(identity); insert(identity, &poly); return classicReduce(basis); } std::unique_ptr TypicalReducer::classicTailReduce(const Poly& poly, const PolyBasis& basis) { MATHICGB_ASSERT(&poly.ring() == &basis.ring()); MATHICGB_ASSERT(!poly.isZero()); term identity; identity.monom = basis.ring().allocMonomial(mArena); basis.ring().monomialSetIdentity(identity.monom); basis.ring().coefficientSetOne(identity.coeff); insertTail(identity, &poly); std::unique_ptr result(new Poly(basis.ring())); result->append(poly.leadCoef(), poly.leadMono()); return classicReduce(std::move(result), basis); } std::unique_ptr TypicalReducer::classicReduceSPoly( const Poly& a, const Poly& b, const PolyBasis& basis ) { const auto& ring = basis.ring(); const auto& monoid = basis.ring().monoid(); monomial lcm = ring.allocMonomial(); monoid.lcm(a.leadMono(), b.leadMono(), lcm); // insert tail of multiple of a monomial multiple1 = ring.allocMonomial(); monoid.divide(a.leadMono(), lcm, multiple1); coefficient plusOne; ring.coefficientSet(plusOne, 1); insertTail(const_term(plusOne, multiple1), &a); // insert tail of multiple of b monomial multiple2 = ring.allocMonomial(); monoid.divide(b.leadMono(), lcm, multiple2); coefficient minusOne = plusOne; ring.coefficientNegateTo(minusOne); insertTail(const_term(minusOne, multiple2), &b); std::unique_ptr reduced = classicReduce(basis); ring.freeMonomial(lcm); ring.freeMonomial(multiple1); ring.freeMonomial(multiple2); return reduced; } void TypicalReducer::classicReduceSPolySet (std::vector >& spairs, const PolyBasis& basis, std::vector >& reducedOut) { for (auto it = spairs.begin(); it != spairs.end(); ++it) { auto reducedSPoly = classicReduceSPoly(basis.poly(it->first), basis.poly(it->second), basis); if (!reducedSPoly->isZero()) reducedOut.push_back(std::move(reducedSPoly)); } } void TypicalReducer::classicReducePolySet (const std::vector >& polys, const PolyBasis& basis, std::vector >& reducedOut) { for (auto it = polys.begin(); it != polys.end(); ++it) { auto reducedPoly = classicReduce(**it, basis); if (!reducedPoly->isZero()) reducedOut.push_back(std::move(reducedPoly)); } } void TypicalReducer::setMemoryQuantum(size_t quantum) { } std::unique_ptr TypicalReducer::classicReduce (std::unique_ptr result, const PolyBasis& basis) { const auto& ring = basis.ring(); const auto& monoid = ring.monoid(); MATHICGB_ASSERT(&result->ring() == &ring); if (tracingLevel > 100) std::cerr << "Classic reduction begun." << std::endl; coefficient coef; unsigned long long steps = 0; // number of steps in this reduction for (const_term v; leadTerm(v);) { if (tracingLevel > 100) { std::cerr << "from reducer queue: "; basis.ring().monomialDisplay(std::cerr, v.monom); std::cerr << std::endl; } size_t reducer = basis.classicReducer(v.monom); if (reducer == static_cast(-1)) { // no reducer found MATHICGB_ASSERT( result->isZero() || basis.monoid().lessThan(v.monom, result->backMono()) ); result->append(v.coeff, v.monom); removeLeadTerm(); } else { // reduce by reducer ++steps; basis.usedAsReducer(reducer); monomial mon = ring.allocMonomial(mArena); monoid.divide(basis.leadMono(reducer), v.monom, mon); ring.coefficientDivide(v.coeff, basis.leadCoef(reducer), coef); ring.coefficientNegateTo(coef); removeLeadTerm(); insertTail(const_term(coef, mon), &basis.poly(reducer)); if (tracingLevel > 100) { std::cerr << "Reducing by basis element " << reducer << ": "; MathicIO<>().writePoly(basis.poly(reducer), false, std::cerr); std::cerr << std::endl; std::cerr << "multiplied by: " << coef << " * "; basis.ring().monomialDisplay(std::cerr, mon); std::cerr << std::endl; } } } if (!result->isZero()) result->makeMonic(); if (tracingLevel > 100) std::cerr << "Classic reduction done." << std::endl; reset(); return result; } std::unique_ptr TypicalReducer::classicReduce(const PolyBasis& basis) { return classicReduce(make_unique(basis.ring()), basis); } MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/SPairs.cpp0000664000175000017500000005474414560325357013116 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "SPairs.hpp" #include "SigPolyBasis.hpp" #include "LogDomain.hpp" #include "MathicIO.hpp" #include MATHICGB_DEFINE_LOG_DOMAIN_WITH_DEFAULTS( SPairEarly, "Time early S-pair construction, elimination and ordering.", 0, 0, 1 ); MATHICGB_DEFINE_LOG_DOMAIN_WITH_DEFAULTS( SPairLate, "Time late S-pair elimination and ordering", 0, 0, 1 ); MATHICGB_DEFINE_LOG_DOMAIN( SPairLcm, "Displays the lcm of the S-pairs being considered in Buchberger's algorithm." ); MATHICGB_DEFINE_LOG_ALIAS("SPairs", "SPairEarly,SPairLate"); MATHICGB_DEFINE_LOG_ALIAS("SPairsDetail", "SPairs,SPairDegree,SPairLcm"); MATHICGB_NAMESPACE_BEGIN SPairs::SPairs(const PolyBasis& basis, bool preferSparseSPairs): mMonoid(basis.ring().monoid()), mOrderMonoid(OrderMonoid::create(mMonoid)), mBareMonoid(BareMonoid::create(mMonoid)), mQueue(QueueConfiguration(basis, mOrderMonoid, preferSparseSPairs)), mBasis(basis) {} std::pair SPairs::pop() { MATHICGB_LOG_TIME(SPairLate); // Must call addPairs for new elements before popping. MATHICGB_ASSERT(mEliminated.columnCount() == mBasis.size()); while (!mQueue.empty()) { const auto p = mQueue.topPair(); if (mBasis.retired(p.first) || mBasis.retired(p.second)) { mQueue.pop(); continue; } auto lcm = bareMonoid().alloc(); // todo: just keep one around instead bareMonoid().copy(orderMonoid(), *mQueue.topPairData(), *lcm); mQueue.pop(); MATHICGB_ASSERT(bareMonoid().isLcm( monoid(), mBasis.leadMono(p.first), monoid(), mBasis.leadMono(p.second), *lcm )); if (!advancedBuchbergerLcmCriterion(p.first, p.second, *lcm)) { mEliminated.setBit(p.first, p.second, true); return p; } } return std::make_pair(static_cast(-1), static_cast(-1)); } std::pair SPairs::pop(exponent& w) { MATHICGB_LOG_TIME(SPairLate); // Must call addPairs for new elements before popping. MATHICGB_ASSERT(mEliminated.columnCount() == mBasis.size()); for (; !mQueue.empty(); mQueue.pop()) { const auto p = mQueue.topPair(); if (mBasis.retired(p.first) || mBasis.retired(p.second)) continue; auto lcm = bareMonoid().alloc(); // todo: just keep one around instead bareMonoid().copy(orderMonoid(), *mQueue.topPairData(), *lcm); MATHICGB_ASSERT(bareMonoid().isLcm( monoid(), mBasis.leadMono(p.first), monoid(), mBasis.leadMono(p.second), *lcm )); if (advancedBuchbergerLcmCriterion(p.first, p.second, *lcm)) continue; if (w == 0) w = bareMonoid().degree(*lcm); else if (w != bareMonoid().degree(*lcm)) break; mQueue.pop(); mEliminated.setBit(p.first, p.second, true); MATHICGB_IF_STREAM_LOG(SPairLcm) { stream << "Scheduling S-pair with lcm "; MathicIO().writeMonomial (bareMonoid(), BareMonoid::HasComponent, *lcm, stream); stream << '.' << std::endl; }; return p; } return std::make_pair(static_cast(-1), static_cast(-1)); } namespace { // Records multiples of a basis element. // Used in addPairs(). class RecordIndexes : public MonoLookup::EntryOutput { public: RecordIndexes( size_t newGen, mathic::BitTriangle& eliminated, std::vector& indexes ): mNewGen(newGen), mEliminated(eliminated), mIndexes(indexes) {} virtual bool proceed(size_t index) { if (index == mNewGen) return true; mIndexes.push_back(index); // The S-pair (newGen, *it) corresponds to reducing the non-minimal // basis element *it. The S-polynomial corresponds to the first // step of that reduction. We tell the caller to reduce *it, so we // get to assume that this S-pair can be eliminated. This is important // because it sometimes allows us to eliminate an S-pair (newGen, x) // when (*it, x) has already been eliminated. We want to make use of // this opportunity before removing all the information about *it. mEliminated.setBit(mNewGen, index, true); return true; } private: size_t const mNewGen; mathic::BitTriangle& mEliminated; std::vector& mIndexes; }; } void SPairs::addPairsAssumeAutoReduce( size_t newGen, std::vector& toRetireAndReduce ) { { MATHICGB_LOG_TIME(SPairEarly); MATHICGB_ASSERT(mQueue.columnCount() == newGen); MATHICGB_ASSERT(newGen < mBasis.size()); MATHICGB_ASSERT(!mBasis.retired(newGen)); while (mEliminated.columnCount() < mBasis.size()) { if (mUseBuchbergerLcmHitCache) { MATHICGB_ASSERT(mEliminated.columnCount() == mBuchbergerLcmHitCache.size()); mBuchbergerLcmHitCache.push_back(0); } mEliminated.addColumn(); } RecordIndexes indexes(newGen, mEliminated, toRetireAndReduce); mBasis.monoLookup().multiples(mBasis.leadMono(newGen), indexes); } addPairs(newGen); } namespace { template class SecondIterator { public: typedef typename PairIterator::iterator_category iterator_category; typedef decltype(reinterpret_cast(0)->second) value_type; typedef typename PairIterator::difference_type difference_type; typedef value_type* pointer; typedef value_type& reference; SecondIterator(PairIterator pairIterator): mIterator(pairIterator) {} SecondIterator& operator++() {++mIterator; return *this;} const value_type operator*() const {return mIterator->second;} difference_type operator-(const SecondIterator& it) const { return mIterator - it.mIterator; } bool operator==(const SecondIterator& it) const { return mIterator == it.mIterator; } bool operator!=(const SecondIterator& it) const { return mIterator != it.mIterator; } private: PairIterator mIterator; }; template SecondIterator makeSecondIterator(Iter it) { return SecondIterator(it); } } void SPairs::addPairs(size_t newGen) { MATHICGB_LOG_TIME(SPairEarly); // Must call addPairs with newGen parameter in the sequence 0, 1, ... // newGen could be implicitly picked up from mQueue.columnCount(), but // doing it this way ensures that what happens is what the client thinks // is happening and offers an ASSERT to inform mistaken client code. MATHICGB_ASSERT(mQueue.columnCount() == newGen); MATHICGB_ASSERT(newGen < mBasis.size()); MATHICGB_ASSERT(!mBasis.retired(newGen)); while (mEliminated.columnCount() < mBasis.size()) { if (mUseBuchbergerLcmHitCache) { MATHICGB_ASSERT(mEliminated.columnCount() == mBuchbergerLcmHitCache.size()); mBuchbergerLcmHitCache.push_back(0); } mEliminated.addColumn(); } if (newGen == std::numeric_limits::max()) throw std::overflow_error ("Too large basis element index in constructing S-pairs."); OrderMonoid::MonoVector prePairMonos(orderMonoid()); typedef std::pair PrePair; std::vector prePairs; prePairMonos.reserve(newGen); prePairs.reserve(newGen); auto newLead = mBasis.leadMono(newGen); auto lcm = mBareMonoid.alloc(); for (size_t oldGen = 0; oldGen < newGen; ++oldGen) { if (mBasis.retired(oldGen)) continue; auto oldLead = mBasis.leadMono(oldGen); if (monoid().component(newLead) != monoid().component(oldLead)) { mEliminated.setBit(newGen, oldGen, true); continue; } if (monoid().relativelyPrime(newLead, oldLead)) { ++mStats.relativelyPrimeHits; mEliminated.setBit(newGen, oldGen, true); continue; } mBareMonoid.lcm(monoid(), newLead, monoid(), oldLead, *lcm); if (simpleBuchbergerLcmCriterion(newGen, oldGen, *lcm)) { mEliminated.setBit(newGen, oldGen, true); continue; } prePairMonos.push_back(bareMonoid(), *lcm); prePairs.emplace_back (prePairMonos.back().ptr(), static_cast(oldGen)); } std::sort(prePairs.begin(), prePairs.end(), [&](const PrePair& a, const PrePair& b) { return mQueue.configuration().compare (b.second, newGen, b.first, a.second, newGen, a.first); }); mQueue.addColumnDescending (makeSecondIterator(prePairs.begin()), makeSecondIterator(prePairs.end())); } size_t SPairs::getMemoryUse() const { return mQueue.getMemoryUse(); } bool SPairs::simpleBuchbergerLcmCriterion( size_t a, size_t b, BareMonoid::ConstMonoRef lcmAB ) const { MATHICGB_ASSERT( monoid().component(mBasis.leadMono(a)) == monoid().component(mBasis.leadMono(b)) ); MATHICGB_ASSERT(a < mBasis.size()); MATHICGB_ASSERT(b < mBasis.size()); MATHICGB_ASSERT(a != b); MATHICGB_ASSERT(!mBasis.retired(a)); MATHICGB_ASSERT(!mBasis.retired(b)); MATHICGB_ASSERT(bareMonoid().isLcm (monoid(), mBasis.leadMono(a), monoid(), mBasis.leadMono(b), lcmAB) ); MATHICGB_ASSERT(mEliminated.columnCount() == mBasis.size()); class Criterion : public MonoLookup::EntryOutput { public: Criterion( const size_t a, const size_t b, BareMonoid::ConstMonoRef lcmAB, const SPairs& sPairs ): mA(a), mB(b), mLcmAB(lcmAB), mSPairs(sPairs), mMonoid(sPairs.monoid()), mBareMonoid(sPairs.bareMonoid()), mBasis(sPairs.basis()), mHit(static_cast(-1)), mAlmostApplies(false) {} virtual bool proceed(size_t index) { MATHICGB_ASSERT(index < mBasis.size()); MATHICGB_ASSERT(!applies()); // should have stopped search in this case MATHICGB_ASSERT (mBareMonoid.divides(mMonoid, mBasis.leadMono(index), mLcmAB)); if (index == mA || index == mB) return true; mAlmostApplies = true; // check lcm(a,index) != lcm(a,b) <=> // exists i such that max(a[i], c[i]) != max(a[i],b[i]) <=> // exists i such that b[i] > a[i] && b[i] > c[i] <=> // exists i such that b[i] > max(a[i], c[i]) <=> // b does not divide lcm(a[i], c[i]) auto leadA = mBasis.leadMono(mA); auto leadB = mBasis.leadMono(mB); auto leadC = mBasis.leadMono(index); if ( !mSPairs.eliminated(index, mA) && mMonoid.dividesLcm(leadB, leadC, leadA) ) return true; // we had lcm(a,index) == lcm(a,b) // check lcm(b,index) != lcm(a,b) if ( !mSPairs.eliminated(index, mB) && mMonoid.dividesLcm(leadA, leadC, leadB) ) return true; // we had lcm(b,index) == lcm(a,b) mHit = index; return false; // stop search } BareMonoid::ConstMonoRef lcmAB() const {return mLcmAB;} bool almostApplies() const {return mAlmostApplies;} bool applies() const {return mHit != static_cast(-1);} size_t hit() const {return mHit;} private: const size_t mA; const size_t mB; BareMonoid::ConstMonoRef mLcmAB; const SPairs& mSPairs; const Monoid& mMonoid; const BareMonoid& mBareMonoid; const PolyBasis& mBasis; size_t mHit; // the divisor that made the criterion apply bool mAlmostApplies; // applies ignoring lcm(a,b)=lcm(a,c) complication }; bool applies = false; { Criterion criterion(a, b, lcmAB, *this); if (mUseBuchbergerLcmHitCache) { // Check cacheB first since when I tried this there was a higher hit rate // for cacheB than cacheA. Might not be a persistent phenomenon, but // there's no downside to trying out cacheB first so I'm going for that. // // I update the cache if the second check is a hit but not if the first // check is a hit. In the one test I did, the worst hit rate was from // updating the cache every time, the second best hit rate was from // not updating the cache (from cache hits) and the best hit rate was // from doing this. // // The idea is that when the first cache check is a hit, // the second cache member might have been a hit too, and updating it // might replace a high hit rate element with a low hit rate element, // which would be bad. When the second cache check is a hit, we know // that the first one wasn't (or we would have taken an early exit), // so we have reason to suspect that the first cache element is not // a high hit rate element. So it should be better to replace it. // That idea seems to be right since it worked better in the one // test I did. size_t cacheB = mBuchbergerLcmHitCache[b]; if ( !applies && !mBasis.retired(cacheB) && mBareMonoid.dividesWithComponent (monoid(), mBasis.leadMono(cacheB), criterion.lcmAB()) ) applies = !criterion.Criterion::proceed(cacheB); size_t cacheA = mBuchbergerLcmHitCache[a]; if ( !applies && !mBasis.retired(cacheA) && mBareMonoid.dividesWithComponent (monoid(), mBasis.leadMono(cacheA), criterion.lcmAB()) ) { applies = !criterion.Criterion::proceed(cacheA); if (applies) mBuchbergerLcmHitCache[b] = cacheA; } } if (applies) { if (mStats.late) ++mStats.buchbergerLcmCacheHitsLate; else ++mStats.buchbergerLcmCacheHits; } else { MATHICGB_ASSERT(!criterion.applies()); // This will be a tough nut to crack in terms of getting the types to match. mBasis.monoLookup().divisors (Monoid::toRef(BareMonoid::toOld(criterion.lcmAB())), criterion); applies = criterion.applies(); if (mUseBuchbergerLcmHitCache && applies) { MATHICGB_ASSERT(criterion.hit() < mBasis.size()); mBuchbergerLcmHitCache[a] = criterion.hit(); mBuchbergerLcmHitCache[b] = criterion.hit(); } } } if (applies) { if (mStats.late) ++mStats.buchbergerLcmSimpleHitsLate; else ++mStats.buchbergerLcmSimpleHits; } MATHICGB_ASSERT(applies == simpleBuchbergerLcmCriterionSlow(a, b)); return applies; } bool SPairs::simpleBuchbergerLcmCriterionSlow(size_t a, size_t b) const { MATHICGB_ASSERT( monoid().component(mBasis.leadMono(a)) == monoid().component(mBasis.leadMono(b)) ); MATHICGB_ASSERT(a < mBasis.size()); MATHICGB_ASSERT(b < mBasis.size()); MATHICGB_ASSERT(a != b); MATHICGB_ASSERT(!mBasis.retired(a)); MATHICGB_ASSERT(!mBasis.retired(b)); MATHICGB_ASSERT(mEliminated.columnCount() == mBasis.size()); // todo: use iterators auto lcmAB = bareMonoid().alloc(); auto lcm = bareMonoid().alloc(); bareMonoid().lcm( monoid(), mBasis.leadMono(a), monoid(), mBasis.leadMono(b), *lcmAB ); size_t stop = mBasis.size(); size_t i = 0; for (; i < stop; ++i) { if (mBasis.retired(i)) continue; if (!bareMonoid().dividesWithComponent(monoid(), mBasis.leadMono(i), *lcmAB)) continue; if (i == a || i == b) continue; if (!eliminated(i, a)) { bareMonoid().lcm( monoid(), mBasis.leadMono(a), monoid(), mBasis.leadMono(i), *lcm ); if (bareMonoid().equal(*lcmAB, *lcm)) continue; } if (!eliminated(i, b)) { bareMonoid().lcm( monoid(), mBasis.leadMono(b), monoid(), mBasis.leadMono(i), *lcm ); if (bareMonoid().equal(*lcmAB, *lcm)) continue; } break; } return i != stop; } bool SPairs::advancedBuchbergerLcmCriterion( size_t a, size_t b, BareMonoid::ConstMonoRef lcmAB ) const { MATHICGB_ASSERT(a != b); MATHICGB_ASSERT(mEliminated.columnCount() == mBasis.size()); MATHICGB_ASSERT(bareMonoid().isLcm (monoid(), mBasis.leadMono(a), monoid(), mBasis.leadMono(b), lcmAB) ); mStats.late = true; if (simpleBuchbergerLcmCriterion(a, b, lcmAB)) { mStats.late = false; MATHICGB_ASSERT(advancedBuchbergerLcmCriterionSlow(a, b)); return true; } mStats.late = false; // *** Determine the graph vertices // graph contains pairs (index, state). index is the index of a basis // element that is a node in G. state indicates which of a and b that the // node in question is so far known to be connected to, if any. typedef std::vector > Graph; class GraphBuilder : public MonoLookup::EntryOutput { public: GraphBuilder(Graph& graph): mGraph(graph) {graph.clear();} virtual bool proceed(size_t index) { mGraph.push_back(std::make_pair(index, NotConnected)); return true; } private: Graph& mGraph; }; Graph& graph = mAdvancedBuchbergerLcmCriterionGraph; graph.clear(); GraphBuilder builder(graph); // This will be a tough nut to crack in terms of getting the types to match. mBasis.monoLookup().divisors (Monoid::toRef(BareMonoid::toOld(lcmAB)), builder); if (graph.size() <= 3) { // For the graph approach to be better than the simpler approach of // considering triples, there has to be more than 3 nodes in the graph. MATHICGB_ASSERT(!advancedBuchbergerLcmCriterionSlow(a, b)); return false; } // *** Set up todo with a and b // todo points to elements (nodes) of graph to process. std::vector todo; Graph::iterator const graphEnd = graph.end(); for (Graph::iterator it = graph.begin(); it != graphEnd; ++it) { if (it->first == a) it->second = ConnectedA; else if (it->first == b) it->second = ConnectedB; else continue; todo.push_back(it); } // *** Follow edges in the graph // We stop as soon as we find a node that is connected to both a and b, // since then a and b are connected so that the criterion applies. bool applies = false; while (!applies && !todo.empty()) { size_t const currentIndex = todo.back()->first; Connection const currentConnect = todo.back()->second; MATHICGB_ASSERT(currentConnect != NotConnected); todo.pop_back(); // loop through all potential edges (currentIndex, otherIndex) auto currentLead = mBasis.leadMono(currentIndex); for (Graph::iterator other = graph.begin(); other != graphEnd; ++other) { Connection const otherConnect = other->second; if (currentConnect == otherConnect) continue; size_t const otherIndex = other->first; MATHICGB_ASSERT(otherIndex != currentIndex); auto const otherLead = mBasis.leadMono(otherIndex); // Note that // lcm(c,d) != lcmAB <=> // exists i such that max(c[i], d[i]) < lcmAB[i] <=> // exists i such that lcmAB[i] > c[i] && lcmAB[i] > d[i] <=> // exists i such that lcmAB[i] > max(c[i], d[i]) <=> // lcmAB does not divide lcm(c[i], d[i]) if ( !eliminated(currentIndex, otherIndex) && monoid().dividesLcm (bareMonoid(), lcmAB, monoid(), currentLead, otherLead) ) continue; // not an edge in G if (otherConnect == NotConnected) { other->second = currentConnect; todo.push_back(other); } else { // At this point we have found an edge between a node connected to // a and a node connected to b. So a and b are connected. MATHICGB_ASSERT(currentConnect != otherConnect); applies = true; break; } } } if (applies) ++mStats.buchbergerLcmAdvancedHits; // if (graph.size() >= 10) // std::cout << "[adv size=" << graph.size() << " result= " << applies << std::endl; MATHICGB_ASSERT(applies == advancedBuchbergerLcmCriterionSlow(a, b)); return applies; } bool SPairs::advancedBuchbergerLcmCriterionSlow(size_t a, size_t b) const { MATHICGB_ASSERT(a != b); MATHICGB_ASSERT(mEliminated.columnCount() == mBasis.size()); auto lcmAB = monoid().alloc(); auto lcm = monoid().alloc(); monoid().lcm(mBasis.leadMono(a), mBasis.leadMono(b), lcmAB); size_t stop = mBasis.size(); // *** Build the graph vertices // graph contains pairs (index, state). index is the index of a basis // that is a node in G. state indicates which of a and b that the node // in question is so far known to be connected to. std::vector > graph; std::vector todo; // indexes into graph to process. for (size_t i = 0; i != stop; ++i) { if (mBasis.retired(i)) continue; if (!monoid().dividesWithComponent(mBasis.leadMono(i), *lcmAB)) continue; Connection con = NotConnected; if (i == a) { con = ConnectedA; todo.push_back(graph.size()); } else if (i == b) { con = ConnectedB; todo.push_back(graph.size()); } graph.push_back(std::make_pair(i, con)); } // *** Follow edges in the graph // We stop as soon as we find a node that is connected to both a and b, // since then a and b are connected so that the criterion applies. bool applies = false; while (!applies && !todo.empty()) { MATHICGB_ASSERT(todo.size() <= graph.size()); std::pair const node = graph[todo.back()]; todo.pop_back(); MATHICGB_ASSERT(node.second != NotConnected); // loop through all potential edges (node.first, i) ConstMonoRef leadNode = mBasis.leadMono(node.first); for (size_t i = 0; i < graph.size(); ++i) { if (node.second == graph[i].second) continue; MATHICGB_ASSERT(graph[i].first != node.first); const size_t other = graph[i].first; auto const leadOther = mBasis.leadMono(other); monoid().lcm(leadNode, leadOther, lcm); if (!eliminated(node.first, other) && monoid().equal(*lcm, *lcmAB)) continue; // not an edge in G if (graph[i].second == NotConnected) { graph[i].second = node.second; todo.push_back(i); } else { // At this point we have found an edge between something a node to // a and a node connected to b. So a and b are connected. MATHICGB_ASSERT(graph[i].second != node.second); applies = true; break; } } } MATHICGB_ASSERT(applies || !simpleBuchbergerLcmCriterionSlow(a, b)); return applies; } SPairs::Stats SPairs::stats() const { size_t const columnCount = mQueue.columnCount(); mStats.sPairsConsidered = columnCount * (columnCount - 1) / 2; return mStats; } std::string SPairs::name() const { return mQueue.name(); } void SPairs::QueueConfiguration::computePairData( size_t a, size_t b, OrderMonoid::MonoRef orderBy ) const { MATHICGB_ASSERT(a != b); MATHICGB_ASSERT(a < mBasis.size()); MATHICGB_ASSERT(b < mBasis.size()); if (mBasis.retired(a) || mBasis.retired(b)) { // todo: do something special here? return; //return false; } Monoid::ConstMonoRef leadA = mBasis.leadMono(a); Monoid::ConstMonoRef leadB = mBasis.leadMono(b); orderMonoid().lcm(monoid(), leadA, monoid(), leadB, orderBy); return; //todo: return true; } MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/F4MatrixBuilder.cpp0000664000175000017500000002773614560325357014663 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "F4MatrixBuilder.hpp" #include "LogDomain.hpp" MATHICGB_DEFINE_LOG_DOMAIN( F4MatrixBuild, "Displays statistics about F4 matrix construction." ); MATHICGB_NAMESPACE_BEGIN MATHICGB_NO_INLINE auto F4MatrixBuilder::findOrCreateColumn( ConstMonoRef monoA, ConstMonoRef monoB, TaskFeeder& feeder ) -> std::pair { const auto col = ColReader(mMap).findProduct(monoA, monoB); if (col.first != 0) return std::make_pair(*col.first, *col.second); return createColumn(monoA, monoB, feeder); } MATHICGB_INLINE auto F4MatrixBuilder::findOrCreateColumn( ConstMonoRef monoA, ConstMonoRef monoB, const ColReader& colMap, TaskFeeder& feeder ) -> std::pair { const auto col = colMap.findProduct(monoA, monoB); if (col.first == 0) return findOrCreateColumn(monoA, monoB, feeder); return std::make_pair(*col.first, *col.second); } MATHICGB_NO_INLINE void F4MatrixBuilder::createTwoColumns( ConstMonoRef monoA1, ConstMonoRef monoA2, ConstMonoRef monoB, TaskFeeder& feeder ) { createColumn(monoA1, monoB, feeder); createColumn(monoA2, monoB, feeder); } F4MatrixBuilder::F4MatrixBuilder( const PolyBasis& basis, const size_t memoryQuantum ): mLeftColCount(0), mRightColCount(0), mTmp(basis.ring().monoid().alloc()), mBasis(basis), mMonomialsLeft(), mMonomialsRight(), mBuilder(basis.ring(), mMap, mMonomialsLeft, mMonomialsRight, memoryQuantum), mMap(basis.ring()) { // This assert to be _NO_ASSUME since otherwise the compiler will assume that // the error checking branch here cannot be taken and optimize it away. const Scalar maxScalar = std::numeric_limits::max(); MATHICGB_ASSERT_NO_ASSUME(ring().charac() <= maxScalar); if (ring().charac() > maxScalar) mathic::reportInternalError("F4MatrixBuilder: too large characteristic."); } void F4MatrixBuilder::addSPolynomialToMatrix( const Poly& polyA, const Poly& polyB ) { MATHICGB_ASSERT(!polyA.isZero()); MATHICGB_ASSERT(polyA.isMonic()); MATHICGB_ASSERT(!polyB.isZero()); MATHICGB_ASSERT(polyB.isMonic()); RowTask task; task.addToTop = false; task.poly = &polyA; task.sPairPoly = &polyB; mTodo.push_back(task); } void F4MatrixBuilder::addPolynomialToMatrix(const Poly& poly) { if (poly.isZero()) return; RowTask task = {}; task.addToTop = false; task.poly = &poly; mTodo.push_back(task); } void F4MatrixBuilder::addPolynomialToMatrix (ConstMonoRef multiple, const Poly& poly) { if (poly.isZero()) return; auto desiredLead = monoid().alloc(); monoid().multiply(poly.leadMono(), multiple, desiredLead); RowTask task = {}; task.addToTop = false; task.poly = &poly; task.desiredLead = desiredLead.release(); MATHICGB_ASSERT(task.sPairPoly == 0); mTodo.push_back(task); } void F4MatrixBuilder::buildMatrixAndClear(QuadMatrix& matrix) { MATHICGB_ASSERT(&matrix.ring() == &ring()); MATHICGB_LOG_TIME(F4MatrixBuild) << "\n***** Constructing matrix *****\n"; if (mTodo.empty()) { matrix.clear(); return; } // todo: prefer sparse/old reducers among the inputs. // Process pending rows until we are done. Note that the methods // we are calling here can add more pending items. struct ThreadData { QuadMatrixBuilder builder; MonoRef tmp1; MonoRef tmp2; }; mtbb::enumerable_thread_specific threadData( [&](){ const mtbb::lock_guard guard(mCreateColumnLock); ThreadData data = { QuadMatrixBuilder( ring(), mMap, mMonomialsLeft, mMonomialsRight, mBuilder.memoryQuantum() ), *monoid().alloc().release(), *monoid().alloc().release() }; return data; }); mtbb::parallel_for_each(mTodo.begin(), mTodo.end(), [&](const RowTask& task, TaskFeeder& feeder) { auto& data = threadData.local(); QuadMatrixBuilder& builder = data.builder; const Poly& poly = *task.poly; if (task.sPairPoly != 0) { MATHICGB_ASSERT(!task.addToTop); monoid().colons( poly.leadMono(), task.sPairPoly->leadMono(), data.tmp2, data.tmp1 ); appendRowBottom (poly, data.tmp1, *task.sPairPoly, data.tmp2, data.builder, feeder); return; } if (task.desiredLead == nullptr) monoid().setIdentity(data.tmp1); else monoid().divide(poly.leadMono(), *task.desiredLead, data.tmp1); if (task.addToTop) appendRowTop(data.tmp1, *task.poly, builder, feeder); else appendRowBottom (data.tmp1, false, poly.begin(), poly.end(), builder, feeder); }); MATHICGB_ASSERT(!threadData.empty()); // as mTodo empty causes early return // Free the monomials from all the tasks for (auto& mono : mTodo) if (!mono.desiredLead.isNull()) monoid().freeRaw(*mono.desiredLead.castAwayConst()); mTodo.clear(); auto& builder = threadData.begin()->builder; for (auto& data : threadData) { if (&data.builder != &builder) builder.takeRowsFrom(data.builder.buildMatrixAndClear()); monoid().freeRaw(data.tmp1); monoid().freeRaw(data.tmp2); } matrix = builder.buildMatrixAndClear(); threadData.clear(); { ColReader reader(mMap); matrix.leftColumnMonomials.clear(); matrix.rightColumnMonomials.clear(); const auto end = reader.end(); for (auto it = reader.begin(); it != end; ++it) { const auto p = *it; auto copy = monoid().alloc(); monoid().copy(p.second, copy); auto& monos = p.first.left() ? matrix.leftColumnMonomials : matrix.rightColumnMonomials; const auto index = p.first.index(); if (monos.size() <= index) monos.resize(index + 1); MATHICGB_ASSERT(monos[index].isNull()); monos[index] = copy.release(); } } #ifdef MATHICGB_DEBUG for (size_t side = 0; side < 2; ++side) { auto& monos = side == 0 ? matrix.leftColumnMonomials : matrix.rightColumnMonomials; for (auto it = monos.begin(); it != monos.end(); ++it) { MATHICGB_ASSERT(!it->isNull()); } } #endif matrix.sortColumnsLeftRightParallel(); mMap.clearNonConcurrent(); } auto F4MatrixBuilder::createColumn( ConstMonoRef monoA, ConstMonoRef monoB, TaskFeeder& feeder ) -> std::pair { const mtbb::lock_guard guard(mCreateColumnLock); // see if the column exists now after we have synchronized { const auto found(ColReader(mMap).findProduct(monoA, monoB)); if (found.first != 0) return std::make_pair(*found.first, *found.second); } // The column really does not exist, so we need to create it monoid().multiply(monoA, monoB, mTmp); if (!monoid().hasAmpleCapacity(*mTmp)) mathic::reportError("Monomial exponent overflow in F4MatrixBuilder."); // look for a reducer of mTmp const size_t reducerIndex = mBasis.classicReducer(*mTmp); const bool insertLeft = (reducerIndex != static_cast(-1)); // Create the new left or right column auto& colCount = insertLeft ? mLeftColCount : mRightColCount; if (colCount == std::numeric_limits::max()) throw std::overflow_error("Too many columns in QuadMatrix"); const auto inserted = mMap.insert (std::make_pair(mTmp.ptr(), LeftRightColIndex(colCount, insertLeft))); ++colCount; MATHICGB_ASSERT(inserted.second); MATHICGB_ASSERT(inserted.first.first != 0); // schedule new task if we found a reducer if (insertLeft) { RowTask task = {}; task.addToTop = true; task.poly = &mBasis.poly(reducerIndex); task.desiredLead = inserted.first.second; feeder.add(task); } return std::make_pair(*inserted.first.first, *inserted.first.second); } void F4MatrixBuilder::appendRowBottom( ConstMonoRef multiple, const bool negate, const Poly::ConstTermIterator begin, const Poly::ConstTermIterator end, QuadMatrixBuilder& builder, TaskFeeder& feeder ) { // todo: eliminate the code-duplication between here and appendRowTop. auto it = begin; updateReader: // Use an on-stack const reader to make it as obvious as possible to the // optimizer's alias analysis that the pointer inside the reader never // changes inside the loop. const ColReader reader(mMap); for (; it != end; ++it) { const auto col = reader.findProduct(it.mono(), multiple); if (col.first == 0) { createColumn(it.mono(), multiple, feeder); goto updateReader; } const auto origScalar = it.coef(); MATHICGB_ASSERT(!ring().field().isZero(origScalar)); const auto maybeNegated = negate ? field().negativeNonZero(origScalar) : origScalar; MATHICGB_ASSERT(maybeNegated < std::numeric_limits::max()); builder.appendEntryBottom(*col.first, static_cast(maybeNegated)); } builder.rowDoneBottomLeftAndRight(); } void F4MatrixBuilder::appendRowTop( ConstMonoRef multiple, const Poly& poly, QuadMatrixBuilder& builder, TaskFeeder& feeder ) { auto it = poly.begin(); const auto end = poly.end(); if ((poly.termCount() % 2) == 1) { ColReader reader(mMap); const auto col = findOrCreateColumn (it.mono(), multiple, reader, feeder); MATHICGB_ASSERT(it.coef() < std::numeric_limits::max()); MATHICGB_ASSERT(!field().isZero(it.coef())); builder.appendEntryTop (col.first, static_cast(it.coef())); ++it; } updateReader: ColReader colMap(mMap); while (it != end) { MATHICGB_ASSERT(it.coef() < std::numeric_limits::max()); MATHICGB_ASSERT(!field().isZero(it.coef())); const auto scalar1 = static_cast(it.coef()); const auto mono1 = it.mono(); auto it2 = it; ++it2; MATHICGB_ASSERT(it2.coef() < std::numeric_limits::max()); MATHICGB_ASSERT(!field().isZero(it2.coef())); const auto scalar2 = static_cast(it2.coef()); const auto mono2 = it2.mono(); const auto colPair = colMap.findTwoProducts(mono1, mono2, multiple); if (colPair.first == 0 || colPair.second == 0) { createTwoColumns(mono1, mono2, multiple, feeder); goto updateReader; } builder.appendEntryTop(*colPair.first, scalar1); builder.appendEntryTop(*colPair.second, scalar2); it = ++it2; } builder.rowDoneTopLeftAndRight(); } void F4MatrixBuilder::appendRowBottom( const Poly& poly, ConstMonoRef multiply, const Poly& sPairPoly, ConstMonoRef sPairMultiply, QuadMatrixBuilder& builder, TaskFeeder& feeder ) { MATHICGB_ASSERT(!poly.isZero()); auto itA = poly.begin(); const auto endA = poly.end(); MATHICGB_ASSERT(!sPairPoly.isZero()); auto itB = sPairPoly.begin(); const auto endB = sPairPoly.end(); // skip leading terms since they cancel MATHICGB_ASSERT(itA.coef() == itB.coef()); ++itA; ++itB; const ColReader colMap(mMap); const auto mulA = multiply; const auto mulB = sPairMultiply; while (true) { // Watch out: we are depending on appendRowBottom to finish the row, so // if you decide not to call that function in case // (itA == itA && itB == endB) then you need to do that yourself. if (itB == endB) { appendRowBottom(mulA, false, itA, endA, builder, feeder); break; } if (itA == endA) { appendRowBottom(mulB, true, itB, endB, builder, feeder); break; } coefficient coeff = 0; LeftRightColIndex col; const auto colA = findOrCreateColumn (itA.mono(), mulA, colMap, feeder); const auto colB = findOrCreateColumn (itB.mono(), mulB, colMap, feeder); const auto cmp = monoid().compare(colA.second, colB.second); if (cmp != LT) { coeff = itA.coef(); col = colA.first; ++itA; } if (cmp != GT) { coeff = ring().coefficientSubtract(coeff, itB.coef()); col = colB.first; ++itB; } MATHICGB_ASSERT(coeff < std::numeric_limits::max()); if (!field().isZero(coeff)) builder.appendEntryBottom(col, static_cast(coeff)); } } MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/MESClassicGBAlg.hpp0000664000175000017500000000175214560325357014474 // Parts taken from MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. // Changes Copyright 2021 Michael Stillman. #ifndef __classic_gb_alg_hpp__ #define __classic_gb_alg_hpp__ #include namespace mgbF4 { class Reducer; class Basis; struct ClassicGBAlgParams { Reducer* reducer; int monoLookupType; bool preferSparseReducers; size_t sPairQueueType; unsigned int breakAfter; unsigned int printInterval; unsigned int sPairGroupSize; size_t reducerMemoryQuantum; bool useAutoTopReduction; bool useAutoTailReduction; std::function callback; }; Basis computeGBClassicAlg(Basis&& inputBasis, ClassicGBAlgParams params); Basis computeModuleGBClassicAlg(Basis&& inputBasis, ClassicGBAlgParams params); }; #endif // Local Variables: // compile-command: "make -C $M2BUILDDIR/Macaulay2/e " // indent-tabs-mode: nil // End: mathicgb-1.1/src/mathicgb/QuadMatrixBuilder.cpp0000664000175000017500000000741014560325357015267 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "QuadMatrixBuilder.hpp" #include "QuadMatrix.hpp" #include "ScopeExit.hpp" #include #include MATHICGB_NAMESPACE_BEGIN QuadMatrixBuilder::QuadMatrixBuilder( const PolyRing& ring, Map& map, Monomials& monomialsLeft, Monomials& monomialsRight, const size_t memoryQuantum ): mMonomialsLeft(monomialsLeft), mMonomialsRight(monomialsRight), mMonomialToCol(map), mTopLeft(memoryQuantum), mTopRight(memoryQuantum), mBottomLeft(memoryQuantum), mBottomRight(memoryQuantum) {} void QuadMatrixBuilder::takeRowsFrom(QuadMatrix&& matrix) { MATHICGB_ASSERT(&ring() == &matrix.ring()); MATHICGB_ASSERT(matrix.debugAssertValid()); mTopLeft.takeRowsFrom(std::move(matrix.topLeft)); mTopRight.takeRowsFrom(std::move(matrix.topRight)); mBottomLeft.takeRowsFrom(std::move(matrix.bottomLeft)); mBottomRight.takeRowsFrom(std::move(matrix.bottomRight)); } namespace { /// Creates a column and updates the associated data structures that /// are passed in. Copies mono - ownership is not taken over. The /// purpose of this function is to avoid code duplication. It is a /// template in order to avoid referring to private types of /// QuadMatrixBuilder. template std::pair createCol( typename Monoid::ConstMonoRef mono, SparseMatrix& top, SparseMatrix& bottom, ToMono& toMonomial, ToCol& toCol, const Monoid& monoid, const bool left ) { MATHICGB_ASSERT(typename ToCol::Reader(toCol).find(mono).first == 0); const auto colCount = static_cast(toMonomial.size()); if (colCount == std::numeric_limits::max()) throw std::overflow_error("Too many columns in QuadMatrixBuilder"); // allocate memory in toMonomial now to ensure no bad_alloc later toMonomial.emplace_back(nullptr); MATHICGB_SCOPE_EXIT(toMonomialGuard) {toMonomial.pop_back();}; auto copied = monoid.alloc(); monoid.copy(mono, copied); auto inserted = toCol.insert( std::make_pair( copied.ptr(), QuadMatrixBuilder::LeftRightColIndex(colCount, left) ) ); MATHICGB_ASSERT(inserted.second); MATHICGB_ASSERT(inserted.first.first != 0); auto p(inserted.first); toMonomial.back() = copied; MATHICGB_ASSERT(monoid.equalHintTrue(*copied, *p.second)); MATHICGB_ASSERT(*p.first == QuadMatrixBuilder::LeftRightColIndex(colCount, left)); auto ptr = const_cast(Monoid::toOld(*p.second)); toMonomialGuard.dismiss(); copied.release(); return std::make_pair(*p.first, ptr); } } std::pair QuadMatrixBuilder::createColumnLeft( ConstMonoRef monomialToBeCopied ) { return createCol( monomialToBeCopied, mTopLeft, mBottomLeft, mMonomialsLeft, mMonomialToCol, monoid(), true ); } std::pair QuadMatrixBuilder::createColumnRight( ConstMonoRef monomialToBeCopied ) { return createCol( monomialToBeCopied, mTopRight, mBottomRight, mMonomialsRight, mMonomialToCol, monoid(), false ); } QuadMatrix QuadMatrixBuilder::buildMatrixAndClear() { QuadMatrix out(ring()); mTopLeft.swap(out.topLeft); mTopRight.swap(out.topRight); mBottomLeft.swap(out.bottomLeft); mBottomRight.swap(out.bottomRight); mTopLeft.clear(); mTopRight.clear(); mBottomLeft.clear(); mBottomRight.clear(); MATHICGB_ASSERT(out.debugAssertValid()); return out; } MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/LogDomainSet.cpp0000664000175000017500000001337214560325357014232 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "LogDomainSet.hpp" #include MATHICGB_NAMESPACE_BEGIN LogDomainSet::LogDomainSet(): mStartTime(mtbb::tick_count::now()) { } void LogDomainSet::registerLogDomain(LogDomain& domain) { MATHICGB_ASSERT(std::strcmp(domain.name(), "none") != 0); MATHICGB_ASSERT(std::strcmp(domain.name(), "all") != 0); mLogDomains.push_back(&domain); } LogDomain* LogDomainSet::logDomain(const char* const name) { const auto func = [&](const LogDomain* const ld){ return std::strcmp(ld->name(), name) == 0; }; const auto it = std::find_if(mLogDomains.begin(), mLogDomains.end(), func); return it == mLogDomains.end() ? static_cast*>(0) : *it; } const char* LogDomainSet::alias(const char* name) { const auto func = [&](const std::pair p){ return std::strcmp(p.first, name) == 0; }; const auto it = std::find_if(mAliases.begin(), mAliases.end(), func); return it == mAliases.end() ? static_cast(0) : it->second; } void LogDomainSet::registerLogAlias(const char* alias, const char* of) { MATHICGB_ASSERT(this->alias(alias) == 0); mAliases.push_back(std::make_pair(alias, of)); } void LogDomainSet::performLogCommandsInternal( const char prefix, const std::string& cmds, const char suffix ) { size_t offset = 0; while (offset < cmds.size()) { const size_t next = cmds.find(',', offset); performLogCommandInternal (prefix, cmds.substr(offset, next - offset), suffix); offset = next; if (offset < cmds.size()) { MATHICGB_ASSERT(cmds[offset] == ','); ++offset; } } } void LogDomainSet::performLogCommandInternal( char prefix, std::string cmd, char suffix ) { const auto isSign = [](const char c) {return c == '+' || c == '-' || c == '0';}; MATHICGB_ASSERT(prefix == ' ' || isSign(prefix)); MATHICGB_ASSERT(suffix == ' ' || isSign(suffix)); if (cmd.empty()) return; // This could be more efficient, but this is not supposed to be a // method that is called very often. if (isSign(cmd[0])) { if (prefix == ' ') prefix = cmd[0]; cmd.erase(cmd.begin()); } if (!cmd.empty() && isSign(*cmd.rbegin())) { if (suffix == ' ') suffix = *cmd.rbegin(); cmd.erase(cmd.end() - 1); } if (cmd == "none") return; if (cmd == "all") { for (auto it = mLogDomains.begin(); it != mLogDomains.end(); ++it) performLogCommandInternal(prefix, (*it)->name(), suffix); return; } auto aliasOf = alias(cmd.c_str()); if (aliasOf != 0) { performLogCommandsInternal(prefix, aliasOf, suffix); return; } // The default modifiers are +X0. if (prefix == ' ') prefix = '+'; if (suffix == ' ') suffix = '0'; auto log = logDomain(cmd.c_str()); if (log != 0) { if (prefix != '0') log->setEnabled(prefix != '-'); if (suffix != '0') log->setStreamEnabled(suffix == '+'); return; } mathic::reportError("Unknown log \"" + cmd + "\".\n"); } void LogDomainSet::printReport(std::ostream& out) const { printCountReport(out); printTimeReport(out); } void LogDomainSet::printCountReport(std::ostream& out) const { mathic::ColumnPrinter pr; auto& names = pr.addColumn(true); auto& counts = pr.addColumn(false); names << "Log name \n"; counts << " Count\n"; pr.repeatToEndOfLine('-'); bool somethingToReport = false; const auto end = logDomains().cend(); for (auto it = logDomains().cbegin(); it != end; ++it) { const auto& log = **it; if (!log.enabled() || !log.hasCount()) continue; somethingToReport = true; names << log.name() << " \n"; counts << " " << mathic::ColumnPrinter::commafy(log.count()) << '\n'; } if (!somethingToReport) return; out << "***** Logging count report *****\n\n" << pr << '\n'; } void LogDomainSet::printTimeReport(std::ostream& out) const { const auto allTime = (mtbb::tick_count::now() - mStartTime).seconds(); mathic::ColumnPrinter pr; auto& names = pr.addColumn(true); auto& times = pr.addColumn(false); auto& ratios = pr.addColumn(false); times.precision(3); times << std::fixed; ratios.precision(3); ratios << std::fixed; names << "Log name \n"; times << " Time/s (real)\n"; ratios << " Ratio\n"; pr.repeatToEndOfLine('-'); double timeSum = 0; bool somethingToReport = false; const auto end = logDomains().cend(); for (auto it = logDomains().cbegin(); it != end; ++it) { const auto& log = **it; if (!log.enabled() || !log.hasTime()) continue; somethingToReport = true; const auto logTime = log.loggedSecondsReal(); timeSum += logTime; names << log.name() << " \n"; times << logTime << '\n'; ratios << mathic::ColumnPrinter::percentDouble(logTime, allTime) << '\n'; } if (!somethingToReport) return; pr.repeatToEndOfLine('-'); names << "sum\n"; times << timeSum; ratios << mathic::ColumnPrinter::percentDouble(timeSum, allTime) << '\n'; const auto oldFlags = out.flags(); const auto oldPrecision = out.precision(); out << std::fixed; out.precision(3); out << "***** Logging time report *****\nTime elapsed: " << allTime << "s\n\n" << pr << '\n'; // todo: restore the stream state using RAII, since the above code might // throw an exception. out.precision(oldPrecision); out.flags(oldFlags); } void LogDomainSet::reset() { mStartTime = mtbb::tick_count::now(); const auto end = logDomains().cend(); for (auto it = logDomains().cbegin(); it != end; ++it) { MATHICGB_ASSERT(*it != 0); (*it)->reset(); } } LogDomainSet& LogDomainSet::singleton() { static LogDomainSet set; return set; } MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/ReducerNoDedup.hpp0000664000175000017500000000104214560325357014551 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_REDUCER_NO_DEDUP_GUARD #define MATHICGB_REDUCER_NO_DEDUP_GUARD MATHICGB_NAMESPACE_BEGIN // This translation unit has to expose something that is needed elsewhere. // Otherwise, the compiler will think it is not needed and exclude the // whole thing, despite there being important global objects in the .cpp file. void reducerNoDedupDependency(); MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/stdinc.h0000664000175000017500000003026114560325357012632 #ifdef MATHICGB_STDINC_GUARD #error stdinc.h included twice. Only include stdinc.h once per cpp file. #endif #define MATHICGB_STDINC_GUARD #ifdef _MSC_VER // For Microsoft Compiler in Visual Studio C++. /// Sometimes you know that a function will be called very rarely so you want to /// tell the compiler not to inline it even if it could be inlined at only a /// modest increase in code size. That is what MATHICGB_NO_INLINE does. #define MATHICGB_NO_INLINE __declspec(noinline) /// Sometimes the compiler just will not inline functions that should /// be inlined. Use sparingly --- preferably only if a profiler says /// that a tiny often-called function consumes a significant amount of time. #define MATHICGB_INLINE __forceinline /// Tells the compiler to always assume that the expression X is true. #define MATHICGB_ASSUME(X) __assume(X) /// As MATHICGB_ASSUME, but might actually evaluate X at run-time if it has /// side-effects. The point is that this can be used on compilers with no other /// support for assuming things. So there is no difference on MS VC++. #define MATHICGB_ASSUME_AND_MAY_EVALUATE(X) __assume(X) /// Tells the compiler that this function returns a pointer that is not an alias /// for any other point that is currently valid in the program - like malloc. #define MATHICGB_RETURN_NO_ALIAS __declspec(restrict) /// Tells the compiler that this function will never throw an exception. #define MATHICGB_NOTHROW __declspec(nothrow) /// Tells the compiler that this function has no effects except the return value /// and the return value depends only on the arguments and first-level /// indirections of the arguments. (this is the common denominator of GCC /// and MS VC++ capabilities) #define MATHICGB_PURE __declspec(noalias) /// Tells the compiler that the return value of this function must be looked /// at by the caller. For example this is appropriate for realloc. #define MATHICGB_MUST_CHECK_RETURN_VALUE /// Tells the compiler that the current line of code cannot be reached. #define MATHICGB_UNREACHABLE __assume(false) /// Tells the compiler that a variable that is a pointer (not a reference) /// does not alias any other pointer that is used in the current scope. #define MATHICGB_RESTRICT __restrict #pragma warning (disable: 4996) // don't warn about e.g. std::fill on pointers #pragma warning (disable: 4290) // VC++ ignores throw () specification. #pragma warning (disable: 4127) // Warns about using "while (true)". #pragma warning (disable: 4100) // Warns about unused parameters. #pragma warning (disable: 4800) // Warns on int to bool conversion. #pragma warning (disable: 4146) // Warns on unary minus on unsigned (bit trick) // This warning warns about using the this pointer in base member // initializer lists. This is a pretty good warning as that can // obviously easily go wrong, but it is pretty useful to do as well, // so the warning is turned off. #pragma warning (disable: 4355) // Tells Windows.h/Windef.h not to define macroes called min and max since that // clashes with std::numeric_limits::max and std::max and probably lots of // other things too. #define NOMINMAX #ifndef MATHICGB_USE_FAKE_ATOMIC #if defined (_M_IX86) || defined(_M_X64) // if on x86 (32 bit) or x64 (64 bit) #define MATHICGB_USE_CUSTOM_ATOMIC_X86_X64 #define MATHICGB_USE_CUSTOM_ATOMIC_4BYTE #ifdef _M_X64 // if on x64 (64 bit) #define MATHICGB_USE_CUSTOM_ATOMIC_8BYTE #endif #endif #endif #elif defined (__GNUC__) // GCC compiler #define MATHICGB_NO_INLINE __attribute__((noinline)) #define MATHICGB_INLINE __attribute__((always_inline)) inline #define MATHICGB_ASSUME(X) ((void)0) #define MATHICGB_ASSUME_AND_MAY_EVALUATE(X) do {if(!(X)){MATHICGB_UNREACHABLE;}while(0)} #define MATHICGB_RETURN_NO_ALIAS __attribute__(malloc) #define MATHICGB_NOTHROW __attribute__(nothrow) #define MATHICGB_PURE __attribute__(pure) #define MATHICGB_MUST_CHECK_RETURN_VALUE __attribute__(warn_unused_result) #define MATHICGB_UNREACHABLE __builtin_unreachable() #define MATHICGB_RESTRICT __restrict // if on x86 (32 bit) or x64 (64 bit) #ifndef MATHICGB_USE_FAKE_ATOMIC #if defined (_X86_) || defined(__x86_64__) #define MATHICGB_USE_CUSTOM_ATOMIC_X86_X64 #define MATHICGB_USE_CUSTOM_ATOMIC_4BYTE #ifdef __x86_64__ // if on x64 (64 bit) #define MATHICGB_USE_CUSTOM_ATOMIC_8BYTE #endif #endif #endif #else #define MATHICGB_NO_INLINE #define MATHICGB_INLINE inline #define MATHICGB_ASSUME(X) ((void)0) #define MATHICGB_ASSUME_AND_MAY_EVALUATE(X) ((void)0) #define MATHICGB_RETURN_NO_ALIAS #define MATHICGB_NOTHROW #define MATHICGB_PURE #define MATHICGB_MUST_CHECK_RETURN_VALUE #define MATHICGB_UNREACHABLE #define MATHICGB_RESTRICT #endif #if defined(__CYGWIN__) && !defined(MATHICGB_NO_TBB) #define MATHICGB_NO_TBB #endif #include #include #ifdef MATHICGB_DEBUG // don't force inline while debugging #undef MATHICGB_INLINE #define MATHICGB_INLINE inline // we have to define DEBUG as lots of code assumes that asserts are turned // on/off depending on DEBUG. Those should change to checking // MATHICGB_DEBUG and then we can remove this define. #define DEBUG #include // Useful for debugging. #include #define MATHICGB_ASSERT(X) do{assert(X);}while(0) #define MATHICGB_ASSERT_NO_ASSUME(X) MATHICGB_ASSERT(X) #define MATHICGB_IF_DEBUG(X) X #else #define MATHICGB_ASSERT(X) MATHICGB_ASSUME(X) #define MATHICGB_ASSERT_NO_ASSUME(X) ((void)0) #define MATHICGB_IF_DEBUG(X) #endif #ifdef MATHICGB_SLOW_DEBUG // for asserts that take a long time. #define MATHICGB_SLOW_ASSERT(X) MATHICGB_ASSERT(X) #else #define MATHICGB_SLOW_ASSERT(X) ((void)0) #endif /// Concatenates A to B without expanding A and B. This is achieved since /// token pasting (##) defeats macro expansion. #define MATHICGB_CONCATENATE(A,B) A##B /// Concatenates A to B after expanding A and B. This is achieved since /// macro parameters are expanded before expanding the macro itself, /// so the token pasting inside MATHICGB_CONCATENATE does not defeat /// expansion of the parameters. So even though this macro just evaluates /// directly to MATHICGB_CONCATENATE(A,B) it does not do the same thing /// as that macro does. #define MATHICGB_CONCATENATE_AFTER_EXPANSION(A,B) MATHICGB_CONCATENATE(A,B) /// Returns an identifier that will be unique in the current file. If you need /// two different identifiers on the same line, you'll need to pass in two /// different ID paramters. Otherwise the ID parameter can be any identifier. /// On the same line, the identifier will be the same if the ID is the same. /// This can be useful in some macroes. #define MATHICGB_UNIQUE(ID) \ MATHICGB_CONCATENATE_AFTER_EXPANSION( \ MathicGB_unique_identifier_, \ MATHICGB_CONCATENATE_AFTER_EXPANSION(ID,__LINE__) \ ) /// Opens the mgb namespace. The purpose of having this be a macro is /// that otherwise editors the world over would automatically indent ALL /// CODE in MathicGB by an extra level to no benefit. By hiding the /// open and close braces inside a macro, the editors cannot see it so they /// do not indent because of it. Also, while transitioning to using /// the namespace, this was a useful way to insert the proper code in /// each file while still keeping everything compiling mid-way. #define MATHICGB_NAMESPACE_BEGIN namespace mgb { #define MATHICGB_NAMESPACE_END } #include /* See http://herbsutter.com/gotw/_102/ for a reason to have a make_unique function. It's pretty easy to do, too: template std::unique_ptr make_unique( Args&& ...args ) { return std::unique_ptr( new T( std::forward(args)... ) ); } Unfortunately, MSVC does not have variadic templates, so this turns into the monstrosity of overloads below. At least they got the perfect forwarding working, otherwise this would have required 4^N overloads for N parameters! Add more overloads below if you need more parameters. */ MATHICGB_NAMESPACE_BEGIN template std::unique_ptr make_unique() { return std::unique_ptr(new T()); } template std::unique_ptr make_unique(A1&& a1) { return std::unique_ptr(new T(std::forward(a1))); } template std::unique_ptr make_unique(A1&& a1, A2&& a2) { return std::unique_ptr(new T(std::forward(a1), std::forward(a2))); } template std::unique_ptr make_unique(A1&& a1, A2&& a2, A3&& a3) { return std::unique_ptr (new T(std::forward(a1), std::forward(a2), std::forward(a3))); } template std::unique_ptr make_unique(A1&& a1, A2&& a2, A3&& a3, A4&& a4) { return std::unique_ptr (new T(std::forward(a1), std::forward(a2), std::forward(a3), std::forward(a4))); } template std::unique_ptr make_unique(A1&& a1, A2&& a2, A3&& a3, A4&& a4, A5&& a5) { return std::unique_ptr (new T(std::forward(a1), std::forward(a2), std::forward(a3), std::forward(a4), std::forward(a5))); } template std::unique_ptr make_unique (A1&& a1, A2&& a2, A3&& a3, A4&& a4, A5&& a5, A6&& a6) { return std::unique_ptr (new T(std::forward(a1), std::forward(a2), std::forward(a3), std::forward(a4), std::forward(a5), std::forward(a6))); } template std::unique_ptr make_unique (A1&& a1, A2&& a2, A3&& a3, A4&& a4, A5&& a5, A6&& a6, A7&& a7) { return std::unique_ptr (new T(std::forward(a1), std::forward(a2), std::forward(a3), std::forward(a4), std::forward(a5), std::forward(a6), std::forward(a7))); } template std::unique_ptr make_unique (A1&& a1, A2&& a2, A3&& a3, A4&& a4, A5&& a5, A6&& a6, A7&& a7, A8&& a8) { return std::unique_ptr (new T(std::forward(a1), std::forward(a2), std::forward(a3), std::forward(a4), std::forward(a5), std::forward(a6), std::forward(a7), std::forward(a8))); } template std::unique_ptr make_unique (A1&& a1, A2&& a2, A3&& a3, A4&& a4, A5&& a5, A6&& a6, A7&& a7, A8&& a8, A9&& a9) { return std::unique_ptr (new T(std::forward(a1), std::forward(a2), std::forward(a3), std::forward(a4), std::forward(a5), std::forward(a6), std::forward(a7), std::forward(a8), std::forward(a9))); } template std::unique_ptr make_unique (A1&& a1, A2&& a2, A3&& a3, A4&& a4, A5&& a5, A6&& a6, A7&& a7, A8&& a8, A9&& a9, A10&& a10) { return std::unique_ptr (new T(std::forward(a1), std::forward(a2), std::forward(a3), std::forward(a4), std::forward(a5), std::forward(a6), std::forward(a7), std::forward(a8), std::forward(a9), std::forward(a10))); } template std::unique_ptr make_unique_array(size_t count) { return std::unique_ptr(new T[count]); } // TODO: These types should be defined in some way that actually // checks that these bit counts are right like in a configure script. typedef unsigned long long uint64; typedef unsigned int uint32; typedef unsigned short uint16; typedef unsigned char uint8; typedef signed long long int64; typedef signed int int32; typedef signed short int16; typedef signed char int8; /// Bizarrely, OpenMP 2 only supports signed loop /// variables. This defect is fixed in OpenMP 3. MSVC 2012 only supports /// OpenMP 2. So signed loop indices are forced for loops that are /// parallelized using OpenMP. typedef signed long OMPIndex; static const size_t BitsPerByte = 8; static const size_t MemoryAlignment = sizeof(void*); /// The higher the value the more detailed output about what the program /// is doing. extern int tracingLevel; MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/QuadMatrix.hpp0000664000175000017500000000673414560325357013775 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_QUAD_MATRIX_GUARD #define MATHICGB_QUAD_MATRIX_GUARD #include "PolyRing.hpp" #include "SparseMatrix.hpp" #include #include #include MATHICGB_NAMESPACE_BEGIN /// Represents a matrix composed of 4 sub-matrices that fit together /// into one matrix divided into top left, top right, bottom left and /// bottom right. This is a convenient representation of the matrices /// encountered in the F4 polynomial reduction algorithm. class QuadMatrix { public: typedef PolyRing::Monoid Monoid; typedef Monoid::Mono Mono; typedef Monoid::MonoRef MonoRef; typedef Monoid::ConstMonoRef ConstMonoRef; typedef Monoid::MonoPtr MonoPtr; typedef Monoid::ConstMonoPtr ConstMonoPtr; QuadMatrix(): mRing(nullptr) {} QuadMatrix(const PolyRing& ring): mRing(&ring) {} QuadMatrix(QuadMatrix&& matrix): topLeft(std::move(matrix.topLeft)), topRight(std::move(matrix.topRight)), bottomLeft(std::move(matrix.bottomLeft)), bottomRight(std::move(matrix.bottomRight)), leftColumnMonomials(std::move(matrix.leftColumnMonomials)), rightColumnMonomials(std::move(matrix.rightColumnMonomials)), mRing(&matrix.ring()) {} QuadMatrix& operator=(QuadMatrix&& matrix) { MATHICGB_ASSERT(mRing == matrix.mRing); this->~QuadMatrix(); new (this) QuadMatrix(std::move(matrix)); return *this; } void clear() { *this = QuadMatrix(ring()); } typedef std::vector Monomials; SparseMatrix topLeft; SparseMatrix topRight; SparseMatrix bottomLeft; SparseMatrix bottomRight; Monomials leftColumnMonomials; Monomials rightColumnMonomials; /// Prints whole matrix to out in human-readable format. Useful for /// debugging. void print(std::ostream& out) const; void printStatistics(std::ostream& out) const; size_t memoryUse() const; size_t memoryUseTrimmed() const; /// Shows whole matrix in a string. Useful for debugging. std::string toString() const; /// Return the combined number of non-zero entries. size_t entryCount() const; /// Return the combined number of left and right columns. size_t rowCount() const; /// Return the number of left columns. SparseMatrix::ColIndex computeLeftColCount() const; /// Return the number of right columns. SparseMatrix::ColIndex computeRightColCount() const; void write(SparseMatrix::Scalar modulus, FILE* file) const; /// Read a matrix from file into *this. Return the modulus from file. /// This method clears the column monomials and the ring pointer. SparseMatrix::Scalar read(FILE* file); /// Sort the left columns to be in decreasing order according to the monomial /// order from the ring. The operation is done in parallel. void sortColumnsLeftRightParallel(); /// Makes a copy of this matrix whose rows are sorted in some canonical way. /// TODO: Actually only coarsely sorts the top rows right now. QuadMatrix toCanonical() const; /// Asserts internal invariants if asserts are turned on. bool debugAssertValid() const; const PolyRing& ring() const {return *mRing;} const Monoid& monoid() const {return ring().monoid();} private: QuadMatrix(const QuadMatrix&); // not available void operator=(const QuadMatrix&); // not available const PolyRing* const mRing; }; std::ostream& operator<<(std::ostream& out, const QuadMatrix& qm); MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/F4ProtoMatrix.hpp0000664000175000017500000000257514560325357014377 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_F4_PROTO_MATRIX_GUARD #define MATHICGB_F4_PROTO_MATRIX_GUARD #include "PolyRing.hpp" #include "SparseMatrix.hpp" #include "Poly.hpp" MATHICGB_NAMESPACE_BEGIN class F4ProtoMatrix { public: typedef uint32 RowIndex; typedef uint32 ColIndex; typedef SparseMatrix::Scalar Scalar; typedef coefficient ExternalScalar; typedef Poly::ConstCoefIterator ExternalConstCoefIterator; struct Row { Row(): indices(), scalars(), externalScalars(), entryCount() {} const ColIndex* indices; const Scalar* scalars; ExternalConstCoefIterator externalScalars; ColIndex entryCount; }; RowIndex rowCount() const {return static_cast(mRows.size());} Row row(const RowIndex row) const; ColIndex* makeRowWithTheseScalars(const Poly& scalars); std::pair makeRow(ColIndex entryCount); void removeLastEntries(const RowIndex row, const ColIndex count); private: struct InternalRow { size_t indicesBegin; size_t scalarsBegin; ColIndex entryCount; bool scalarsStoredExternally; ExternalConstCoefIterator externalScalars; }; std::vector mIndices; std::vector mScalars; std::vector mRows; }; MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/MonomialMap.hpp0000664000175000017500000002251314560325357014120 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_MONOMIAL_MAP_GUARD #define MATHICGB_MONOMIAL_MAP_GUARD #include "FixedSizeMonomialMap.h" #include "mtbb.hpp" #include "Atomic.hpp" #include "PolyRing.hpp" #include #include #include #include MATHICGB_NAMESPACE_BEGIN /// A concurrent hash map from monomials to T. This map can resize itself /// if there are too few buckets compared to entries. /// /// Queries are supported through a MonomialMap::Reader object. On resize all /// previous readers are subject to permanent spurious misses - /// querying clients need to grab a fresh reader to confirm misses. Grabbing /// a reader incurs synchronization so do not do it for every query. /// /// External synchronization with writers is required if spurious misses are /// not acceptable. There are no spurious hits. If misses are very rare then /// reads can be done with minimal overhead by following this pattern: /// /// 1) grab a reader X /// 2) perform queries on X until done or there is a miss /// 3) replace X with a fresh reader /// 4) go to 2 if the miss is now a hit /// 5) grab a lock shared with all writers /// 6) perform the query again - a miss is now guaranteed to be accurate /// 7) release the lock after the processing of the miss is done and go to 2 /// /// There is no way to avoid locking if spurious misses are not acceptable /// as otherwise a writer could make an insertion of the requested key at any /// time while processing the miss - which then makes the miss spurious /// after-the-fact. template class MonomialMap { public: typedef PolyRing::Monoid Monoid; typedef Monoid::Mono Mono; typedef Monoid::MonoRef MonoRef; typedef Monoid::ConstMonoRef ConstMonoRef; typedef Monoid::MonoPtr MonoPtr; typedef Monoid::ConstMonoPtr ConstMonoPtr; typedef T mapped_type; typedef FixedSizeMonomialMap FixedSizeMap; typedef typename FixedSizeMap::value_type value_type; MonomialMap(const PolyRing& ring): mMap(new FixedSizeMap(InitialBucketCount, ring)), mRing(ring), mCapacityUntilGrowth (maxEntries(mMap.load(std::memory_order_relaxed)->bucketCount())) { // We can load mMap as std::memory_order_relaxed because we just stored it // and the constructor cannot run concurrently. } ~MonomialMap() { // We can load with std::memory_order_relaxed because the destructor // cannot run concurrently. delete mMap.load(std::memory_order_relaxed); } const PolyRing& ring() const {return mRing;} /// All queries are performed through a Reader. Readers are subject to /// permanent spurious misses on hash map resize. Grab a fresh reader /// on misses to confirm them. Making a Reader imposes synchronization /// overhead. External locking is required to guarantee that a miss is /// genuine since there is no mutual exclusion between queries and /// insertions. /// /// It is intentional that a reader does not have an update() method. The /// purpose of this is to make the internal hash table pointer const inside /// the class which guarantees to the compiler that it will never change. /// This in turn allows the compiler to store the fields of the internal /// hash table pointer such as the hash map mask. If there were an update() /// method this would not be possible and the compiler might have to load /// that mask for every query. I made it this way because I was seeming /// a performance regression of several percent which then went away with /// this solution. (well actually it's a reference, which has the same /// effect). class Reader { public: Reader(const MonomialMap& map): mMap(*map.mMap.load(std::memory_order_seq_cst)) { // We grab the hash table pointer with std::memory_order_seq_cst in order // to force a CPU cache flush - in this way we are more likely to get an // up to date value. } /// Returns the value that mono maps to or null if no such key has been /// inserted. Also returns the internal monomial that matches mono if such /// a monomial exists. Misses can be spurious! Read the comments on the parent /// class. std::pair find(ConstMonoRef mono) const { return mMap.find(mono); } // As find but looks for the product of a and b and also returns the // monomal that is the product. std::pair findProduct( ConstMonoRef a, ConstMonoRef b ) const { return mMap.findProduct(a, b); } /// As findProduct() but looks for the two products a1*b and a2*b /// simultaneously. The purpose of this is similar to that of unrolling a /// loop. MATHICGB_INLINE std::pair findTwoProducts( const ConstMonoRef a1, const ConstMonoRef a2, const ConstMonoRef b ) const { return mMap.findTwoProducts(a1, a2, b); } typedef typename FixedSizeMonomialMap::const_iterator const_iterator; /// The range [begin(), end()) contains all entries in the hash table. /// Insertions invalidate all iterators. Beware that insertions can /// happen concurrently. const_iterator begin() const {return mMap.begin();} const_iterator end() const {return mMap.end();} private: const FixedSizeMonomialMap& mMap; }; /// Removes all entries from the hash table. This requires mutual exclusion /// from and synchronization with all readers and writers. void clearNonConcurrent() { // We can load with std::memory_order_relaxed because this method // requires external synchronization. mMap.load(std::memory_order_relaxed)->clearNonConcurrent(); } /// Makes value.first map to value.second unless value.first is already /// present in the map - in that case nothing is done. If p is the returned /// pair then *p.first.first is the value that value.first maps to after the insert /// and p.second is true if an insertion was performed. *p.first.first will not /// equal value.second if an insertion was not performed - unless the /// inserted value equals the already present value. p.first.second is an /// internal monomial that equals value.first. std::pair, bool> insert(const value_type& value) { const mtbb::lock_guard lockGuard(mInsertionMutex); // const std::lock_guard lockGuard(mInsertionMutex); //const mtbb::mutex::scoped_lock lockGuard(mInsertionMutex); // We can load mMap as std::memory_order_relaxed because we have already // synchronized with all other mutators by locking mInsertionMutex; auto map = mMap.load(std::memory_order_relaxed); // this is a loop since it is possible to set the growth factor and // the initial size so low that several rounds are required. This should // only happen when debugging as otherwise such low parameters are // not a good idea. while (mCapacityUntilGrowth == 0) { // Resize the table by making a bigger one and using that instead. if (map->bucketCount() > // check overflow std::numeric_limits::max() / GrowthFactor) { throw std::bad_alloc(); } const size_t newBucketCount = map->bucketCount() * GrowthFactor; auto nextMap = make_unique(newBucketCount, std::move(*map)); mOldMaps.emplace_back(map); mCapacityUntilGrowth = maxEntries(nextMap->bucketCount()) - maxEntries(map->bucketCount()); // Store with std::memory_order_seq_cst to force a memory flush so that // readers see the new table as soon as possible. map = nextMap.release(); mMap.store(map, std::memory_order_seq_cst); } MATHICGB_ASSERT(mCapacityUntilGrowth > 0); auto p = map->insert(value); if (p.second) --mCapacityUntilGrowth; return p; } /// Return the number of entries. This method uses internal synchronization /// so do not call too much or you'll get degraded performance. size_t entryCount() const { const mtbb::lock_guard lockGuard(mInsertionMutex); // const std::lock_guard lockGuard(mInsertionMutex); // We can load with std::memory_order_relaxed because we are holding the // lock. auto& map = *mMap.load(std::memory_order_relaxed); return maxEntries(map.bucketCount()) - mCapacityUntilGrowth; } private: static const size_t MinBucketsPerEntry = 3; // inverse of max load factor static const size_t GrowthFactor = 2; static const size_t InitialBucketCount = 1 << 1; static size_t maxEntries(const size_t bucketCount) { return (bucketCount + (MinBucketsPerEntry - 1)) / MinBucketsPerEntry; } Atomic mMap; const PolyRing& mRing; mutable mtbb::mutex mInsertionMutex; /// Only access this field while holding the mInsertionMutex lock. size_t mCapacityUntilGrowth; /// Only access this field while holding the mInsertionMutex lock. /// Contains the old hash tables that we discarded on resize. We have to /// keep these around as we have no way to determine if there are still /// readers looking at them. This could be changed at the cost of /// more overhead in the Reader constructor and destructor. std::vector> mOldMaps; }; MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/TypicalReducer.hpp0000664000175000017500000000574114560325357014632 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_TYPICAL_REDUCER_GUARD #define MATHICGB_TYPICAL_REDUCER_GUARD #include "Reducer.hpp" #include "Poly.hpp" #include "PolyRing.hpp" MATHICGB_NAMESPACE_BEGIN class SigPolyBasis; class PolyBasis; /** Uses the template method pattern (not C++ templates) to implement reduction with some steps left to sub-classes. The template method pattern defines an algorithm that calls several virtual methods. Sub-classes can then redefine those methods to change some parts of the algorithm without recoding the whole thing. The word "template" here has nothing to do with C++ templates. See http://en.wikipedia.org/wiki/Template_method_pattern */ class TypicalReducer : public Reducer { public: virtual unsigned int preferredSetSize() const; virtual std::unique_ptr regularReduce( ConstMonoRef sig, ConstMonoRef multiple, size_t basisElement, const SigPolyBasis& basis ); virtual std::unique_ptr classicReduce (const Poly& poly, const PolyBasis& basis); virtual std::unique_ptr classicTailReduce (const Poly& poly, const PolyBasis& basis); virtual std::unique_ptr classicReduceSPoly (const Poly& a, const Poly& b, const PolyBasis& basis); virtual void classicReduceSPolySet( std::vector >& spairs, const PolyBasis& basis, std::vector >& reducedOut ); virtual void classicReducePolySet( const std::vector >& polys, const PolyBasis& basis, std::vector >& reducedOut ); virtual void setMemoryQuantum(size_t quantum); protected: // These are the methods that sub-classes define in order to carry // out sub-steps in the reduction. virtual void insertTail(const_term multiplier, const Poly* f) { MATHICGB_ASSERT(f != 0); NewConstTerm t = {multiplier.coeff, multiplier.monom}; insertTail(t, *f); } virtual void insert(monomial multiplier, const Poly* f) { MATHICGB_ASSERT(f != 0); ConstMonoRef mono = multiplier; insert(mono, *f); } virtual bool leadTerm(const_term& result) { NewConstTerm t; auto hasLead = leadTerm(t); if (hasLead) { result.monom = Monoid::toOld(*t.mono); result.coeff = t.coef; } return hasLead; } virtual void insertTail(NewConstTerm multiplier, const Poly& f) {} virtual void insert(ConstMonoRef multiplier, const Poly& f) {} virtual bool leadTerm(NewConstTerm& lead) {return false;} virtual void removeLeadTerm() = 0; virtual void resetReducer() = 0; virtual size_t getMemoryUse() const; // Sub-classes can use this memt::Arena mArena; private: void reset(); std::unique_ptr classicReduce(const PolyBasis& basis); std::unique_ptr classicReduce (std::unique_ptr partialResult, const PolyBasis& basis); }; MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/MonoProcessor.hpp0000664000175000017500000001040414560325357014513 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_MONO_PROCESSOR_GUARD #define MATHICGB_MONO_PROCESSOR_GUARD #include "Basis.hpp" MATHICGB_NAMESPACE_BEGIN /// Does pre- and post-processing of monomials to implement module monomial /// orders not directly supported by the monoid. template class MonoProcessor; template class MonoProcessor { public: typedef M Monoid; typedef typename Monoid::VarIndex VarIndex; typedef typename Monoid::Component Component; typedef typename Monoid::MonoVector MonoVector; typedef typename Monoid::MonoRef MonoRef; typedef typename Monoid::ConstMonoRef ConstMonoRef; typedef typename Monoid::ConstMonoPtr ConstMonoPtr; MonoProcessor( const Monoid& monoid, const bool componentsAscendingDesired, const bool schreyering ): mOrderFromLeft(false), mComponentsAscendingDesired(componentsAscendingDesired), mComponentCount(0), mSchreyering(schreyering), mSchreyerMultipliersMemory(monoid) {} void setComponentsAscendingDesired(bool value) { mComponentsAscendingDesired = value; } bool componentsAscendingDesired() const {return mComponentsAscendingDesired;} void setSchreyering(bool value) {mSchreyering = true;} bool schreyering() const {return mSchreyering;} void setSchreyerMultipliers(const Basis& basis) { MonoVector schreyer(monoid()); for (size_t gen = 0; gen < basis.size(); ++gen) schreyer.push_back(basis.getPoly(gen)->leadMono()); setSchreyerMultipliers(std::move(schreyer)); } void setSchreyerMultipliers(MonoVector&& moduleAdjustments) { MATHICGB_ASSERT(moduleAdjustments.monoid() == monoid()); MATHICGB_ASSERT(mSchreyerMultipliersMemory.empty() || mSchreyerMultipliersMemory.size() == componentCount()); mSchreyerMultipliersMemory = std::move(moduleAdjustments); mSchreyerMultipliers.clear(); for ( auto it = mSchreyerMultipliersMemory.begin(); it != mSchreyerMultipliersMemory.end(); ++it ) { // in the absence of a separate monoid for (non-module) monomials, // at least we can check that the component is zero. MATHICGB_ASSERT(this->monoid().component(*it) == 0); // todo: there should be a better way of indexing into a // MonoVector. mSchreyerMultipliers.emplace_back((*it).ptr()); } } void preprocess(MonoRef mono) const { if (hasSchreyerMultipliers()) monoid().multiplyInPlace(moduleAdjustment(mono), mono); if (needToReverseComponents()) reverseComponent(mono); } void postprocess(MonoRef mono) const { if (needToReverseComponents()) reverseComponent(mono); if (hasSchreyerMultipliers()) { MATHICGB_ASSERT(monoid().divides(moduleAdjustment(mono), mono)); monoid().divideInPlace(moduleAdjustment(mono), mono); } } bool processingNeeded() const { return needToReverseComponents() || hasSchreyerMultipliers(); } bool needToReverseComponents() const { return Monoid::HasComponent && componentsAscendingDesired() != monoid().componentsAscending(); } bool hasSchreyerMultipliers() const { return !mSchreyerMultipliers.empty(); } void setComponentCount(Component count) {mComponentCount = count;} Component componentCount() const {return mComponentCount;} const Monoid& monoid() const {return mSchreyerMultipliersMemory.monoid();} private: void operator==(const MonoProcessor&) const; // not available void reverseComponent(MonoRef mono) const { const auto component = monoid().component(mono); const auto newComponent = mComponentCount - 1 - component; monoid().setComponent(newComponent, mono); } ConstMonoRef moduleAdjustment(ConstMonoRef mono) const { MATHICGB_ASSERT(hasSchreyerMultipliers()); const auto component = monoid().component(mono); MATHICGB_ASSERT(component < componentCount()); MATHICGB_ASSERT(mSchreyerMultipliers.size() == componentCount()); return *mSchreyerMultipliers[component]; } bool mOrderFromLeft; bool mComponentsAscendingDesired; Component mComponentCount; bool mSchreyering; MonoVector mSchreyerMultipliersMemory; std::vector mSchreyerMultipliers; }; MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/ClassicGBAlg.hpp0000664000175000017500000000150114560325357014117 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_CLASSIC_GB_ALG_GUARD #define MATHICGB_CLASSIC_GB_ALG_GUARD #include MATHICGB_NAMESPACE_BEGIN class Reducer; class Basis; struct ClassicGBAlgParams { Reducer* reducer; int monoLookupType; bool preferSparseReducers; size_t sPairQueueType; unsigned int breakAfter; unsigned int printInterval; unsigned int sPairGroupSize; size_t reducerMemoryQuantum; bool useAutoTopReduction; bool useAutoTailReduction; std::function callback; }; Basis computeGBClassicAlg(Basis&& inputBasis, ClassicGBAlgParams params); Basis computeModuleGBClassicAlg(Basis&& inputBasis, ClassicGBAlgParams params); MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/ModuleMonoSet.cpp0000664000175000017500000001160014560325357014427 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "ModuleMonoSet.hpp" #include "StaticMonoMap.hpp" #include "MathicIO.hpp" MATHICGB_NAMESPACE_BEGIN template< bool UseKDTree, bool AllowRemovals, bool UseDivMask > class ConcreteModuleMonoSet : public ModuleMonoSet { public: typedef PolyRing::Monoid Monoid; struct NoData {}; typedef StaticMonoLookup Lookup; typedef typename Lookup::Entry Entry; ConcreteModuleMonoSet(const Monoid& monoid, const size_t componentCount): mMonoid(monoid), mComponentCount(componentCount), mLookups(std::allocator().allocate(mComponentCount)) { for (size_t component = 0; component < componentCount; ++component) new (&mLookups[component]) Lookup(monoid); } virtual ~ConcreteModuleMonoSet() { for(size_t component = 0; component < mComponentCount; ++component) mLookups[component].~Lookup(); std::allocator().deallocate(mLookups, mComponentCount); } virtual bool insert(ConstMonoRef m) { const auto c = monoid().component(m); MATHICGB_ASSERT(c < componentCount()); if (member(m)) return false; if (AllowRemovals) mLookups[c].removeMultiples(m); mLookups[c].insert(m, NoData()); return true; } virtual bool member(ConstMonoRef m) { const auto c = monoid().component(m); MATHICGB_ASSERT(c < componentCount()); return mLookups[c].divisor(m) != 0; } virtual std::string name() const { return Lookup(monoid()).getName(); } virtual void display(std::ostream& out) const { std::vector monomials; for (size_t c = 0; c < componentCount(); ++c) { const Lookup& lookup = mLookups[c]; if (lookup.size() == 0) continue; out << " " << c << ": "; monomials.clear(); lookup.forAll([&](const Entry& entry) { monomials.emplace_back(entry.mono().ptr()); }); const auto& monoid = this->monoid(); // workaround for gcc 4.5.3 issue const auto cmp = [&](ConstMonoPtr a, ConstMonoPtr b) { return monoid.lessThan(*a, *b); }; std::sort(monomials.begin(), monomials.end(), cmp); for (auto mono = monomials.cbegin(); mono != monomials.cend(); ++mono) { MathicIO<>().writeMonomial(monoid, false, **mono, out); out << " "; } out << '\n'; } } virtual void getMonomials(std::vector& monomials) const { for (size_t c = 0; c < componentCount(); ++c) { mLookups[c].forAll( [&](const Entry& entry) { monomials.push_back(entry.mono().ptr()); } ); } } virtual void forAllVirtual(EntryOutput& consumer) { for (size_t c = 0; c < componentCount(); ++c) { mLookups[c].forAll( [&](const Entry& entry) { consumer.proceed(entry.mono()); } ); } } virtual size_t elementCount() const { size_t count = 0; for (size_t c = 0; c < componentCount(); ++c) count += mLookups[c].size(); return count; } virtual size_t getMemoryUse() const { size_t count = 0; for (size_t c = 0; c < componentCount(); ++c) count += mLookups[c].getMemoryUse(); return count; } const Monoid& monoid() const {return mMonoid;} size_t componentCount() const {return mComponentCount;} private: const Monoid& mMonoid; // We cannot use std::vector as Lookup might not be copyable or movable. const size_t mComponentCount; Lookup* const mLookups; }; ModuleMonoSet::~ModuleMonoSet() {} void ModuleMonoSet::displayCodes(std::ostream& out) { out << " 1 list, using divmasks\n" " 2 KD-tree, using divmasks\n" " 3 list\n" " 4 KD-tree\n"; } namespace { class ModuleMonoSetFactory { public: typedef PolyRing::Monoid Monoid; std::unique_ptr make( const Monoid& monoid, int type, size_t componentCount, bool allowRemovals ) { const Params params = {monoid, type, componentCount}; return staticMonoLookupMake > (type, allowRemovals, params); } private: struct Params { const Monoid& monoid; int type; size_t componentCount; }; template struct Make { static std::unique_ptr make(const Params& params) { return make_unique > (params.monoid, params.componentCount); } }; }; } std::unique_ptr ModuleMonoSet::make( const Monoid& monoid, const int type, const size_t components, const bool allowRemovals ) { return ModuleMonoSetFactory().make(monoid, type, components, allowRemovals); } MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/ScopeExit.hpp0000664000175000017500000000611514560325357013612 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_SCOPE_EXIT_GUARD #define MATHICGB_SCOPE_EXIT_GUARD MATHICGB_NAMESPACE_BEGIN // Guard holds an action to call and calls it unless it has been released. template class Guard { public: ~Guard() { if (mOwning && mActive) mAction(); } private: friend struct GuardMaker; Guard(T&& action, const bool& active): mOwning(true), mActive(active), mAction(std::move(action)) {} // Most compilers should elide the call to this construtor, but it must be // here anyway and we should support even a crazy compiler that decides to // call it. Guard(Guard&& guard): mOwning(true), mActive(guard.mActive), mAction(std::move(guard.mAction)) { assert(guard.mActive); guard.mOwning = false; // to avoid calling mAction twice } bool mOwning; const bool& mActive; const T mAction; }; // The class user code interacts with to dismiss an action. class Dismisser { public: Dismisser(bool& active): mActive(active) {} void dismiss() {mActive = false;} private: bool& mActive; }; // Helper class that allows convenient syntax for the macro by overloading // operator+. struct GuardMaker { public: GuardMaker(const bool& active): mActive(active) {} template Guard operator+(T&& t) {return Guard(std::forward(t), mActive);} private: const bool& mActive; }; MATHICGB_NAMESPACE_END // Example, with no need to dismiss: // FILE* file = fopen("file.txt", "r"); // MATHICGB_SCOPE_EXIT() { // fclose(file); // std::cout << "file closed"; // }; // // ... // return; // the file is closed // // Example, with need to dismiss: // v.push_back(5); // MATHICGB_SCOPE_EXIT(name) {v.pop_back();}; // // ... // if (error) // return; // the pop_back is done // name.dismiss(); // return; // the pop_back is not done // // The middle line is a no-op if the name parameter expands to nothing. // When NAME expands to nothing, we need the static_cast to prevent // the compiler from parsing the middle line as a redeclaration of // myBool. In the final line we use that a const reference keeps // temporary objects alive until the end of the scope. It would be correct // to copy, but this way we can keep the copy constructor private // and help out any compiler that has issue with eliding that copy. #define MATHICGB_SCOPE_EXIT(NAME) \ bool MATHICGB_UNIQUE(active) = true; \ ::mgb::Dismisser NAME(static_cast(MATHICGB_UNIQUE(active))); \ const auto& MATHICGB_UNIQUE(guard) = \ ::mgb::GuardMaker(MATHICGB_UNIQUE(active)) + [&] // Without this pragma, MSVC will say // warning C4003: not enough actual parameters for macro 'MYLIB_SCOPE_EXIT' // when using MYLIB_SCOPE_EXIT without a name parameter. Not very happy about // turning off the warning. I wonder if there is a way to avoid the warning in // this case without turning it off. // MES: turning this off for now, as it gives warning on clang (unknown pragma ignored). // #pragma warning (disable: 4003) #endif mathicgb-1.1/src/mathicgb/F4MatrixBuilder.hpp0000664000175000017500000001351614560325357014657 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_F4_MATRIX_BUILDER_GUARD #define MATHICGB_F4_MATRIX_BUILDER_GUARD #include "QuadMatrixBuilder.hpp" #include "Poly.hpp" #include "PolyRing.hpp" #include "PolyBasis.hpp" #include "QuadMatrix.hpp" #include "mtbb.hpp" #include MATHICGB_NAMESPACE_BEGIN /// Class for constructing an F4 matrix. This class is reponsible for /// figuring out what matrix to build and then it uses QuadMatrixBuilder /// to create that matrix. /// /// @todo: this class does not offer exception guarantees. It's just not /// very workable without an RAII monomial handle, so add one of those /// before fixing this. class F4MatrixBuilder { private: typedef QuadMatrixBuilder::ColIndex ColIndex; typedef QuadMatrixBuilder::LeftRightColIndex LeftRightColIndex; typedef QuadMatrixBuilder::Scalar Scalar; typedef QuadMatrixBuilder::Map Map; typedef QuadMatrixBuilder::Monomials Monomials; public: typedef PolyRing::Field Field; typedef PolyRing::Monoid Monoid; typedef Monoid::Mono Mono; typedef Monoid::MonoRef MonoRef; typedef Monoid::ConstMonoRef ConstMonoRef; typedef Monoid::MonoPtr MonoPtr; typedef Monoid::ConstMonoPtr ConstMonoPtr; /// memoryQuantum is how much to increase the memory size by each time the /// current amount of memory is exhausted. A value of 0 indicates to start /// small and double the quantum at each exhaustion. F4MatrixBuilder(const PolyBasis& basis, size_t memoryQuantum = 0); /** Schedules a row representing the S-polynomial between polyA and polyB to be added to the matrix. No ownership is taken, but polyA and polyB must remain valid until the matrix is constructed. Currently, the two monomials must be monic, though this is just because they always happen to be monic so there was no reason to support the non-monic case. */ void addSPolynomialToMatrix(const Poly& polyA, const Poly& polyB); /** Schedules a row representing multiple*poly to be added to the matrix. No ownership is taken, but poly must remain valid until the matrix is constructed. multiple is copied so it need not remain valid. */ void addPolynomialToMatrix(ConstMonoRef multiple, const Poly& poly); /// as the overload with a multiple, just letting multiple be the /// identity. void addPolynomialToMatrix(const Poly& poly); /** Builds an F4 matrix to the specifications given. Also clears the information in this object. The right columns are ordered by decreasing monomial of each column according to the order from the basis. The left columns are ordered in some way so that the first entry in each top row (the pivot) has a lower index than any other entries in that row. The matrix contains a reducer/pivot for every monomial that can be reduced by the basis and that is present in the matrix. There is no guarantee that the bottom part of the matrix contains rows that exactly correspond to the polynomials that have been scheduled to be added to the matrix. It is only guaranteed that the whole matrix has the same row-space as though that had been the case. */ void buildMatrixAndClear(QuadMatrix& matrix); const PolyRing& ring() const {return mBuilder.ring();} const Monoid& monoid() const {return ring().monoid();} const Field& field() const {return ring().field();} private: typedef const MonomialMap::Reader ColReader; /// Represents the task of adding a row to the matrix. If sPairPoly is null /// then the row to add is multiply * poly. Otherwise, the row to add is /// multiply * poly - sPairMultiply * sPairPoly /// where sPairMultiply makes the lead terms cancel. struct RowTask { bool addToTop; // add the row to the bottom if false ConstMonoPtr desiredLead; // multiply monomial onto poly to get this lead const Poly* poly; const Poly* sPairPoly; ConstMonoPtr sPairMultiply; }; #if 1 //TBB_MAJOR_VERSION >= 2021 using TaskFeeder = mtbb::feeder; //#else // using TaskFeeder = mtbb::mtbbFeeder; #endif // typedef mtbb::parallel_do_feeder TaskFeeder; /// Creates a column with monomial label x and schedules a new row to /// reduce that column if possible. Here x is monoA if monoB is /// null and otherwise x is the product of monoA and monoB. MATHICGB_NO_INLINE std::pair createColumn(ConstMonoRef monoA, ConstMonoRef monoB, TaskFeeder& feeder); void appendRowTop( ConstMonoRef multiple, const Poly& poly, QuadMatrixBuilder& builder, TaskFeeder& feeder ); void appendRowBottom( const Poly& poly, ConstMonoRef multiply, const Poly& sPairPoly, ConstMonoRef sPairMultiply, QuadMatrixBuilder& builder, TaskFeeder& feeder ); void appendRowBottom( ConstMonoRef multiple, bool negate, Poly::ConstTermIterator begin, Poly::ConstTermIterator end, QuadMatrixBuilder& builder, TaskFeeder& feeder ); MATHICGB_NO_INLINE std::pair findOrCreateColumn( ConstMonoRef monoA, ConstMonoRef monoB, TaskFeeder& feeder ); MATHICGB_INLINE std::pair findOrCreateColumn( ConstMonoRef monoA, ConstMonoRef monoB, const ColReader& colMap, TaskFeeder& feeder ); MATHICGB_NO_INLINE void createTwoColumns( ConstMonoRef monoA1, ConstMonoRef monoA2, ConstMonoRef monoB, TaskFeeder& feeder ); mtbb::mutex mCreateColumnLock; ColIndex mLeftColCount; ColIndex mRightColCount; Mono mTmp; const PolyBasis& mBasis; Monomials mMonomialsLeft; Monomials mMonomialsRight; QuadMatrixBuilder mBuilder; Map mMap; std::vector mTodo; }; MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/mathicgb/SparseMatrix.cpp0000664000175000017500000004316314560325357014330 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "SparseMatrix.hpp" #include "Poly.hpp" #include MATHICGB_NAMESPACE_BEGIN void SparseMatrix::takeRowsFrom(SparseMatrix&& matrix) { if (matrix.mRows.empty()) return; if (mRows.empty()) { *this = std::move(matrix); return; } Block* oldestBlock = &matrix.mBlock; while (oldestBlock->mPreviousBlock != 0) oldestBlock = oldestBlock->mPreviousBlock; if (mBlock.mHasNoRows) // only put mBlock in chain of blocks if non-empty oldestBlock->mPreviousBlock = mBlock.mPreviousBlock; else oldestBlock->mPreviousBlock = new Block(std::move(mBlock)); mBlock = std::move(matrix.mBlock); mRows.insert(mRows.end(), matrix.mRows.begin(), matrix.mRows.end()); matrix.clear(); } void SparseMatrix::rowToPolynomial( const RowIndex row, const std::vector& colMonomials, Poly& poly ) { poly.setToZero(); poly.reserve(entryCountInRow(row)); const auto end = rowEnd(row); for (auto it = rowBegin(row); it != end; ++it) { MATHICGB_ASSERT(it.index() < colMonomials.size()); if (it.scalar() != 0) poly.append(it.scalar(), *colMonomials[it.index()]); } MATHICGB_ASSERT(poly.termsAreInDescendingOrder()); } void SparseMatrix::sortRowsByIncreasingPivots() { SparseMatrix ordered; const auto rowCount = this->rowCount(); std::vector rows(rowCount); for (RowIndex row = 0; row < rowCount; ++row) rows[row] = row; const auto lexLess = [&](const RowIndex a, const RowIndex b) -> bool { auto aIt = rowBegin(a); auto bIt = rowBegin(b); const auto aEnd = rowEnd(a); const auto bEnd = rowEnd(b); for (; aIt != aEnd && bIt != bEnd; ++aIt, ++bIt) { if (*aIt < *bIt) return true; if (*aIt > *bIt) return false; ++aIt; ++bIt; } return aIt == aEnd && bIt != bEnd; }; std::sort(rows.begin(), rows.end(), lexLess); // construct ordered with pivot columns in increasing order ordered.clear(); for (size_t i = 0; i < rowCount; ++i) ordered.appendRow(*this, rows[i]); *this = std::move(ordered); } void SparseMatrix::applyColumnMap(const std::vector& colMap) { MATHICGB_ASSERT(colMap.size() >= computeColCount()); Block* block = &mBlock; for (; block != 0; block = block->mPreviousBlock) { const auto end = block->mColIndices.end(); for (auto it = block->mColIndices.begin(); it != end; ++it) *it = colMap[*it]; } } void SparseMatrix::multiplyRow( const RowIndex row, const Scalar multiplier, const Scalar modulus ) { MATHICGB_ASSERT(row < rowCount()); const auto end = rowEnd(row); for (auto it = rowBegin(row); it != end; ++it) it.setScalar(modularProduct(it.scalar(), multiplier, modulus)); } void SparseMatrix::print(std::ostream& out) const { if (rowCount() == 0) out << "matrix with no rows\n"; for (RowIndex row = 0; row < rowCount(); ++row) { out << row << ':'; const auto end = rowEnd(row); for (auto it = rowBegin(row); it != end; ++it) out << ' ' << it.index() << '#' << it.scalar(); out << '\n'; } } void SparseMatrix::printStatistics(std::ostream& out) const { typedef mathic::ColumnPrinter ColPr; ColPr pr; pr.addColumn(false, " ", ""); pr.addColumn(false, "", ""); pr.addColumn(true, "", ""); const auto memory = memoryUse(); const auto colCount = computeColCount(); const auto entryCount = this->entryCount(); const uint64 area = static_cast(rowCount()) * static_cast(colCount); pr[0] << "\n/\n" << ColPr::commafy(rowCount()) << " |\nrows |\n\\\n"; const char* const line = "------------------\n"; pr[1] << ColPr::commafy(colCount) << " \n" << line << ColPr::withSIPrefix(entryCount) << " -" << ColPr::percentIntegerFixed(entryCount, area) << " \n" << ColPr::bytesInUnit(memory) << " -" << ColPr::percentIntegerFixed(memoryUseTrimmed(), memory) << " \n" << line; pr[2] << " columns\n\\\n| non-zero (density)\n| memory (used)\n/\n"; out << '\n' << pr << "\n"; } std::string SparseMatrix::toString() const { std::ostringstream out; print(out); return out.str(); } void SparseMatrix::appendRowAndNormalize( const SparseMatrix& matrix, const RowIndex row, const Scalar modulus ) { MATHICGB_ASSERT(row < matrix.rowCount()); auto it = matrix.rowBegin(row); const auto end = matrix.rowEnd(row); if (it != end) { appendEntry(it.index(), 1); const Scalar lead = it.scalar(); ++it; if (it != end) { const Scalar inverse = modularInverse(lead, modulus); do { const uint32 prod = static_cast(inverse) * it.scalar(); const uint16 prodMod = static_cast(prod % modulus); appendEntry(it.index(), prodMod); ++it; } while (it != end); } } rowDone(); } void SparseMatrix::appendRow(const SparseMatrix& matrix, const RowIndex row) { MATHICGB_ASSERT(row < matrix.rowCount()); const auto size = matrix.entryCountInRow(row); while (mBlock.mScalars.capacityToGo() < size) growEntryCapacity(); MATHICGB_ASSERT(mBlock.mScalars.capacityToGo() == mBlock.mColIndices.capacityToGo()); auto const data = matrix.mRows[row]; mBlock.mScalars.memcpy(data.mScalarsBegin, size); mBlock.mColIndices.memcpy(data.mIndicesBegin, size); rowDone(); } SparseMatrix& SparseMatrix::operator=(const SparseMatrix& matrix) { // todo: use copy-swap or copy-move. clear(); mMemoryQuantum = matrix.mMemoryQuantum; // A version that works on each block would be faster, but this is not // used anywhere time-critical right now. Improve this if it turns // up in profiling at some point. for (RowIndex row = 0; row < matrix.rowCount(); ++row) appendRow(matrix, row); return *this; } void SparseMatrix::swap(SparseMatrix& matrix) { mBlock.swap(matrix.mBlock); using std::swap; swap(mRows, matrix.mRows); swap(mMemoryQuantum, matrix.mMemoryQuantum); } bool SparseMatrix::operator==(const SparseMatrix& matrix) const { const auto count = rowCount(); if (count != matrix.rowCount()) return false; for (RowIndex row = 0; row < count; ++row) { if (entryCountInRow(row) != matrix.entryCountInRow(row)) return false; const auto end = rowEnd(row); auto matrixIt = matrix.rowBegin(row); for (auto it = rowBegin(row); it != end; ++it, ++matrixIt) if (*it != *matrixIt) return false; } return true; } SparseMatrix::ColIndex SparseMatrix::computeColCount() const { // Obviously this can be done faster, but there has not been a need for that // so far. ColIndex colCount = 0; for (RowIndex row = 0; row < rowCount(); ++row) { const auto end = rowEnd(row); for (auto it = rowBegin(row); it != end; ++it) colCount = std::max(colCount, it.index() + 1); } return colCount; } void SparseMatrix::clear() { Block* block = &mBlock; while (block != 0) { delete[] block->mColIndices.releaseMemory(); delete[] block->mScalars.releaseMemory(); Block* const tmp = block->mPreviousBlock; if (block != &mBlock) delete block; block = tmp; } mBlock.mPreviousBlock = 0; mBlock.mHasNoRows = true; mRows.clear(); } void SparseMatrix::appendRowWithModulus( std::vector const& v, const Scalar modulus ) { const auto count = static_cast(v.size()); for (ColIndex col = 0; col < count; ++col) { const Scalar scalar = static_cast(v[col] % modulus); if (scalar != 0) appendEntry(col, scalar); } rowDone(); } void SparseMatrix::appendRowWithModulusNormalized( std::vector const& v, const Scalar modulus ) { uint16 multiply = 1; bool first = true; const auto count = static_cast(v.size()); for (ColIndex col = 0; col < count; ++col) { Scalar scalar = static_cast(v[col] % modulus); if (scalar == 0) continue; if (first) { multiply = modularInverse(scalar, modulus); scalar = 1; first = false; } else { uint32 prod = static_cast(multiply) * scalar; scalar = prod % modulus; } appendEntry(col, scalar); } rowDone(); } bool SparseMatrix::appendRowWithModulusIfNonZero( std::vector const& v, const Scalar modulus ) { appendRowWithModulus(v, modulus); MATHICGB_ASSERT(rowCount() > 0); if (mRows.back().empty()) { mRows.pop_back(); return false; } else return true; } void SparseMatrix::trimLeadingZeroColumns(const ColIndex trimThisMany) { Block* block = &mBlock; for (; block != 0; block = block->mPreviousBlock) { const auto end = block->mColIndices.end(); for (auto it = block->mColIndices.begin(); it != end; ++it) { MATHICGB_ASSERT(*it >= trimThisMany); *it -= trimThisMany; } } } void SparseMatrix::reserveFreeEntries(const size_t freeCount) { if (freeCount <= mBlock.mColIndices.capacity() - mBlock.mColIndices.size()) return; // We need to copy over the pending entries, so we need space for those // entries on top of freeCount. const size_t count = freeCount + ( // todo: detect overflow for this addition mBlock.mHasNoRows ? mBlock.mColIndices.size() : std::distance(mRows.back().mIndicesEnd, mBlock.mColIndices.end()) ); // @todo: fix memory leaks on exception auto oldBlock = new Block(std::move(mBlock)); MATHICGB_ASSERT(mBlock.mColIndices.begin() == 0); MATHICGB_ASSERT(mBlock.mScalars.begin() == 0); MATHICGB_ASSERT(mBlock.mHasNoRows); MATHICGB_ASSERT(mBlock.mPreviousBlock == 0); { const auto begin = new ColIndex[count]; const auto capacityEnd = begin + count; mBlock.mColIndices.releaseAndSetMemory(begin, begin, capacityEnd); } { const auto begin = new Scalar[count]; const auto capacityEnd = begin + count; mBlock.mScalars.releaseAndSetMemory(begin, begin, capacityEnd); } // copy pending entries over if (oldBlock->mHasNoRows) { mBlock.mColIndices.rawAssign (oldBlock->mColIndices.begin(), oldBlock->mColIndices.end()); mBlock.mScalars.rawAssign (oldBlock->mScalars.begin(), oldBlock->mScalars.end()); delete oldBlock; // no reason to keep it around } else { mBlock.mColIndices.rawAssign (mRows.back().mIndicesEnd, oldBlock->mColIndices.end()); mBlock.mScalars.rawAssign (mRows.back().mScalarsEnd, oldBlock->mScalars.end()); // remove the pending entries from old block so that counting the number // of entries will give the correct result in future. oldBlock->mColIndices.resize (std::distance(oldBlock->mColIndices.begin(), mRows.back().mIndicesEnd)); oldBlock->mScalars.resize (std::distance(oldBlock->mScalars.begin(), mRows.back().mScalarsEnd)); mBlock.mPreviousBlock = oldBlock; } } void SparseMatrix::growEntryCapacity() { MATHICGB_ASSERT(mBlock.mColIndices.size() == mBlock.mScalars.size()); MATHICGB_ASSERT(mBlock.mColIndices.capacity() == mBlock.mScalars.capacity()); MATHICGB_ASSERT(mBlock.mColIndices.size() <= mBlock.mColIndices.capacity()); // TODO: handle overflow of arithmetic here if (mMemoryQuantum != 0 && (!mBlock.mHasNoRows || mBlock.mPreviousBlock == 0) ) reserveFreeEntries(mMemoryQuantum); else if (mBlock.mColIndices.capacity() == 0) reserveFreeEntries(1 << 14); // minimum block size else { // do this if the quantum is not set or if the quantum is too small // to store a single row being built. reserveFreeEntries(mBlock.mColIndices.capacity() * 2); } MATHICGB_ASSERT(mBlock.mColIndices.size() <= mBlock.mColIndices.capacity()); MATHICGB_ASSERT(mBlock.mColIndices.size() == mBlock.mScalars.size()); } float SparseMatrix::computeDensity() const { const auto rowCount = static_cast(this->rowCount()); const auto colCount = static_cast(computeColCount()); const auto entryCount = static_cast(this->entryCount()); return entryCount / (rowCount * colCount); } size_t SparseMatrix::entryCount() const { size_t count = 0; const Block* block = &mBlock; for (; block != 0; block = block->mPreviousBlock) count += block->mColIndices.size(); return count; } size_t SparseMatrix::memoryUse() const { size_t count = 0; for (auto block = &mBlock; block != 0; block = block->mPreviousBlock) count += block->memoryUse() + sizeof(Block); return count; } size_t SparseMatrix::memoryUseTrimmed() const { size_t count = 0; for (auto block = &mBlock; block != 0; block = block->mPreviousBlock) count += block->memoryUseTrimmed() + sizeof(Block); return count; } size_t SparseMatrix::Block::memoryUse() const { return mColIndices.memoryUse() + mScalars.memoryUse(); } size_t SparseMatrix::Block::memoryUseTrimmed() const { return mColIndices.memoryUseTrimmed() + mScalars.memoryUseTrimmed(); } std::ostream& operator<<(std::ostream& out, const SparseMatrix& matrix) { matrix.print(out); return out; } namespace { template T readOne(FILE* file) { T t; if (fread(&t, sizeof(T), 1, file) != 1) mathic::reportError("error while reading file."); return t; } template void writeOne(const T& t, FILE* file) { if (fwrite(&t, sizeof(T), 1, file) != 1) mathic::reportError("error while writing to file."); } template void writeMany(const std::vector& v, FILE* file) { if (v.empty()) return; if (fwrite(v.data(), sizeof(T), v.size(), file) != v.size()) mathic::reportError("error while writing to file."); } template void readMany(FILE* file, size_t count, std::vector& v) { size_t const originalSize = v.size(); v.resize(originalSize + count); if (fread(v.data() + originalSize, sizeof(T), count, file) != count) mathic::reportError("error while reading file."); } } void SparseMatrix::write(const Scalar modulus, FILE* file) const { const auto storedRowCount = rowCount(); writeOne(static_cast(storedRowCount), file); writeOne(static_cast(computeColCount()), file); writeOne(static_cast(modulus), file); writeOne(static_cast(entryCount()), file); // write scalars for (SparseMatrix::RowIndex row = 0; row < storedRowCount; ++row) { const auto count = entryCountInRow(row); if (fwrite(&rowBegin(row).scalar(), sizeof(uint16), count, file) != count) mathic::reportError("error while writing to file."); } // write indices for (SparseMatrix::RowIndex row = 0; row < storedRowCount; ++row) { const auto count = entryCountInRow(row); if (fwrite(&rowBegin(row).index(), sizeof(uint32), count, file) != count) mathic::reportError("error while writing to file."); } std::vector entryCounts; for (SparseMatrix::RowIndex row = 0; row < storedRowCount; ++row) entryCounts.push_back(entryCountInRow(row)); writeMany(entryCounts, file); } SparseMatrix::Scalar SparseMatrix::read(FILE* file) { MATHICGB_ASSERT(file != 0); const auto rowCount = readOne(file); [[maybe_unused]] const auto colCount = readOne(file); const auto modulus = readOne(file); const auto entryCount64 = readOne(file); if (entryCount64 > std::numeric_limits::max()) throw std::bad_alloc(); const auto entryCount = static_cast(entryCount64); // Allocate memory to hold the matrix in one block. clear(); reserveFreeEntries(entryCount); mRows.reserve(rowCount); MATHICGB_ASSERT(mBlock.mPreviousBlock == 0); // only one block // @todo: we can read directly into the block. Do that. // Read scalars. { mBlock.mScalars.resize(entryCount); std::vector scalars; readMany(file, entryCount, scalars); std::copy(scalars.begin(), scalars.end(), mBlock.mScalars.begin()); } // Read column indices. { mBlock.mColIndices.resize(entryCount); std::vector indices; readMany(file, entryCount, indices); std::copy(indices.begin(), indices.end(), mBlock.mColIndices.begin()); } // Read where rows begin and end. { std::vector sizes; readMany(file, rowCount, sizes); uint32 runningOffset = 0; for (auto it = sizes.begin(); it != sizes.end(); ++it) { Row row; row.mIndicesBegin = mBlock.mColIndices.begin() + runningOffset; row.mScalarsBegin = mBlock.mScalars.begin() + runningOffset; runningOffset += *it; row.mIndicesEnd = mBlock.mColIndices.begin() + runningOffset; row.mScalarsEnd = mBlock.mScalars.begin() + runningOffset; mRows.push_back(row); } MATHICGB_ASSERT(runningOffset == entryCount); } MATHICGB_ASSERT(mBlock.mPreviousBlock == 0); // still only one block return modulus; } void SparseMatrix::writePBM(FILE* file) { // See http://netpbm.sourceforge.net/doc/pbm.html const auto rowCount = this->rowCount(); auto colCount = this->computeColCount(); colCount += 8-(colCount % 8); // Write PBM header { std::stringstream out; out << "P1 " << colCount << ' ' << rowCount << '\n'; fputs(out.str().c_str(), file); } for (RowIndex row = 0; row < rowCount; ++row) { const auto end = rowEnd(row); auto it = rowBegin(row); for (ColIndex col = 0; col < colCount; ++col) { if (it != end && col == it.index()) { fputc('1', file); ++it; } else fputc('0', file); } fputc('\n', file); } } bool SparseMatrix::debugAssertValid() const { for (RowIndex row = 0; row < rowCount(); ++row) { for (auto it = rowBegin(row); it != rowEnd(row); ++it) { // A scalar of 0 is not necessarily bad, it is just not expected // at the time of writing this assert. Feel free to remove this assert // if you are creating scalars that are zero on purpose. MATHICGB_ASSERT(it.scalar() != 0); } } return true; } MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb/SigSPairs.cpp0000664000175000017500000002406514560325357013552 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "stdinc.h" #include "SigSPairs.hpp" #include "SigPolyBasis.hpp" #include "ModuleMonoSet.hpp" #include "Reducer.hpp" #include #include #include MATHICGB_NAMESPACE_BEGIN SigSPairs::SigSPairs( const PolyRing *R0, const SigPolyBasis *GB0, ModuleMonoSet *Hsyz0, Reducer* reducer, bool postponeKoszuls, bool useBaseDivisors, bool useSingularCriterionEarly, size_t queueType ): R(R0), mUseSingularCriterionEarly(useSingularCriterionEarly), mUseBaseDivisors(useBaseDivisors), mUseHighBaseDivisors(useBaseDivisors), Hsyz(Hsyz0), GB(GB0), // mReducer(reducer), mPostponeKoszuls(postponeKoszuls), mQueue(SigSPairQueue::create(*GB)) {} SigSPairs::~SigSPairs() { MATHICGB_ASSERT(mUseBaseDivisors || mUseHighBaseDivisors || mKnownSyzygyTri.empty()); } auto SigSPairs::popSignature(PairContainer& pairs) -> Mono { auto sig = mQueue->popSignature(pairs); if (!sig.isNull()) { size_t const pairCount = pairs.size(); mStats.spairsFinal += pairCount; mStats.duplicateSignatures += pairCount - 1; } return sig; } void SigSPairs::newPairs(size_t newGen) { MATHICGB_ASSERT(mIndexSigs.empty()); makePreSPairs(newGen); mQueue->pushPairs(newGen, mIndexSigs); mIndexSigs.clear(); MATHICGB_ASSERT((!mUseBaseDivisors && !mUseHighBaseDivisors) || mKnownSyzygyTri.columnCount() == newGen + 1); } void SigSPairs::setupBaseDivisors( BaseDivisor& divisor1, BaseDivisor& divisor2, size_t& highDivisorCmp, size_t newGenerator ) { BaseDivContainer divisors; const size_t MaxBaseDivisors = 2; if (mUseBaseDivisors || mUseHighBaseDivisors) divisors.reserve(MaxBaseDivisors + 1); MATHICGB_ASSERT(mUseBaseDivisors || mUseHighBaseDivisors); MATHICGB_ASSERT(mKnownSyzygyTri.columnCount() == newGenerator); mKnownSyzygyTri.addColumn(); if (mUseHighBaseDivisors) { size_t highDivisor = GB->highBaseDivisor(newGenerator); if (highDivisor != static_cast(-1)) { // To use a high divisor, the ratio of the other generator has to be // greater than both the ratio of newGenerator and of the high ratio // divisor. We can check both at once by letting highDivisorCmp // be the one out of newGenerator and highDivisor that has the // highest ratio. if (GB->ratioCompare(newGenerator, highDivisor) == GT) highDivisorCmp = newGenerator; else highDivisorCmp = highDivisor; } } else highDivisorCmp = static_cast(-1); if (!mUseBaseDivisors) return; std::vector divs; GB->lowBaseDivisors(divs, MaxBaseDivisors, newGenerator); MATHICGB_ASSERT(divs.size() <= MaxBaseDivisors); divisors.resize(divs.size()); for (size_t i = 0; i < divisors.size(); ++i) { BaseDivisor& bd = divisors[i]; bd.baseDivisor = divs[i]; // Only use the base divisor technique for generators with ratio // less than both N and baseDivisor. baseDivisorCmp is the // smallest one of these, so it can be used for this comparison. if (GB->ratioCompare(newGenerator, bd.baseDivisor) == LT) bd.ratioLessThan = newGenerator; else bd.ratioLessThan = bd.baseDivisor; // Construct a monomial in makeSPair_t2 that can be used // to eliminate s-pairs quickly based on the s-pairs already // eliminated for baseDivisor. auto newSig = GB->signature(newGenerator); auto newLead = GB->leadMono(newGenerator); auto baseDivSig = GB->signature(bd.baseDivisor); auto baseDivLead = GB->leadMono(bd.baseDivisor); bd.baseMonomial = R->allocMonomial(); R->mysteriousSPairMonomialRoutine( Monoid::toOld(newSig), Monoid::toOld(newLead), Monoid::toOld(baseDivSig), Monoid::toOld(baseDivLead), bd.baseMonomial ); } divisor1.baseDivisor = static_cast(-1); divisor2.baseDivisor = static_cast(-1); if (divisors.size() >= 1) divisor1 = divisors.front(); if (divisors.size() == 2) { divisor2 = divisors.back(); MATHICGB_ASSERT(GB->ratioCompare (divisor1.ratioLessThan, divisor2.ratioLessThan) != LT); } } void SigSPairs::makePreSPairs(size_t newGen) { MATHICGB_ASSERT(mIndexSigs.empty()); MATHICGB_ASSERT(newGen < GB->size()); mStats.spairsConstructed += newGen; monomial baseDivisorMonomial = 0; BaseDivisor divisor1; BaseDivisor divisor2; divisor1.baseDivisor = static_cast(-1); divisor2.baseDivisor = static_cast(-1); size_t highDivisorCmp = static_cast(-1); if (mUseBaseDivisors || mUseHighBaseDivisors) setupBaseDivisors(divisor1, divisor2, highDivisorCmp, newGen); monomial hsyz = 0; if (!mPostponeKoszuls) hsyz = R->allocMonomial(); auto newSig = GB->signature(newGen); auto newLead = GB->leadMono(newGen); auto pairSig = R->allocMonomial(); if (mUseHighBaseDivisors && divisor1.baseDivisor != static_cast(-1)) ++mStats.hasLowBaseDivisor; if (mUseHighBaseDivisors && highDivisorCmp != static_cast(-1)) ++mStats.hasHighBaseDivisor; PreSPair result; for (size_t oldGen = 0; oldGen < newGen; oldGen++) { auto oldSig = GB->signature(oldGen); auto oldLead = GB->leadMono(oldGen); // Check whether this is a non-regular spair. // 'cmp' is used below too. const int cmp = GB->ratioCompare(newGen, oldGen); if (cmp == EQ) { ++mStats.nonregularSPairs; continue; } // check high ratio divisor if (mUseHighBaseDivisors && highDivisorCmp != static_cast(-1) && GB->ratioCompare(oldGen, highDivisorCmp) == GT && mKnownSyzygyTri.bitUnordered(oldGen, highDivisorCmp)) { MATHICGB_ASSERT(oldGen != highDivisorCmp); // otherwise ratios should be equal mKnownSyzygyTri.setBit(newGen, oldGen, true); ++mStats.highBaseDivisorHits; // if MATHICGB_DEBUG defined, get to the ASSERT below stating // that this is really a syzygy #ifndef MATHICGB_DEBUG continue; #endif } // check low ratio divisors if (mUseBaseDivisors && divisor1.baseDivisor != static_cast(-1) && GB->ratioCompare(oldGen, divisor1.ratioLessThan) == LT) { // if no divisor1, also no divisor 2 and also // divisor1 has larger ratio, so skip both checks if divisor1 fails due // to the ratio being too small or because there is no divisor1. if ( (divisor1.baseDivisor != oldGen && // if divisor1 is a hit mKnownSyzygyTri.bitUnordered(divisor1.baseDivisor, oldGen) && monoid().divides(oldLead, divisor1.baseMonomial)) || // or if divisor2 is a hit (divisor2.baseDivisor != static_cast(-1) && GB->ratioCompare(oldGen, divisor2.ratioLessThan) == LT && divisor2.baseDivisor != oldGen && mKnownSyzygyTri.bitUnordered(divisor2.baseDivisor, oldGen) && monoid().divides(oldLead, divisor2.baseMonomial)) ) { mKnownSyzygyTri.setBit(newGen, oldGen, true); ++mStats.lowBaseDivisorHits; // if MATHICGB_DEBUG defined, get to the ASSERT below stating // that this really is a syzygy. #ifndef MATHICGB_DEBUG continue; #endif } } if (cmp == GT) monoid().colonMultiply(newLead, oldLead, newSig, pairSig); else { MATHICGB_ASSERT(cmp == LT); monoid().colonMultiply(oldLead, newLead, oldSig, pairSig); } if (Hsyz->member(pairSig)) { ++mStats.syzygyModuleHits; #ifdef MATHICGB_DEBUG // Check if actually already elim. by low/high base divisor. // Only check in MATHICGB_DEBUG mode as otherwise we would have taken an // early exit before getting here. if ((mUseBaseDivisors || mUseHighBaseDivisors) && mKnownSyzygyTri.bit(newGen, oldGen)) --mStats.syzygyModuleHits; #endif if (mUseBaseDivisors || mUseHighBaseDivisors) mKnownSyzygyTri.setBit(newGen, oldGen, true); continue; } MATHICGB_ASSERT((!mUseBaseDivisors && !mUseHighBaseDivisors) || !mKnownSyzygyTri.bit(newGen, oldGen)); if (!mPostponeKoszuls) { // add koszul syzygy to Hsyz. MATHICGB_ASSERT(cmp == GT || cmp == LT); if (cmp == GT) monoid().multiply(newSig, oldLead, hsyz); else monoid().multiply(oldSig, newLead, hsyz); if (Hsyz->insert(hsyz)) hsyz = R->allocMonomial(); if (monoid().relativelyPrime(newLead, oldLead)) { ++mStats.earlyRelativelyPrimePairs; continue; } } if (mUseSingularCriterionEarly) { MATHICGB_ASSERT(cmp == GT || cmp == LT); size_t const givesSig = (cmp == GT ? newGen : oldGen); if ( GB->ratioCompare(GB->minimalLeadInSig(pairSig), givesSig) == GT && !monoid().relativelyPrime(newLead, oldLead) ) { ++mStats.earlySingularCriterionPairs; continue; } } // construct the PreSPair result.signature = pairSig; pairSig = R->allocMonomial(); result.i = static_cast(oldGen); mIndexSigs.push_back(result); ++mStats.queuedPairs; } R->freeMonomial(pairSig); if (mUseBaseDivisors && ! baseDivisorMonomial.isNull()) R->freeMonomial(baseDivisorMonomial); if (!mPostponeKoszuls) R->freeMonomial(hsyz); } void SigSPairs::setKnownSyzygies(std::vector >& pairs) { if (!mUseBaseDivisors && !mUseHighBaseDivisors) return; for (size_t i = 0; i < pairs.size(); ++i) setKnownSyzygy(pairs[i].first, pairs[i].second); } void SigSPairs::setKnownSyzygy(size_t gen1, size_t gen2) { MATHICGB_ASSERT(gen1 < GB->size()); MATHICGB_ASSERT(gen2 < GB->size()); MATHICGB_ASSERT(gen1 != gen2); if (mUseBaseDivisors || mUseHighBaseDivisors) mKnownSyzygyTri.setBitUnordered(gen1, gen2, true); } size_t SigSPairs::pairCount() const { return mQueue->pairCount(); } std::string SigSPairs::name() { return mQueue->name(); } size_t SigSPairs::getMemoryUse() const { return mQueue->memoryUse() + getKnownSyzygyBitsMemoryUse(); } size_t SigSPairs::getKnownSyzygyBitsMemoryUse() const { return mKnownSyzygyTri.getMemoryUse(); } MATHICGB_NAMESPACE_END mathicgb-1.1/src/mathicgb.cpp0000664000175000017500000006626115117247507011711 #include "mathicgb/stdinc.h" #include "mathicgb.h" #include "mathicgb/Basis.hpp" #include "mathicgb/PolyRing.hpp" #include "mathicgb/Poly.hpp" #include "mathicgb/Reducer.hpp" #include "mathicgb/ClassicGBAlg.hpp" #include "mathicgb/mtbb.hpp" #include "mathicgb/LogDomainSet.hpp" #include #ifndef MATHICGB_ASSERT #ifdef MATHICGB_DEBUG #include #define MATHICGB_ASSERT(X) assert(X) #else #define MATHICGB_ASSERT(X) #endif #endif #define MATHICGB_STREAM_CHECK(X, MSG) \ do { \ const bool value = (X); \ if (!value) { \ [[maybe_unused]] const bool ignoreMe = false; \ MATHICGB_ASSERT(( \ "MathicGB stream protocol error: "#MSG \ "\nAssert expression: "#X"\n", \ false \ )); \ throw std::invalid_argument( \ "MathicGB stream protocol error: "#MSG \ "\nAssert expression: "#X"\n" \ ); \ } \ } while (false) extern "C" { void libmathicgbIsPresent(void) {} char MATHICGB_VERSION_STRING[] = PACKAGE_VERSION; } MATHICGB_NAMESPACE_BEGIN using namespace mgbi; namespace { bool isPrime(unsigned int n) { if (n == 0 || n == 1) return false; if (n == 2 || n == 3) return true; return true; // todo: make better test } }; bool logTime(const char* logName, double& time) { auto log = LogDomainSet::singleton().logDomain(logName); if (log == nullptr || !log->enabled()) return false; time = log->loggedSecondsReal(); return true; } bool logNumber(const char* logName, double& number) { auto log = LogDomainSet::singleton().logDomain(logName); if (log == nullptr || !log->enabled()) return false; number = static_cast(log->count()); return true; } namespace mgbi { struct StreamStateChecker::Pimpl { Pimpl(Coefficient modulus, VarIndex varCount, Component comCount): modulus(modulus), varCount(varCount), comCount(comCount), state(Initial), hasClaimedPolyCount(false), claimedPolyCount(0), seenPolyCount(0), hasClaimedTermCount(false), claimedTermCount(0), seenTermCount(0), lastVar(0) {} bool debugAssertValid() const; enum State { Initial, MakingIdeal, MakingPoly, MakingTerm, HasIdeal }; const Coefficient modulus; const VarIndex varCount; const Component comCount; State state; bool hasClaimedPolyCount; size_t claimedPolyCount; size_t seenPolyCount; bool hasClaimedTermCount; size_t claimedTermCount; size_t seenTermCount; VarIndex lastVar; }; bool StreamStateChecker::Pimpl::debugAssertValid() const { #ifdef MATHICGB_DEBUG switch (state) { case Initial: case MakingIdeal: case MakingPoly: case MakingTerm: case HasIdeal: break; default: MATHICGB_ASSERT(false); return false; } #endif return true; }; StreamStateChecker::StreamStateChecker( const Coefficient modulus, const VarIndex varCount, const Component comCount ): mPimpl(new Pimpl(modulus, varCount, comCount)) { try { MATHICGB_STREAM_CHECK(isPrime(modulus), "The modulus must be prime"); MATHICGB_ASSERT(mPimpl->debugAssertValid()); } catch (...) { delete mPimpl; } } StreamStateChecker::~StreamStateChecker() { MATHICGB_ASSERT(mPimpl->debugAssertValid()); delete mPimpl; } void StreamStateChecker::idealBegin() { MATHICGB_ASSERT(mPimpl->debugAssertValid()); MATHICGB_STREAM_CHECK( mPimpl->state == Pimpl::Initial || mPimpl->state == Pimpl::HasIdeal, "idealBegin() must not be called twice " "without an intervening call to idealDone()." ); mPimpl->state = Pimpl::MakingIdeal; mPimpl->hasClaimedPolyCount = false; mPimpl->claimedPolyCount = 0; mPimpl->seenPolyCount = 0; MATHICGB_ASSERT(mPimpl->debugAssertValid()); } void StreamStateChecker::idealBegin(size_t polyCount) { idealBegin(); mPimpl->hasClaimedPolyCount = true; mPimpl->claimedPolyCount = polyCount; mPimpl->seenPolyCount = 0; MATHICGB_ASSERT(mPimpl->debugAssertValid()); } void StreamStateChecker::appendPolynomialBegin() { MATHICGB_ASSERT(mPimpl->debugAssertValid()); MATHICGB_STREAM_CHECK( mPimpl->state != Pimpl::Initial && mPimpl->state != Pimpl::HasIdeal, "appendPolynomialBegin() must only be called after idealBegin() and " "before idealEnd()." ); MATHICGB_STREAM_CHECK( mPimpl->state == Pimpl::MakingIdeal, "appendPolynomialBegin() must not be called twice without " "an intervening call to appendPolynomialDone()." ); MATHICGB_STREAM_CHECK( !mPimpl->hasClaimedPolyCount || mPimpl->seenPolyCount < mPimpl->claimedPolyCount, "The number of polynomials in an ideal must not exceed the amount " "passed to idealBegin()." ); mPimpl->state = Pimpl::MakingPoly; mPimpl->seenPolyCount += 1; mPimpl->hasClaimedTermCount = false; mPimpl->claimedTermCount = 0; mPimpl->seenTermCount = 0; MATHICGB_ASSERT(mPimpl->debugAssertValid()); } void StreamStateChecker::appendPolynomialBegin(size_t termCount) { appendPolynomialBegin(); mPimpl->hasClaimedTermCount = true; mPimpl->claimedTermCount = termCount; mPimpl->seenTermCount = 0; MATHICGB_ASSERT(mPimpl->debugAssertValid()); } void StreamStateChecker::appendTermBegin(const Component com) { MATHICGB_ASSERT(mPimpl->debugAssertValid()); MATHICGB_STREAM_CHECK( mPimpl->state != Pimpl::Initial && mPimpl->state != Pimpl::HasIdeal && mPimpl->state != Pimpl::MakingIdeal, "appendTermBegin() must only be called after appendPolynomialBegin() " "and before appendPolynomialDone()." ); MATHICGB_STREAM_CHECK( mPimpl->state == Pimpl::MakingPoly, "appendTermBegin() must not be called twice without an intervening " "call to appendTermDone()." ); MATHICGB_STREAM_CHECK( !mPimpl->hasClaimedTermCount || mPimpl->seenTermCount < mPimpl->claimedTermCount, "The number of terms in a polynomial must not exceed the amount " "passed to appendPolynomialBegin()." ); MATHICGB_STREAM_CHECK( com < mPimpl->comCount, "The component passed to appendTermBegin must be strictly less " "than the number of components." ); mPimpl->state = Pimpl::MakingTerm; mPimpl->seenTermCount += 1; mPimpl->lastVar = std::numeric_limitslastVar)>::max(); MATHICGB_ASSERT(mPimpl->debugAssertValid()); } void StreamStateChecker::appendExponent(VarIndex index, Exponent exponent) { MATHICGB_ASSERT(mPimpl->debugAssertValid()); MATHICGB_STREAM_CHECK( mPimpl->state == Pimpl::MakingTerm, "appendExponent must only be called after appendTermBegin() and before " "appendTermDone()." ); MATHICGB_STREAM_CHECK( index < mPimpl->varCount, "The index passed to appendExponent must be strictly less than " "the number of variables." ); MATHICGB_STREAM_CHECK( mPimpl->lastVar == std::numeric_limitslastVar)>::max() || mPimpl->lastVar < index, "The variable indices passed to appendExponent must be in strictly " "increasing order within each monomial." ); mPimpl->lastVar = index; MATHICGB_ASSERT(mPimpl->debugAssertValid()); } void StreamStateChecker::appendTermDone(Coefficient coefficient) { MATHICGB_ASSERT(mPimpl->debugAssertValid()); MATHICGB_STREAM_CHECK( coefficient > 0, "The coefficient passed to appendTermDone() must be strictly positive." ); MATHICGB_STREAM_CHECK( coefficient < mPimpl->modulus, "The coefficient passed to appendTermDone() must be strictly less " "then the modulus." ); MATHICGB_STREAM_CHECK( mPimpl->state == Pimpl::MakingTerm, "appendTermDone() must only be called after appendTermBegin()." ); mPimpl->state = Pimpl::MakingPoly; MATHICGB_ASSERT(mPimpl->debugAssertValid()); } void StreamStateChecker::appendPolynomialDone() { MATHICGB_ASSERT(mPimpl->debugAssertValid()); MATHICGB_STREAM_CHECK( mPimpl->state == Pimpl::MakingPoly, "appendPolynomialDone() must only be called after appendPolynomialBegin()." ); MATHICGB_STREAM_CHECK( !mPimpl->hasClaimedTermCount || mPimpl->seenTermCount == mPimpl->claimedTermCount, "The number of terms in a polynomial must match the amount " "passed to appendPolynomialBegin()." ); mPimpl->state = Pimpl::MakingIdeal; MATHICGB_ASSERT(mPimpl->debugAssertValid()); } void StreamStateChecker::idealDone() { MATHICGB_ASSERT(mPimpl->debugAssertValid()); MATHICGB_STREAM_CHECK( mPimpl->state == Pimpl::MakingIdeal, "idealDone() must only be called after idealBegin()." ); MATHICGB_STREAM_CHECK( !mPimpl->hasClaimedPolyCount || mPimpl->seenPolyCount == mPimpl->claimedPolyCount, "The number of polynomials in an ideal must match the amount " "passed to idealBegin()." ); mPimpl->state = Pimpl::HasIdeal; MATHICGB_ASSERT(mPimpl->debugAssertValid()); } bool StreamStateChecker::hasIdeal() const { MATHICGB_ASSERT(mPimpl->debugAssertValid()); return mPimpl->state == Pimpl::HasIdeal; } } // ** Implementation of the class GroebnerConfiguration struct GroebnerConfiguration::Pimpl { Pimpl( Coefficient modulus, VarIndex varCount, Component comCount ): mModulus(modulus), mVarCount(varCount), mComCount(comCount), mBaseOrder(RevLexDescendingBaseOrder), mGradings(varCount, 1), mComponentBefore(ComponentAfterBaseOrder), mComponentsAscending(true), mSchreyering(true), mReducer(DefaultReducer), mMaxSPairGroupSize(0), mMaxThreadCount(0), mLogging(), mCallbackData(nullptr), mCallback(nullptr) #ifdef MATHICGB_DEBUG , mHasBeenDestroyed(false) #endif { } ~Pimpl() { MATHICGB_ASSERT(debugAssertValid()); MATHICGB_IF_DEBUG(mHasBeenDestroyed = true;) } static bool baseOrderValid(const BaseOrder order) { return order == RevLexDescendingBaseOrder || order == LexDescendingBaseOrder || order == RevLexAscendingBaseOrder || order == LexAscendingBaseOrder; } static bool reducerValid(const Reducer reducer) { return reducer == DefaultReducer || reducer == ClassicReducer || reducer == MatrixReducer; } bool debugAssertValid() const { #ifdef MATHICGB_DEBUG MATHICGB_ASSERT(baseOrderValid(mBaseOrder)); MATHICGB_ASSERT(reducerValid(mReducer)); MATHICGB_ASSERT(mModulus != 0); MATHICGB_ASSERT(mCallback != 0 || mCallbackData == 0); MATHICGB_ASSERT_NO_ASSUME(!mHasBeenDestroyed); #endif return true; } const Coefficient mModulus; const VarIndex mVarCount; const Component mComCount; BaseOrder mBaseOrder; std::vector mGradings; size_t mComponentBefore; bool mComponentsAscending; bool mSchreyering; Reducer mReducer; unsigned int mMaxSPairGroupSize; unsigned int mMaxThreadCount; std::string mLogging; void* mCallbackData; Callback::Action (*mCallback) (void*); MATHICGB_IF_DEBUG(bool mHasBeenDestroyed); }; GroebnerConfiguration::GroebnerConfiguration( Coefficient modulus, VarIndex varCount, Component comCount ): mPimpl(new Pimpl(modulus, varCount, comCount)) { if (modulus > std::numeric_limits::max()) { MATHICGB_ASSERT_NO_ASSUME(false); std::ostringstream str; str << "Modulus " << modulus << " is too large. MathicGB only supports 16 bit moduli."; mathic::reportError(str.str()); } if (!isPrime(modulus)) { MATHICGB_ASSERT_NO_ASSUME(false); std::ostringstream str; str << "Modulus " << modulus << " is not prime. MathicGB only supports prime fields."; mathic::reportError(str.str()); } MATHICGB_ASSERT(mPimpl->debugAssertValid()); } GroebnerConfiguration::GroebnerConfiguration( const GroebnerConfiguration& conf ): mPimpl(new Pimpl(*conf.mPimpl)) { MATHICGB_ASSERT(conf.mPimpl->debugAssertValid()); } GroebnerConfiguration::~GroebnerConfiguration() { MATHICGB_ASSERT(mPimpl->debugAssertValid()); delete mPimpl; } auto GroebnerConfiguration::modulus() const -> Coefficient { return mPimpl->mModulus; } auto GroebnerConfiguration::varCount() const -> VarIndex { return mPimpl->mVarCount; } auto GroebnerConfiguration::comCount() const -> Component { return mPimpl->mComCount; } const char* GroebnerConfiguration::baseOrderName(BaseOrder order) { switch (order) { case RevLexDescendingBaseOrder: return "reverse lexicographic descending"; case LexDescendingBaseOrder: return "lexicographic descending"; case RevLexAscendingBaseOrder: return "reverse lexicographic ascending"; case LexAscendingBaseOrder: return "lexicographic ascending"; default: return "(ERROR: invalid base order)"; } } bool GroebnerConfiguration::setMonomialOrderInternal( MonomialOrderData order ) { MATHICGB_ASSERT(Pimpl::baseOrderValid(order.baseOrder)); MATHICGB_ASSERT(varCount() != 0 || order.gradingsSize == 0); MATHICGB_ASSERT(varCount() == 0 || order.gradingsSize % varCount() == 0); // Check if order is global. if (varCount() != 0) { const size_t rowCount = order.gradingsSize / varCount(); for (VarIndex var = 0; var < varCount(); ++var) { // check if 1 < x_var. for (size_t row = 0; row < rowCount; ++row) { const Exponent e = order.gradings[row * varCount() + var]; if (e < 0) return false; // order not global if (e > 0) goto orderGlobalForVar; } if ( order.baseOrder == RevLexAscendingBaseOrder || order.baseOrder == RevLexDescendingBaseOrder ) return false; // order not global orderGlobalForVar:; } } mPimpl->mBaseOrder = order.baseOrder; mPimpl->mGradings.assign (order.gradings, order.gradings + order.gradingsSize); return true; } auto GroebnerConfiguration::monomialOrderInternal() const -> MonomialOrderData { const MonomialOrderData data = { mPimpl->mBaseOrder, mPimpl->mGradings.data(), mPimpl->mGradings.size() }; return data; } void GroebnerConfiguration::setCallbackInternal( void* data, Callback::Action (*func) (void*) ) { MATHICGB_ASSERT(func != 0 || data == 0); mPimpl->mCallbackData = data; mPimpl->mCallback = func; } void* GroebnerConfiguration::callbackDataInternal() const { return mPimpl->mCallbackData; } void GroebnerConfiguration::setComponentBefore(size_t value) { mPimpl->mComponentBefore = value; } size_t GroebnerConfiguration::componentBefore() const { return mPimpl->mComponentBefore; } void GroebnerConfiguration::setComponentsAscending(bool value) { mPimpl->mComponentsAscending = value; } bool GroebnerConfiguration::componentsAscending() const { return mPimpl->mComponentsAscending; } void GroebnerConfiguration::setSchreyering(bool value) { mPimpl->mSchreyering = value; } bool GroebnerConfiguration::schreyering() const { return mPimpl->mSchreyering; } void GroebnerConfiguration::setReducer(Reducer reducer) { MATHICGB_ASSERT(Pimpl::reducerValid(reducer)); mPimpl->mReducer = reducer; } auto GroebnerConfiguration::reducer() const -> Reducer { return mPimpl->mReducer; } void GroebnerConfiguration::setMaxSPairGroupSize(unsigned int size) { mPimpl->mMaxSPairGroupSize = size; } uint32 GroebnerConfiguration::maxSPairGroupSize() const { return mPimpl->mMaxSPairGroupSize; } void GroebnerConfiguration::setMaxThreadCount(unsigned int maxThreadCount) { mPimpl->mMaxThreadCount = maxThreadCount; } unsigned int GroebnerConfiguration::maxThreadCount() const { return mPimpl->mMaxThreadCount; } void GroebnerConfiguration::setLogging(const char* logging) { if (logging == nullptr) mPimpl->mLogging.clear(); else mPimpl->mLogging = logging; } const char* GroebnerConfiguration::logging() const { return mPimpl->mLogging.c_str(); } // ** Implementation of class GroebnerInputIdealStream namespace { PolyRing::Monoid::Order::BaseOrder translateBaseOrder( const GroebnerConfiguration::BaseOrder baseOrder ) { typedef PolyRing::Monoid::Order Internal; typedef GroebnerConfiguration External; switch (baseOrder) { default: MATHICGB_ASSERT(false); case External:: RevLexDescendingBaseOrder: return Internal::RevLexBaseOrderFromRight; case External::LexDescendingBaseOrder: return Internal::LexBaseOrderFromLeft; case External::RevLexAscendingBaseOrder: return Internal::RevLexBaseOrderFromLeft; case External::LexAscendingBaseOrder: return Internal::LexBaseOrderFromRight; } } } struct GroebnerInputIdealStream::Pimpl { Pimpl(const GroebnerConfiguration& conf): ring( PolyRing::Field(conf.modulus()), PolyRing::Monoid::Order( conf.varCount(), std::move(conf.monomialOrder().second), translateBaseOrder(conf.monomialOrder().first), conf.componentBefore(), conf.componentsAscending(), conf.schreyering() ) ), basis(ring), poly(ring), monomial(ring.allocMonomial()), conf(conf) #ifdef MATHICGB_DEBUG , hasBeenDestroyed(false), checker(conf.modulus(), conf.varCount(), conf.comCount()) #endif {} ~Pimpl() { ring.freeMonomial(monomial); } const PolyRing ring; Basis basis; Poly poly; Monomial monomial; const GroebnerConfiguration conf; MATHICGB_IF_DEBUG(bool hasBeenDestroyed); MATHICGB_IF_DEBUG(StreamStateChecker checker); }; GroebnerInputIdealStream::GroebnerInputIdealStream( const GroebnerConfiguration& conf ): mExponents(new Exponent[conf.varCount()]), mPimpl(new Pimpl(conf)) { MATHICGB_ASSERT(debugAssertValid()); } GroebnerInputIdealStream::~GroebnerInputIdealStream() { MATHICGB_ASSERT(debugAssertValid()); MATHICGB_ASSERT(mExponents != 0); MATHICGB_ASSERT(mPimpl != 0); MATHICGB_ASSERT_NO_ASSUME(!mPimpl->hasBeenDestroyed); MATHICGB_IF_DEBUG(mPimpl->hasBeenDestroyed = true); delete mPimpl; delete[] mExponents; } const GroebnerConfiguration& GroebnerInputIdealStream::configuration() const { return mPimpl->conf; } auto GroebnerInputIdealStream::modulus() const -> Coefficient { return configuration().modulus(); } auto GroebnerInputIdealStream::varCount() const -> VarIndex { return configuration().varCount(); } auto GroebnerInputIdealStream::comCount() const -> Component { return configuration().comCount(); } void GroebnerInputIdealStream::idealBegin() { MATHICGB_ASSERT(debugAssertValid()); MATHICGB_IF_DEBUG(mPimpl->checker.idealBegin()); MATHICGB_ASSERT(mPimpl->poly.isZero()); MATHICGB_ASSERT(mPimpl->basis.empty()); MATHICGB_ASSERT(debugAssertValid()); } void GroebnerInputIdealStream::idealBegin(size_t polyCount) { MATHICGB_ASSERT(debugAssertValid()); MATHICGB_IF_DEBUG(mPimpl->checker.idealBegin(polyCount)); MATHICGB_ASSERT(mPimpl->poly.isZero()); MATHICGB_ASSERT(mPimpl->basis.empty()); mPimpl->basis.reserve(polyCount); MATHICGB_ASSERT(debugAssertValid()); } void GroebnerInputIdealStream::appendPolynomialBegin() { MATHICGB_ASSERT(debugAssertValid()); MATHICGB_IF_DEBUG(mPimpl->checker.appendPolynomialBegin()); MATHICGB_ASSERT(mPimpl->poly.isZero()); MATHICGB_ASSERT(debugAssertValid()); } void GroebnerInputIdealStream::appendPolynomialBegin(size_t termCount) { MATHICGB_ASSERT(debugAssertValid()); MATHICGB_IF_DEBUG(mPimpl->checker.appendPolynomialBegin(termCount)); MATHICGB_ASSERT(mPimpl->poly.isZero()); mPimpl->poly.reserve(termCount); MATHICGB_ASSERT(debugAssertValid()); } void GroebnerInputIdealStream::appendTermBegin(const Component com) { MATHICGB_ASSERT(debugAssertValid()); MATHICGB_IF_DEBUG(mPimpl->checker.appendTermBegin(com)); std::fill_n(mExponents, varCount(), 0); mPimpl->ring.monoid().setComponent(com, mPimpl->monomial); MATHICGB_ASSERT(debugAssertValid()); } void GroebnerInputIdealStream::appendTermDone(Coefficient coefficient) { MATHICGB_ASSERT(debugAssertValid()); MATHICGB_IF_DEBUG(mPimpl->checker.appendTermDone(coefficient)); // @todo: do this directly into the polynomial instead of copying a second // time. mPimpl->ring.monomialSetExternalExponents(mPimpl->monomial, mExponents); mPimpl->poly.append(coefficient, mPimpl->monomial); MATHICGB_ASSERT(debugAssertValid()); } void GroebnerInputIdealStream::appendPolynomialDone() { MATHICGB_ASSERT(debugAssertValid()); MATHICGB_IF_DEBUG(mPimpl->checker.appendPolynomialDone()); // todo: avoid copy here by the following changes // todo: give Ideal a Poly&& insert // todo: give Poly a Poly&& constructor auto poly = make_unique(std::move(mPimpl->poly)); if (!poly->termsAreInDescendingOrder()) *poly = poly->polyWithTermsDescending(); mPimpl->basis.insert(std::move(poly)); mPimpl->poly.setToZero(); MATHICGB_ASSERT(debugAssertValid()); } void GroebnerInputIdealStream::idealDone() { MATHICGB_ASSERT(debugAssertValid()); MATHICGB_IF_DEBUG(mPimpl->checker.idealDone()); } bool GroebnerInputIdealStream::debugAssertValid() const { MATHICGB_ASSERT(mExponents != 0); MATHICGB_ASSERT(mPimpl != 0); MATHICGB_ASSERT_NO_ASSUME(!mPimpl->hasBeenDestroyed); MATHICGB_ASSERT(!mPimpl->monomial.isNull()); MATHICGB_ASSERT(&mPimpl->basis.ring() == &mPimpl->ring); MATHICGB_ASSERT(&mPimpl->poly.ring() == &mPimpl->ring); MATHICGB_ASSERT(mPimpl->ring.getNumVars() == mPimpl->conf.varCount()); MATHICGB_ASSERT(mPimpl->ring.charac() == mPimpl->conf.modulus()); return true; } // ** Implementation of class mgbi::PimplOf namespace mgbi { class PimplOf { public: template typename T::Pimpl& operator()(T& t) { MATHICGB_ASSERT(t.mPimpl != 0); return *t.mPimpl; } }; } // ** Implementation of mgbi::IdealAdapter namespace mgbi { struct IdealAdapter::Pimpl { Pimpl(): polyIndex(0), mTermIt() {} std::unique_ptr basis; std::unique_ptr tmpTerm; size_t polyIndex; Poly::ConstTermIterator mTermIt; }; IdealAdapter::IdealAdapter(): mPimpl(new Pimpl()) {} IdealAdapter::~IdealAdapter() { MATHICGB_ASSERT(mPimpl != 0); delete mPimpl; } auto IdealAdapter::varCount() const -> VarIndex { MATHICGB_ASSERT(mPimpl->basis.get() != 0); return mPimpl->basis->ring().getNumVars(); } size_t IdealAdapter::polyCount() const { MATHICGB_ASSERT(mPimpl->basis.get() != 0); return mPimpl->basis->size(); } size_t IdealAdapter::termCount(PolyIndex poly) const { MATHICGB_ASSERT(mPimpl->basis.get() != 0); MATHICGB_ASSERT(poly < mPimpl->basis->size()); return mPimpl->basis->getPoly(poly)->termCount(); } void IdealAdapter::toFirstTerm() { mPimpl->polyIndex = 0; while ( mPimpl->polyIndex < mPimpl->basis->size() && mPimpl->basis->getPoly(mPimpl->polyIndex)->isZero() ) ++(mPimpl->polyIndex); if (mPimpl->polyIndex < mPimpl->basis->size()) mPimpl->mTermIt = mPimpl->basis->getPoly(mPimpl->polyIndex)->begin(); } auto IdealAdapter::nextTerm() const -> ConstTerm { MATHICGB_ASSERT(mPimpl->basis.get() != 0); MATHICGB_ASSERT(mPimpl->polyIndex < mPimpl->basis->size()); const auto& monoid = mPimpl->basis->ring().monoid(); const auto& p = *mPimpl->basis->getPoly(mPimpl->polyIndex); MATHICGB_ASSERT(p.ring().monoid() == monoid); const auto& from = *mPimpl->mTermIt; const auto com = monoid.component(*from.mono); auto to = mPimpl->tmpTerm.get(); for (VarIndex var = 0; var < monoid.varCount(); ++var) to[var] = monoid.externalExponent(*from.mono, var); ++(mPimpl->mTermIt); if (mPimpl->mTermIt == p.end()) { ++mPimpl->polyIndex; while ( mPimpl->polyIndex < mPimpl->basis->size() && mPimpl->basis->getPoly(mPimpl->polyIndex)->isZero() ) ++(mPimpl->polyIndex); if (mPimpl->polyIndex < mPimpl->basis->size()) mPimpl->mTermIt = mPimpl->basis->getPoly(mPimpl->polyIndex)->begin(); } ConstTerm term; term.coef = from.coef; term.exponents = to; term.com = com; return term; } } namespace { class CallbackAdapter { public: typedef mgb::GroebnerConfiguration::Callback::Action Action; CallbackAdapter(void* data, Action (*callback) (void*)): mData(data), mCallback(callback), mLastAction(Action::ContinueAction) { MATHICGB_ASSERT(mCallback != 0 || mData == 0); } bool isNull() const {return mCallback == nullptr;} Action lastAction() const {return mLastAction;} bool operator()() { if (isNull()) return true; mLastAction = mCallback(mData); return mLastAction == Action::ContinueAction; } private: void* const mData; Action (* const mCallback) (void*); Action mLastAction; }; } // ** Implementation of function mgbi::internalComputeGroebnerBasis namespace mgbi { bool internalComputeGroebnerBasis( GroebnerInputIdealStream& inputWhichWillBeCleared, IdealAdapter& output ) { /// @todo: make a scheme where the output Groebner basis is freed /// polynomial-by-polynomial as data is transferred to out. Also /// make it so that ideal is not copied. auto&& basis = PimplOf()(inputWhichWillBeCleared).basis; auto&& conf = inputWhichWillBeCleared.configuration(); auto&& ring = basis.ring(); // This is not used: const auto varCount = ring.getNumVars(); MATHICGB_ASSERT(PimplOf()(conf).debugAssertValid()); // Tell tbb how many threads to use const auto maxThreadCount = int(conf.maxThreadCount()); const auto tbbMaxThreadCount = maxThreadCount == 0 ? mtbb::task_arena::automatic : maxThreadCount; mtbb::task_arena scheduler(tbbMaxThreadCount); // Set up logging LogDomainSet::singleton().reset(); LogDomainSet::singleton().performLogCommands(conf.logging()); // Make reducer typedef GroebnerConfiguration GConf; Reducer::ReducerType reducerType; switch (conf.reducer()) { case GConf::ClassicReducer: reducerType = Reducer::Reducer_Geobucket_Hashed; break; default: case GConf::DefaultReducer: case GConf::MatrixReducer: reducerType = Reducer::Reducer_F4_New; break; } const auto reducer = Reducer::makeReducer(reducerType, ring); CallbackAdapter callback( PimplOf()(conf).mCallbackData, PimplOf()(conf).mCallback ); ClassicGBAlgParams params; params.reducer = reducer.get(); params.monoLookupType = 2; params.preferSparseReducers = true; params.sPairQueueType = 0; params.breakAfter = 0; params.printInterval = 0; params.sPairGroupSize = conf.maxSPairGroupSize(); params.reducerMemoryQuantum = 100 * 1024; params.useAutoTopReduction = true; params.useAutoTailReduction = false; params.callback = nullptr; if (!callback.isNull()) params.callback = [&callback](){return callback();}; auto gb = scheduler.execute([&basis,&conf,¶ms]{ return conf.comCount() == 1 ? computeGBClassicAlg(std::move(basis), params) : computeModuleGBClassicAlg(std::move(basis), params); }); typedef mgb::GroebnerConfiguration::Callback::Action Action; if (callback.lastAction() != Action::StopWithNoOutputAction) { PimplOf()(output).basis = make_unique(std::move(gb)); PimplOf()(output).tmpTerm = make_unique_array(basis.ring().varCount()); return true; } else return false; } } MATHICGB_NAMESPACE_END mathicgb-1.1/src/cli/0000775000175000017500000000000015117247675010251 5mathicgb-1.1/src/cli/HelpAction.cpp0000664000175000017500000000641114560325357012720 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "mathicgb/stdinc.h" #include "HelpAction.hpp" #include "mathicgb/LogDomain.hpp" #include "mathicgb/LogDomainSet.hpp" #include MATHICGB_NAMESPACE_BEGIN void HelpAction::performAction() { if (topic() != "logs") { mathic::HelpAction::performAction(); return; } const char* header = "MathicGB offers a set of logs that can be enabled or disabled " "individually.\n" "\n" "A log can have a streaming component and a summary " "component. The streaming component is printed as the logged event " "occurs while the summary component is printed at the end. For example " "a log for opening files would stream a message every time a file is " "opened and it would report the total number of files opened when the " "program has run to the end. The summary can also include how long " "something took.\n" "\n" "An enabled log always prints its summary if it registered any events. " "The streaming component can be turned off even for an enabled log, and " "this is the default for some logs.\n" "\n" "You specify the log configuration using the option -log X, where X is " "a comma-seperated list of log specifications. Here is an example:\n" "\n" " A,+B,-C,D+,E-\n" "\n" "This enables logs A, B, D and E and disables C. Furthermore, streaming " "for D is turned on while it is turned off for E. The streaming setting " "for A, B and C is the default for those logs.\n" "\n" "A prefix of - disables the log while no prefix or a prefix of + enables " "it. A suffix of - turns off streaming while a suffix of + turns it on. " "If there is no suffix then the setting for streaming is unchanged. A " "prefix or suffix of 0 means do nothing.\n" "\n" "The following is a list of all compile-time enabled logs. The prefixes " "and suffixes indicate the default state of the log.\n"; mathic::display(header); auto& logs = LogDomainSet::singleton().logDomains(); for (auto it = logs.begin(); it != logs.end(); ++it) { const auto toSign = [](const bool b) {return b ? '+' : '-';}; std::cerr << "\n " << toSign((*it)->enabled()) << (*it)->name() << toSign((*it)->streamEnabledPure()) << '\n'; mathic::display((*it)->description(), " "); } const char* aliasDescription = "\nA log alias is a short-hand where one name stands for several log " "specifications. Prefixes and Suffixes also apply to aliases. If X " "expands to A+,-B,C then +X- expands to +A-,+B-,+C-. 0all- turns off " "all streaming output without enabling or disabling any logs.\n" "\n" "The following is a list of all aliases.\n"; mathic::display(aliasDescription); auto& aliases = LogDomainSet::singleton().aliases(); for (auto it = aliases.begin(); it != aliases.end(); ++it) { std::cerr << "\n " << it->first << " expands to\n"; std::string str = it->second; std::replace(str.begin(), str.end(), ',', ' '); mathic::display(str, " "); } std::cerr << "\n none expands to nothing\n" "\n" " all expands to all log names\n" "\n"; } MATHICGB_NAMESPACE_END mathicgb-1.1/src/cli/SigGBAction.hpp0000664000175000017500000000175014560325357012771 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_SIG_G_B_ACTION_GUARD #define MATHICGB_SIG_G_B_ACTION_GUARD #include "GBCommonParams.hpp" #include "CommonParams.hpp" #include MATHICGB_NAMESPACE_BEGIN class SigGBAction : public mic::Action { public: SigGBAction(); virtual void directOptions( std::vector tokens, mic::CliParser& parser ); virtual void performAction(); static const char* staticName(); virtual const char* name() const; virtual const char* description() const; virtual const char* shortDescription() const; virtual void pushBackParameters(std::vector& parameters); private: CommonParams mParams; GBCommonParams mGBParams; mic::BoolParameter mUseSingularCriterionEarly; mic::BoolParameter mPostponeKoszul; mic::BoolParameter mUseBaseDivisors; }; MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/cli/SigGBAction.cpp0000664000175000017500000000715114560325357012765 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "mathicgb/stdinc.h" #include "SigGBAction.hpp" #include "mathicgb/Basis.hpp" #include "mathicgb/SignatureGB.hpp" #include "mathicgb/io-util.hpp" #include "mathicgb/Scanner.hpp" #include "mathicgb/MathicIO.hpp" #include #include MATHICGB_NAMESPACE_BEGIN SigGBAction::SigGBAction(): mParams(1, 1), mUseSingularCriterionEarly( "earlySingularCriterion", "Apply the singular S-pair elimination criterion before queueing " "that S-pair. Otherwise, the criterion is only checked just before " "the S-pair would otherwise cause a polynomial reduction to occur. ", false), mPostponeKoszul( "postponeKoszul", "Postpone the construction of Koszul syzygy signatures.", true), mUseBaseDivisors( "useBaseDivisors", "Use high ratio and low ratio base divisors to eliminate " "S-spairs quickly based on signature.", true) {} void SigGBAction::directOptions( std::vector< std::string> tokens, mic::CliParser& parser ) { mParams.directOptions(tokens, parser); } void SigGBAction::performAction() { mParams.perform(); mGBParams.perform(); // read input file const std::string inputBasisFile = mParams.inputFileNameStem(0) + ".ideal"; std::ifstream inputFile(inputBasisFile.c_str()); if (inputFile.fail()) mic::reportError("Could not read input file \"" + inputBasisFile + '\n'); Scanner in(inputFile); auto p = MathicIO<>().readRing(true, in); auto& ring = *p.first; auto& processor = p.second; auto basis = MathicIO<>().readBasis(ring, false, in); if (processor.schreyering()) processor.setSchreyerMultipliers(basis); SignatureGB alg( std::move(basis), std::move(processor), Reducer::reducerType(mGBParams.mReducer.value()), mGBParams.mMonoLookup.value(), mGBParams.mMonomialTable.value(), mPostponeKoszul.value(), mUseBaseDivisors.value(), mGBParams.mPreferSparseReducers.value(), mUseSingularCriterionEarly.value(), mGBParams.mSPairQueue.value()); alg.setBreakAfter(mGBParams.mBreakAfter.value()); alg.setPrintInterval(mGBParams.mPrintInterval.value()); alg.computeGrobnerBasis(); // print statistics alg.displayStats(std::cout); alg.displayPaperStats(std::cout); { std::ofstream statsOut(mParams.inputFileNameStem(0) + ".stats"); alg.displayStats(statsOut); alg.displayPaperStats(statsOut); } if (mGBParams.mOutputResult.value()) { // print basis { std::ofstream ogb(mParams.inputFileNameStem(0) + ".gb"); ogb << "-- gb: ----\n"; alg.getGB()->display(ogb); } // print syzygy basis { std::ofstream syzygyOut(mParams.inputFileNameStem(0) + ".syz"); syzygyOut << "-- syz: ----\n"; alg.getSyzTable()->display(syzygyOut); syzygyOut << std::endl; } } } const char* SigGBAction::staticName() { return "siggb"; } const char* SigGBAction::name() const { return staticName(); } const char* SigGBAction::description() const { return "Compute a signature Grobner basis. " "The project name is an optional direct parameter."; } const char* SigGBAction::shortDescription() const { return "Compute a signature Grobner basis"; } void SigGBAction::pushBackParameters( std::vector& parameters ) { mParams.pushBackParameters(parameters); mGBParams.pushBackParameters(parameters); parameters.push_back(&mUseSingularCriterionEarly); parameters.push_back(&mPostponeKoszul); parameters.push_back(&mUseBaseDivisors); } MATHICGB_NAMESPACE_END mathicgb-1.1/src/cli/GBMain.cpp0000664000175000017500000000262014560325357011765 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "mathicgb/stdinc.h" #include "GBAction.hpp" #include "SigGBAction.hpp" #include "MatrixAction.hpp" #include "HelpAction.hpp" #include "mathicgb/LogDomainSet.hpp" #include #include #include #include // This is to satisfy the code checker that requires every file to contain // these macroes. MATHICGB_NAMESPACE_BEGIN MATHICGB_NAMESPACE_END int main(int argc, char **argv) { try { mathic::CliParser parser; parser.registerAction(); parser.registerAction(); parser.registerAction(); parser.registerAction(); std::vector commandLine(argv, argv + argc); commandLine.erase(commandLine.begin()); parser.parse(commandLine)->performAction(); } catch (const mathic::MathicException& e) { mathic::display(e.what()); return -1; } catch (std::exception& e) { mathic::display(e.what()); return -1; } catch (...) { std::cout << "UNKNOWN ERROR" << std::endl; // maybe there is some outer exception handler that might say something // reasonable about this exception, so rethrow the exception. throw; } mgb::LogDomainSet::singleton().printReport(std::cerr); return 0; }; mathicgb-1.1/src/cli/CommonParams.hpp0000664000175000017500000000343314560325357013274 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_COMMON_PARAMS_GUARD #define MATHICGB_COMMON_PARAMS_GUARD #include "mathicgb/mtbb.hpp" #include #include MATHICGB_NAMESPACE_BEGIN class CommonParams { public: friend class GBAction; CommonParams(size_t minDirectParams, size_t maxDirectParams); void directOptions (std::vector tokens, mathic::CliParser& parser); void pushBackParameters(std::vector& parameters); /// Takes appropriate action depending on the parameters. For example this /// will set the number of threads in tbb. void perform(); /// If called with string X, then X will be considered an extension /// for a file name instead of part of the file name. void registerFileNameExtension(std::string extensions); /// Returns the number of direct parameters/input files. size_t inputFileCount() const; /// Returns the file name at offset i, if any. std::string inputFileName(size_t i); /// Returns the stem of the input file name at offset i, with any registered /// extensions stripped off. std::string inputFileNameStem(size_t i); /// Returns the registered extension of the input file name at offset i, /// if any. std::string inputFileNameExtension(size_t i); private: mathic::IntegerParameter mTracingLevel; mathic::IntegerParameter mThreadCount; mathic::StringParameter mLogs; std::vector mExtensions; /// to recognize file type /// to set thread count std::unique_ptr mTaskArena; std::size_t mMinDirectParams; std::size_t mMaxDirectParams; std::vector mDirectParameters; }; MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/cli/MatrixAction.cpp0000664000175000017500000001227614560325357013302 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "mathicgb/stdinc.h" #include "MatrixAction.hpp" #include "mathicgb/QuadMatrix.hpp" #include "mathicgb/SparseMatrix.hpp" #include "mathicgb/F4MatrixReducer.hpp" #include "mathicgb/SparseMatrix.hpp" #include "mathicgb/CFile.hpp" #include #include #include #include MATHICGB_NAMESPACE_BEGIN namespace { static const char* QuadMatrixExtension = ".qmat"; static const char* LowerRightMatrixExtension = ".brmat"; static const char* ReducedLowerRightMatrixExtension = ".rbrmat"; /// Returns true if the file exists - or more precisely if it can be opened /// for reading. Using this function to create a file only if it does not /// exist implies a race condition in that the file could have been crated /// after checking if it exists and before (re)creating it. Do not use this /// approach if that is not acceptable. The advantage here is that this is /// portable. There could be a solution with freopen, but unfortunately /// freopen is allowed to fail on any change to the mode so it is not /// a portable solution. bool fileExists(const std::string fileName) { return CFile(fileName, "r", CFile::NoThrowTag()).hasFile(); } } MatrixAction::MatrixAction(): mParams(1, std::numeric_limits::max()) { mParams.registerFileNameExtension(QuadMatrixExtension); mParams.registerFileNameExtension(LowerRightMatrixExtension); mParams.registerFileNameExtension(ReducedLowerRightMatrixExtension); mParams.registerFileNameExtension("."); } void MatrixAction::directOptions( std::vector< std::string> tokens, mic::CliParser& parser ) { mParams.directOptions(tokens, parser); } void MatrixAction::performAction() { mParams.perform(); for (size_t i = 0; i < mParams.inputFileCount(); ++i) { const auto fileNameStem = mParams.inputFileNameStem(i); const auto extension = mParams.inputFileNameExtension(i); const auto quadFileName = fileNameStem + QuadMatrixExtension; const auto lowerRightFileName = fileNameStem + LowerRightMatrixExtension; const auto reducedLowerRightFileName = fileNameStem + ReducedLowerRightMatrixExtension; std::string inputFileName; SparseMatrix lowerRightMatrix; SparseMatrix::Scalar modulus = 0; // will be changed below to a (hopefully) prime number if ( extension == QuadMatrixExtension || extension == "." || extension == "" ) { inputFileName = quadFileName; CFile file(quadFileName, "rb"); QuadMatrix matrix; modulus = matrix.read(file.handle()); file.close(); lowerRightMatrix = F4MatrixReducer(modulus).reduceToBottomRight(matrix); if (!fileExists(lowerRightFileName)) { CFile file(lowerRightFileName, "wb"); lowerRightMatrix.write(modulus, file.handle()); CFile pbmFile(lowerRightFileName + ".pbm", "wb"); lowerRightMatrix.writePBM(pbmFile.handle()); } } else if (extension == LowerRightMatrixExtension) { inputFileName = lowerRightFileName; CFile file(lowerRightFileName, "rb"); modulus = lowerRightMatrix.read(file.handle()); } else { mathic::reportError ("Unknown input file extension of " + mParams.inputFileName(i)); } lowerRightMatrix = F4MatrixReducer(modulus). reducedRowEchelonForm(lowerRightMatrix); lowerRightMatrix.sortRowsByIncreasingPivots(); if (!fileExists(reducedLowerRightFileName)) { CFile file(reducedLowerRightFileName.c_str(), "wb"); lowerRightMatrix.write(modulus, file.handle()); CFile pbmFile(reducedLowerRightFileName + ".pbm", "wb"); lowerRightMatrix.writePBM(pbmFile.handle()); } else { SparseMatrix referenceMatrix; CFile file(reducedLowerRightFileName.c_str(), "rb"); referenceMatrix.read(file.handle()); if (lowerRightMatrix != referenceMatrix) { const std::string wrongFile = fileNameStem + ".out" + ReducedLowerRightMatrixExtension; const std::string wrongFilePbm = fileNameStem + ".out.pbm"; std::cerr << "Reducing " << inputFileName << " does not yield the matrix " << reducedLowerRightFileName << ".\n" << "Writing computed matrix to " << wrongFile << ".\n"; CFile file(wrongFile, "wb"); lowerRightMatrix.write(modulus, file.handle()); CFile filePbm(wrongFilePbm, "wb"); lowerRightMatrix.writePBM(filePbm.handle()); } else if (tracingLevel > 0) { std::cerr << "Match for " << inputFileName << " -> " << ReducedLowerRightMatrixExtension << ".\n"; } } } } const char* MatrixAction::staticName() { return "matrix"; } const char* MatrixAction::name() const { return staticName(); } const char* MatrixAction::description() const { return "Perform matrix computations. " "The name of the matrix file is an optional direct parameter."; } const char* MatrixAction::shortDescription() const { return "Perform matrix computations."; } void MatrixAction::pushBackParameters( std::vector& parameters ) { mParams.pushBackParameters(parameters); } MATHICGB_NAMESPACE_END mathicgb-1.1/src/cli/GBAction.hpp0000664000175000017500000000222214560325357012321 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_G_B_ACTION_GUARD #define MATHICGB_G_B_ACTION_GUARD #include "GBCommonParams.hpp" #include "CommonParams.hpp" #include MATHICGB_NAMESPACE_BEGIN /// Calculates a classic Grobner basis using Buchberger's algorithm class GBAction : public mathic::Action { public: GBAction(); virtual void directOptions( std::vector tokens, mic::CliParser& parser ); virtual void performAction(); static const char* staticName(); virtual const char* name() const; virtual const char* description() const; virtual const char* shortDescription() const; virtual void pushBackParameters(std::vector& parameters); private: CommonParams mParams; GBCommonParams mGBParams; mathic::BoolParameter mAutoTailReduce; mathic::BoolParameter mAutoTopReduce; //mic::IntegerParameter mTermOrder; mathic::IntegerParameter mSPairGroupSize; mathic::IntegerParameter mMinMatrixToStore; mic::BoolParameter mModule; }; MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/cli/GBCommonParams.cpp0000664000175000017500000000631114560325357013476 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "mathicgb/stdinc.h" #include "GBCommonParams.hpp" #include "mathicgb/ModuleMonoSet.hpp" #include "mathicgb/MonoLookup.hpp" #include "mathicgb/Reducer.hpp" MATHICGB_NAMESPACE_BEGIN GBCommonParams::GBCommonParams(): mPreferSparseReducers( "preferSparseReducers", "If true, always use the sparsest reducer in polynomial reduction. " "This option impacts both classic and signature constrained " "polynomial reduction. Ties are broken by taking the oldest reducer. " "If this option is false, the oldest reducer is always used.", true ), mOutputResult( "outputResult", "If true, output the resulting Groebner or signature basis " "to the file .gb and in the signature basis " "case, the signatures of the syzygies are placed in .syz", false ), mSPairQueue( "spairQueue", "The priority queue used to order S-pairs.\n" " 0 tournament tree in front of triangle\n" " 1 heap in front of triangle\n" " 2 tournament tree\n" " 3 heap\n", 0 ), mBreakAfter( "breakAfter", "Stop the computation after this many elements have been added to " "the basis. The computation runs uninterrupted if the value is zero.", 0 ), mPrintInterval( "printInterval", "Print information about the computation every time this many S-pair " "reductions have been performed and at the end. Do not print information " "like this during the computation if the value is zero.", std::numeric_limits::max() ), mMonomialTable( "monomialTable", "The kind of monomial table data structure to use.\n", 2 ), mMonoLookup( "divisorLookup", "The monomial lookup data structure to use.\n", 2 ), mReducer( "reducer", "The data structure to use for polynomial reduction.\n", 4 ), mMemoryQuantum( "memoryQuantumForReducer", "Specifies how many items to allocate memory for at a time for the reducer.", 1024 * 1024) { { std::ostringstream reducerOut; Reducer::displayReducerTypes(reducerOut); mReducer.appendToDescription(reducerOut.str()); } { std::ostringstream out; out << "Monomial map data structures codes:\n"; MonoLookup::displayCodes(out); mMonoLookup.appendToDescription(out.str()); } { std::ostringstream out; out << "Module monomial set data structures codes:\n"; ModuleMonoSet::displayCodes(out); mMonomialTable.appendToDescription(out.str()); } } void GBCommonParams::pushBackParameters( std::vector& parameters ) { parameters.push_back(&mPreferSparseReducers); parameters.push_back(&mOutputResult); parameters.push_back(&mSPairQueue); parameters.push_back(&mBreakAfter); parameters.push_back(&mPrintInterval); parameters.push_back(&mMonomialTable); parameters.push_back(&mMonoLookup); parameters.push_back(&mReducer); parameters.push_back(&mMemoryQuantum); } void GBCommonParams::perform() { // currently there is nothing to do } MATHICGB_NAMESPACE_END mathicgb-1.1/src/cli/GBCommonParams.hpp0000664000175000017500000000147614560325357013512 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_GB_COMMON_PARAMS_GUARD #define MATHICGB_GB_COMMON_PARAMS_GUARD #include MATHICGB_NAMESPACE_BEGIN class GBCommonParams { public: GBCommonParams(); void pushBackParameters(std::vector& parameters); void perform(); mathic::BoolParameter mPreferSparseReducers; mathic::BoolParameter mOutputResult; mathic::IntegerParameter mSPairQueue; mathic::IntegerParameter mBreakAfter; mathic::IntegerParameter mPrintInterval; mathic::IntegerParameter mMonomialTable; mathic::IntegerParameter mMonoLookup; mathic::IntegerParameter mReducer; mathic::IntegerParameter mMemoryQuantum; }; MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/cli/HelpAction.hpp0000664000175000017500000000060614560325357012725 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_HELP_ACTION_GUARD #define MATHICGB_HELP_ACTION_GUARD #include MATHICGB_NAMESPACE_BEGIN class HelpAction : public mathic::HelpAction { public: virtual void performAction(); }; MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/cli/GBAction.cpp0000664000175000017500000001102314560325357012313 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "mathicgb/stdinc.h" #include "GBAction.hpp" #include "mathicgb/ClassicGBAlg.hpp" #include "mathicgb/Basis.hpp" #include "mathicgb/io-util.hpp" #include "mathicgb/F4Reducer.hpp" #include "mathicgb/Scanner.hpp" #include "mathicgb/MathicIO.hpp" #include "mathicgb/Reducer.hpp" #include #include MATHICGB_NAMESPACE_BEGIN GBAction::GBAction(): mParams(1, 1), mAutoTailReduce( "autoTailReduce", "Reduce the non-leading terms of all polynomials whenever an element " "is inserted into the basis. Only relevant to the " "classic Buchberger algorithm.", false), mAutoTopReduce( "autoTopReduce", "Reduce any basis element whose lead term becomes reducible " "by a different basis element. Only relevant to the " "classic Buchberger algorithm.", true), mSPairGroupSize( "sPairGroupSize", "Specifies how many S-pair to reduce at one time. A value of 0 " "indicates to use an appropriate default.", 0), mMinMatrixToStore( "storeMatrices", "If using a matrix-based reducer, store the matrices that are generated in " "files named X-1.mat, X-2.mat and so on where X is the project name. Only " "matrices with at least as many entries as the parameter are stored. " "A value of 0 indicates not to store any matrices.", 0), mModule( "module", "The input is a basis of a submodule over the polynomial ring instead of " "an ideal in the polynomial ring. This option is experimental.", false ) {} void GBAction::directOptions( std::vector tokens, mic::CliParser& parser ) { mParams.directOptions(tokens, parser); } void GBAction::performAction() { mParams.perform(); mGBParams.perform(); const std::string projectName = mParams.inputFileNameStem(0); // read input const std::string inputBasisFile = projectName + ".ideal"; std::ifstream inputFile(inputBasisFile.c_str()); if (inputFile.fail()) mic::reportError("Could not read input file \"" + inputBasisFile + '\n'); Scanner in(inputFile); auto p = MathicIO<>().readRing(true, in); auto& ring = *p.first; auto basis = MathicIO<>().readBasis(ring, mModule.value(), in); // run algorithm const auto reducerType = Reducer::reducerType(mGBParams.mReducer.value()); std::unique_ptr reducer; if ( reducerType != Reducer::Reducer_F4_Old && reducerType != Reducer::Reducer_F4_New ) { reducer = Reducer::makeReducer(reducerType, ring); } else { auto f4Reducer = makeF4Reducer( ring, reducerType == Reducer::Reducer_F4_Old, mMinMatrixToStore.value() > 0 ? projectName : "", mMinMatrixToStore ); reducer = std::move(f4Reducer); } ClassicGBAlgParams params; params.reducer = reducer.get(); params.monoLookupType = mGBParams.mMonoLookup.value(); params.preferSparseReducers = mGBParams.mPreferSparseReducers.value(); params.sPairQueueType = mGBParams.mSPairQueue.value(); params.breakAfter = mGBParams.mBreakAfter.value(); params.printInterval = mGBParams.mPrintInterval.value(); params.sPairGroupSize = mSPairGroupSize.value(); params.reducerMemoryQuantum = mGBParams.mMemoryQuantum.value(); params.useAutoTopReduction = mAutoTopReduce.value(); params.useAutoTailReduction = mAutoTailReduce.value(); params.callback = nullptr; const auto gb = mParams.mTaskArena->execute([&basis,this,¶ms]{ return (mModule.value() ? computeModuleGBClassicAlg(std::move(basis), params) : computeGBClassicAlg(std::move(basis), params)); }); if (mGBParams.mOutputResult.value()) { std::ofstream out(projectName + ".gb"); MathicIO<>().writeBasis(gb, mModule.value(), out); } } const char* GBAction::staticName() { return "gb"; } const char* GBAction::name() const { return staticName(); } const char* GBAction::description() const { return "Compute a Grobner basis. " "The project name is an optional direct parameter."; } const char* GBAction::shortDescription() const { return "Compute a Grobner basis."; } void GBAction::pushBackParameters( std::vector& parameters ) { mParams.pushBackParameters(parameters); mGBParams.pushBackParameters(parameters); parameters.push_back(&mAutoTailReduce); parameters.push_back(&mAutoTopReduce); parameters.push_back(&mSPairGroupSize); parameters.push_back(&mMinMatrixToStore); parameters.push_back(&mModule); } MATHICGB_NAMESPACE_END mathicgb-1.1/src/cli/MatrixAction.hpp0000664000175000017500000000153214560325357013300 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #ifndef MATHICGB_MATRIX_ACTION_GUARD #define MATHICGB_MATRIX_ACTION_GUARD #include "CommonParams.hpp" #include MATHICGB_NAMESPACE_BEGIN /// Performs computations on matrices. class MatrixAction : public mathic::Action { public: MatrixAction(); virtual void directOptions( std::vector tokens, mic::CliParser& parser ); virtual void performAction(); static const char* staticName(); virtual const char* name() const; virtual const char* description() const; virtual const char* shortDescription() const; virtual void pushBackParameters(std::vector& parameters); private: CommonParams mParams; }; MATHICGB_NAMESPACE_END #endif mathicgb-1.1/src/cli/CommonParams.cpp0000664000175000017500000000626114560325357013271 // MathicGB copyright 2012 all rights reserved. MathicGB comes with ABSOLUTELY // NO WARRANTY and is licensed as GPL v2.0 or later - see LICENSE.txt. #include "mathicgb/stdinc.h" #include "CommonParams.hpp" #include "mathicgb/LogDomain.hpp" #include "mathicgb/LogDomainSet.hpp" MATHICGB_DEFINE_LOG_ALIAS("default", "F4Detail,SPairs"); MATHICGB_NAMESPACE_BEGIN CommonParams::CommonParams(size_t minDirectParams, size_t maxDirectParams): mTracingLevel("tracingLevel", "How much information to print out about what the program does. No " "information is shown if the value is zero. Higher values " "result in more information.", 0), mThreadCount("threadCount", "Specifies how many threads to use at a time. A value of 0 indicates that " "the program should choose the optimal number of threads.", 0), mLogs("log", "Enable the specified log. Do \"help logs\" to see all available logs and " "the details of how to configure what kind of logging you want. " "To enable logs X, Y and Z, do \"-log X,Y,Z\". " "To enabled all logs, do \"-log\" or \"-log all\".", "none"), mMinDirectParams(minDirectParams), mMaxDirectParams(maxDirectParams) { } void CommonParams::directOptions( std::vector tokens, mathic::CliParser& parser ) { if (tokens.size() < mMinDirectParams) mathic::reportError("Too few direct options"); if (tokens.size() > mMaxDirectParams) mathic::reportError("Too many direct options"); mDirectParameters = std::move(tokens); } void CommonParams::pushBackParameters( std::vector& parameters ) { parameters.push_back(&mLogs); parameters.push_back(&mTracingLevel); parameters.push_back(&mThreadCount); } void CommonParams::perform() { const std::string logs = mLogs.value().empty() ? "default" : mLogs.value(); LogDomainSet::singleton().performLogCommands(logs); tracingLevel = mTracingLevel.value(); // delete the old init object first to make the new one take control. mTaskArena.reset(); mTaskArena = make_unique(mtbb::numThreads(mThreadCount.value())); } void CommonParams::registerFileNameExtension(std::string extension) { MATHICGB_ASSERT(!extension.empty()); mExtensions.push_back(std::move(extension)); } size_t CommonParams::inputFileCount() const { return mDirectParameters.size(); } std::string CommonParams::inputFileName(size_t i) { MATHICGB_ASSERT(i < inputFileCount()); return mDirectParameters[i]; } std::string CommonParams::inputFileNameStem(size_t i) { MATHICGB_ASSERT(i < inputFileCount()); const auto& str = mDirectParameters[i]; const auto toStrip = inputFileNameExtension(i); MATHICGB_ASSERT (toStrip.size() < str.size() || (toStrip.empty() && str.empty())); return str.substr(0, str.size() - toStrip.size()); } std::string CommonParams::inputFileNameExtension(size_t i) { MATHICGB_ASSERT(i < inputFileCount()); const auto& str = mDirectParameters[i]; const auto end = mExtensions.end(); for (auto it = mExtensions.begin(); it != end; ++it) { if ( str.size() >= it->size() && str.substr(str.size() - it->size(), it->size()) == *it ) return *it; } return std::string(); } MATHICGB_NAMESPACE_END mathicgb-1.1/src/CMakeLists.txt0000664000175000017500000001033215053044040012135 if(CMAKE_BUILD_TYPE STREQUAL Debug) add_compile_options(-DMATHICGB_DEBUG -DMATHIC_DEBUG -DMEMT_DEBUG) endif() add_library(mathicgb STATIC mathicgb.h mathicgb.cpp mathicgb/MonoArena.hpp mathicgb/Range.hpp mathicgb/mtbb.hpp mathicgb/PrimeField.hpp mathicgb/MonoMonoid.hpp mathicgb/MonoProcessor.hpp mathicgb/MonoOrder.hpp mathicgb/Unchar.hpp mathicgb/MathicIO.hpp mathicgb/NonCopyable.hpp mathicgb/StaticMonoMap.hpp mathicgb/KoszulQueue.hpp mathicgb/Poly.hpp mathicgb/ReducerHelper.hpp mathicgb/MonomialMap.hpp mathicgb/RawVector.hpp mathicgb/Atomic.hpp mathicgb/ScopeExit.hpp mathicgb/FixedSizeMonomialMap.h # change name? mathicgb/ReducerPack.hpp mathicgb/ReducerPack.cpp mathicgb/ClassicGBAlg.hpp mathicgb/ClassicGBAlg.cpp mathicgb/MonoLookup.hpp mathicgb/MonoLookup.cpp mathicgb/SigPolyBasis.hpp mathicgb/SigPolyBasis.cpp mathicgb/Basis.hpp mathicgb/Basis.cpp mathicgb/ModuleMonoSet.hpp mathicgb/ModuleMonoSet.cpp mathicgb/PolyBasis.hpp mathicgb/PolyBasis.cpp mathicgb/PolyHashTable.hpp mathicgb/PolyHashTable.cpp mathicgb/PolyRing.hpp mathicgb/PolyRing.cpp mathicgb/Reducer.hpp mathicgb/Reducer.cpp mathicgb/ReducerDedup.hpp mathicgb/ReducerDedup.cpp mathicgb/ReducerHash.hpp mathicgb/ReducerHash.cpp mathicgb/ReducerHashPack.hpp mathicgb/ReducerHashPack.cpp mathicgb/ReducerNoDedup.hpp mathicgb/ReducerNoDedup.cpp mathicgb/ReducerPackDedup.hpp mathicgb/ReducerPackDedup.cpp mathicgb/SignatureGB.hpp mathicgb/SignatureGB.cpp mathicgb/SigSPairs.hpp mathicgb/SigSPairs.cpp mathicgb/SPairs.hpp mathicgb/SPairs.cpp mathicgb/SigSPairQueue.hpp mathicgb/SigSPairQueue.cpp mathicgb/SparseMatrix.hpp mathicgb/SparseMatrix.cpp mathicgb/QuadMatrixBuilder.hpp mathicgb/QuadMatrixBuilder.cpp mathicgb/TypicalReducer.hpp mathicgb/TypicalReducer.cpp mathicgb/F4Reducer.hpp mathicgb/F4Reducer.cpp mathicgb/F4MatrixBuilder.hpp mathicgb/F4MatrixBuilder.cpp mathicgb/QuadMatrix.hpp mathicgb/QuadMatrix.cpp mathicgb/F4MatrixReducer.hpp mathicgb/F4MatrixReducer.cpp mathicgb/CFile.hpp mathicgb/CFile.cpp mathicgb/LogDomain.hpp mathicgb/LogDomain.cpp mathicgb/LogDomainSet.hpp mathicgb/LogDomainSet.cpp mathicgb/F4MatrixBuilder2.hpp mathicgb/F4MatrixBuilder2.cpp mathicgb/F4ProtoMatrix.hpp mathicgb/F4ProtoMatrix.cpp mathicgb/F4MatrixProjection.hpp mathicgb/F4MatrixProjection.cpp mathicgb/io-util.hpp mathicgb/io-util.cpp mathicgb/Scanner.hpp mathicgb/Scanner.cpp mathicgb/stdinc.h ) target_compile_options(mathicgb PUBLIC $<$>:-DMATHICGB_NO_TBB> ) target_link_libraries(mathicgb memtailor mathic Threads::Threads $<$:TBB::tbb> ) target_include_directories(mathicgb PUBLIC $ $ ) include(CTest) if(BUILD_TESTING) add_executable(mathicgb-unit-tests test/F4MatrixBuilder.cpp test/F4MatrixReducer.cpp test/MathicIO.cpp test/MonoMonoid.cpp test/PrimeField.cpp test/QuadMatrixBuilder.cpp test/Range.cpp test/Scanner.cpp test/SparseMatrix.cpp test/gb-test.cpp test/ideals.hpp test/ideals.cpp test/mathicgb.cpp test/poly-test.cpp test/testMain.cpp ) ################################ # add gtest testing ############ ################################ if(NOT GTEST_FOUND) find_package(GTest) endif() include(GoogleTest) gtest_discover_tests(mathicgb-unit-tests TEST_PREFIX unit-tests:) if(GTEST_FOUND) target_link_libraries(mathicgb-unit-tests mathicgb GTest::GTest GTest::Main) else() include(FetchContent) FetchContent_Declare(googletest GIT_REPOSITORY https://github.com/google/googletest.git GIT_TAG v1.16.0 ) FetchContent_MakeAvailable(googletest) target_link_libraries(mathicgb-unit-tests mathicgb gtest) target_include_directories(mathicgb-unit-tests PRIVATE ${googletest_SOURCE_DIR}/googletest/include ${googletest_SOURCE_DIR}/googletest/src ${googletest_SOURCE_DIR}/googletest ) endif() endif() mathicgb-1.1/src/mathicgb.h0000664000175000017500000010200614560325357011343 #ifndef MATHICGB_MATHICGB_GUARD #define MATHICGB_MATHICGB_GUARD #include #include #include // The main function in this file is computeGroebnerBasis. See the comment // preceding that function for an example of how to use this library // interface. extern "C" { // Put a C function in the library so that it can be detected by the autoconf // macro AC_CHECK_LIB. That macro can only check for libraries that contain // at least one C function. void libmathicgbIsPresent(void); // This function does nothing. extern char MATHICGB_VERSION_STRING[]; } /// The classes and functions in this namespace make up the public interface /// of MathicGB. You should not have to update your code when upgrading to a /// newer minor revision of MathicGB if you only use the public interface. namespace mgb { // Part of the public interface of MathicGB /// Code in this namespace is not part of the public interface of MathicGB. /// If you take a dependency on code in this namespace, except indirectly /// through using code in the mgb namespace, then you are not using the /// library interface as intended. namespace mgbi { // Not part of the public interface of MathicGB class PimplOf; } /// Sets time to the number of seconds accumulated on the internal /// MathicGB log named logName. Returns true if the logName log was /// found and false otherwise. /// /// The available logs and what they measure are not part of /// the public interface of MathicGB and indeed the availability of a log /// depends on both compile-time and run-time events. Therefore you must /// ensure that your program works even if this function always returns /// false. bool logTime(const char* logName, double& time); /// As logTime, but retrieves a number associated to logName that is /// not necessarily a time. bool logNumber(const char* logName, double& number); /// Use this class to describe a configuration of a Groebner basis algorithm /// that you want to run. /// /// If you came here to compute the Groebner basis of an ideal in a /// polynomial ring and you don't want to deal with modules: Don't worry /// about it. A module with one component over a polynomial ring is the /// same thing as that ring. Simply set the componentCount to 1. Then all /// (module) monomials will have component 0 and you can just ignore that. /// The internal implementation has a special case for this case you will /// not pay an overhead for this other than passing a few 0 components /// through the interface. /// /// @todo: expose more of the available functionality. class GroebnerConfiguration { public: // Type for the coefficient of a term. 2*x is a term with coefficient 2. typedef unsigned int Coefficient; /// Type to specify a variable in the polynomial ring. If the variables /// are x, y, z in that order, then x has index 0, y has index 1 and z /// has index 2. typedef size_t VarIndex; /// Type for the exponent of a variable. If x is a variable, then /// x*x = x^2 has exponent 2. typedef int Exponent; /// Type for the component of a module monomial. The module monomial /// x*y*z * e_i has component i. typedef unsigned int Component; /// A configuration in a module over a polynomial ring with varCount /// variables and the coefficients are from the finite field with /// modulus elements. modulus must be a prime. The module has the basis /// e_0, ..., e_k where k is componentCount - 1. GroebnerConfiguration( Coefficient modulus, VarIndex varCount, Component comCount ); GroebnerConfiguration(const GroebnerConfiguration& conf); ~GroebnerConfiguration(); Coefficient modulus() const; VarIndex varCount() const; Component comCount() const; enum BaseOrder { /// Reverse lexicographic order with x_1 > x_2 > ... > x_n. /// Can be described as rev-lex-descending or rev-lex-from-right. /// This is what people usually mean when they say rev-lex. RevLexDescendingBaseOrder = 0, /// Lexicographic order with x_1 > x_2 > ... > x_n. /// Can be described as lex-descending or lex-from-left. /// This is what people usually mean when they say lex. LexDescendingBaseOrder = 1, /// Reverse lexicographic order with x_1 < x_2 < ... < x_n. /// Can be described as rev-lex-ascending or rev-lex-from-left. RevLexAscendingBaseOrder = 2, /// Lexicographic order with x_1 < x_2 < ... < x_n. /// Can be described as lex-ascending or lex-from-right. LexAscendingBaseOrder = 3 }; /// Returns a name for the passed in base order. /// Ownership of the string is not passed on. You should not depend on /// the string having any particular value, except that it is something /// that will identify the order to a human. static const char* baseOrderName(BaseOrder order); /// Specifies the monomial order to compute a Groebner basis with /// respect to. You must ensure that the order that you are specifying /// is in fact a monomial order. /// /// The specified monomial order has two parts - a set of gradings and /// a base order. The base order is used to break ties for monomials with /// identical grades. /// /// The gradings parameter represents a matrix where each row of the matrix /// defines a grading. The matrix is represented in row-major order. /// The matrix has varCount() columns so gradings.size() must be a multiple /// of varCount(). /// /// Suppose gradings has one row U and that x^a and x^b are two monomials /// with exponent vectors a and b respectively. Then a < b if a*U < b*U /// where * is dot product. If there are several rows in gradings, then /// the first row U is considered first. If a*U=b*U then the second row /// is considered and so on. If a and b have the same degree with respect /// to all the rows of the matrix, then the base order is used to break the /// tie. /// /// An order is global if 1 is the smallest of all monomials. Equivalently, /// if 1 < x for each variable x in the ambient ring. In MathicGB only /// global orders are considered monomial orders and non-global orders /// are not supported. setMonomialOrder will return true if the specified /// order is global. Otherwise, setMonomialOrder returns false and the /// requested order is NOT set. So you can ignore the return value if /// and only if you are certain that the order you are requesting is in /// fact global. For example, ungraded reverse lex is not a (global) monomial /// order. /// /// Each row of the matrix adds overhead to the Groebner basis /// computation both in terms of time and space. /// /// The default grading is (1, ..., 1)-graded reverse lex. bool setMonomialOrder( BaseOrder order, const std::vector& gradings ); std::pair > monomialOrder() const; static const size_t ComponentAfterBaseOrder = static_cast(-1); /// Sets the module monomial order. This order extends the /// monomial order in the sense that a aM R and componentBefore != /// ComponentAfterBaseOrder, then that is an invalid value and you /// will experience undefined behavior. This is only checked at a /// later stage, so there is no problem in setting a value that /// was invalid at the time but that becomes valid later, either /// because you reset it to something valid or because you change the /// matrix. /// /// Setting this value to anything other than /// ComponentAfterBaseOrder incurs overhead similar to adding a /// row to the comparison matrix. /// /// The default value is ComponentAfterBaseOrder. void setComponentBefore(size_t value); VarIndex componentBefore() const; /// This setting modifies the module monomial order. /// If componentsAscending is true then a comparison of components /// is done such that a module monomial with greater component is /// considered greater once we get the point where components are /// compared. So when not using the Schreyer setting, the impact is: /// /// true value: e_0 < e_1 < ... < e_n /// false value: e_n < ... < e_1 < e_0. /// /// The default value is true. Either setting is implemented with a /// pre-processing step, so there is little-to-no overhead for it. void setComponentsAscending(bool value); bool componentsAscending() const; /// This setting modifies the module monomial order. /// We are Schreyering if we are using an ordering <' that is /// derived from the usual module mononial order < in the /// following way. Let c_i be the leading monomial of the input /// basis element with index i. Then /// /// ae_i <' be_i if and only if ac_ie_i < bc_je_j. /// /// The default value is true. Either setting is implemented with a /// pre-processing step, so there is little-to-no overhead. /// /// A possible future extension would be to allow setting the c_i /// to be something other than leading monomials. This would be useful /// for the higher levels in computation of resolutions. This /// functionality is not currently available. void setSchreyering(bool value); bool schreyering() const; enum Reducer { DefaultReducer = 0, /// Let the library decide for itself. ClassicReducer = 1, /// The classic polynomial division algorithm. MatrixReducer = 2 /// use linear algebra as in F4. }; /// Specify the way that polynoials are reduced. void setReducer(Reducer reducer); Reducer reducer() const; /// Sets the maximum number of S-pairs to reduce at one time. This is /// mainly useful as a (weak) control on memory usage for F4 reducers. /// A value of 0 indicates to let the library decide this value for /// itself, which is also the default and highly recommended value. /// /// For matrix-based reducers, use a high value. For serial classic /// reduction, use a low value, preferably 1. Setting the value to /// 0 already takes care of this. void setMaxSPairGroupSize(unsigned int size); unsigned int maxSPairGroupSize() const; /// Sets the maximum number of threads to use. May use fewer threads. /// A value of 0 indicates to let the library decide this value for /// itself, which is also the default value. void setMaxThreadCount(unsigned int maxThreadCount); unsigned int maxThreadCount() const; /// Sets logging to occur according to the string. The format of the /// string is the same as for the -logs command line parameter. /// Ownership of the string is not taken over. /// @todo: describe the format in more detail. void setLogging(const char* logging); const char* logging() const; /// Class used for setCallback(). class Callback { public: enum Action { ContinueAction = 0, StopWithNoOutputAction = 1, StopWithPartialOutputAction = 2 }; virtual Action call() = 0; }; /// Set callback to be called at various unspecified times during /// the computation. Callback has the ability to stop or continue /// the computation based on its return value. If callback is null /// then no function will be called. void setCallback(Callback* callback); Callback* callback(); const Callback* callback() const; private: friend class mgbi::PimplOf; void operator=(const GroebnerConfiguration&); // not available bool operator==(const GroebnerConfiguration&); // not available struct MonomialOrderData { BaseOrder baseOrder; const Exponent* gradings; size_t gradingsSize; }; bool setMonomialOrderInternal(MonomialOrderData order); MonomialOrderData monomialOrderInternal() const; static Callback::Action callbackCaller(void* obj); void setCallbackInternal(void* data, Callback::Action (*func) (void*)); void* callbackDataInternal() const; struct Pimpl; Pimpl* const mPimpl; }; /// After making a configuration, use this class to communicate a basis /// of the input ideal that you want to run a Groebner basis algorithm on. class GroebnerInputIdealStream { public: GroebnerInputIdealStream(const GroebnerConfiguration& conf); ~GroebnerInputIdealStream(); typedef GroebnerConfiguration::Coefficient Coefficient; typedef GroebnerConfiguration::VarIndex VarIndex; typedef GroebnerConfiguration::Exponent Exponent; typedef GroebnerConfiguration::Component Component; const GroebnerConfiguration& configuration() const; Coefficient modulus() const; VarIndex varCount() const; Component comCount() const; void idealBegin(); void idealBegin(size_t polyCount); void appendPolynomialBegin(); void appendPolynomialBegin(size_t termCount); /// Signals the beginning of communication of a module term of the /// current module element. void appendTermBegin(Component com); /// The sequence of indices appended to a term must be in strictly /// ascending order. void appendExponent(VarIndex index, Exponent exponent); void appendTermDone(Coefficient coefficient); void appendPolynomialDone(); void idealDone(); private: bool debugAssertValid() const; Exponent* const mExponents; struct Pimpl; friend class mgbi::PimplOf; Pimpl* const mPimpl; }; /// After making a configuration and an ideal, use this function to compute /// a Groebner basis. The output basis is constructed on output, which must /// resemble GroebnerInputIdealStream by having the following functions. /// /// - modulus() const; /// - varCount() const; /// - idealBegin(size_t polyCount); /// - void appendPolynomialBegin(size_t termCount); /// - void appendTermBegin(Component com); /// - void appendExponent(VarIndex index, Exponent exponent); /// - void appendTermDone(Coefficient coefficient); /// - void appendPolynomialDone(); /// - void idealDone(); /// /// ** Example /// /// This example uses a default configuration, constructs an ideal and then /// outputs the Groebner basis to a NullIdealStream which does not do /// anything with the output. However, we wrap the NullIdealStream in a /// IdealStreamLog, which prints out the method calls done on the stream /// to std::cerr. We also wrap the GroebnerInputIdealStream in a /// IdealStreamChecker which checks that we are correctly following the /// protocol of GroebnerInputIdealStream - that's only recommended when /// debugging as it is slow. /// /// GroebnerConfiguration configuration(101, 4); // mod 101, 4 variables /// GroebnerInputIdealStream input(configuration); /// IdealStreamChecker checked(input); /// checked.idealBegin(2); // describe ideal with 2 basis elements /// checked.appendPolynomial(2); // describe generator with 2 terms /// checked.appendTermBegin(); /// checked.appendExponent(0, 40); // x0^40 /// checked.appendTermDone(3); // 3 * x0^40 /// checked.appendTermBegin(); /// checked.appendExponent(1, 5); // x1^5 /// checked.appendExponent(2, 7); // x2^7 /// checked.appendTermDone(11); // 11 * x1^5 * x2^7 /// checked.appendPolynomialDone(); // 3 * x0^40 + 11 * x1^5 * x2^7 /// checked.appendPolynomialBegin(1); /// checked.appendTermBegin(); /// checked.appendTermDone(13); // 13 /// checked.appendPolynomialDone(); // 13 /// checked.idealDone(); // the generators are 3*x0^40 + 11*x1^5*x2^7 and 13 /// NullIdealStream nullStream; /// IdealStreamLog logStream(nullStream, std::cerr); /// computeGroebnerBasis(input, logStream); /// /// The ideal constructed on the passed-in GroebnerInputIdealStream will /// be cleared. If you need it again for something else, you will have /// to re-construct it. template void computeGroebnerBasis( GroebnerInputIdealStream& inputWhichWillBeCleared, OutputStream& output ); class NullIdealStream; /// Passes on all method calls to an inner ideal stream while printing out /// what methods get called to an std::ostream. template class IdealStreamLog { public: typedef GroebnerConfiguration::Coefficient Coefficient; typedef GroebnerConfiguration::VarIndex VarIndex; typedef GroebnerConfiguration::Exponent Exponent; typedef GroebnerConfiguration::Component Component; /// All calls are written to log and then passed on to stream. IdealStreamLog(std::ostream& log, Stream& stream); /// All calls are written to log. IdealStreamLog( std::ostream& log, Coefficient modulus, VarIndex varCount, Component comCount ); ~IdealStreamLog(); Coefficient modulus() const; VarIndex varCount() const; Component comCount() const; void idealBegin(); void idealBegin(size_t polyCount); void appendPolynomialBegin(); void appendPolynomialBegin(size_t termCount); void appendTermBegin(Component com); void appendExponent(VarIndex index, Exponent exponent); void appendTermDone(Coefficient coefficient); void appendPolynomialDone(); void idealDone(); private: const Coefficient mModulus; const VarIndex mVarCount; const Component mComCount; Stream* const mStream; std::ostream& mLog; }; /// An ideal stream that simply ignores all the method calls it receives. /// Can be handy in combination with IdealStreamLog or as a temporary /// stand-in if you have not yet written your own ideal stream. class NullIdealStream { public: typedef GroebnerConfiguration::Coefficient Coefficient; typedef GroebnerConfiguration::VarIndex VarIndex; typedef GroebnerConfiguration::Exponent Exponent; typedef GroebnerConfiguration::Component Component; NullIdealStream( Coefficient modulus, VarIndex varCount, Component comCount ); Coefficient modulus() const {return mModulus;} VarIndex varCount() const {return mVarCount;} Component comCount() const {return mComCount;} void idealBegin() {} void idealBegin(size_t polyCount) {} void appendPolynomialBegin() {} void appendPolynomialBegin(size_t termCount) {} void appendTermBegin(Component com) {} void appendExponent(VarIndex index, Exponent exponent) {} void appendTermDone(Coefficient coefficient) {} void appendPolynomialDone() {} void idealDone() {} private: const Coefficient mModulus; const VarIndex mVarCount; const Component mComCount; }; template void streamSimpleIdeal(OutputStream& output); namespace mgbi { // Not part of the public interface of MathicGB /// Class that checks to see if the protocol for an ideal stream is followed. /// A method will return false if that is not the case. This class is not /// itself an ideal stream - it is intended to be used with ideal streams for /// debugging. class StreamStateChecker { public: typedef GroebnerConfiguration::Coefficient Coefficient; typedef GroebnerConfiguration::VarIndex VarIndex; typedef GroebnerConfiguration::Exponent Exponent; typedef GroebnerConfiguration::Component Component; StreamStateChecker( const Coefficient modulus, const VarIndex varCount, const Component comCount ); ~StreamStateChecker(); void idealBegin(); void idealBegin(size_t polyCount); void appendPolynomialBegin(); void appendPolynomialBegin(size_t termCount); void appendTermBegin(Component com); void appendExponent(VarIndex index, Exponent exponent); void appendTermDone(Coefficient coefficient); void appendPolynomialDone(); void idealDone(); bool hasIdeal() const; private: struct Pimpl; Pimpl* const mPimpl; }; } /// Use this class to check that you are following the correct protocol /// for calling methods on an ideal stream. This has significant overhead /// so it is not recommended for production use. If you have built the /// MathicGB library in debug mode then this is already automatically /// used for GroebnerInputIdealStream. template class IdealStreamChecker { public: typedef GroebnerConfiguration::Coefficient Coefficient; typedef GroebnerConfiguration::VarIndex VarIndex; typedef GroebnerConfiguration::Exponent Exponent; typedef GroebnerConfiguration::Component Component; IdealStreamChecker(Stream& stream); Coefficient modulus() const; VarIndex varCount() const; Component comCount() const; void idealBegin(); void idealBegin(size_t polyCount); void appendPolynomialBegin(); void appendPolynomialBegin(size_t termCount); void appendTermBegin(Component com); void appendExponent(VarIndex index, Exponent exponent); void appendTermDone(Coefficient coefficient); void appendPolynomialDone(); void idealDone(); private: Stream& mStream; mgbi::StreamStateChecker mChecker; }; } // ******************************************************** // Nothing below this line is part of the public interface of MathicGB. #ifdef MATHICGB_DEBUG #include #endif namespace mgb { // ** Functions // This method is made inline to avoid the overhead from calling a function // for every exponent. This is also why mExponents is not inside the pimpl - // otherwise we couldn't access it from here. That then explains why // mExponents is a raw pointer instead of a std::vector - the compiler for the // caller and the library must agree on the memory layout of the object and // that is less likely to introduce problems for a raw pointer than for a // std::vector. In particular, doing it this way allows the library and // the caller to use different implementations of the STL. inline void GroebnerInputIdealStream::appendExponent( const VarIndex index, const Exponent exponent ) { #ifdef MATHICGB_DEBUG assert(index < varCount()); #endif mExponents[index] = exponent; } // ** Implementation of class GroebnerConfiguration // This code is inline so that things will still work even if // the caller uses a different implementation of std::vector than // the library does internally. So we have to decay objects of // type std::vector to pointers. inline bool GroebnerConfiguration::setMonomialOrder( const BaseOrder baseOrder, const std::vector& gradings ) { // We cannot do gradings.data() since we may be compiling without C++11 // support. We also cannot do &*gradings.begin() if gradings is empty // since then we are dereferencing an invalid iterator - the debug build // of MSVC's STL will correctly flag this as an error. const MonomialOrderData data = { baseOrder, gradings.empty() ? static_cast(0) : &*gradings.begin(), gradings.size() }; return setMonomialOrderInternal(data); } inline std::pair< GroebnerConfiguration::BaseOrder, std::vector > GroebnerConfiguration::monomialOrder() const { const MonomialOrderData data = monomialOrderInternal(); return std::make_pair( data.baseOrder, std::vector(data.gradings, data.gradings + data.gradingsSize) ); } inline GroebnerConfiguration::Callback::Action GroebnerConfiguration::callbackCaller(void* obj) { return static_cast(obj)->call(); }; inline void GroebnerConfiguration::setCallback(Callback* callback) { setCallbackInternal(static_cast(callback), callbackCaller); } inline const GroebnerConfiguration::Callback* GroebnerConfiguration::callback() const { return const_cast(*this).callback(); } inline GroebnerConfiguration::Callback* GroebnerConfiguration::callback() { return static_cast(callbackDataInternal()); } // ** Implementation of the class IdealStreamLog // This class has to be inline as it is a template. template IdealStreamLog::IdealStreamLog(std::ostream& log, Stream& stream): mModulus(stream.modulus()), mVarCount(stream.varCount()), mComCount(stream.comCount()), mStream(&stream), mLog(log) { mLog << "IdealStreamLog s(stream, log); // modulus=" << mModulus << ", varCount=" << mVarCount << ", comCount=" << mComCount << '\n'; } template IdealStreamLog::IdealStreamLog( std::ostream& log, Coefficient modulus, VarIndex varCount, Component comCount ): mModulus(modulus), mVarCount(varCount), mComCount(comCount), mStream(0), mLog(log) { mLog << "IdealStreamLog s(stream, " << mModulus << ", " << mVarCount << ", " << mComCount << ");\n"; } template IdealStreamLog::~IdealStreamLog() { mLog << "// s.~IdealStreamLog();\n"; } template typename IdealStreamLog::Coefficient IdealStreamLog::modulus() const { return mModulus; } template typename IdealStreamLog::VarIndex IdealStreamLog::varCount() const { return mVarCount; } template typename IdealStreamLog::Component IdealStreamLog::comCount() const { return mComCount; } template void IdealStreamLog::idealBegin() { mLog << "s.idealBegin();\n"; if (mStream != 0) mStream->idealBegin(); } template void IdealStreamLog::idealBegin(size_t polyCount) { mLog << "s.idealBegin(" << polyCount << "); // polyCount\n"; if (mStream != 0) mStream->idealBegin(polyCount); } template void IdealStreamLog::appendPolynomialBegin() { mLog << "s.appendPolynomialBegin();\n"; if (mStream != 0) mStream->appendPolynomialBegin(); } template void IdealStreamLog::appendPolynomialBegin(size_t termCount) { mLog << "s.appendPolynomialBegin(" << termCount << ");\n"; if (mStream != 0) mStream->appendPolynomialBegin(termCount); } template void IdealStreamLog::appendTermBegin(const Component com) { mLog << "s.appendTermBegin(" << com << ");\n"; if (mStream != 0) mStream->appendTermBegin(com); } template void IdealStreamLog::appendExponent(VarIndex index, Exponent exponent) { mLog << "s.appendExponent(" << index << ", " << exponent << "); // index, exponent\n"; if (mStream != 0) mStream->appendExponent(index, exponent); } template void IdealStreamLog::appendTermDone(Coefficient coefficient) { mLog << "s.appendTermDone(" << coefficient << "); // coefficient\n"; if (mStream != 0) mStream->appendTermDone(coefficient); } template void IdealStreamLog::appendPolynomialDone() { mLog << "s.appendPolynomialDone();\n"; if (mStream != 0) mStream->appendPolynomialDone(); } template void IdealStreamLog::idealDone() { mLog << "s.idealDone();\n"; if (mStream != 0) mStream->idealDone(); } // ** Implementation of the class IdealStreamChecker // This class has to be inline as it is a template. template IdealStreamChecker::IdealStreamChecker(Stream& stream): mStream(stream), mChecker(stream.modulus(), stream.varCount(), stream.comCount()) {} template typename IdealStreamChecker::Coefficient IdealStreamChecker::modulus() const { return mStream.modulus(); } template typename IdealStreamChecker::VarIndex IdealStreamChecker::varCount() const { return mStream.varCount(); } template typename IdealStreamChecker::Component IdealStreamChecker::comCount() const { return mStream.comCount(); } template void IdealStreamChecker::idealBegin() { mChecker.idealBegin(); mStream.idealBegin(); } template void IdealStreamChecker::idealBegin(size_t polyCount) { mChecker.idealBegin(polyCount); mStream.idealBegin(polyCount); } template void IdealStreamChecker::appendPolynomialBegin() { mChecker.appendPolynomialBegin(); mStream.appendPolynomialBegin(); } template void IdealStreamChecker::appendPolynomialBegin(size_t termCount) { mChecker.appendPolynomialBegin(termCount); mStream.appendPolynomialBegin(termCount); } template void IdealStreamChecker::appendTermBegin(const Component com) { mChecker.appendTermBegin(com); mStream.appendTermBegin(com); } template void IdealStreamChecker::appendExponent(VarIndex index, Exponent exponent) { mChecker.appendExponent(index, exponent); mStream.appendExponent(index, exponent); } template void IdealStreamChecker::appendTermDone(Coefficient coefficient) { mChecker.appendTermDone(coefficient); mStream.appendTermDone(coefficient); } template void IdealStreamChecker::appendPolynomialDone() { mChecker.appendPolynomialDone(); mStream.appendPolynomialDone(); } template void IdealStreamChecker::idealDone() { mChecker.idealDone(); mStream.idealDone(); } // ** Implementation of the class NullIdealStream // This class isn't a template, but it might become one and it is so // trivial that making it inline is not a big deal - it's not much more // than just its interface. The idea is also for this class to have minimal // overhead and making it inline helps with that. inline NullIdealStream::NullIdealStream( Coefficient modulus, VarIndex varCount, Component comCount ): mModulus(modulus), mVarCount(varCount), mComCount(comCount) {} namespace mgbi { /// Used to read an internal MathicGB ideal without exposing the type of /// the ideal. class IdealAdapter { public: typedef GroebnerConfiguration::Coefficient Coefficient; typedef GroebnerConfiguration::VarIndex VarIndex; typedef GroebnerConfiguration::Exponent Exponent; typedef GroebnerConfiguration::Component Component; typedef size_t PolyIndex; typedef size_t TermIndex; struct ConstTerm { Coefficient coef; const Exponent* exponents; Component com; }; IdealAdapter(); ~IdealAdapter(); VarIndex varCount() const; size_t polyCount() const; size_t termCount(PolyIndex poly) const; Component componentCount() const; /// Sets the internal position to the first term of the first polynomial. void toFirstTerm(); /// Returns the next term. First all terms of polynomial 0 are returned, /// then all terms of the next polynomial and so on. ConstTerm nextTerm() const; private: friend class mgbi::PimplOf; struct Pimpl; Pimpl* mPimpl; }; bool internalComputeGroebnerBasis( GroebnerInputIdealStream& inputWhichWillBeCleared, IdealAdapter& output ); } template void computeGroebnerBasis( GroebnerInputIdealStream& inputWhichWillBeCleared, OutputStream& output ) { typedef mgbi::IdealAdapter::ConstTerm ConstTerm; mgbi::IdealAdapter ideal; const bool doOutput = mgbi::internalComputeGroebnerBasis(inputWhichWillBeCleared, ideal); if (!doOutput) return; ideal.toFirstTerm(); const size_t varCount = ideal.varCount(); const size_t polyCount = ideal.polyCount(); output.idealBegin(polyCount); for (size_t polyIndex = 0; polyIndex < polyCount; ++polyIndex) { const size_t termCount = ideal.termCount(polyIndex); output.appendPolynomialBegin(termCount); for (size_t termIndex = 0; termIndex < termCount; ++termIndex) { const ConstTerm term = ideal.nextTerm(); output.appendTermBegin(term.com); for (size_t var = 0; var < varCount; ++var) output.appendExponent(var, term.exponents[var]); output.appendTermDone(term.coef); } output.appendPolynomialDone(); } output.idealDone(); } } #endif mathicgb-1.1/configure0000775000175000017500000233552215117247651010550 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.71 for mathicgb 1.1. # # # Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, # Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh as_nop=: if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="as_nop=: if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else \$as_nop case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ) then : else \$as_nop exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 blah=\$(echo \$(echo blah)) test x\"\$blah\" = xblah || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null then : as_have_required=yes else $as_nop as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : else $as_nop as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$as_shell as_have_required=yes if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null then : break 2 fi fi done;; esac as_found=false done IFS=$as_save_IFS if $as_found then : else $as_nop if { test -f "$SHELL" || test -f "$SHELL.exe"; } && as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$SHELL as_have_required=yes fi fi if test "x$CONFIG_SHELL" != x then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno then : printf "%s\n" "$0: This script requires a shell more modern than all" printf "%s\n" "$0: the shells that I found on your system." if test ${ZSH_VERSION+y} ; then printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else printf "%s\n" "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_nop # --------- # Do nothing but, unlike ":", preserve the value of $?. as_fn_nop () { return $? } as_nop=as_fn_nop # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else $as_nop as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_nop # --------- # Do nothing but, unlike ":", preserve the value of $?. as_fn_nop () { return $? } as_nop=as_fn_nop # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='mathicgb' PACKAGE_TARNAME='mathicgb' PACKAGE_VERSION='1.1' PACKAGE_STRING='mathicgb 1.1' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="src/mathicgb.h" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_STDIO_H # include #endif #ifdef HAVE_STDLIB_H # include #endif #ifdef HAVE_STRING_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_cxx_list= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS MATHICGB_SO_VERSION CXXCPP LT_SYS_LIBRARY_PATH OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB DLLTOOL OBJDUMP FILECMD NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED host_os host_vendor host_cpu host build_os build_vendor build_cpu build LIBTOOL LN_S AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V CSCOPE ETAGS CTAGS am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__include DEPDIR am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE CLI_FALSE CLI_TRUE DEPS_LIBS DEPS_CFLAGS TBB_LIBS TBB_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG with_gtest_FALSE with_gtest_TRUE ac_ct_CC CFLAGS CC ac_ct_AR AR HAVE_CXX11 OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL am__quote' ac_subst_files='' ac_user_opts=' enable_option_checking with_gtest with_tbb enable_cli enable_maintainer_mode enable_dependency_tracking enable_silent_rules enable_shared enable_static with_pic enable_fast_install with_aix_soname with_gnu_ld with_sysroot enable_libtool_lock ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR TBB_CFLAGS TBB_LIBS LT_SYS_LIBRARY_PATH CXXCPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures mathicgb 1.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/mathicgb] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of mathicgb 1.1:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-cli disable building the command line interface --disable-maintainer-mode disable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-shared[=PKGS] build shared libraries [default=no] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-gtest use gtest, which is required for running the unit tests with make check [default=yes]. --with-tbb use TBB, which is required for multithreading. The value detect, which is the default, enables TBB if it can be found and otherwise prints a warning and continues the build without multithreading support. TBB is not available for Cygwin (last checked March 2013). --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-aix-soname=aix|svr4|both shared library versioning (aka "SONAME") variant to provide on AIX, [default=aix]. --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified). Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path TBB_CFLAGS C compiler flags for TBB, overriding pkg-config TBB_LIBS linker flags for TBB, overriding pkg-config LT_SYS_LIBRARY_PATH User-defined run-time library search path. CXXCPP C++ preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for configure.gnu first; this name is used for a wrapper for # Metaconfig's "Configure" on case-insensitive file systems. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF mathicgb configure 1.1 generated by GNU Autoconf 2.71 Copyright (C) 2021 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext then : ac_retval=0 else $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext then : ac_retval=0 else $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_check_header_compile LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_cxx_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : eval "$3=yes" else $as_nop eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_compile # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext } then : ac_retval=0 else $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext } then : ac_retval=0 else $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$3=yes" else $as_nop eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. */ #include #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main (void) { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : eval "$3=yes" else $as_nop eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err } then : ac_retval=0 else $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp ac_configure_args_raw= for ac_arg do case $ac_arg in *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_configure_args_raw " '$ac_arg'" done case $ac_configure_args_raw in *$as_nl*) ac_safe_unquote= ;; *) ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. ac_unsafe_a="$ac_unsafe_z#~" ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; esac cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by mathicgb $as_me 1.1, which was generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac printf "%s\n" "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Sanitize IFS. IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo printf "%s\n" "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo printf "%s\n" "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then printf "%s\n" "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then printf "%s\n" "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && printf "%s\n" "$as_me: caught signal $ac_signal" printf "%s\n" "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi for ac_site_file in $ac_site_files do case $ac_site_file in #( */*) : ;; #( *) : ac_site_file=./$ac_site_file ;; esac if test -f "$ac_site_file" && test -r "$ac_site_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 printf "%s\n" "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Test code for whether the C++ compiler supports C++98 (global declarations) ac_cxx_conftest_cxx98_globals=' // Does the compiler advertise C++98 conformance? #if !defined __cplusplus || __cplusplus < 199711L # error "Compiler does not advertise C++98 conformance" #endif // These inclusions are to reject old compilers that // lack the unsuffixed header files. #include #include // and are *not* freestanding headers in C++98. extern void assert (int); namespace std { extern int strcmp (const char *, const char *); } // Namespaces, exceptions, and templates were all added after "C++ 2.0". using std::exception; using std::strcmp; namespace { void test_exception_syntax() { try { throw "test"; } catch (const char *s) { // Extra parentheses suppress a warning when building autoconf itself, // due to lint rules shared with more typical C programs. assert (!(strcmp) (s, "test")); } } template struct test_template { T const val; explicit test_template(T t) : val(t) {} template T add(U u) { return static_cast(u) + val; } }; } // anonymous namespace ' # Test code for whether the C++ compiler supports C++98 (body of main) ac_cxx_conftest_cxx98_main=' assert (argc); assert (! argv[0]); { test_exception_syntax (); test_template tt (2.0); assert (tt.add (4) == 6.0); assert (true && !false); } ' # Test code for whether the C++ compiler supports C++11 (global declarations) ac_cxx_conftest_cxx11_globals=' // Does the compiler advertise C++ 2011 conformance? #if !defined __cplusplus || __cplusplus < 201103L # error "Compiler does not advertise C++11 conformance" #endif namespace cxx11test { constexpr int get_val() { return 20; } struct testinit { int i; double d; }; class delegate { public: delegate(int n) : n(n) {} delegate(): delegate(2354) {} virtual int getval() { return this->n; }; protected: int n; }; class overridden : public delegate { public: overridden(int n): delegate(n) {} virtual int getval() override final { return this->n * 2; } }; class nocopy { public: nocopy(int i): i(i) {} nocopy() = default; nocopy(const nocopy&) = delete; nocopy & operator=(const nocopy&) = delete; private: int i; }; // for testing lambda expressions template Ret eval(Fn f, Ret v) { return f(v); } // for testing variadic templates and trailing return types template auto sum(V first) -> V { return first; } template auto sum(V first, Args... rest) -> V { return first + sum(rest...); } } ' # Test code for whether the C++ compiler supports C++11 (body of main) ac_cxx_conftest_cxx11_main=' { // Test auto and decltype auto a1 = 6538; auto a2 = 48573953.4; auto a3 = "String literal"; int total = 0; for (auto i = a3; *i; ++i) { total += *i; } decltype(a2) a4 = 34895.034; } { // Test constexpr short sa[cxx11test::get_val()] = { 0 }; } { // Test initializer lists cxx11test::testinit il = { 4323, 435234.23544 }; } { // Test range-based for int array[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, 14, 19, 17, 8, 6, 20, 16, 2, 11, 1}; for (auto &x : array) { x += 23; } } { // Test lambda expressions using cxx11test::eval; assert (eval ([](int x) { return x*2; }, 21) == 42); double d = 2.0; assert (eval ([&](double x) { return d += x; }, 3.0) == 5.0); assert (d == 5.0); assert (eval ([=](double x) mutable { return d += x; }, 4.0) == 9.0); assert (d == 5.0); } { // Test use of variadic templates using cxx11test::sum; auto a = sum(1); auto b = sum(1, 2); auto c = sum(1.0, 2.0, 3.0); } { // Test constructor delegation cxx11test::delegate d1; cxx11test::delegate d2(); cxx11test::delegate d3(45); } { // Test override and final cxx11test::overridden o1(55464); } { // Test nullptr char *c = nullptr; } { // Test template brackets test_template<::test_template> v(test_template(12)); } { // Unicode literals char const *utf8 = u8"UTF-8 string \u2500"; char16_t const *utf16 = u"UTF-8 string \u2500"; char32_t const *utf32 = U"UTF-32 string \u2500"; } ' # Test code for whether the C compiler supports C++11 (complete). ac_cxx_conftest_cxx11_program="${ac_cxx_conftest_cxx98_globals} ${ac_cxx_conftest_cxx11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_cxx_conftest_cxx98_main} ${ac_cxx_conftest_cxx11_main} return ok; } " # Test code for whether the C compiler supports C++98 (complete). ac_cxx_conftest_cxx98_program="${ac_cxx_conftest_cxx98_globals} int main (int argc, char **argv) { int ok = 0; ${ac_cxx_conftest_cxx98_main} return ok; } " # Test code for whether the C compiler supports C89 (global declarations) ac_c_conftest_c89_globals=' /* Does the compiler advertise C89 conformance? Do not test the value of __STDC__, because some compilers set it to 0 while being otherwise adequately conformant. */ #if !defined __STDC__ # error "Compiler does not advertise C89 conformance" #endif #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ struct buf { int x; }; struct buf * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not \xHH hex character constants. These do not provoke an error unfortunately, instead are silently treated as an "x". The following induces an error, until -std is added to get proper ANSI mode. Curiously \x00 != x always comes out true, for an array size at least. It is necessary to write \x00 == 0 to get something that is true only with -std. */ int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) '\''x'\'' int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), int, int);' # Test code for whether the C compiler supports C89 (body of main). ac_c_conftest_c89_main=' ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); ' # Test code for whether the C compiler supports C99 (global declarations) ac_c_conftest_c99_globals=' // Does the compiler advertise C99 conformance? #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L # error "Compiler does not advertise C99 conformance" #endif #include extern int puts (const char *); extern int printf (const char *, ...); extern int dprintf (int, const char *, ...); extern void *malloc (size_t); // Check varargs macros. These examples are taken from C99 6.10.3.5. // dprintf is used instead of fprintf to avoid needing to declare // FILE and stderr. #define debug(...) dprintf (2, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK #error "your preprocessor is broken" #endif #if BIG_OK #else #error "your preprocessor is broken" #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // See if C++-style comments work. // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) continue; return 0; } // Check varargs and va_copy. static bool test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str = ""; int number = 0; float fnumber = 0; while (*format) { switch (*format++) { case '\''s'\'': // string str = va_arg (args_copy, const char *); break; case '\''d'\'': // int number = va_arg (args_copy, int); break; case '\''f'\'': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); return *str && number && fnumber; } ' # Test code for whether the C compiler supports C99 (body of main). ac_c_conftest_c99_main=' // Check bool. _Bool success = false; success |= (argc != 0); // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[0] = argv[0][0]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' || dynamic_array[ni.number - 1] != 543); ' # Test code for whether the C compiler supports C11 (global declarations) ac_c_conftest_c11_globals=' // Does the compiler advertise C11 conformance? #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L # error "Compiler does not advertise C11 conformance" #endif // Check _Alignas. char _Alignas (double) aligned_as_double; char _Alignas (0) no_special_alignment; extern char aligned_as_int; char _Alignas (0) _Alignas (int) aligned_as_int; // Check _Alignof. enum { int_alignment = _Alignof (int), int_array_alignment = _Alignof (int[100]), char_alignment = _Alignof (char) }; _Static_assert (0 < -_Alignof (int), "_Alignof is signed"); // Check _Noreturn. int _Noreturn does_not_return (void) { for (;;) continue; } // Check _Static_assert. struct test_static_assert { int x; _Static_assert (sizeof (int) <= sizeof (long int), "_Static_assert does not work in struct"); long int y; }; // Check UTF-8 literals. #define u8 syntax error! char const utf8_literal[] = u8"happens to be ASCII" "another string"; // Check duplicate typedefs. typedef long *long_ptr; typedef long int *long_ptr; typedef long_ptr long_ptr; // Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. struct anonymous { union { struct { int i; int j; }; struct { int k; long int l; } w; }; int m; } v1; ' # Test code for whether the C compiler supports C11 (body of main). ac_c_conftest_c11_main=' _Static_assert ((offsetof (struct anonymous, i) == offsetof (struct anonymous, w.k)), "Anonymous union alignment botch"); v1.i = 2; v1.w.k = 5; ok |= v1.i != 5; ' # Test code for whether the C compiler supports C11 (complete). ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} ${ac_c_conftest_c11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} ${ac_c_conftest_c11_main} return ok; } " # Test code for whether the C compiler supports C99 (complete). ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} return ok; } " # Test code for whether the C compiler supports C89 (complete). ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} return ok; } " as_fn_append ac_header_cxx_list " stdio.h stdio_h HAVE_STDIO_H" as_fn_append ac_header_cxx_list " stdlib.h stdlib_h HAVE_STDLIB_H" as_fn_append ac_header_cxx_list " string.h string_h HAVE_STRING_H" as_fn_append ac_header_cxx_list " inttypes.h inttypes_h HAVE_INTTYPES_H" as_fn_append ac_header_cxx_list " stdint.h stdint_h HAVE_STDINT_H" as_fn_append ac_header_cxx_list " strings.h strings_h HAVE_STRINGS_H" as_fn_append ac_header_cxx_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" as_fn_append ac_header_cxx_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" as_fn_append ac_header_cxx_list " unistd.h unistd_h HAVE_UNISTD_H" # Auxiliary files required by this configure script. ac_aux_files="config.guess config.sub ltmain.sh missing install-sh compile ar-lib" # Locations in which to look for auxiliary files. ac_aux_dir_candidates="${srcdir}/build/autotools" # Search for a directory containing all of the required auxiliary files, # $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. # If we don't find one directory that contains all the files we need, # we report the set of missing files from the *first* directory in # $ac_aux_dir_candidates and give up. ac_missing_aux_files="" ac_first_candidate=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in $ac_aux_dir_candidates do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 ac_aux_dir_found=yes ac_install_sh= for ac_aux in $ac_aux_files do # As a special case, if "install-sh" is required, that requirement # can be satisfied by any of "install-sh", "install.sh", or "shtool", # and $ac_install_sh is set appropriately for whichever one is found. if test x"$ac_aux" = x"install-sh" then if test -f "${as_dir}install-sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 ac_install_sh="${as_dir}install-sh -c" elif test -f "${as_dir}install.sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 ac_install_sh="${as_dir}install.sh -c" elif test -f "${as_dir}shtool"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 ac_install_sh="${as_dir}shtool install -c" else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} install-sh" else break fi fi else if test -f "${as_dir}${ac_aux}"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" else break fi fi fi done if test "$ac_aux_dir_found" = yes; then ac_aux_dir="$as_dir" break fi ac_first_candidate=false as_found=false done IFS=$as_save_IFS if $as_found then : else $as_nop as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. if test -f "${ac_aux_dir}config.guess"; then ac_config_guess="$SHELL ${ac_aux_dir}config.guess" fi if test -f "${ac_aux_dir}config.sub"; then ac_config_sub="$SHELL ${ac_aux_dir}config.sub" fi if test -f "$ac_aux_dir/configure"; then ac_configure="$SHELL ${ac_aux_dir}configure" fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # package, version, bug-report-email # set up information about directories # directory of extra autoconf macroes # directory for auxiliary build tools (install-sh etc) # check that source directory is correct # Locate the C++ compiler. ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CXX+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 printf "%s\n" "$CXX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CXX+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 printf "%s\n" "$ac_ct_CXX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 printf %s "checking whether the C++ compiler works... " >&6; } ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else $as_nop ac_file='' fi if test -z "$ac_file" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C++ compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 printf %s "checking for C++ compiler default output file name... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 printf "%s\n" "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 printf %s "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else $as_nop { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 printf "%s\n" "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 printf %s "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 printf "%s\n" "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 printf %s "checking for suffix of object files... " >&6; } if test ${ac_cv_objext+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 printf "%s\n" "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5 printf %s "checking whether the compiler supports GNU C++... " >&6; } if test ${ac_cv_cxx_compiler_gnu+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_compiler_gnu=yes else $as_nop ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+y} ac_save_CXXFLAGS=$CXXFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 printf %s "checking whether $CXX accepts -g... " >&6; } if test ${ac_cv_prog_cxx_g+y} then : printf %s "(cached) " >&6 else $as_nop ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_g=yes else $as_nop CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : else $as_nop ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 printf "%s\n" "$ac_cv_prog_cxx_g" >&6; } if test $ac_test_CXXFLAGS; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_prog_cxx_stdcxx=no if test x$ac_prog_cxx_stdcxx = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5 printf %s "checking for $CXX option to enable C++11 features... " >&6; } if test ${ac_cv_prog_cxx_cxx11+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cxx_cxx11=no ac_save_CXX=$CXX cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_cxx_conftest_cxx11_program _ACEOF for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA do CXX="$ac_save_CXX $ac_arg" if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_cxx11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cxx_cxx11" != "xno" && break done rm -f conftest.$ac_ext CXX=$ac_save_CXX fi if test "x$ac_cv_prog_cxx_cxx11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cxx_cxx11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5 printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; } CXX="$CXX $ac_cv_prog_cxx_cxx11" fi ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11 ac_prog_cxx_stdcxx=cxx11 fi fi if test x$ac_prog_cxx_stdcxx = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5 printf %s "checking for $CXX option to enable C++98 features... " >&6; } if test ${ac_cv_prog_cxx_cxx98+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cxx_cxx98=no ac_save_CXX=$CXX cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_cxx_conftest_cxx98_program _ACEOF for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA do CXX="$ac_save_CXX $ac_arg" if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_cxx98=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cxx_cxx98" != "xno" && break done rm -f conftest.$ac_ext CXX=$ac_save_CXX fi if test "x$ac_cv_prog_cxx_cxx98" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cxx_cxx98" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5 printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; } CXX="$CXX $ac_cv_prog_cxx_cxx98" fi ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98 ac_prog_cxx_stdcxx=cxx98 fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu # Require C++11 support ax_cxx_compile_cxx11_required=truednl ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_success=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features by default" >&5 printf %s "checking whether $CXX supports C++11 features by default... " >&6; } if test ${ax_cv_cxx_compile_cxx11+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; typedef check> right_angle_brackets; int a; decltype(a) b; typedef check check_type; check_type c; check_type&& cr = static_cast(c); auto d = a; _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ax_cv_cxx_compile_cxx11=yes else $as_nop ax_cv_cxx_compile_cxx11=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_cxx_compile_cxx11" >&5 printf "%s\n" "$ax_cv_cxx_compile_cxx11" >&6; } if test x$ax_cv_cxx_compile_cxx11 = xyes; then ac_success=yes fi if test x$ac_success = xno; then for switch in -std=gnu++11 -std=gnu++0x; do cachevar=`printf "%s\n" "ax_cv_cxx_compile_cxx11_$switch" | $as_tr_sh` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features with $switch" >&5 printf %s "checking whether $CXX supports C++11 features with $switch... " >&6; } if eval test \${$cachevar+y} then : printf %s "(cached) " >&6 else $as_nop ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS $switch" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; typedef check> right_angle_brackets; int a; decltype(a) b; typedef check check_type; check_type c; check_type&& cr = static_cast(c); auto d = a; _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : eval $cachevar=yes else $as_nop eval $cachevar=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CXXFLAGS="$ac_save_CXXFLAGS" fi eval ac_res=\$$cachevar { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } if eval test x\$$cachevar = xyes; then CXXFLAGS="$CXXFLAGS $switch" ac_success=yes break fi done fi if test x$ac_success = xno; then for switch in -std=c++11 -std=c++0x; do cachevar=`printf "%s\n" "ax_cv_cxx_compile_cxx11_$switch" | $as_tr_sh` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features with $switch" >&5 printf %s "checking whether $CXX supports C++11 features with $switch... " >&6; } if eval test \${$cachevar+y} then : printf %s "(cached) " >&6 else $as_nop ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS $switch" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; typedef check> right_angle_brackets; int a; decltype(a) b; typedef check check_type; check_type c; check_type&& cr = static_cast(c); auto d = a; _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : eval $cachevar=yes else $as_nop eval $cachevar=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CXXFLAGS="$ac_save_CXXFLAGS" fi eval ac_res=\$$cachevar { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } if eval test x\$$cachevar = xyes; then CXXFLAGS="$CXXFLAGS $switch" ac_success=yes break fi done fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test x$ax_cxx_compile_cxx11_required = xtrue; then if test x$ac_success = xno; then as_fn_error $? "*** A compiler with support for C++11 language features is required." "$LINENO" 5 fi else if test x$ac_success = xno; then HAVE_CXX11=0 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: No compiler with C++11 support was found" >&5 printf "%s\n" "$as_me: No compiler with C++11 support was found" >&6;} else HAVE_CXX11=1 printf "%s\n" "#define HAVE_CXX11 1" >>confdefs.h fi fi # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. set dummy ${ac_tool_prefix}clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "clang", so it can be a program name with args. set dummy clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi fi test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes else $as_nop ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_c_compiler_gnu if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 else $as_nop ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes else $as_nop CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else $as_nop ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } if test $ac_test_CFLAGS; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi ac_prog_cc_stdc=no if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c11_program _ACEOF for ac_arg in '' -std=gnu11 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } CC="$CC $ac_cv_prog_cc_c11" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c99_program _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } CC="$CC $ac_cv_prog_cc_c99" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c89_program _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } CC="$CC $ac_cv_prog_cc_c89" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 printf %s "checking whether $CC understands -c and -o together... " >&6; } if test ${am_cv_prog_cc_c_o+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in ar lib "link -lib" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AR+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 printf "%s\n" "$AR" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar lib "link -lib" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_AR+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 printf "%s\n" "$ac_ct_AR" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5 printf %s "checking the archiver ($AR) interface... " >&6; } if test ${am_cv_ar_interface+y} then : printf %s "(cached) " >&6 else $as_nop ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am_cv_ar_interface=ar cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int some_variable = 0; _ACEOF if ac_fn_c_try_compile "$LINENO" then : am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 (eval $am_ar_try) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then am_cv_ar_interface=ar else am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 (eval $am_ar_try) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then am_cv_ar_interface=lib else am_cv_ar_interface=unknown fi fi rm -f conftest.lib libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5 printf "%s\n" "$am_cv_ar_interface" >&6; } case $am_cv_ar_interface in ar) ;; lib) # Microsoft lib, so override with the ar-lib wrapper script. # FIXME: It is wrong to rewrite AR. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__AR in this case, # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something # similar. AR="$am_aux_dir/ar-lib $AR" ;; unknown) as_fn_error $? "could not determine $AR interface" "$LINENO" 5 ;; esac # Check availability and location of dependencies ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_header= ac_cache= for ac_item in $ac_header_cxx_list do if test $ac_cache; then ac_fn_cxx_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then printf "%s\n" "#define $ac_item 1" >> confdefs.h fi ac_header= ac_cache= elif test $ac_header; then ac_cache=$ac_item else ac_header=$ac_item fi done if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes then : printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h fi ac_fn_cxx_check_header_compile "$LINENO" "memtailor.h" "ac_cv_header_memtailor_h" "$ac_includes_default" if test "x$ac_cv_header_memtailor_h" = xyes then : else $as_nop as_fn_error $? "memtailor is required" "$LINENO" 5 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing libmemtailorIsPresent" >&5 printf %s "checking for library containing libmemtailorIsPresent... " >&6; } if test ${ac_cv_search_libmemtailorIsPresent+y} then : printf %s "(cached) " >&6 else $as_nop ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ namespace conftest { extern "C" int libmemtailorIsPresent (); } int main (void) { return conftest::libmemtailorIsPresent (); ; return 0; } _ACEOF for ac_lib in '' memtailor do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_cxx_try_link "$LINENO" then : ac_cv_search_libmemtailorIsPresent=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_libmemtailorIsPresent+y} then : break fi done if test ${ac_cv_search_libmemtailorIsPresent+y} then : else $as_nop ac_cv_search_libmemtailorIsPresent=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_libmemtailorIsPresent" >&5 printf "%s\n" "$ac_cv_search_libmemtailorIsPresent" >&6; } ac_res=$ac_cv_search_libmemtailorIsPresent if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else $as_nop as_fn_error $? "memtailor is required" "$LINENO" 5 fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_fn_cxx_check_header_compile "$LINENO" "mathic.h" "ac_cv_header_mathic_h" "$ac_includes_default" if test "x$ac_cv_header_mathic_h" = xyes then : else $as_nop as_fn_error $? "mathic is required" "$LINENO" 5 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing libmathicIsPresent" >&5 printf %s "checking for library containing libmathicIsPresent... " >&6; } if test ${ac_cv_search_libmathicIsPresent+y} then : printf %s "(cached) " >&6 else $as_nop ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ namespace conftest { extern "C" int libmathicIsPresent (); } int main (void) { return conftest::libmathicIsPresent (); ; return 0; } _ACEOF for ac_lib in '' mathic do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_cxx_try_link "$LINENO" then : ac_cv_search_libmathicIsPresent=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_libmathicIsPresent+y} then : break fi done if test ${ac_cv_search_libmathicIsPresent+y} then : else $as_nop ac_cv_search_libmathicIsPresent=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_libmathicIsPresent" >&5 printf "%s\n" "$ac_cv_search_libmathicIsPresent" >&6; } ac_res=$ac_cv_search_libmathicIsPresent if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else $as_nop as_fn_error $? "mathic is required" "$LINENO" 5 fi # Check whether --with-gtest was given. if test ${with_gtest+y} then : withval=$with_gtest; else $as_nop with_gtest=yes fi if test "x$with_gtest" != "xno" then : ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_fn_cxx_check_header_compile "$LINENO" "gtest/gtest.h" "ac_cv_header_gtest_gtest_h" "$ac_includes_default" if test "x$ac_cv_header_gtest_gtest_h" = xyes then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing testing::InitGoogleTest" >&5 printf %s "checking for library containing testing::InitGoogleTest... " >&6; } SAVELIBS=$LIBS LIBS="$LIBS -lgtest -pthread" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { testing::InitGoogleTest() ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: -lgtest" >&5 printf "%s\n" "-lgtest" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } as_fn_error $? "gtest not found; try again using --without-gtest" "$LINENO" 5 fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$SAVELIBS else $as_nop as_fn_error $? "gtest not found; try again using --without-gtest" "$LINENO" 5 fi fi if test "x$with_gtest" != "xno"; then with_gtest_TRUE= with_gtest_FALSE='#' else with_gtest_TRUE='#' with_gtest_FALSE= fi # Check whether --with-tbb was given. if test ${with_tbb+y} then : withval=$with_tbb; fi if test "x$with_tbb" == "x" then : with_tbb="detect" fi if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_PKG_CONFIG+y} then : printf %s "(cached) " >&6 else $as_nop case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 printf "%s\n" "$PKG_CONFIG" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_ac_pt_PKG_CONFIG+y} then : printf %s "(cached) " >&6 else $as_nop case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 printf "%s\n" "$ac_pt_PKG_CONFIG" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 printf %s "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } PKG_CONFIG="" fi fi if test "x$with_tbb" == "xdetect" then : pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tbb" >&5 printf %s "checking for tbb... " >&6; } if test -n "$TBB_CFLAGS"; then pkg_cv_TBB_CFLAGS="$TBB_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"tbb\""; } >&5 ($PKG_CONFIG --exists --print-errors "tbb") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_TBB_CFLAGS=`$PKG_CONFIG --cflags "tbb" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$TBB_LIBS"; then pkg_cv_TBB_LIBS="$TBB_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"tbb\""; } >&5 ($PKG_CONFIG --exists --print-errors "tbb") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_TBB_LIBS=`$PKG_CONFIG --libs "tbb" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then TBB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "tbb" 2>&1` else TBB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "tbb" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$TBB_PKG_ERRORS" >&5 pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tbb32" >&5 printf %s "checking for tbb32... " >&6; } if test -n "$TBB_CFLAGS"; then pkg_cv_TBB_CFLAGS="$TBB_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"tbb32\""; } >&5 ($PKG_CONFIG --exists --print-errors "tbb32") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_TBB_CFLAGS=`$PKG_CONFIG --cflags "tbb32" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$TBB_LIBS"; then pkg_cv_TBB_LIBS="$TBB_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"tbb32\""; } >&5 ($PKG_CONFIG --exists --print-errors "tbb32") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_TBB_LIBS=`$PKG_CONFIG --libs "tbb32" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then TBB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "tbb32" 2>&1` else TBB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "tbb32" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$TBB_PKG_ERRORS" >&5 with_tbb="no"; { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: TBB not detected. Compiling without multithreading and without precise timing." >&5 printf "%s\n" "$as_me: WARNING: TBB not detected. Compiling without multithreading and without precise timing." >&2;} elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } with_tbb="no"; { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: TBB not detected. Compiling without multithreading and without precise timing." >&5 printf "%s\n" "$as_me: WARNING: TBB not detected. Compiling without multithreading and without precise timing." >&2;} else TBB_CFLAGS=$pkg_cv_TBB_CFLAGS TBB_LIBS=$pkg_cv_TBB_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } with_tbb="yes" fi elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tbb32" >&5 printf %s "checking for tbb32... " >&6; } if test -n "$TBB_CFLAGS"; then pkg_cv_TBB_CFLAGS="$TBB_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"tbb32\""; } >&5 ($PKG_CONFIG --exists --print-errors "tbb32") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_TBB_CFLAGS=`$PKG_CONFIG --cflags "tbb32" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$TBB_LIBS"; then pkg_cv_TBB_LIBS="$TBB_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"tbb32\""; } >&5 ($PKG_CONFIG --exists --print-errors "tbb32") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_TBB_LIBS=`$PKG_CONFIG --libs "tbb32" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then TBB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "tbb32" 2>&1` else TBB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "tbb32" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$TBB_PKG_ERRORS" >&5 with_tbb="no"; { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: TBB not detected. Compiling without multithreading and without precise timing." >&5 printf "%s\n" "$as_me: WARNING: TBB not detected. Compiling without multithreading and without precise timing." >&2;} elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } with_tbb="no"; { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: TBB not detected. Compiling without multithreading and without precise timing." >&5 printf "%s\n" "$as_me: WARNING: TBB not detected. Compiling without multithreading and without precise timing." >&2;} else TBB_CFLAGS=$pkg_cv_TBB_CFLAGS TBB_LIBS=$pkg_cv_TBB_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } with_tbb="yes" fi else TBB_CFLAGS=$pkg_cv_TBB_CFLAGS TBB_LIBS=$pkg_cv_TBB_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } with_tbb="yes" fi elif test "x$with_tbb" == "xyes" then : pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tbb" >&5 printf %s "checking for tbb... " >&6; } if test -n "$TBB_CFLAGS"; then pkg_cv_TBB_CFLAGS="$TBB_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"tbb\""; } >&5 ($PKG_CONFIG --exists --print-errors "tbb") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_TBB_CFLAGS=`$PKG_CONFIG --cflags "tbb" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$TBB_LIBS"; then pkg_cv_TBB_LIBS="$TBB_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"tbb\""; } >&5 ($PKG_CONFIG --exists --print-errors "tbb") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_TBB_LIBS=`$PKG_CONFIG --libs "tbb" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then TBB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "tbb" 2>&1` else TBB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "tbb" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$TBB_PKG_ERRORS" >&5 pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tbb32" >&5 printf %s "checking for tbb32... " >&6; } if test -n "$TBB_CFLAGS"; then pkg_cv_TBB_CFLAGS="$TBB_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"tbb32\""; } >&5 ($PKG_CONFIG --exists --print-errors "tbb32") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_TBB_CFLAGS=`$PKG_CONFIG --cflags "tbb32" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$TBB_LIBS"; then pkg_cv_TBB_LIBS="$TBB_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"tbb32\""; } >&5 ($PKG_CONFIG --exists --print-errors "tbb32") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_TBB_LIBS=`$PKG_CONFIG --libs "tbb32" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then TBB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "tbb32" 2>&1` else TBB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "tbb32" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$TBB_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (tbb32) were not met: $TBB_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables TBB_CFLAGS and TBB_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables TBB_CFLAGS and TBB_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else TBB_CFLAGS=$pkg_cv_TBB_CFLAGS TBB_LIBS=$pkg_cv_TBB_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } fi elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tbb32" >&5 printf %s "checking for tbb32... " >&6; } if test -n "$TBB_CFLAGS"; then pkg_cv_TBB_CFLAGS="$TBB_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"tbb32\""; } >&5 ($PKG_CONFIG --exists --print-errors "tbb32") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_TBB_CFLAGS=`$PKG_CONFIG --cflags "tbb32" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$TBB_LIBS"; then pkg_cv_TBB_LIBS="$TBB_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"tbb32\""; } >&5 ($PKG_CONFIG --exists --print-errors "tbb32") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_TBB_LIBS=`$PKG_CONFIG --libs "tbb32" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then TBB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "tbb32" 2>&1` else TBB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "tbb32" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$TBB_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (tbb32) were not met: $TBB_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables TBB_CFLAGS and TBB_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables TBB_CFLAGS and TBB_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else TBB_CFLAGS=$pkg_cv_TBB_CFLAGS TBB_LIBS=$pkg_cv_TBB_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } fi else TBB_CFLAGS=$pkg_cv_TBB_CFLAGS TBB_LIBS=$pkg_cv_TBB_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } fi elif test "x$with_tbb" == "xno" then : else $as_nop as_fn_error $? "invalid value $with_tbb for with_tbb." "$LINENO" 5 fi if test "x$with_tbb" == "xno" then : TBB_CFLAGS="-DMATHICGB_NO_TBB" fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ _ACEOF if ac_fn_cxx_try_link "$LINENO" then : fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test "x$with_tbb" == "xyes" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if librt is needed to support TBB on this platform" >&5 printf %s "checking if librt is needed to support TBB on this platform... " >&6; }; oldLIBS=$LIBS; LIBS="$TBB_LIBS -lrt $LIBS"; oldCFLAGS=$CFLAGS; CFLAGS="$CFLAGS $TBB_CFLAGS"; cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { tbb::tick_count::now(); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO" then : LIBS=$oldLibs; cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { tbb::tick_count::now(); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; }; RT_LIBS="-lrt" fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext; LIBS=$oldLIBS; CFLAGS=$oldCFLAGS; fi DEPS_CFLAGS="$TBB_CFLAGS" DEPS_LIBS="$TBB_LIBS $RT_LIBS" # Check whether --enable-cli was given. if test ${enable_cli+y} then : enableval=$enable_cli; case "${enableval}" in yes) cli=true ;; no) cli=false ;; *) as_fn_error $? "bad value \"${enableval}\" for --enable-cli" "$LINENO" 5 ;; esac else $as_nop cli=true fi if test x$cli = xtrue; then CLI_TRUE= CLI_FALSE='#' else CLI_TRUE='#' CLI_FALSE= fi # Enable optional maintainer mode (off by default) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 printf %s "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test ${enable_maintainer_mode+y} then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else $as_nop USE_MAINTAINER_MODE=yes fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 printf "%s\n" "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE # Set up Automake am__api_version='1.16' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 printf %s "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if test ${ac_cv_path_install+y} then : printf %s "(cached) " >&6 else $as_nop as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac # Account for fact that we put trailing slashes in our PATH walk. case $as_dir in #(( ./ | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test ${ac_cv_path_install+y}; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 printf "%s\n" "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 printf %s "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`printf "%s\n" "$program_transform_name" | sed "$ac_script"` if test x"${MISSING+set}" != xset; then MISSING="\${SHELL} '$am_aux_dir/missing'" fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_STRIP+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 printf "%s\n" "$STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_STRIP+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 printf "%s\n" "$ac_ct_STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5 printf %s "checking for a race-free mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if test ${ac_cv_path_mkdir+y} then : printf %s "(cached) " >&6 else $as_nop as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir ('*'coreutils) '* | \ 'BusyBox '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test ${ac_cv_path_mkdir+y}; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 printf "%s\n" "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AWK+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 printf "%s\n" "$AWK" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$AWK" && break done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval test \${ac_cv_prog_make_${ac_make}_set+y} then : printf %s "(cached) " >&6 else $as_nop cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } SET_MAKE= else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; } cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } case $?:`cat confinc.out 2>/dev/null` in #( '0:this is the am__doit target') : case $s in #( BSD) : am__include='.include' am__quote='"' ;; #( *) : am__include='include' am__quote='' ;; esac ;; #( *) : ;; esac if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 printf "%s\n" "${_am_result}" >&6; } # Check whether --enable-dependency-tracking was given. if test ${enable_dependency_tracking+y} then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi # Check whether --enable-silent-rules was given. if test ${enable_silent_rules+y} then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 printf %s "checking whether $am_make supports nested variables... " >&6; } if test ${am_cv_make_support_nested_variables+y} then : printf %s "(cached) " >&6 else $as_nop if printf "%s\n" 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='mathicgb' VERSION='1.1' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h printf "%s\n" "#define VERSION \"$VERSION\"" >>confdefs.h # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' depcc="$CC" am_compiler_list= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 printf %s "checking dependency style of $depcc... " >&6; } if test ${am_cv_CC_dependencies_compiler_type+y} then : printf %s "(cached) " >&6 else $as_nop if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi depcc="$CXX" am_compiler_list= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 printf %s "checking dependency style of $depcc... " >&6; } if test ${am_cv_CXX_dependencies_compiler_type+y} then : printf %s "(cached) " >&6 else $as_nop if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 printf "%s\n" "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi # Variables for tags utilities; see am/tags.am if test -z "$CTAGS"; then CTAGS=ctags fi if test -z "$ETAGS"; then ETAGS=etags fi if test -z "$CSCOPE"; then CSCOPE=cscope fi # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi # if --enable-silent-rules is passed to ./configure or if V=0 is passed # to make, then the compilation output will be much less verbose making # it possible to spot warnings and errors as they go by. # Check whether --enable-silent-rules was given. if test ${enable_silent_rules+y} then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 printf %s "checking whether $am_make supports nested variables... " >&6; } if test ${am_cv_make_support_nested_variables+y} then : printf %s "(cached) " >&6 else $as_nop if printf "%s\n" 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' # Set up the $(LN_S) macro, which creates symbolic links { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 printf %s "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 printf "%s\n" "no, using $LN_S" >&6; } fi # set output variable INSTALL to the name of a BSD-compatible install program. # Requires install-sh to be present as a fallback, even on systems where # the fallback is not used. # Set up LibTool case `pwd` in *\ * | *\ *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 printf "%s\n" "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.7' macro_revision='2.4.7' ltmain=$ac_aux_dir/ltmain.sh # Make sure we can run config.sub. $SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 printf %s "checking build system type... " >&6; } if test ${ac_cv_build+y} then : printf %s "(cached) " >&6 else $as_nop ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` || as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 printf "%s\n" "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 printf %s "checking host system type... " >&6; } if test ${ac_cv_host+y} then : printf %s "(cached) " >&6 else $as_nop if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` || as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5 fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 printf "%s\n" "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 printf %s "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case $ECHO in printf*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: printf" >&5 printf "%s\n" "printf" >&6; } ;; print*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 printf "%s\n" "print -r" >&6; } ;; *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cat" >&5 printf "%s\n" "cat" >&6; } ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 printf %s "checking for a sed that does not truncate output... " >&6; } if test ${ac_cv_path_SED+y} then : printf %s "(cached) " >&6 else $as_nop ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in sed gsed do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 printf "%s\n" "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 printf %s "checking for grep that handles long lines and -e... " >&6; } if test ${ac_cv_path_GREP+y} then : printf %s "(cached) " >&6 else $as_nop if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in grep ggrep do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 printf "%s\n" "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 printf %s "checking for egrep... " >&6; } if test ${ac_cv_path_EGREP+y} then : printf %s "(cached) " >&6 else $as_nop if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in egrep do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 printf "%s\n" "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 printf %s "checking for fgrep... " >&6; } if test ${ac_cv_path_FGREP+y} then : printf %s "(cached) " >&6 else $as_nop if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in fgrep do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 printf "%s\n" "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test ${with_gnu_ld+y} then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes else $as_nop with_gnu_ld=no fi ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 printf %s "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test yes = "$with_gnu_ld"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 printf %s "checking for GNU ld... " >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 printf %s "checking for non-GNU ld... " >&6; } fi if test ${lt_cv_path_LD+y} then : printf %s "(cached) " >&6 else $as_nop if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 printf "%s\n" "$LD" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 printf %s "checking if the linker ($LD) is GNU ld... " >&6; } if test ${lt_cv_prog_gnu_ld+y} then : printf %s "(cached) " >&6 else $as_nop # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if test ${lt_cv_path_NM+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM else lt_nm_to_check=${ac_tool_prefix}nm if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. tmp_nm=$ac_dir/$lt_tmp_nm if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then # Check to see if the nm accepts a BSD-compat flag. # Adding the 'sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in mingw*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | $SED '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | $SED '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 printf "%s\n" "$lt_cv_path_NM" >&6; } if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DUMPBIN+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 printf "%s\n" "$DUMPBIN" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DUMPBIN+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 printf "%s\n" "$ac_ct_DUMPBIN" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols -headers /dev/null 2>&1 | $SED '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: ;; esac fi if test : != "$DUMPBIN"; then NM=$DUMPBIN fi fi test -z "$NM" && NM=nm { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 printf %s "checking the name lister ($NM) interface... " >&6; } if test ${lt_cv_nm_interface+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 printf "%s\n" "$lt_cv_nm_interface" >&6; } # find the maximum length of command line arguments { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 printf %s "checking the maximum length of command line arguments... " >&6; } if test ${lt_cv_sys_max_cmd_len+y} then : printf %s "(cached) " >&6 else $as_nop i=0 teststring=ABCD case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; bitrig* | darwin* | dragonfly* | freebsd* | midnightbsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | $SED 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test X`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n "$lt_cv_sys_max_cmd_len"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 printf "%s\n" "$lt_cv_sys_max_cmd_len" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 printf "%s\n" "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 printf %s "checking how to convert $build file names to $host format... " >&6; } if test ${lt_cv_to_host_file_cmd+y} then : printf %s "(cached) " >&6 else $as_nop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 printf "%s\n" "$lt_cv_to_host_file_cmd" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 printf %s "checking how to convert $build file names to toolchain format... " >&6; } if test ${lt_cv_to_tool_file_cmd+y} then : printf %s "(cached) " >&6 else $as_nop #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 printf "%s\n" "$lt_cv_to_tool_file_cmd" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 printf %s "checking for $LD option to reload object files... " >&6; } if test ${lt_cv_ld_reload_flag+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_ld_reload_flag='-r' fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 printf "%s\n" "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test yes != "$GCC"; then reload_cmds=false fi ;; darwin*) if test yes = "$GCC"; then reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}file", so it can be a program name with args. set dummy ${ac_tool_prefix}file; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_FILECMD+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$FILECMD"; then ac_cv_prog_FILECMD="$FILECMD" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_FILECMD="${ac_tool_prefix}file" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi FILECMD=$ac_cv_prog_FILECMD if test -n "$FILECMD"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $FILECMD" >&5 printf "%s\n" "$FILECMD" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_FILECMD"; then ac_ct_FILECMD=$FILECMD # Extract the first word of "file", so it can be a program name with args. set dummy file; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_FILECMD+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_FILECMD"; then ac_cv_prog_ac_ct_FILECMD="$ac_ct_FILECMD" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_FILECMD="file" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_FILECMD=$ac_cv_prog_ac_ct_FILECMD if test -n "$ac_ct_FILECMD"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_FILECMD" >&5 printf "%s\n" "$ac_ct_FILECMD" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_FILECMD" = x; then FILECMD=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac FILECMD=$ac_ct_FILECMD fi else FILECMD="$ac_cv_prog_FILECMD" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_OBJDUMP+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 printf "%s\n" "$OBJDUMP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_OBJDUMP+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 printf "%s\n" "$ac_ct_OBJDUMP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 printf %s "checking how to recognize dependent libraries... " >&6; } if test ${lt_cv_deplibs_check_method+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # that responds to the $file_magic_cmd with a given extended regex. # If you have 'file' or equivalent on your system and you're not sure # whether 'pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='$FILECMD -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly* | midnightbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=$FILECMD lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=$FILECMD case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=$FILECMD lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd* | bitrig*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; os2*) lt_cv_deplibs_check_method=pass_all ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 printf "%s\n" "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DLLTOOL+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 printf "%s\n" "$DLLTOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DLLTOOL+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 printf "%s\n" "$ac_ct_DLLTOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 printf %s "checking how to associate runtime and link libraries... " >&6; } if test ${lt_cv_sharedlib_from_linklib_cmd+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh; # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 printf "%s\n" "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AR+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 printf "%s\n" "$AR" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_AR+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 printf "%s\n" "$ac_ct_AR" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} # Use ARFLAGS variable as AR's operation code to sync the variable naming with # Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have # higher priority because thats what people were doing historically (setting # ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS # variable obsoleted/removed. test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr} lt_ar_flags=$AR_FLAGS # Make AR_FLAGS overridable by 'make ARFLAGS='. Don't try to run-time override # by AR_FLAGS because that was never working and AR_FLAGS is about to die. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 printf %s "checking for archiver @FILE support... " >&6; } if test ${lt_cv_ar_at_file+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 printf "%s\n" "$lt_cv_ar_at_file" >&6; } if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_STRIP+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 printf "%s\n" "$STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_STRIP+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 printf "%s\n" "$ac_ct_STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_RANLIB+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 printf "%s\n" "$RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_RANLIB+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 printf "%s\n" "$ac_ct_RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in bitrig* | openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 printf %s "checking command to parse $NM output from $compiler object... " >&6; } if test ${lt_cv_sys_global_symbol_pipe+y} then : printf %s "(cached) " >&6 else $as_nop # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test ia64 = "$host_cpu"; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. lt_cv_sys_global_symbol_to_import="$SED -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" lt_c_name_lib_hook="\ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" else # Disable hooks by default. lt_cv_sys_global_symbol_to_import= lt_cdecl_hook= lt_c_name_hook= lt_c_name_lib_hook= fi # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="$SED -n"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="$SED -n"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="$SED -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function, # D for any global variable and I for any imported variable. # Also find C++ and __fastcall symbols from MSVC++ or ICC, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ " /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ " /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ " {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ " s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="$SED -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | $SED '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&5 if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&5 && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS=conftstm.$ac_objext CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest$ac_exeext; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: failed" >&5 printf "%s\n" "failed" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ok" >&5 printf "%s\n" "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 printf %s "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test ${with_sysroot+y} then : withval=$with_sysroot; else $as_nop with_sysroot=no fi lt_sysroot= case $with_sysroot in #( yes) if test yes = "$GCC"; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | $SED -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 printf "%s\n" "$with_sysroot" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 printf "%s\n" "${lt_sysroot:-no}" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 printf %s "checking for a working dd... " >&6; } if test ${ac_cv_path_lt_DD+y} then : printf %s "(cached) " >&6 else $as_nop printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} if test -z "$lt_DD"; then ac_path_lt_DD_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in dd do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_lt_DD="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_lt_DD" || continue if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi $ac_path_lt_DD_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_lt_DD"; then : fi else ac_cv_path_lt_DD=$lt_DD fi rm -f conftest.i conftest2.i conftest.out fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 printf "%s\n" "$ac_cv_path_lt_DD" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 printf %s "checking how to truncate binary pipes... " >&6; } if test ${lt_cv_truncate_bin+y} then : printf %s "(cached) " >&6 else $as_nop printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 printf "%s\n" "$lt_cv_truncate_bin" >&6; } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # Check whether --enable-libtool-lock was given. if test ${enable_libtool_lock+y} then : enableval=$enable_libtool_lock; fi test no = "$enable_libtool_lock" || enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out what ABI is being produced by ac_compile, and set mode # options accordingly. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `$FILECMD conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE=32 ;; *ELF-64*) HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test yes = "$lt_cv_prog_gnu_ld"; then case `$FILECMD conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `$FILECMD conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; mips64*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then emul=elf case `$FILECMD conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; *64-bit*) emul="${emul}64" ;; esac case `$FILECMD conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; *LSB*) emul="${emul}ltsmip" ;; esac case `$FILECMD conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; esac LD="${LD-ld} -m $emul" fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when # doing 32-bit compilation for a host where ld defaults to 64-bit, or # vice versa); the common cases where no linker options are needed do # not appear in the list. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `$FILECMD conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `$FILECMD conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 printf %s "checking whether the C compiler needs -belf... " >&6; } if test ${lt_cv_cc_needs_belf+y} then : printf %s "(cached) " >&6 else $as_nop ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_cv_cc_needs_belf=yes else $as_nop lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 printf "%s\n" "$lt_cv_cc_needs_belf" >&6; } if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `$FILECMD conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD=${LD-ld}_sol2 fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks=$enable_libtool_lock if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_MANIFEST_TOOL+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 printf "%s\n" "$MANIFEST_TOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_MANIFEST_TOOL+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 printf "%s\n" "$ac_ct_MANIFEST_TOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if test ${lt_cv_path_mainfest_tool+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 printf "%s\n" "$lt_cv_path_mainfest_tool" >&6; } if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DSYMUTIL+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 printf "%s\n" "$DSYMUTIL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DSYMUTIL+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 printf "%s\n" "$ac_ct_DSYMUTIL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_NMEDIT+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 printf "%s\n" "$NMEDIT" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_NMEDIT+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 printf "%s\n" "$ac_ct_NMEDIT" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_LIPO+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 printf "%s\n" "$LIPO" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_LIPO+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 printf "%s\n" "$ac_ct_LIPO" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_OTOOL+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 printf "%s\n" "$OTOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_OTOOL+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 printf "%s\n" "$ac_ct_OTOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_OTOOL64+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 printf "%s\n" "$OTOOL64" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_OTOOL64+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 printf "%s\n" "$ac_ct_OTOOL64" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 printf %s "checking for -single_module linker flag... " >&6; } if test ${lt_cv_apple_cc_single_mod+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 printf %s "checking for -exported_symbols_list linker flag... " >&6; } if test ${lt_cv_ld_exported_symbols_list+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_cv_ld_exported_symbols_list=yes else $as_nop lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 printf %s "checking for -force_load linker flag... " >&6; } if test ${lt_cv_ld_force_load+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR $AR_FLAGS libconftest.a conftest.o" >&5 $AR $AR_FLAGS libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 printf "%s\n" "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; darwin*) case $MACOSX_DEPLOYMENT_TARGET,$host in 10.[012],*|,*powerpc*-darwin[5-8]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; *) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi if test yes = "$lt_cv_ld_exported_symbols_list"; then _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes then : printf "%s\n" "#define HAVE_DLFCN_H 1" >>confdefs.h fi func_stripname_cnf () { case $2 in .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;; *) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;; esac } # func_stripname_cnf # Set options # Check whether --enable-shared was given. if test ${enable_shared+y} then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS=$lt_save_ifs ;; esac else $as_nop enable_shared=no fi enable_dlopen=no enable_win32_dll=no # Check whether --enable-static was given. if test ${enable_static+y} then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS=$lt_save_ifs ;; esac else $as_nop enable_static=yes fi # Check whether --with-pic was given. if test ${with_pic+y} then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $withval; do IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS=$lt_save_ifs ;; esac else $as_nop pic_mode=default fi # Check whether --enable-fast-install was given. if test ${enable_fast_install+y} then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS=$lt_save_ifs ;; esac else $as_nop enable_fast_install=yes fi shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[5-9]*,yes) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 printf %s "checking which variant of shared library versioning to provide... " >&6; } # Check whether --with-aix-soname was given. if test ${with_aix_soname+y} then : withval=$with_aix_soname; case $withval in aix|svr4|both) ;; *) as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 ;; esac lt_cv_with_aix_soname=$with_aix_soname else $as_nop if test ${lt_cv_with_aix_soname+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_with_aix_soname=aix fi with_aix_soname=$lt_cv_with_aix_soname fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 printf "%s\n" "$with_aix_soname" >&6; } if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, # the AIX toolchain works better with OBJECT_MODE set (default 32). if test 64 = "${OBJECT_MODE-32}"; then shared_archive_member_spec=shr_64 else shared_archive_member_spec=shr fi fi ;; *) with_aix_soname=aix ;; esac # This can be used to rebuild libtool when needed LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 printf %s "checking for objdir... " >&6; } if test ${lt_cv_objdir+y} then : printf %s "(cached) " >&6 else $as_nop rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 printf "%s\n" "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir printf "%s\n" "#define LT_OBJDIR \"$lt_cv_objdir/\"" >>confdefs.h case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a '.a' archive for static linking (except MSVC and # ICC, which need '.lib'). libext=a with_gnu_ld=$lt_cv_prog_gnu_ld old_CC=$CC old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o func_cc_basename $compiler cc_basename=$func_cc_basename_result # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 printf %s "checking for ${ac_tool_prefix}file... " >&6; } if test ${lt_cv_path_MAGIC_CMD+y} then : printf %s "(cached) " >&6 else $as_nop case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/${ac_tool_prefix}file"; then lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 printf "%s\n" "$MAGIC_CMD" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for file" >&5 printf %s "checking for file... " >&6; } if test ${lt_cv_path_MAGIC_CMD+y} then : printf %s "(cached) " >&6 else $as_nop case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/file"; then lt_cv_path_MAGIC_CMD=$ac_dir/"file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 printf "%s\n" "$MAGIC_CMD" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC=$CC ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test yes = "$GCC"; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if test ${lt_cv_prog_compiler_rtti_exceptions+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test yes = "$GCC"; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi lt_prog_compiler_pic='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; esac ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64, which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # flang / f18. f95 an alias for gfortran or flang on Debian flang* | f18* | f95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | $SED 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 printf %s "checking for $compiler option to produce PIC... " >&6; } if test ${lt_cv_prog_compiler_pic+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if test ${lt_cv_prog_compiler_pic_works+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works"; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if test ${lt_cv_prog_compiler_static_works+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler_static_works=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; } if test yes = "$lt_cv_prog_compiler_static_works"; then : else lt_prog_compiler_static= fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test ${lt_cv_prog_compiler_c_o+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test ${lt_cv_prog_compiler_c_o+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } hard_links=nottested if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 printf %s "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 printf "%s\n" "$hard_links" >&6; } if test no = "$hard_links"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ' (' and ')$', so one must not match beginning or # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', # as well as any symbol that contains 'd'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++ or Intel C++ Compiler. if test yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC) with_gnu_ld=yes ;; openbsd* | bitrig*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' export_dynamic_flag_spec='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test ia64 != "$host_cpu"; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='$wl--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' link_all_deplibs=yes ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=yes file_list_spec='@' ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='$wl-rpath,$libdir' export_dynamic_flag_spec='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | $SED 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in tcc*) hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' export_dynamic_flag_spec='-rdynamic' ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test no = "$ld_shlibs"; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. hardcode_direct=no hardcode_direct_absolute=no ;; esac if test yes = "$GCC"; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi export_dynamic_flag_spec='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if test ${lt_cv_aix_libpath_+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if test ${lt_cv_aix_libpath_+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' $wl-bernotok' allow_undefined_flag=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++ or Intel C++ Compiler. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl* | icl*) # Native MSVC or ICC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC and ICC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test yes = "$lt_cv_ld_force_load"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" archive_expsym_cmds="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" module_expsym_cmds="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly* | midnightbsd*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test yes = "$GCC"; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='$wl-E' ;; hpux10*) if test yes,no = "$GCC,$with_gnu_ld"; then archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 printf %s "checking if $CC understands -b... " >&6; } if test ${lt_cv_prog_compiler__b+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler__b=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 printf "%s\n" "$lt_cv_prog_compiler__b" >&6; } if test yes = "$lt_cv_prog_compiler__b"; then archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test yes = "$GCC"; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 printf %s "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if test ${lt_cv_irix_exported_symbol+y} then : printf %s "(cached) " >&6 else $as_nop save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_cv_irix_exported_symbol=yes else $as_nop lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; } if test yes = "$lt_cv_irix_exported_symbol"; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi link_all_deplibs=no else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler ld_shlibs=yes archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' ;; esac ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='$wl-rpath,$libdir' export_dynamic_flag_spec='$wl-E' else archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='$wl-rpath,$libdir' fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=yes file_list_spec='@' ;; osf3*) if test yes = "$GCC"; then allow_undefined_flag=' $wl-expect_unresolved $wl\*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test yes = "$GCC"; then allow_undefined_flag=' $wl-expect_unresolved $wl\*' archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test yes = "$GCC"; then wlarc='$wl' archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='$wl' archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test yes = "$GCC"; then whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test sequent = "$host_vendor"; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='$wl-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='$wl-z,text' allow_undefined_flag='$wl-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='$wl-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='$wl-Bexport' runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='$wl-Blargedynsym' ;; esac fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 printf "%s\n" "$ld_shlibs" >&6; } test no = "$ld_shlibs" && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test yes,yes = "$GCC,$enable_shared"; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 printf %s "checking whether -lc should be explicitly linked in... " >&6; } if test ${lt_cv_archive_cmds_need_lc+y} then : printf %s "(cached) " >&6 else $as_nop $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 printf %s "checking dynamic linker characteristics... " >&6; } if test yes = "$GCC"; then case $host_os in darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary... lt_tmp_lt_search_path_spec= lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` # ...but if some path component already ends with the multilib dir we assume # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= ;; esac for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" elif test -n "$lt_multi_os_dir"; then test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS = " "; FS = "/|\n";} { lt_foo = ""; lt_count = 0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's|/\([A-Za-z]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a(lib.so.V)' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl* | *,icl*) # Native MSVC or ICC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC and ICC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly* | midnightbsd*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. hardcode_libdir_flag_spec='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if test ${lt_cv_shlibpath_overrides_runpath+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 printf "%s\n" "$dynamic_linker" >&6; } test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 printf %s "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test yes = "$hardcode_automatic"; then # We can hardcode non-existent directories. if test no != "$hardcode_direct" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && test no != "$hardcode_minus_L"; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 printf "%s\n" "$hardcode_action" >&6; } if test relink = "$hardcode_action" || test yes = "$inherit_rpath"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi if test yes != "$enable_dlopen"; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen=load_add_on lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen=dlopen lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 printf %s "checking for dlopen in -ldl... " >&6; } if test ${ac_cv_lib_dl_dlopen+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char dlopen (); int main (void) { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dl_dlopen=yes else $as_nop ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl else $as_nop lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; tpf*) # Don't try to run any link tests for TPF. We know it's impossible # because TPF is a cross-compiler, and we know how we open DSOs. lt_cv_dlopen=dlopen lt_cv_dlopen_libs= lt_cv_dlopen_self=no ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes then : lt_cv_dlopen=shl_load else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 printf %s "checking for shl_load in -ldld... " >&6; } if test ${ac_cv_lib_dld_shl_load+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char shl_load (); int main (void) { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dld_shl_load=yes else $as_nop ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 printf "%s\n" "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes then : lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld else $as_nop ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes then : lt_cv_dlopen=dlopen else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 printf %s "checking for dlopen in -ldl... " >&6; } if test ${ac_cv_lib_dl_dlopen+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char dlopen (); int main (void) { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dl_dlopen=yes else $as_nop ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 printf %s "checking for dlopen in -lsvld... " >&6; } if test ${ac_cv_lib_svld_dlopen+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char dlopen (); int main (void) { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_svld_dlopen=yes else $as_nop ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 printf "%s\n" "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 printf %s "checking for dld_link in -ldld... " >&6; } if test ${ac_cv_lib_dld_dld_link+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ char dld_link (); int main (void) { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dld_dld_link=yes else $as_nop ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 printf "%s\n" "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes then : lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld fi fi fi fi fi fi ;; esac if test no = "$lt_cv_dlopen"; then enable_dlopen=no else enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS=$CPPFLAGS test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS=$LDFLAGS wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 printf %s "checking whether a program can dlopen itself... " >&6; } if test ${lt_cv_dlopen_self+y} then : printf %s "(cached) " >&6 else $as_nop if test yes = "$cross_compiling"; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 printf "%s\n" "$lt_cv_dlopen_self" >&6; } if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 printf %s "checking whether a statically linked program can dlopen itself... " >&6; } if test ${lt_cv_dlopen_self_static+y} then : printf %s "(cached) " >&6 else $as_nop if test yes = "$cross_compiling"; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 printf "%s\n" "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS=$save_CPPFLAGS LDFLAGS=$save_LDFLAGS LIBS=$save_LIBS ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 printf %s "checking whether stripping libraries is possible... " >&6; } if test -z "$STRIP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } else if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then old_striplib="$STRIP --strip-debug" striplib="$STRIP --strip-unneeded" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else case $host_os in darwin*) # FIXME - insert some real tests, host_os isn't really good enough striplib="$STRIP -x" old_striplib="$STRIP -S" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } ;; freebsd*) if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then old_striplib="$STRIP --strip-debug" striplib="$STRIP --strip-unneeded" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi ;; *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } ;; esac fi fi # Report what library types will actually be built { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 printf %s "checking if libtool supports shared libraries... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 printf "%s\n" "$can_build_shared" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 printf %s "checking whether to build shared libraries... " >&6; } test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 printf "%s\n" "$enable_shared" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 printf %s "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 printf "%s\n" "$enable_static" >&6; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu CC=$lt_save_CC if test -n "$CXX" && ( test no != "$CXX" && ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || (test g++ != "$CXX"))); then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 printf %s "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if test ${ac_cv_prog_CXXCPP+y} then : printf %s "(cached) " >&6 else $as_nop # Double quotes because $CXX needs to be expanded for CXXCPP in "$CXX -E" cpp /lib/cpp do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO" then : else $as_nop # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO" then : # Broken: success on invalid input. continue else $as_nop # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 printf "%s\n" "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO" then : else $as_nop # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO" then : # Broken: success on invalid input. continue else $as_nop # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : else $as_nop { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu else _lt_caught_CXX_error=yes fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds reload_flag_CXX=$reload_flag reload_cmds_CXX=$reload_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_caught_CXX_error"; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC compiler_CXX=$CC func_cc_basename $compiler cc_basename=$func_cc_basename_result if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test yes = "$GXX"; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test yes = "$GXX"; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test ${with_gnu_ld+y} then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes else $as_nop with_gnu_ld=no fi ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 printf %s "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test yes = "$with_gnu_ld"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 printf %s "checking for GNU ld... " >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 printf %s "checking for non-GNU ld... " >&6; } fi if test ${lt_cv_path_LD+y} then : printf %s "(cached) " >&6 else $as_nop if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 printf "%s\n" "$LD" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 printf %s "checking if the linker ($LD) is GNU ld... " >&6; } if test ${lt_cv_prog_gnu_ld+y} then : printf %s "(cached) " >&6 else $as_nop # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test yes = "$with_gnu_ld"; then archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='$wl' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no ;; esac if test yes = "$GXX"; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag=$shared_flag' $wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi export_dynamic_flag_spec_CXX='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. # The "-G" linker flag allows undefined symbols. no_undefined_flag_CXX='-bernotok' # Determine the default libpath from the value encoded in an empty # executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if test ${lt_cv_aix_libpath__CXX+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO" then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if test ${lt_cv_aix_libpath__CXX+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO" then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' $wl-bernotok' allow_undefined_flag_CXX=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' fi archive_cmds_need_lc_CXX=yes archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl* | ,icl* | no,icl*) # Native MSVC or ICC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_CXX=' ' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=yes file_list_spec_CXX='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' enable_shared_with_static_runtimes_CXX=yes # Don't use ranlib old_postinstall_cmds_CXX='chmod 644 $oldlib' postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ func_to_tool_file "$lt_outputfile"~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' export_dynamic_flag_spec_CXX='$wl--export-all-symbols' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported if test yes = "$lt_cv_ld_force_load"; then whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec_CXX='' fi link_all_deplibs_CXX=yes allow_undefined_flag_CXX=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" archive_expsym_cmds_CXX="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" module_expsym_cmds_CXX="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" if test yes != "$lt_cv_apple_cc_single_mod"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" archive_expsym_cmds_CXX="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" fi else ld_shlibs_CXX=no fi ;; os2*) hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_minus_L_CXX=yes allow_undefined_flag_CXX=unsupported shrext_cmds=.dll archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes_CXX=yes file_list_spec_CXX='@' ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly* | midnightbsd*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; haiku*) archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' link_all_deplibs_CXX=yes ;; hpux9*) hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='$wl-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='$wl-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' export_dynamic_flag_spec_CXX='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5].* | *pgcpp\ [1-5].*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | $SED 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='$wl-E' whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes,no = "$GXX,$with_gnu_ld"; then allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' case $host in osf3*) archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test yes,no = "$GXX,$with_gnu_ld"; then no_undefined_flag_CXX=' $wl-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' else # g++ 2.7 appears to require '-G' NOT '-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' fi hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='$wl-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='$wl-z,text' allow_undefined_flag_CXX='$wl-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='$wl-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='$wl-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ '"$old_archive_cmds_CXX" reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ '"$reload_cmds_CXX" ;; *) archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 printf "%s\n" "$ld_shlibs_CXX" >&6; } test no = "$ld_shlibs_CXX" && can_build_shared=no GCC_CXX=$GXX LD_CXX=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case $prev$p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test x-L = "$p" || test x-R = "$p"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test no = "$pre_test_object_deps_done"; then case $prev in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX=$prev$p else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX=$prev$p else postdeps_CXX="${postdeps_CXX} $prev$p" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test no = "$pre_test_object_deps_done"; then if test -z "$predep_objects_CXX"; then predep_objects_CXX=$p else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX=$p else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= # C++ specific cases for pic, static, wl, etc. if test yes = "$GXX"; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi lt_prog_compiler_pic_CXX='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static_CXX='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly* | midnightbsd*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='$wl-a ${wl}archive' if test ia64 != "$host_cpu"; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='$wl-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64, which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) # IBM XL 8.0, 9.0 on PPC and BlueGene lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | $SED 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 printf %s "checking for $compiler option to produce PIC... " >&6; } if test ${lt_cv_prog_compiler_pic_CXX+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic_CXX" >&6; } lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if test ${lt_cv_prog_compiler_pic_works_CXX+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if test ${lt_cv_prog_compiler_static_works_CXX+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 printf "%s\n" "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then : else lt_prog_compiler_static_CXX= fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test ${lt_cv_prog_compiler_c_o_CXX+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test ${lt_cv_prog_compiler_c_o_CXX+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links=nottested if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 printf %s "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 printf "%s\n" "$hard_links" >&6; } if test no = "$hard_links"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX=$ltdll_cmds ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl* | icl*) exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' ;; esac ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs_CXX=no ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 printf "%s\n" "$ld_shlibs_CXX" >&6; } test no = "$ld_shlibs_CXX" && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test yes,yes = "$GCC,$enable_shared"; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 printf %s "checking whether -lc should be explicitly linked in... " >&6; } if test ${lt_cv_archive_cmds_need_lc_CXX+y} then : printf %s "(cached) " >&6 else $as_nop $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_CXX=no else lt_cv_archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 printf "%s\n" "$lt_cv_archive_cmds_need_lc_CXX" >&6; } archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX ;; esac fi ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 printf %s "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a(lib.so.V)' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl* | *,icl*) # Native MSVC or ICC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC and ICC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly* | midnightbsd*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. hardcode_libdir_flag_spec_CXX='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if test ${lt_cv_shlibpath_overrides_runpath+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO" then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 printf "%s\n" "$dynamic_linker" >&6; } test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 printf %s "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test yes = "$hardcode_automatic_CXX"; then # We can hardcode non-existent directories. if test no != "$hardcode_direct_CXX" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" && test no != "$hardcode_minus_L_CXX"; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 printf "%s\n" "$hardcode_action_CXX" >&6; } if test relink = "$hardcode_action_CXX" || test yes = "$inherit_rpath_CXX"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test yes != "$_lt_caught_CXX_error" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_config_commands="$ac_config_commands libtool" # Only expand once: MATHICGB_SO_VERSION=0:1:0 ac_config_files="$ac_config_files Makefile build/autotools/mathicgb.pc:build/autotools/mathicgb.pc.in" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 printf "%s\n" "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -z "${with_gtest_TRUE}" && test -z "${with_gtest_FALSE}"; then as_fn_error $? "conditional \"with_gtest\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CLI_TRUE}" && test -z "${CLI_FALSE}"; then as_fn_error $? "conditional \"CLI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 printf %s "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5 printf "%s\n" "done" >&6; } if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh as_nop=: if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else $as_nop as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by mathicgb $as_me 1.1, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Configuration commands: $config_commands Report bugs to the package provider." _ACEOF ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ mathicgb config.status 1.1 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" Copyright (C) 2021 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX printf "%s\n" "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' FILECMD='`$ECHO "$FILECMD" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' lt_ar_flags='`$ECHO "$lt_ar_flags" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ FILECMD \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ DLLTOOL \ sharedlib_from_linklib_cmd \ AR \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_import \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ lt_cv_nm_interface \ nm_file_list_spec \ lt_cv_truncate_bin \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ reload_flag_CXX \ compiler_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_static_CXX \ lt_cv_prog_compiler_c_o_CXX \ export_dynamic_flag_spec_CXX \ whole_archive_flag_spec_CXX \ compiler_needs_object_CXX \ with_gnu_ld_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_separator_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX \ file_list_spec_CXX \ compiler_lib_search_dirs_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ configure_time_dlsearch_path \ configure_time_lt_sys_library_path \ reload_cmds_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ export_symbols_cmds_CXX \ prelink_cmds_CXX \ postlink_cmds_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "build/autotools/mathicgb.pc") CONFIG_FILES="$CONFIG_FILES build/autotools/mathicgb.pc:build/autotools/mathicgb.pc.in" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`printf "%s\n" "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 printf "%s\n" "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. case $CONFIG_FILES in #( *\'*) : eval set x "$CONFIG_FILES" ;; #( *) : set x $CONFIG_FILES ;; #( *) : ;; esac shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`$as_dirname -- "$am_mf" || $as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$am_mf" : 'X\(//\)[^/]' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$am_mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` am_filepart=`$as_basename -- "$am_mf" || $as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$am_mf" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` { echo "$as_me:$LINENO: cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles" >&5 (cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } || am_rc=$? done if test $am_rc -ne 0; then { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Something went wrong bootstrapping makefile fragments for automatic dependency tracking. If GNU make was not used, consider re-running the configure script with MAKE=\"gmake\" (or whatever is necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking). See \`config.log' for more details" "$LINENO" 5; } fi { am_dirpart=; unset am_dirpart;} { am_filepart=; unset am_filepart;} { am_mf=; unset am_mf;} { am_rc=; unset am_rc;} rm -f conftest-deps.mk } ;; "libtool":C) # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 # Copyright (C) 2014 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool 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 2 of of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program or library that is built # using GNU Libtool, you may include this file under the same # distribution terms that you use for the rest of that program. # # GNU Libtool 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 this program. If not, see . # The names of the tagged configurations supported by this script. available_tags='CXX ' # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shared archive member basename,for filename based shared library versioning on AIX. shared_archive_member_spec=$shared_archive_member_spec # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # A file(cmd) program that detects file types. FILECMD=$lt_FILECMD # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # DLL creation program. DLLTOOL=$lt_DLLTOOL # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive (by configure). lt_ar_flags=$lt_ar_flags # Flags to create an archive. AR_FLAGS=\${ARFLAGS-"\$lt_ar_flags"} # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm into a list of symbols to manually relocate. global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # The name lister interface. nm_interface=$lt_lt_cv_nm_interface # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and where our libraries should be installed. lt_sysroot=$lt_sysroot # Command to truncate a binary pipe. lt_truncate_bin=$lt_lt_cv_truncate_bin # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Detected run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path # Explicit LT_SYS_LIBRARY_PATH set during ./configure time. configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \$shlibpath_var if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # ### END FUNCTIONS SHARED WITH CONFIGURE _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain=$ac_aux_dir/ltmain.sh # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? $SED '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # How to create reloadable object files. reload_flag=$lt_reload_flag_CXX reload_cmds=$lt_reload_cmds_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \$shlibpath_var if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi mathicgb-1.1/aclocal.m40000664000175000017500000016315215117247650010474 # generated automatically by aclocal 1.16.5 -*- Autoconf -*- # Copyright (C) 1996-2021 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.71],, [m4_warning([this file was generated for autoconf 2.71. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # pkg.m4 - Macros to locate and use pkg-config. -*- Autoconf -*- # serial 12 (pkg-config-0.29.2) dnl Copyright © 2004 Scott James Remnant . dnl Copyright © 2012-2015 Dan Nicholson dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, but dnl WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU dnl General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA dnl 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a dnl configuration script generated by Autoconf, you may include it under dnl the same distribution terms that you use for the rest of that dnl program. dnl PKG_PREREQ(MIN-VERSION) dnl ----------------------- dnl Since: 0.29 dnl dnl Verify that the version of the pkg-config macros are at least dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's dnl installed version of pkg-config, this checks the developer's version dnl of pkg.m4 when generating configure. dnl dnl To ensure that this macro is defined, also add: dnl m4_ifndef([PKG_PREREQ], dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) dnl dnl See the "Since" comment for each macro you use to see what version dnl of the macros you require. m4_defun([PKG_PREREQ], [m4_define([PKG_MACROS_VERSION], [0.29.2]) m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) ])dnl PKG_PREREQ dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) dnl ---------------------------------- dnl Since: 0.16 dnl dnl Search for the pkg-config tool and set the PKG_CONFIG variable to dnl first found in the path. Checks that the version of pkg-config found dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is dnl used since that's the first version where most current features of dnl pkg-config existed. AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])dnl PKG_PROG_PKG_CONFIG dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------------------------------- dnl Since: 0.18 dnl dnl Check to see whether a particular set of modules exists. Similar to dnl PKG_CHECK_MODULES(), but does not set variables or print errors. dnl dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) dnl only at the first occurrence in configure.ac, so if the first place dnl it's called might be skipped (such as if it is within an "if", you dnl have to call PKG_CHECK_EXISTS manually AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) dnl --------------------------------------------- dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting dnl pkg_failed based on the result. m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])dnl _PKG_CONFIG dnl _PKG_SHORT_ERRORS_SUPPORTED dnl --------------------------- dnl Internal check to see if pkg-config supports short errors. AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])dnl _PKG_SHORT_ERRORS_SUPPORTED dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl -------------------------------------------------------------- dnl Since: 0.4.0 dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES might not happen, you should be sure to include an dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $2]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])dnl PKG_CHECK_MODULES dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl --------------------------------------------------------------------- dnl Since: 0.29 dnl dnl Checks for existence of MODULES and gathers its build flags with dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags dnl and VARIABLE-PREFIX_LIBS from --libs. dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to dnl include an explicit call to PKG_PROG_PKG_CONFIG in your dnl configure.ac. AC_DEFUN([PKG_CHECK_MODULES_STATIC], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl _save_PKG_CONFIG=$PKG_CONFIG PKG_CONFIG="$PKG_CONFIG --static" PKG_CHECK_MODULES($@) PKG_CONFIG=$_save_PKG_CONFIG[]dnl ])dnl PKG_CHECK_MODULES_STATIC dnl PKG_INSTALLDIR([DIRECTORY]) dnl ------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable pkgconfigdir as the location where a module dnl should install pkg-config .pc files. By default the directory is dnl $libdir/pkgconfig, but the default can be changed by passing dnl DIRECTORY. The user can override through the --with-pkgconfigdir dnl parameter. AC_DEFUN([PKG_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([pkgconfigdir], [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, [with_pkgconfigdir=]pkg_default) AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_INSTALLDIR dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) dnl -------------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable noarch_pkgconfigdir as the location where a dnl module should install arch-independent pkg-config .pc files. By dnl default the directory is $datadir/pkgconfig, but the default can be dnl changed by passing DIRECTORY. The user can override through the dnl --with-noarch-pkgconfigdir parameter. AC_DEFUN([PKG_NOARCH_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([noarch-pkgconfigdir], [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, [with_noarch_pkgconfigdir=]pkg_default) AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_NOARCH_INSTALLDIR dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------- dnl Since: 0.28 dnl dnl Retrieves the value of the pkg-config variable for the given module. AC_DEFUN([PKG_CHECK_VAR], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl _PKG_CONFIG([$1], [variable="][$3]["], [$2]) AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])dnl PKG_CHECK_VAR dnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND], dnl [DESCRIPTION], [DEFAULT]) dnl ------------------------------------------ dnl dnl Prepare a "--with-" configure option using the lowercase dnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and dnl PKG_CHECK_MODULES in a single macro. AC_DEFUN([PKG_WITH_MODULES], [ m4_pushdef([with_arg], m4_tolower([$1])) m4_pushdef([description], [m4_default([$5], [build with ]with_arg[ support])]) m4_pushdef([def_arg], [m4_default([$6], [auto])]) m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes]) m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no]) m4_case(def_arg, [yes],[m4_pushdef([with_without], [--without-]with_arg)], [m4_pushdef([with_without],[--with-]with_arg)]) AC_ARG_WITH(with_arg, AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),, [AS_TR_SH([with_]with_arg)=def_arg]) AS_CASE([$AS_TR_SH([with_]with_arg)], [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)], [auto],[PKG_CHECK_MODULES([$1],[$2], [m4_n([def_action_if_found]) $3], [m4_n([def_action_if_not_found]) $4])]) m4_popdef([with_arg]) m4_popdef([description]) m4_popdef([def_arg]) ])dnl PKG_WITH_MODULES dnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [DESCRIPTION], [DEFAULT]) dnl ----------------------------------------------- dnl dnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES dnl check._[VARIABLE-PREFIX] is exported as make variable. AC_DEFUN([PKG_HAVE_WITH_MODULES], [ PKG_WITH_MODULES([$1],[$2],,,[$3],[$4]) AM_CONDITIONAL([HAVE_][$1], [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"]) ])dnl PKG_HAVE_WITH_MODULES dnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [DESCRIPTION], [DEFAULT]) dnl ------------------------------------------------------ dnl dnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after dnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make dnl and preprocessor variable. AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES], [ PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4]) AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"], [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])]) ])dnl PKG_HAVE_DEFINE_WITH_MODULES # Copyright (C) 2002-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.16' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.16.5], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.16.5])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # Copyright (C) 2011-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_AR([ACT-IF-FAIL]) # ------------------------- # Try to determine the archiver interface, and trigger the ar-lib wrapper # if it is needed. If the detection of archiver interface fails, run # ACT-IF-FAIL (default is to abort configure with a proper error message). AC_DEFUN([AM_PROG_AR], [AC_BEFORE([$0], [LT_INIT])dnl AC_BEFORE([$0], [AC_PROG_LIBTOOL])dnl AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([ar-lib])dnl AC_CHECK_TOOLS([AR], [ar lib "link -lib"], [false]) : ${AR=ar} AC_CACHE_CHECK([the archiver ($AR) interface], [am_cv_ar_interface], [AC_LANG_PUSH([C]) am_cv_ar_interface=ar AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int some_variable = 0;]])], [am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([am_ar_try]) if test "$ac_status" -eq 0; then am_cv_ar_interface=ar else am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([am_ar_try]) if test "$ac_status" -eq 0; then am_cv_ar_interface=lib else am_cv_ar_interface=unknown fi fi rm -f conftest.lib libconftest.a ]) AC_LANG_POP([C])]) case $am_cv_ar_interface in ar) ;; lib) # Microsoft lib, so override with the ar-lib wrapper script. # FIXME: It is wrong to rewrite AR. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__AR in this case, # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something # similar. AR="$am_aux_dir/ar-lib $AR" ;; unknown) m4_default([$1], [AC_MSG_ERROR([could not determine $AR interface])]) ;; esac AC_SUBST([AR])dnl ]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. AS_CASE([$CONFIG_FILES], [*\'*], [eval set x "$CONFIG_FILES"], [*], [set x $CONFIG_FILES]) shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`AS_DIRNAME(["$am_mf"])` am_filepart=`AS_BASENAME(["$am_mf"])` AM_RUN_LOG([cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles]) || am_rc=$? done if test $am_rc -ne 0; then AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments for automatic dependency tracking. If GNU make was not used, consider re-running the configure script with MAKE="gmake" (or whatever is necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking).]) fi AS_UNSET([am_dirpart]) AS_UNSET([am_filepart]) AS_UNSET([am_mf]) AS_UNSET([am_rc]) rm -f conftest-deps.mk } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking is enabled. # This creates each '.Po' and '.Plo' makefile fragment that we'll need in # order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl m4_ifdef([_$0_ALREADY_INIT], [m4_fatal([$0 expanded multiple times ]m4_defn([_$0_ALREADY_INIT]))], [m4_define([_$0_ALREADY_INIT], m4_expansion_stack)])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifset([AC_PACKAGE_NAME], [ok]):m4_ifset([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) # Variables for tags utilities; see am/tags.am if test -z "$CTAGS"; then CTAGS=ctags fi AC_SUBST([CTAGS]) if test -z "$ETAGS"; then ETAGS=etags fi AC_SUBST([ETAGS]) if test -z "$CSCOPE"; then CSCOPE=cscope fi AC_SUBST([CSCOPE]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless 'enable' is passed literally. # For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], am_maintainer_other[ make rules and dependencies not useful (and sometimes confusing) to the casual installer])], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check whether make has an 'include' directive that can support all # the idioms we need for our automatic dependency tracking code. AC_DEFUN([AM_MAKE_INCLUDE], [AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) AS_CASE([$?:`cat confinc.out 2>/dev/null`], ['0:this is the am__doit target'], [AS_CASE([$s], [BSD], [am__include='.include' am__quote='"'], [am__include='include' am__quote=''])]) if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* AC_MSG_RESULT([${_am_result}]) AC_SUBST([am__include])]) AC_SUBST([am__quote])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then MISSING="\${SHELL} '$am_aux_dir/missing'" fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([build/autotools/m4/ax_cxx_compile_stdcxx_11.m4]) m4_include([build/autotools/m4/libtool.m4]) m4_include([build/autotools/m4/ltoptions.m4]) m4_include([build/autotools/m4/ltsugar.m4]) m4_include([build/autotools/m4/ltversion.m4]) m4_include([build/autotools/m4/lt~obsolete.m4]) mathicgb-1.1/configure.ac0000664000175000017500000001623215117247507011117 # Note: also update version in CMakeLists.txt dnl AC_INIT sets up autoconf and must be first macro. AC_INIT([mathicgb], [1.1]) # package, version, bug-report-email # set up information about directories AC_CONFIG_MACRO_DIR([build/autotools/m4]) # directory of extra autoconf macroes AC_CONFIG_AUX_DIR([build/autotools]) # directory for auxiliary build tools (install-sh etc) # check that source directory is correct dnl if autoconf is told the source code is in a directory that does not dnl contain this file then it knows that the directory is wrong. AC_CONFIG_SRCDIR([src/mathicgb.h]) # Locate the C++ compiler. AC_PROG_CXX AC_LANG([C++]) # Require C++11 support AX_CXX_COMPILE_STDCXX_11(, [mandatory]) AM_PROG_AR # Check availability and location of dependencies AC_LANG([C++]) AC_DEFUN([NO_MEMTAILOR_ERROR], AC_MSG_ERROR([memtailor is required])) AC_CHECK_HEADER([memtailor.h],, [NO_MEMTAILOR_ERROR]) AC_SEARCH_LIBS([libmemtailorIsPresent], [memtailor],, [NO_MEMTAILOR_ERROR]) AC_LANG([C++]) AC_DEFUN([NO_MATHIC_ERROR], AC_MSG_ERROR([mathic is required])) AC_CHECK_HEADER([mathic.h],, [NO_MATHIC_ERROR]) AC_SEARCH_LIBS([libmathicIsPresent], [mathic],, [NO_MATHIC_ERROR]) dnl ----- The gtest dependency AC_ARG_WITH([gtest], [AS_HELP_STRING([--with-gtest], [use gtest, which is required for running the unit tests with make check [default=yes].])],, [with_gtest=yes]) AC_DEFUN([NO_GTEST_ERROR], [AC_MSG_ERROR([gtest not found; try again using --without-gtest])]) AS_IF([test "x$with_gtest" != "xno"], [AC_LANG([C++]) AC_CHECK_HEADER([gtest/gtest.h], [AC_MSG_CHECKING([for library containing testing::InitGoogleTest]) SAVELIBS=$LIBS LIBS="$LIBS -lgtest -pthread" AC_LINK_IFELSE( [AC_LANG_PROGRAM([ #include ], [ testing::InitGoogleTest()])], [AC_MSG_RESULT([-lgtest])], [AC_MSG_RESULT([no]) NO_GTEST_ERROR]) LIBS=$SAVELIBS], [NO_GTEST_ERROR])]) AM_CONDITIONAL([with_gtest], [test "x$with_gtest" != "xno"]) dnl ----- The TBB dependency AC_ARG_WITH([tbb], AS_HELP_STRING( [--with-tbb], [use TBB, which is required for multithreading. The value detect, which is the default, enables TBB if it can be found and otherwise prints a warning and continues the build without multithreading support. TBB is not available for Cygwin (last checked March 2013).] )) AS_IF([test "x$with_tbb" == "x"], [with_tbb="detect"]) AS_IF( [test "x$with_tbb" == "xdetect"], [PKG_CHECK_MODULES([TBB], [tbb], [with_tbb="yes"], [PKG_CHECK_MODULES([TBB], [tbb32], [with_tbb="yes"], [with_tbb="no"; AC_MSG_WARN([TBB not detected. Compiling without multithreading and without precise timing.])]) ])], [test "x$with_tbb" == "xyes"], [PKG_CHECK_MODULES([TBB], [tbb],, [PKG_CHECK_MODULES([TBB], [tbb32])])], [test "x$with_tbb" == "xno"], [], [AC_MSG_ERROR([invalid value $with_tbb for with_tbb.])] ) AS_IF([test "x$with_tbb" == "xno"], [TBB_CFLAGS="-DMATHICGB_NO_TBB"]) dnl ----- The librt dependency dnl On Linux TBB calls clock_gettime, which requires librt, but librt is not dnl linked in automatically. So we need to check for that. dnl the first AC_LINK_IFELSE causes tests for lots of C++ related things, dnl and these print out messages. So to avoid those messages appearing dnl after "if librt..." and before the result for that test, we do an dnl empty AC_LINK_IFELSE. Probably there is a better way. AC_LINK_IFELSE([AC_LANG_SOURCE([[]])], [], []) dnl We check if -lrt is necessary. We need librt if we are building with TBB, dnl if linking and compiling works when linking with librt but it doesn't dnl without linking with librt. AS_IF([test "x$with_tbb" == "xyes"], [AC_MSG_CHECKING([if librt is needed to support TBB on this platform]); oldLIBS=$LIBS; LIBS="$TBB_LIBS -lrt $LIBS"; oldCFLAGS=$CFLAGS; CFLAGS="$CFLAGS $TBB_CFLAGS"; AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#]include [<]tbb/tbb.h[>]], [[tbb::tick_count::now();]] )], [LIBS=$oldLibs; AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#]include [<]tbb/tbb.h[>]], [[tbb::tick_count::now();]] )], [AC_MSG_RESULT([no])], [AC_MSG_RESULT([yes]); RT_LIBS="-lrt"] )], [AC_MSG_RESULT([no])] )]; LIBS=$oldLIBS; CFLAGS=$oldCFLAGS; ) DEPS_CFLAGS="$TBB_CFLAGS" DEPS_LIBS="$TBB_LIBS $RT_LIBS" AC_SUBST(DEPS_CFLAGS) AC_SUBST(DEPS_LIBS) AC_ARG_ENABLE([cli], AS_HELP_STRING([--disable-cli], [disable building the command line interface]), [case "${enableval}" in yes) cli=true ;; no) cli=false ;; *) AC_MSG_ERROR([bad value "${enableval}" for --enable-cli]) ;; esac], [cli=true]) AM_CONDITIONAL([CLI], [test x$cli = xtrue]) # Enable optional maintainer mode (off by default) dnl AM_MAINTAINER_MODE turns off automatic reconstruction of the build dnl files if the source build files have changed. A developer will want dnl those automatic reconstructions to happen so that changes to the dnl build system are actually carried out. However, a user might not dnl have the tools required to reconfigure and the need for dnl reconstruction might be spurious if the last-modified date is set dnl incorrectly on the build files. dnl dnl Passing the option [enable] to AM_MAINTAINER_MODE makes the dnl non-reconstruction feature available, but only when turned on by dnl passing the option –disable-maintainer-mode. This option is dnl apparently useful to some package distributors. AM_MAINTAINER_MODE([enable]) # Set up Automake dnl foreign: do not create the GNU-specific file COPYING and do not complain dnl that GNU-specific files like NEWS, README, AUTHORS and ChangeLog are dnl missing. dnl -Wall: set Automake to emit all warnings it can. Is NOT RELATED to setting dnl warnings for other tools. For example, it wil not make the compiler dnl get a -Wall option. dnl subdir-objects: Put object files in a directory structure based on dnl the directory structure of the source files. This way, two source dnl files with the same name in different directories do not conflict. AM_INIT_AUTOMAKE([foreign subdir-objects -Wall]) # if --enable-silent-rules is passed to ./configure or if V=0 is passed # to make, then the compilation output will be much less verbose making # it possible to spot warnings and errors as they go by. AM_SILENT_RULES() # Set up the $(LN_S) macro, which creates symbolic links AC_PROG_LN_S # set output variable INSTALL to the name of a BSD-compatible install program. # Requires install-sh to be present as a fallback, even on systems where # the fallback is not used. AC_PROG_INSTALL # Set up LibTool LT_INIT([disable-shared]) dnl Set the version for the library -- this concerns compatibility of the dnl source and binary interface of the library and is not the same as the dnl version of the project. AC_SUBST([MATHICGB_SO_VERSION], [0:1:0]) dnl Set up AC_OUTPUT to create each file by copying an input file dnl while substituting the output variable values. AC_CONFIG_FILES([Makefile build/autotools/mathicgb.pc:build/autotools/mathicgb.pc.in]) dnl Macro that is required to be at the end of any Autoconf script. dnl Creates config.status and launches it. AC_OUTPUT mathicgb-1.1/Makefile.am0000664000175000017500000001304315117247507010662 # options passed to aclocal, which is a tool for making macroes visible to # autoconf. We use -I to tell aclocal where we put the local macros. ACLOCAL_AMFLAGS = -I build/autotools/m4 # Options passed to the C and C++ PreProcessor (CPP) and compiler AM_CPPFLAGS = -I${top_srcdir}/ -I$(top_srcdir)/src/ $(DEPS_CFLAGS) # tell Libtool what the name of the library is. lib_LTLIBRARIES = libmathicgb.la # libraries that are needed by this library libmathicgb_la_LIBADD= $(DEPS_LIBS) # the sources that are built to make libmathicgb. Listing the headers in # sources ensure that those files are included in distributions. libmathicgb_la_SOURCES = src/mathicgb/MonoArena.hpp \ src/mathicgb/Range.hpp src/mathicgb/ReducerPack.hpp \ src/mathicgb/ReducerPack.cpp src/mathicgb/ClassicGBAlg.cpp \ src/mathicgb/ClassicGBAlg.hpp src/mathicgb/MonoLookup.hpp \ src/mathicgb/MonoLookup.cpp src/mathicgb/StaticMonoMap.hpp \ src/mathicgb/SigPolyBasis.cpp src/mathicgb/SigPolyBasis.hpp \ src/mathicgb/Basis.cpp src/mathicgb/Basis.hpp \ src/mathicgb/io-util.cpp src/mathicgb/io-util.hpp \ src/mathicgb/KoszulQueue.hpp src/mathicgb/ModuleMonoSet.cpp \ src/mathicgb/ModuleMonoSet.hpp src/mathicgb/Poly.hpp \ src/mathicgb/PolyBasis.cpp src/mathicgb/PolyBasis.hpp \ src/mathicgb/PolyHashTable.cpp src/mathicgb/PolyHashTable.hpp \ src/mathicgb/PolyRing.cpp src/mathicgb/PolyRing.hpp \ src/mathicgb/Reducer.cpp src/mathicgb/Reducer.hpp \ src/mathicgb/ReducerDedup.hpp src/mathicgb/ReducerDedup.cpp \ src/mathicgb/ReducerHash.hpp src/mathicgb/ReducerHash.cpp \ src/mathicgb/ReducerHashPack.hpp src/mathicgb/ReducerHashPack.cpp \ src/mathicgb/ReducerHelper.hpp src/mathicgb/ReducerNoDedup.hpp \ src/mathicgb/ReducerNoDedup.cpp src/mathicgb/ReducerPackDedup.hpp \ src/mathicgb/ReducerPackDedup.cpp src/mathicgb/SignatureGB.cpp \ src/mathicgb/SignatureGB.hpp src/mathicgb/SigSPairs.cpp \ src/mathicgb/SigSPairs.hpp src/mathicgb/SPairs.cpp \ src/mathicgb/SPairs.hpp src/mathicgb/stdinc.h \ src/mathicgb/SigSPairQueue.hpp src/mathicgb/SigSPairQueue.cpp \ src/mathicgb/SparseMatrix.hpp src/mathicgb/SparseMatrix.cpp \ src/mathicgb/QuadMatrixBuilder.hpp \ src/mathicgb/QuadMatrixBuilder.cpp src/mathicgb/TypicalReducer.cpp \ src/mathicgb/TypicalReducer.hpp src/mathicgb/F4Reducer.hpp \ src/mathicgb/F4Reducer.cpp src/mathicgb/F4MatrixBuilder.hpp \ src/mathicgb/F4MatrixBuilder.cpp src/mathicgb/QuadMatrix.hpp \ src/mathicgb/QuadMatrix.cpp src/mathicgb/F4MatrixReducer.cpp \ src/mathicgb/F4MatrixReducer.hpp src/mathicgb/MonomialMap.hpp \ src/mathicgb/RawVector.hpp src/mathicgb/Atomic.hpp \ src/mathicgb/FixedSizeMonomialMap.h src/mathicgb/CFile.hpp \ src/mathicgb/CFile.cpp src/mathicgb/LogDomain.hpp \ src/mathicgb/LogDomain.cpp src/mathicgb/LogDomainSet.hpp \ src/mathicgb/F4MatrixBuilder2.hpp src/mathicgb/F4MatrixBuilder2.cpp \ src/mathicgb/LogDomainSet.cpp src/mathicgb/F4ProtoMatrix.hpp \ src/mathicgb/F4ProtoMatrix.cpp src/mathicgb/F4MatrixProjection.hpp \ src/mathicgb/F4MatrixProjection.cpp src/mathicgb/ScopeExit.hpp \ src/mathicgb.cpp src/mathicgb.h src/mathicgb/mtbb.hpp \ src/mathicgb/PrimeField.hpp src/mathicgb/MonoMonoid.hpp \ src/mathicgb/MonoProcessor.hpp src/mathicgb/MonoOrder.hpp \ src/mathicgb/Scanner.hpp src/mathicgb/Scanner.cpp \ src/mathicgb/Unchar.hpp src/mathicgb/MathicIO.hpp \ src/mathicgb/NonCopyable.hpp # The headers that libmathicgb installs. mathicgbA_include_HEADERS = src/mathicgb.h mathicgbA_includedir = $(includedir) mathicgbB_include_HEADERS = $(wildcard \ $(top_srcdir)/src/mathicgb/*.h $(top_srcdir)/src/mathicgb/*.hpp) mathicgbB_includedir = $(includedir)/mathicgb pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = build/autotools/mathicgb.pc # When making a distribution file, Automake knows to include all files # that are necessary to build the project. EXTRA_DIST specifies files # to include beyond those used in the build process. EXTRA_DIST = autogen.sh CMakeLists.txt src/CMakeLists.txt \ cmake/FindMathic.cmake cmake/FindMemtailor.cmake cmake/FindTBB.cmake if CLI dist_man_MANS = doc/mgb.1 bin_PROGRAMS = mgb # set up the console program. Listing the headers in sources ensure that # those files are included in distributions. mgb_SOURCES = src/cli/GBMain.cpp src/cli/CommonParams.hpp \ src/cli/CommonParams.cpp src/cli/GBAction.hpp src/cli/GBAction.cpp \ src/cli/GBCommonParams.hpp src/cli/GBCommonParams.cpp \ src/cli/MatrixAction.cpp src/cli/MatrixAction.hpp \ src/cli/SigGBAction.hpp src/cli/SigGBAction.cpp \ src/cli/HelpAction.hpp src/cli/HelpAction.cpp mgb_LDADD = $(top_builddir)/libmathicgb.la $(DEPS_LIBS) -lpthread endif # set up tests to run on "make check" if with_gtest TESTS=unittest check_PROGRAMS=$(TESTS) # this prevents g++ 4.8.2 from crashing and churning through memory when compiling under Ubuntu 64 14.04.1 src/test/MonoMonoid.o src/test/Range.o : CXXFLAGS += -O0 unittest_LDADD = $(DEPS_LIBS) $(top_builddir)/libmathicgb.la $(DEPS_LIBS) -lpthread -lgtest test_LIBS= unittest_SOURCES=src/test/Range.cpp \ src/test/testMain.cpp src/test/gb-test.cpp src/test/ideals.cpp \ src/test/poly-test.cpp src/test/ideals.hpp src/test/SparseMatrix.cpp \ src/test/QuadMatrixBuilder.cpp src/test/F4MatrixBuilder.cpp \ src/test/F4MatrixReducer.cpp src/test/mathicgb.cpp \ src/test/PrimeField.cpp src/test/MonoMonoid.cpp src/test/Scanner.cpp \ src/test/MathicIO.cpp else check: @echo @echo "configured without gtest, so unittests cannot be run." endif mathicgb-1.1/doc/0000775000175000017500000000000015117247675007460 5mathicgb-1.1/doc/mgb.10000664000175000017500000000111614560325357010221 .TH MGB "1" "April 2015" .SH NAME Mathicgb: \- Compute (signature) Groebner bases using the fast data\%structures from mathic. .SH DESCRIPTION .HP gb \- Compute a Groebner basis. .HP help \- Return information about the command line interface. .HP matrix \- Perform matrix computations. .HP siggb \- Compute a signature Groebner basis .SH AUTHORS Mathicgb was written by Bjarke Hammersholt Roune and Michael Stillman . This manual page was written by Doug Torrance for the Debian project (but may be used by others). mathicgb-1.1/CMakeLists.txt0000664000175000017500000000421015117247507011362 cmake_minimum_required(VERSION 3.12) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) project(mathicgb VERSION 1.1 LANGUAGES CXX) option(enable_mgb "Build mgb" ON) option(with_tbb "use TBB for multithreading" auto) set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH}) find_package(Threads 2.1 REQUIRED QUIET) find_package(Memtailor REQUIRED) find_package(Mathic REQUIRED) if(with_tbb) find_package(TBB REQUIRED) elseif(with_tbb STREQUAL auto) find_package(TBB) set(with_tbb ${TBB_FOUND}) endif() add_library(memtailor STATIC IMPORTED) set_target_properties(memtailor PROPERTIES IMPORTED_LOCATION "${MEMTAILOR_LIBRARIES}" INTERFACE_INCLUDE_DIRECTORIES "${MEMTAILOR_INCLUDE_DIR}") add_library(mathic STATIC IMPORTED) set_target_properties(mathic PROPERTIES IMPORTED_LOCATION "${MATHIC_LIBRARIES}" INTERFACE_INCLUDE_DIRECTORIES "${MATHIC_INCLUDE_DIR}") add_compile_options( -DHAVE_CXX11=1 -DPACKAGE_NAME="${PROJECT_NAME}" -DPACKAGE_TARNAME="${PROJECT_NAME}" -DPACKAGE_VERSION="${PROJECT_VERSION}" -DPACKAGE_STRING="${PROJECT_NAME} ${PROJECT_VERSION}" -DPACKAGE_BUGREPORT="" -DPACKAGE_URL="" -DPACKAGE="${PROJECT_NAME}" -Wall -Wextra -Wno-unused-parameter -Wno-unused-value -Wno-unused-variable -Wno-sign-compare ) add_subdirectory(src) set_target_properties(mathicgb PROPERTIES PUBLIC_HEADER src/mathicgb.h) install(TARGETS mathicgb LIBRARY DESTINATION lib) install(DIRECTORY src/mathicgb DESTINATION include FILES_MATCHING PATTERN "*.hpp" PATTERN "*.h" ) install(FILES doc/mgb.1 TYPE MAN) install(FILES README.md gpl-2.0.txt gpl-3.0.txt DESTINATION licenses/mathicgb ) if(enable_mgb) add_executable(mgb src/cli/GBMain.cpp src/cli/CommonParams.hpp src/cli/CommonParams.cpp src/cli/GBAction.hpp src/cli/GBAction.cpp src/cli/GBCommonParams.hpp src/cli/GBCommonParams.cpp src/cli/MatrixAction.hpp src/cli/MatrixAction.cpp src/cli/SigGBAction.hpp src/cli/SigGBAction.cpp src/cli/HelpAction.hpp src/cli/HelpAction.cpp ) target_link_libraries(mgb mathicgb) install(TARGETS mgb RUNTIME DESTINATION bin) endif() mathicgb-1.1/Makefile.in0000664000175000017500000023244115117247651010700 # Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2021 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @CLI_TRUE@bin_PROGRAMS = mgb$(EXEEXT) @with_gtest_TRUE@TESTS = unittest$(EXEEXT) @with_gtest_TRUE@check_PROGRAMS = $(am__EXEEXT_1) subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = \ $(top_srcdir)/build/autotools/m4/ax_cxx_compile_stdcxx_11.m4 \ $(top_srcdir)/build/autotools/m4/libtool.m4 \ $(top_srcdir)/build/autotools/m4/ltoptions.m4 \ $(top_srcdir)/build/autotools/m4/ltsugar.m4 \ $(top_srcdir)/build/autotools/m4/ltversion.m4 \ $(top_srcdir)/build/autotools/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(mathicgbA_include_HEADERS) \ $(mathicgbB_include_HEADERS) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = build/autotools/mathicgb.pc CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libdir)" \ "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(pkgconfigdir)" \ "$(DESTDIR)$(mathicgbA_includedir)" \ "$(DESTDIR)$(mathicgbB_includedir)" @with_gtest_TRUE@am__EXEEXT_1 = unittest$(EXEEXT) PROGRAMS = $(bin_PROGRAMS) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = libmathicgb_la_DEPENDENCIES = $(am__DEPENDENCIES_1) am__dirstamp = $(am__leading_dot)dirstamp am_libmathicgb_la_OBJECTS = src/mathicgb/ReducerPack.lo \ src/mathicgb/ClassicGBAlg.lo src/mathicgb/MonoLookup.lo \ src/mathicgb/SigPolyBasis.lo src/mathicgb/Basis.lo \ src/mathicgb/io-util.lo src/mathicgb/ModuleMonoSet.lo \ src/mathicgb/PolyBasis.lo src/mathicgb/PolyHashTable.lo \ src/mathicgb/PolyRing.lo src/mathicgb/Reducer.lo \ src/mathicgb/ReducerDedup.lo src/mathicgb/ReducerHash.lo \ src/mathicgb/ReducerHashPack.lo src/mathicgb/ReducerNoDedup.lo \ src/mathicgb/ReducerPackDedup.lo src/mathicgb/SignatureGB.lo \ src/mathicgb/SigSPairs.lo src/mathicgb/SPairs.lo \ src/mathicgb/SigSPairQueue.lo src/mathicgb/SparseMatrix.lo \ src/mathicgb/QuadMatrixBuilder.lo \ src/mathicgb/TypicalReducer.lo src/mathicgb/F4Reducer.lo \ src/mathicgb/F4MatrixBuilder.lo src/mathicgb/QuadMatrix.lo \ src/mathicgb/F4MatrixReducer.lo src/mathicgb/CFile.lo \ src/mathicgb/LogDomain.lo src/mathicgb/F4MatrixBuilder2.lo \ src/mathicgb/LogDomainSet.lo src/mathicgb/F4ProtoMatrix.lo \ src/mathicgb/F4MatrixProjection.lo src/mathicgb.lo \ src/mathicgb/Scanner.lo libmathicgb_la_OBJECTS = $(am_libmathicgb_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am__mgb_SOURCES_DIST = src/cli/GBMain.cpp src/cli/CommonParams.hpp \ src/cli/CommonParams.cpp src/cli/GBAction.hpp \ src/cli/GBAction.cpp src/cli/GBCommonParams.hpp \ src/cli/GBCommonParams.cpp src/cli/MatrixAction.cpp \ src/cli/MatrixAction.hpp src/cli/SigGBAction.hpp \ src/cli/SigGBAction.cpp src/cli/HelpAction.hpp \ src/cli/HelpAction.cpp @CLI_TRUE@am_mgb_OBJECTS = src/cli/GBMain.$(OBJEXT) \ @CLI_TRUE@ src/cli/CommonParams.$(OBJEXT) \ @CLI_TRUE@ src/cli/GBAction.$(OBJEXT) \ @CLI_TRUE@ src/cli/GBCommonParams.$(OBJEXT) \ @CLI_TRUE@ src/cli/MatrixAction.$(OBJEXT) \ @CLI_TRUE@ src/cli/SigGBAction.$(OBJEXT) \ @CLI_TRUE@ src/cli/HelpAction.$(OBJEXT) mgb_OBJECTS = $(am_mgb_OBJECTS) @CLI_TRUE@mgb_DEPENDENCIES = $(top_builddir)/libmathicgb.la \ @CLI_TRUE@ $(am__DEPENDENCIES_1) am__unittest_SOURCES_DIST = src/test/Range.cpp src/test/testMain.cpp \ src/test/gb-test.cpp src/test/ideals.cpp \ src/test/poly-test.cpp src/test/ideals.hpp \ src/test/SparseMatrix.cpp src/test/QuadMatrixBuilder.cpp \ src/test/F4MatrixBuilder.cpp src/test/F4MatrixReducer.cpp \ src/test/mathicgb.cpp src/test/PrimeField.cpp \ src/test/MonoMonoid.cpp src/test/Scanner.cpp \ src/test/MathicIO.cpp @with_gtest_TRUE@am_unittest_OBJECTS = src/test/Range.$(OBJEXT) \ @with_gtest_TRUE@ src/test/testMain.$(OBJEXT) \ @with_gtest_TRUE@ src/test/gb-test.$(OBJEXT) \ @with_gtest_TRUE@ src/test/ideals.$(OBJEXT) \ @with_gtest_TRUE@ src/test/poly-test.$(OBJEXT) \ @with_gtest_TRUE@ src/test/SparseMatrix.$(OBJEXT) \ @with_gtest_TRUE@ src/test/QuadMatrixBuilder.$(OBJEXT) \ @with_gtest_TRUE@ src/test/F4MatrixBuilder.$(OBJEXT) \ @with_gtest_TRUE@ src/test/F4MatrixReducer.$(OBJEXT) \ @with_gtest_TRUE@ src/test/mathicgb.$(OBJEXT) \ @with_gtest_TRUE@ src/test/PrimeField.$(OBJEXT) \ @with_gtest_TRUE@ src/test/MonoMonoid.$(OBJEXT) \ @with_gtest_TRUE@ src/test/Scanner.$(OBJEXT) \ @with_gtest_TRUE@ src/test/MathicIO.$(OBJEXT) unittest_OBJECTS = $(am_unittest_OBJECTS) @with_gtest_TRUE@unittest_DEPENDENCIES = $(am__DEPENDENCIES_1) \ @with_gtest_TRUE@ $(top_builddir)/libmathicgb.la \ @with_gtest_TRUE@ $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/build/autotools/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = src/$(DEPDIR)/mathicgb.Plo \ src/cli/$(DEPDIR)/CommonParams.Po \ src/cli/$(DEPDIR)/GBAction.Po \ src/cli/$(DEPDIR)/GBCommonParams.Po \ src/cli/$(DEPDIR)/GBMain.Po src/cli/$(DEPDIR)/HelpAction.Po \ src/cli/$(DEPDIR)/MatrixAction.Po \ src/cli/$(DEPDIR)/SigGBAction.Po \ src/mathicgb/$(DEPDIR)/Basis.Plo \ src/mathicgb/$(DEPDIR)/CFile.Plo \ src/mathicgb/$(DEPDIR)/ClassicGBAlg.Plo \ src/mathicgb/$(DEPDIR)/F4MatrixBuilder.Plo \ src/mathicgb/$(DEPDIR)/F4MatrixBuilder2.Plo \ src/mathicgb/$(DEPDIR)/F4MatrixProjection.Plo \ src/mathicgb/$(DEPDIR)/F4MatrixReducer.Plo \ src/mathicgb/$(DEPDIR)/F4ProtoMatrix.Plo \ src/mathicgb/$(DEPDIR)/F4Reducer.Plo \ src/mathicgb/$(DEPDIR)/LogDomain.Plo \ src/mathicgb/$(DEPDIR)/LogDomainSet.Plo \ src/mathicgb/$(DEPDIR)/ModuleMonoSet.Plo \ src/mathicgb/$(DEPDIR)/MonoLookup.Plo \ src/mathicgb/$(DEPDIR)/PolyBasis.Plo \ src/mathicgb/$(DEPDIR)/PolyHashTable.Plo \ src/mathicgb/$(DEPDIR)/PolyRing.Plo \ src/mathicgb/$(DEPDIR)/QuadMatrix.Plo \ src/mathicgb/$(DEPDIR)/QuadMatrixBuilder.Plo \ src/mathicgb/$(DEPDIR)/Reducer.Plo \ src/mathicgb/$(DEPDIR)/ReducerDedup.Plo \ src/mathicgb/$(DEPDIR)/ReducerHash.Plo \ src/mathicgb/$(DEPDIR)/ReducerHashPack.Plo \ src/mathicgb/$(DEPDIR)/ReducerNoDedup.Plo \ src/mathicgb/$(DEPDIR)/ReducerPack.Plo \ src/mathicgb/$(DEPDIR)/ReducerPackDedup.Plo \ src/mathicgb/$(DEPDIR)/SPairs.Plo \ src/mathicgb/$(DEPDIR)/Scanner.Plo \ src/mathicgb/$(DEPDIR)/SigPolyBasis.Plo \ src/mathicgb/$(DEPDIR)/SigSPairQueue.Plo \ src/mathicgb/$(DEPDIR)/SigSPairs.Plo \ src/mathicgb/$(DEPDIR)/SignatureGB.Plo \ src/mathicgb/$(DEPDIR)/SparseMatrix.Plo \ src/mathicgb/$(DEPDIR)/TypicalReducer.Plo \ src/mathicgb/$(DEPDIR)/io-util.Plo \ src/test/$(DEPDIR)/F4MatrixBuilder.Po \ src/test/$(DEPDIR)/F4MatrixReducer.Po \ src/test/$(DEPDIR)/MathicIO.Po \ src/test/$(DEPDIR)/MonoMonoid.Po \ src/test/$(DEPDIR)/PrimeField.Po \ src/test/$(DEPDIR)/QuadMatrixBuilder.Po \ src/test/$(DEPDIR)/Range.Po src/test/$(DEPDIR)/Scanner.Po \ src/test/$(DEPDIR)/SparseMatrix.Po \ src/test/$(DEPDIR)/gb-test.Po src/test/$(DEPDIR)/ideals.Po \ src/test/$(DEPDIR)/mathicgb.Po src/test/$(DEPDIR)/poly-test.Po \ src/test/$(DEPDIR)/testMain.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libmathicgb_la_SOURCES) $(mgb_SOURCES) $(unittest_SOURCES) DIST_SOURCES = $(libmathicgb_la_SOURCES) $(am__mgb_SOURCES_DIST) \ $(am__unittest_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac man1dir = $(mandir)/man1 NROFF = nroff MANS = $(dist_man_MANS) DATA = $(pkgconfig_DATA) HEADERS = $(mathicgbA_include_HEADERS) $(mathicgbB_include_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` AM_RECURSIVE_TARGETS = cscope check recheck am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' RECHECK_LOGS = $(TEST_LOGS) TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/build/autotools/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build/autotools/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.in \ $(top_srcdir)/build/autotools/ar-lib \ $(top_srcdir)/build/autotools/compile \ $(top_srcdir)/build/autotools/config.guess \ $(top_srcdir)/build/autotools/config.sub \ $(top_srcdir)/build/autotools/depcomp \ $(top_srcdir)/build/autotools/install-sh \ $(top_srcdir)/build/autotools/ltmain.sh \ $(top_srcdir)/build/autotools/mathicgb.pc.in \ $(top_srcdir)/build/autotools/missing \ $(top_srcdir)/build/autotools/test-driver README.md \ build/autotools/ar-lib build/autotools/compile \ build/autotools/config.guess build/autotools/config.sub \ build/autotools/depcomp build/autotools/install-sh \ build/autotools/ltmain.sh build/autotools/missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip # Exists only to be overridden by the user if desired. AM_DISTCHECK_DVI_TARGET = dvi distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEPS_CFLAGS = @DEPS_CFLAGS@ DEPS_LIBS = @DEPS_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MATHICGB_SO_VERSION = @MATHICGB_SO_VERSION@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TBB_CFLAGS = @TBB_CFLAGS@ TBB_LIBS = @TBB_LIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # options passed to aclocal, which is a tool for making macroes visible to # autoconf. We use -I to tell aclocal where we put the local macros. ACLOCAL_AMFLAGS = -I build/autotools/m4 # Options passed to the C and C++ PreProcessor (CPP) and compiler AM_CPPFLAGS = -I${top_srcdir}/ -I$(top_srcdir)/src/ $(DEPS_CFLAGS) # tell Libtool what the name of the library is. lib_LTLIBRARIES = libmathicgb.la # libraries that are needed by this library libmathicgb_la_LIBADD = $(DEPS_LIBS) # the sources that are built to make libmathicgb. Listing the headers in # sources ensure that those files are included in distributions. libmathicgb_la_SOURCES = src/mathicgb/MonoArena.hpp \ src/mathicgb/Range.hpp src/mathicgb/ReducerPack.hpp \ src/mathicgb/ReducerPack.cpp src/mathicgb/ClassicGBAlg.cpp \ src/mathicgb/ClassicGBAlg.hpp src/mathicgb/MonoLookup.hpp \ src/mathicgb/MonoLookup.cpp src/mathicgb/StaticMonoMap.hpp \ src/mathicgb/SigPolyBasis.cpp src/mathicgb/SigPolyBasis.hpp \ src/mathicgb/Basis.cpp src/mathicgb/Basis.hpp \ src/mathicgb/io-util.cpp src/mathicgb/io-util.hpp \ src/mathicgb/KoszulQueue.hpp src/mathicgb/ModuleMonoSet.cpp \ src/mathicgb/ModuleMonoSet.hpp src/mathicgb/Poly.hpp \ src/mathicgb/PolyBasis.cpp src/mathicgb/PolyBasis.hpp \ src/mathicgb/PolyHashTable.cpp src/mathicgb/PolyHashTable.hpp \ src/mathicgb/PolyRing.cpp src/mathicgb/PolyRing.hpp \ src/mathicgb/Reducer.cpp src/mathicgb/Reducer.hpp \ src/mathicgb/ReducerDedup.hpp src/mathicgb/ReducerDedup.cpp \ src/mathicgb/ReducerHash.hpp src/mathicgb/ReducerHash.cpp \ src/mathicgb/ReducerHashPack.hpp src/mathicgb/ReducerHashPack.cpp \ src/mathicgb/ReducerHelper.hpp src/mathicgb/ReducerNoDedup.hpp \ src/mathicgb/ReducerNoDedup.cpp src/mathicgb/ReducerPackDedup.hpp \ src/mathicgb/ReducerPackDedup.cpp src/mathicgb/SignatureGB.cpp \ src/mathicgb/SignatureGB.hpp src/mathicgb/SigSPairs.cpp \ src/mathicgb/SigSPairs.hpp src/mathicgb/SPairs.cpp \ src/mathicgb/SPairs.hpp src/mathicgb/stdinc.h \ src/mathicgb/SigSPairQueue.hpp src/mathicgb/SigSPairQueue.cpp \ src/mathicgb/SparseMatrix.hpp src/mathicgb/SparseMatrix.cpp \ src/mathicgb/QuadMatrixBuilder.hpp \ src/mathicgb/QuadMatrixBuilder.cpp src/mathicgb/TypicalReducer.cpp \ src/mathicgb/TypicalReducer.hpp src/mathicgb/F4Reducer.hpp \ src/mathicgb/F4Reducer.cpp src/mathicgb/F4MatrixBuilder.hpp \ src/mathicgb/F4MatrixBuilder.cpp src/mathicgb/QuadMatrix.hpp \ src/mathicgb/QuadMatrix.cpp src/mathicgb/F4MatrixReducer.cpp \ src/mathicgb/F4MatrixReducer.hpp src/mathicgb/MonomialMap.hpp \ src/mathicgb/RawVector.hpp src/mathicgb/Atomic.hpp \ src/mathicgb/FixedSizeMonomialMap.h src/mathicgb/CFile.hpp \ src/mathicgb/CFile.cpp src/mathicgb/LogDomain.hpp \ src/mathicgb/LogDomain.cpp src/mathicgb/LogDomainSet.hpp \ src/mathicgb/F4MatrixBuilder2.hpp src/mathicgb/F4MatrixBuilder2.cpp \ src/mathicgb/LogDomainSet.cpp src/mathicgb/F4ProtoMatrix.hpp \ src/mathicgb/F4ProtoMatrix.cpp src/mathicgb/F4MatrixProjection.hpp \ src/mathicgb/F4MatrixProjection.cpp src/mathicgb/ScopeExit.hpp \ src/mathicgb.cpp src/mathicgb.h src/mathicgb/mtbb.hpp \ src/mathicgb/PrimeField.hpp src/mathicgb/MonoMonoid.hpp \ src/mathicgb/MonoProcessor.hpp src/mathicgb/MonoOrder.hpp \ src/mathicgb/Scanner.hpp src/mathicgb/Scanner.cpp \ src/mathicgb/Unchar.hpp src/mathicgb/MathicIO.hpp \ src/mathicgb/NonCopyable.hpp # The headers that libmathicgb installs. mathicgbA_include_HEADERS = src/mathicgb.h mathicgbA_includedir = $(includedir) mathicgbB_include_HEADERS = $(wildcard \ $(top_srcdir)/src/mathicgb/*.h $(top_srcdir)/src/mathicgb/*.hpp) mathicgbB_includedir = $(includedir)/mathicgb pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = build/autotools/mathicgb.pc # When making a distribution file, Automake knows to include all files # that are necessary to build the project. EXTRA_DIST specifies files # to include beyond those used in the build process. EXTRA_DIST = autogen.sh CMakeLists.txt src/CMakeLists.txt \ cmake/FindMathic.cmake cmake/FindMemtailor.cmake cmake/FindTBB.cmake @CLI_TRUE@dist_man_MANS = doc/mgb.1 # set up the console program. Listing the headers in sources ensure that # those files are included in distributions. @CLI_TRUE@mgb_SOURCES = src/cli/GBMain.cpp src/cli/CommonParams.hpp \ @CLI_TRUE@ src/cli/CommonParams.cpp src/cli/GBAction.hpp src/cli/GBAction.cpp \ @CLI_TRUE@ src/cli/GBCommonParams.hpp src/cli/GBCommonParams.cpp \ @CLI_TRUE@ src/cli/MatrixAction.cpp src/cli/MatrixAction.hpp \ @CLI_TRUE@ src/cli/SigGBAction.hpp src/cli/SigGBAction.cpp \ @CLI_TRUE@ src/cli/HelpAction.hpp src/cli/HelpAction.cpp @CLI_TRUE@mgb_LDADD = $(top_builddir)/libmathicgb.la $(DEPS_LIBS) -lpthread @with_gtest_TRUE@unittest_LDADD = $(DEPS_LIBS) $(top_builddir)/libmathicgb.la $(DEPS_LIBS) -lpthread -lgtest @with_gtest_TRUE@test_LIBS = @with_gtest_TRUE@unittest_SOURCES = src/test/Range.cpp \ @with_gtest_TRUE@ src/test/testMain.cpp src/test/gb-test.cpp src/test/ideals.cpp \ @with_gtest_TRUE@ src/test/poly-test.cpp src/test/ideals.hpp src/test/SparseMatrix.cpp \ @with_gtest_TRUE@ src/test/QuadMatrixBuilder.cpp src/test/F4MatrixBuilder.cpp \ @with_gtest_TRUE@ src/test/F4MatrixReducer.cpp src/test/mathicgb.cpp \ @with_gtest_TRUE@ src/test/PrimeField.cpp src/test/MonoMonoid.cpp src/test/Scanner.cpp \ @with_gtest_TRUE@ src/test/MathicIO.cpp all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .log .o .obj .test .test$(EXEEXT) .trs am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): build/autotools/mathicgb.pc: $(top_builddir)/config.status $(top_srcdir)/build/autotools/mathicgb.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } src/mathicgb/$(am__dirstamp): @$(MKDIR_P) src/mathicgb @: > src/mathicgb/$(am__dirstamp) src/mathicgb/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/mathicgb/$(DEPDIR) @: > src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/ReducerPack.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/ClassicGBAlg.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/MonoLookup.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/SigPolyBasis.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/Basis.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/io-util.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/ModuleMonoSet.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/PolyBasis.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/PolyHashTable.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/PolyRing.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/Reducer.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/ReducerDedup.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/ReducerHash.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/ReducerHashPack.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/ReducerNoDedup.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/ReducerPackDedup.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/SignatureGB.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/SigSPairs.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/SPairs.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/SigSPairQueue.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/SparseMatrix.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/QuadMatrixBuilder.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/TypicalReducer.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/F4Reducer.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/F4MatrixBuilder.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/QuadMatrix.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/F4MatrixReducer.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/CFile.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/LogDomain.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/F4MatrixBuilder2.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/LogDomainSet.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/F4ProtoMatrix.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/mathicgb/F4MatrixProjection.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) src/$(am__dirstamp): @$(MKDIR_P) src @: > src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/$(DEPDIR) @: > src/$(DEPDIR)/$(am__dirstamp) src/mathicgb.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) src/mathicgb/Scanner.lo: src/mathicgb/$(am__dirstamp) \ src/mathicgb/$(DEPDIR)/$(am__dirstamp) libmathicgb.la: $(libmathicgb_la_OBJECTS) $(libmathicgb_la_DEPENDENCIES) $(EXTRA_libmathicgb_la_DEPENDENCIES) $(AM_V_CXXLD)$(CXXLINK) -rpath $(libdir) $(libmathicgb_la_OBJECTS) $(libmathicgb_la_LIBADD) $(LIBS) src/cli/$(am__dirstamp): @$(MKDIR_P) src/cli @: > src/cli/$(am__dirstamp) src/cli/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/cli/$(DEPDIR) @: > src/cli/$(DEPDIR)/$(am__dirstamp) src/cli/GBMain.$(OBJEXT): src/cli/$(am__dirstamp) \ src/cli/$(DEPDIR)/$(am__dirstamp) src/cli/CommonParams.$(OBJEXT): src/cli/$(am__dirstamp) \ src/cli/$(DEPDIR)/$(am__dirstamp) src/cli/GBAction.$(OBJEXT): src/cli/$(am__dirstamp) \ src/cli/$(DEPDIR)/$(am__dirstamp) src/cli/GBCommonParams.$(OBJEXT): src/cli/$(am__dirstamp) \ src/cli/$(DEPDIR)/$(am__dirstamp) src/cli/MatrixAction.$(OBJEXT): src/cli/$(am__dirstamp) \ src/cli/$(DEPDIR)/$(am__dirstamp) src/cli/SigGBAction.$(OBJEXT): src/cli/$(am__dirstamp) \ src/cli/$(DEPDIR)/$(am__dirstamp) src/cli/HelpAction.$(OBJEXT): src/cli/$(am__dirstamp) \ src/cli/$(DEPDIR)/$(am__dirstamp) mgb$(EXEEXT): $(mgb_OBJECTS) $(mgb_DEPENDENCIES) $(EXTRA_mgb_DEPENDENCIES) @rm -f mgb$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(mgb_OBJECTS) $(mgb_LDADD) $(LIBS) src/test/$(am__dirstamp): @$(MKDIR_P) src/test @: > src/test/$(am__dirstamp) src/test/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/test/$(DEPDIR) @: > src/test/$(DEPDIR)/$(am__dirstamp) src/test/Range.$(OBJEXT): src/test/$(am__dirstamp) \ src/test/$(DEPDIR)/$(am__dirstamp) src/test/testMain.$(OBJEXT): src/test/$(am__dirstamp) \ src/test/$(DEPDIR)/$(am__dirstamp) src/test/gb-test.$(OBJEXT): src/test/$(am__dirstamp) \ src/test/$(DEPDIR)/$(am__dirstamp) src/test/ideals.$(OBJEXT): src/test/$(am__dirstamp) \ src/test/$(DEPDIR)/$(am__dirstamp) src/test/poly-test.$(OBJEXT): src/test/$(am__dirstamp) \ src/test/$(DEPDIR)/$(am__dirstamp) src/test/SparseMatrix.$(OBJEXT): src/test/$(am__dirstamp) \ src/test/$(DEPDIR)/$(am__dirstamp) src/test/QuadMatrixBuilder.$(OBJEXT): src/test/$(am__dirstamp) \ src/test/$(DEPDIR)/$(am__dirstamp) src/test/F4MatrixBuilder.$(OBJEXT): src/test/$(am__dirstamp) \ src/test/$(DEPDIR)/$(am__dirstamp) src/test/F4MatrixReducer.$(OBJEXT): src/test/$(am__dirstamp) \ src/test/$(DEPDIR)/$(am__dirstamp) src/test/mathicgb.$(OBJEXT): src/test/$(am__dirstamp) \ src/test/$(DEPDIR)/$(am__dirstamp) src/test/PrimeField.$(OBJEXT): src/test/$(am__dirstamp) \ src/test/$(DEPDIR)/$(am__dirstamp) src/test/MonoMonoid.$(OBJEXT): src/test/$(am__dirstamp) \ src/test/$(DEPDIR)/$(am__dirstamp) src/test/Scanner.$(OBJEXT): src/test/$(am__dirstamp) \ src/test/$(DEPDIR)/$(am__dirstamp) src/test/MathicIO.$(OBJEXT): src/test/$(am__dirstamp) \ src/test/$(DEPDIR)/$(am__dirstamp) unittest$(EXEEXT): $(unittest_OBJECTS) $(unittest_DEPENDENCIES) $(EXTRA_unittest_DEPENDENCIES) @rm -f unittest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unittest_OBJECTS) $(unittest_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f src/*.$(OBJEXT) -rm -f src/*.lo -rm -f src/cli/*.$(OBJEXT) -rm -f src/mathicgb/*.$(OBJEXT) -rm -f src/mathicgb/*.lo -rm -f src/test/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/mathicgb.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/cli/$(DEPDIR)/CommonParams.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/cli/$(DEPDIR)/GBAction.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/cli/$(DEPDIR)/GBCommonParams.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/cli/$(DEPDIR)/GBMain.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/cli/$(DEPDIR)/HelpAction.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/cli/$(DEPDIR)/MatrixAction.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/cli/$(DEPDIR)/SigGBAction.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/Basis.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/CFile.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/ClassicGBAlg.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/F4MatrixBuilder.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/F4MatrixBuilder2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/F4MatrixProjection.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/F4MatrixReducer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/F4ProtoMatrix.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/F4Reducer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/LogDomain.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/LogDomainSet.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/ModuleMonoSet.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/MonoLookup.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/PolyBasis.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/PolyHashTable.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/PolyRing.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/QuadMatrix.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/QuadMatrixBuilder.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/Reducer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/ReducerDedup.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/ReducerHash.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/ReducerHashPack.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/ReducerNoDedup.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/ReducerPack.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/ReducerPackDedup.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/SPairs.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/Scanner.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/SigPolyBasis.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/SigSPairQueue.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/SigSPairs.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/SignatureGB.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/SparseMatrix.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/TypicalReducer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/mathicgb/$(DEPDIR)/io-util.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/test/$(DEPDIR)/F4MatrixBuilder.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/test/$(DEPDIR)/F4MatrixReducer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/test/$(DEPDIR)/MathicIO.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/test/$(DEPDIR)/MonoMonoid.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/test/$(DEPDIR)/PrimeField.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/test/$(DEPDIR)/QuadMatrixBuilder.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/test/$(DEPDIR)/Range.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/test/$(DEPDIR)/Scanner.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/test/$(DEPDIR)/SparseMatrix.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/test/$(DEPDIR)/gb-test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/test/$(DEPDIR)/ideals.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/test/$(DEPDIR)/mathicgb.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/test/$(DEPDIR)/poly-test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/test/$(DEPDIR)/testMain.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf src/.libs src/_libs -rm -rf src/mathicgb/.libs src/mathicgb/_libs distclean-libtool: -rm -f libtool config.lt install-man1: $(dist_man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(dist_man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) install-mathicgbA_includeHEADERS: $(mathicgbA_include_HEADERS) @$(NORMAL_INSTALL) @list='$(mathicgbA_include_HEADERS)'; test -n "$(mathicgbA_includedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(mathicgbA_includedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(mathicgbA_includedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(mathicgbA_includedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(mathicgbA_includedir)" || exit $$?; \ done uninstall-mathicgbA_includeHEADERS: @$(NORMAL_UNINSTALL) @list='$(mathicgbA_include_HEADERS)'; test -n "$(mathicgbA_includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(mathicgbA_includedir)'; $(am__uninstall_files_from_dir) install-mathicgbB_includeHEADERS: $(mathicgbB_include_HEADERS) @$(NORMAL_INSTALL) @list='$(mathicgbB_include_HEADERS)'; test -n "$(mathicgbB_includedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(mathicgbB_includedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(mathicgbB_includedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(mathicgbB_includedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(mathicgbB_includedir)" || exit $$?; \ done uninstall-mathicgbB_includeHEADERS: @$(NORMAL_UNINSTALL) @list='$(mathicgbB_include_HEADERS)'; test -n "$(mathicgbB_includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(mathicgbB_includedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: $(check_PROGRAMS) @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? unittest.log: unittest$(EXEEXT) @p='unittest$(EXEEXT)'; \ b='unittest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-zstd: distdir tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ *.tar.zst*) \ zstd -dc $(distdir).tar.zst | $(am__untar) ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) $(MANS) $(DATA) $(HEADERS) install-binPROGRAMS: install-libLTLIBRARIES install-checkPROGRAMS: install-libLTLIBRARIES installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libdir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(mathicgbA_includedir)" "$(DESTDIR)$(mathicgbB_includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f src/$(DEPDIR)/$(am__dirstamp) -rm -f src/$(am__dirstamp) -rm -f src/cli/$(DEPDIR)/$(am__dirstamp) -rm -f src/cli/$(am__dirstamp) -rm -f src/mathicgb/$(DEPDIR)/$(am__dirstamp) -rm -f src/mathicgb/$(am__dirstamp) -rm -f src/test/$(DEPDIR)/$(am__dirstamp) -rm -f src/test/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \ clean-libLTLIBRARIES clean-libtool mostlyclean-am distclean: distclean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f src/$(DEPDIR)/mathicgb.Plo -rm -f src/cli/$(DEPDIR)/CommonParams.Po -rm -f src/cli/$(DEPDIR)/GBAction.Po -rm -f src/cli/$(DEPDIR)/GBCommonParams.Po -rm -f src/cli/$(DEPDIR)/GBMain.Po -rm -f src/cli/$(DEPDIR)/HelpAction.Po -rm -f src/cli/$(DEPDIR)/MatrixAction.Po -rm -f src/cli/$(DEPDIR)/SigGBAction.Po -rm -f src/mathicgb/$(DEPDIR)/Basis.Plo -rm -f src/mathicgb/$(DEPDIR)/CFile.Plo -rm -f src/mathicgb/$(DEPDIR)/ClassicGBAlg.Plo -rm -f src/mathicgb/$(DEPDIR)/F4MatrixBuilder.Plo -rm -f src/mathicgb/$(DEPDIR)/F4MatrixBuilder2.Plo -rm -f src/mathicgb/$(DEPDIR)/F4MatrixProjection.Plo -rm -f src/mathicgb/$(DEPDIR)/F4MatrixReducer.Plo -rm -f src/mathicgb/$(DEPDIR)/F4ProtoMatrix.Plo -rm -f src/mathicgb/$(DEPDIR)/F4Reducer.Plo -rm -f src/mathicgb/$(DEPDIR)/LogDomain.Plo -rm -f src/mathicgb/$(DEPDIR)/LogDomainSet.Plo -rm -f src/mathicgb/$(DEPDIR)/ModuleMonoSet.Plo -rm -f src/mathicgb/$(DEPDIR)/MonoLookup.Plo -rm -f src/mathicgb/$(DEPDIR)/PolyBasis.Plo -rm -f src/mathicgb/$(DEPDIR)/PolyHashTable.Plo -rm -f src/mathicgb/$(DEPDIR)/PolyRing.Plo -rm -f src/mathicgb/$(DEPDIR)/QuadMatrix.Plo -rm -f src/mathicgb/$(DEPDIR)/QuadMatrixBuilder.Plo -rm -f src/mathicgb/$(DEPDIR)/Reducer.Plo -rm -f src/mathicgb/$(DEPDIR)/ReducerDedup.Plo -rm -f src/mathicgb/$(DEPDIR)/ReducerHash.Plo -rm -f src/mathicgb/$(DEPDIR)/ReducerHashPack.Plo -rm -f src/mathicgb/$(DEPDIR)/ReducerNoDedup.Plo -rm -f src/mathicgb/$(DEPDIR)/ReducerPack.Plo -rm -f src/mathicgb/$(DEPDIR)/ReducerPackDedup.Plo -rm -f src/mathicgb/$(DEPDIR)/SPairs.Plo -rm -f src/mathicgb/$(DEPDIR)/Scanner.Plo -rm -f src/mathicgb/$(DEPDIR)/SigPolyBasis.Plo -rm -f src/mathicgb/$(DEPDIR)/SigSPairQueue.Plo -rm -f src/mathicgb/$(DEPDIR)/SigSPairs.Plo -rm -f src/mathicgb/$(DEPDIR)/SignatureGB.Plo -rm -f src/mathicgb/$(DEPDIR)/SparseMatrix.Plo -rm -f src/mathicgb/$(DEPDIR)/TypicalReducer.Plo -rm -f src/mathicgb/$(DEPDIR)/io-util.Plo -rm -f src/test/$(DEPDIR)/F4MatrixBuilder.Po -rm -f src/test/$(DEPDIR)/F4MatrixReducer.Po -rm -f src/test/$(DEPDIR)/MathicIO.Po -rm -f src/test/$(DEPDIR)/MonoMonoid.Po -rm -f src/test/$(DEPDIR)/PrimeField.Po -rm -f src/test/$(DEPDIR)/QuadMatrixBuilder.Po -rm -f src/test/$(DEPDIR)/Range.Po -rm -f src/test/$(DEPDIR)/Scanner.Po -rm -f src/test/$(DEPDIR)/SparseMatrix.Po -rm -f src/test/$(DEPDIR)/gb-test.Po -rm -f src/test/$(DEPDIR)/ideals.Po -rm -f src/test/$(DEPDIR)/mathicgb.Po -rm -f src/test/$(DEPDIR)/poly-test.Po -rm -f src/test/$(DEPDIR)/testMain.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-libtool distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-mathicgbA_includeHEADERS \ install-mathicgbB_includeHEADERS install-pkgconfigDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f src/$(DEPDIR)/mathicgb.Plo -rm -f src/cli/$(DEPDIR)/CommonParams.Po -rm -f src/cli/$(DEPDIR)/GBAction.Po -rm -f src/cli/$(DEPDIR)/GBCommonParams.Po -rm -f src/cli/$(DEPDIR)/GBMain.Po -rm -f src/cli/$(DEPDIR)/HelpAction.Po -rm -f src/cli/$(DEPDIR)/MatrixAction.Po -rm -f src/cli/$(DEPDIR)/SigGBAction.Po -rm -f src/mathicgb/$(DEPDIR)/Basis.Plo -rm -f src/mathicgb/$(DEPDIR)/CFile.Plo -rm -f src/mathicgb/$(DEPDIR)/ClassicGBAlg.Plo -rm -f src/mathicgb/$(DEPDIR)/F4MatrixBuilder.Plo -rm -f src/mathicgb/$(DEPDIR)/F4MatrixBuilder2.Plo -rm -f src/mathicgb/$(DEPDIR)/F4MatrixProjection.Plo -rm -f src/mathicgb/$(DEPDIR)/F4MatrixReducer.Plo -rm -f src/mathicgb/$(DEPDIR)/F4ProtoMatrix.Plo -rm -f src/mathicgb/$(DEPDIR)/F4Reducer.Plo -rm -f src/mathicgb/$(DEPDIR)/LogDomain.Plo -rm -f src/mathicgb/$(DEPDIR)/LogDomainSet.Plo -rm -f src/mathicgb/$(DEPDIR)/ModuleMonoSet.Plo -rm -f src/mathicgb/$(DEPDIR)/MonoLookup.Plo -rm -f src/mathicgb/$(DEPDIR)/PolyBasis.Plo -rm -f src/mathicgb/$(DEPDIR)/PolyHashTable.Plo -rm -f src/mathicgb/$(DEPDIR)/PolyRing.Plo -rm -f src/mathicgb/$(DEPDIR)/QuadMatrix.Plo -rm -f src/mathicgb/$(DEPDIR)/QuadMatrixBuilder.Plo -rm -f src/mathicgb/$(DEPDIR)/Reducer.Plo -rm -f src/mathicgb/$(DEPDIR)/ReducerDedup.Plo -rm -f src/mathicgb/$(DEPDIR)/ReducerHash.Plo -rm -f src/mathicgb/$(DEPDIR)/ReducerHashPack.Plo -rm -f src/mathicgb/$(DEPDIR)/ReducerNoDedup.Plo -rm -f src/mathicgb/$(DEPDIR)/ReducerPack.Plo -rm -f src/mathicgb/$(DEPDIR)/ReducerPackDedup.Plo -rm -f src/mathicgb/$(DEPDIR)/SPairs.Plo -rm -f src/mathicgb/$(DEPDIR)/Scanner.Plo -rm -f src/mathicgb/$(DEPDIR)/SigPolyBasis.Plo -rm -f src/mathicgb/$(DEPDIR)/SigSPairQueue.Plo -rm -f src/mathicgb/$(DEPDIR)/SigSPairs.Plo -rm -f src/mathicgb/$(DEPDIR)/SignatureGB.Plo -rm -f src/mathicgb/$(DEPDIR)/SparseMatrix.Plo -rm -f src/mathicgb/$(DEPDIR)/TypicalReducer.Plo -rm -f src/mathicgb/$(DEPDIR)/io-util.Plo -rm -f src/test/$(DEPDIR)/F4MatrixBuilder.Po -rm -f src/test/$(DEPDIR)/F4MatrixReducer.Po -rm -f src/test/$(DEPDIR)/MathicIO.Po -rm -f src/test/$(DEPDIR)/MonoMonoid.Po -rm -f src/test/$(DEPDIR)/PrimeField.Po -rm -f src/test/$(DEPDIR)/QuadMatrixBuilder.Po -rm -f src/test/$(DEPDIR)/Range.Po -rm -f src/test/$(DEPDIR)/Scanner.Po -rm -f src/test/$(DEPDIR)/SparseMatrix.Po -rm -f src/test/$(DEPDIR)/gb-test.Po -rm -f src/test/$(DEPDIR)/ideals.Po -rm -f src/test/$(DEPDIR)/mathicgb.Po -rm -f src/test/$(DEPDIR)/poly-test.Po -rm -f src/test/$(DEPDIR)/testMain.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-libLTLIBRARIES \ uninstall-man uninstall-mathicgbA_includeHEADERS \ uninstall-mathicgbB_includeHEADERS uninstall-pkgconfigDATA uninstall-man: uninstall-man1 .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles am--refresh check \ check-TESTS check-am clean clean-binPROGRAMS \ clean-checkPROGRAMS clean-cscope clean-generic \ clean-libLTLIBRARIES clean-libtool cscope cscopelist-am ctags \ ctags-am dist dist-all dist-bzip2 dist-gzip dist-lzip \ dist-shar dist-tarZ dist-xz dist-zip dist-zstd distcheck \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ install install-am install-binPROGRAMS install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-libLTLIBRARIES install-man \ install-man1 install-mathicgbA_includeHEADERS \ install-mathicgbB_includeHEADERS install-pdf install-pdf-am \ install-pkgconfigDATA install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-libLTLIBRARIES uninstall-man \ uninstall-man1 uninstall-mathicgbA_includeHEADERS \ uninstall-mathicgbB_includeHEADERS uninstall-pkgconfigDATA .PRECIOUS: Makefile # this prevents g++ 4.8.2 from crashing and churning through memory when compiling under Ubuntu 64 14.04.1 @with_gtest_TRUE@src/test/MonoMonoid.o src/test/Range.o : CXXFLAGS += -O0 @with_gtest_FALSE@check: @with_gtest_FALSE@ @echo @with_gtest_FALSE@ @echo "configured without gtest, so unittests cannot be run." # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: mathicgb-1.1/autogen.sh0000775000175000017500000000012214560325357010622 #!/bin/sh srcdir="`dirname '$0'`" autoreconf --verbose --install --force $srcdir