diff options
| author | Alexander Neumann <30894796+Neumann-A@users.noreply.github.com> | 2020-08-12 19:28:41 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-08-12 10:28:41 -0700 |
| commit | f3b96f339c3179f8f1c46b412d192e0c8a84eb5e (patch) | |
| tree | 1602ac95f8097220ffb55a62bbce63322cab3a5b | |
| parent | dea76199aad32b41af3e6d33a265d62d187a3da2 (diff) | |
| download | vcpkg-f3b96f339c3179f8f1c46b412d192e0c8a84eb5e.tar.gz vcpkg-f3b96f339c3179f8f1c46b412d192e0c8a84eb5e.zip | |
[lapack-reference|fortran] Add new port (#12805)
* [vcpkg/script] add vcpkg_find_fortran
* [openblas] add pkg-config fixes
* [lapack] add lapack-reference and reduce dependency on clapack
* fix build issues
* dont touch any main files
* move toolchain var into parent scope
* fix a few more issues
* create link in the noblas case
* removed unnecessary check handled by vcpkg_find_fortran.
* move dumpbin check
* fix last issue
* depend on openblas
* set cmake_binary_dir so that compiler id run gets put into buildtree.
* more paths
* add missing PARENT_SCOPE
* ws change
* [mlpack] remove dep on clapack
* comment out patches
* remove openblas again
* Install lapack wrapper since it is missing linkage against -lm and -lgfortran
* PREPEND mingw path to make sure cmake picks it up correctly
* depend on openblas also on osx
* add clapack on windows to skip due to conflicting library installs
* add clapack to skip on linux
* add -fPIC as a fortran compiler flag
* do not add the flag on windows
* add gcc explicitly to the cmake args.
* ws change
* applyrequested changes from CR
* fix the failing patch
| -rw-r--r-- | ports/clapack/CONTROL | 2 | ||||
| -rw-r--r-- | ports/clapack/portfile.cmake | 6 | ||||
| -rw-r--r-- | ports/lapack-reference/CONTROL | 16 | ||||
| -rw-r--r-- | ports/lapack-reference/FindLAPACK.cmake | 568 | ||||
| -rw-r--r-- | ports/lapack-reference/portfile.cmake | 123 | ||||
| -rw-r--r-- | ports/lapack-reference/vcpkg-cmake-wrapper.cmake | 2 | ||||
| -rw-r--r-- | ports/lapack/CONTROL | 4 | ||||
| -rw-r--r-- | ports/lapack/clapack/FindLAPACK.cmake (renamed from ports/clapack/FindLAPACK.cmake) | 0 | ||||
| -rw-r--r-- | ports/lapack/clapack/vcpkg-cmake-wrapper.cmake (renamed from ports/clapack/vcpkg-cmake-wrapper.cmake) | 0 | ||||
| -rw-r--r-- | ports/lapack/portfile.cmake | 9 | ||||
| -rw-r--r-- | ports/mlpack/CONTROL | 2 | ||||
| -rw-r--r-- | ports/mlpack/cmakelists.patch | 18 | ||||
| -rw-r--r-- | ports/openblas/CONTROL | 5 | ||||
| -rw-r--r-- | ports/openblas/portfile.cmake | 32 | ||||
| -rw-r--r-- | ports/vcpkg-gfortran/CONTROL | 4 | ||||
| -rw-r--r-- | ports/vcpkg-gfortran/portfile.cmake | 53 | ||||
| -rw-r--r-- | scripts/ci.baseline.txt | 5 | ||||
| -rw-r--r-- | scripts/cmake/vcpkg_find_fortran.cmake | 61 |
18 files changed, 878 insertions, 32 deletions
diff --git a/ports/clapack/CONTROL b/ports/clapack/CONTROL index 76e53e29f..bbabc6ad8 100644 --- a/ports/clapack/CONTROL +++ b/ports/clapack/CONTROL @@ -1,6 +1,6 @@ Source: clapack Version: 3.2.1 -Port-Version: 13 +Port-Version: 14 Homepage: https://www.netlib.org/clapack Description: CLAPACK (f2c'ed version of LAPACK) Build-Depends: openblas (!osx) diff --git a/ports/clapack/portfile.cmake b/ports/clapack/portfile.cmake index 1de30b109..8fdbe7c42 100644 --- a/ports/clapack/portfile.cmake +++ b/ports/clapack/portfile.cmake @@ -11,7 +11,7 @@ vcpkg_extract_source_archive_ex( ARCHIVE ${ARCHIVE} PATCHES remove_internal_blas.patch - fix-ConfigFile.patch + fix-ConfigFile.patch fix-install.patch support-uwp.patch ) @@ -37,10 +37,6 @@ vcpkg_copy_pdbs() #TODO: fix the official exported targets, since they are broken (luckily it seems that no-one uses them for now) vcpkg_fixup_cmake_targets(CONFIG_PATH share/clapack) -#we install a cmake wrapper since the official FindLAPACK module in cmake does find clapack easily, unfortunately... -file(INSTALL ${CMAKE_CURRENT_LIST_DIR}/vcpkg-cmake-wrapper.cmake DESTINATION ${CURRENT_PACKAGES_DIR}/share/lapack) -file(INSTALL ${CMAKE_CURRENT_LIST_DIR}/FindLAPACK.cmake DESTINATION ${CURRENT_PACKAGES_DIR}/share/lapack) - file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include) # Handle copyright diff --git a/ports/lapack-reference/CONTROL b/ports/lapack-reference/CONTROL new file mode 100644 index 000000000..493e7f50e --- /dev/null +++ b/ports/lapack-reference/CONTROL @@ -0,0 +1,16 @@ +Source: lapack-reference
+Version: 3.8.0
+Description: LAPACK — Linear Algebra PACKage http://www.netlib.org/lapack/
+Default-Features: blas-select
+Build-Depends: vcpkg-gfortran (windows)
+
+Feature: cblas
+Description: Builds CBLAS
+
+Feature: noblas
+Build-Depends: openblas
+Description: Use external optimized BLAS
+
+Feature: blas-select
+Build-Depends: lapack-reference[core, noblas](!windows|(windows&!static))
+Description: Use external optimized BLAS
diff --git a/ports/lapack-reference/FindLAPACK.cmake b/ports/lapack-reference/FindLAPACK.cmake new file mode 100644 index 000000000..1edaa0f83 --- /dev/null +++ b/ports/lapack-reference/FindLAPACK.cmake @@ -0,0 +1,568 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+# file Copyright.txt or https://cmake.org/licensing for details.
+
+#[=======================================================================[.rst:
+FindLAPACK
+----------
+
+Find Linear Algebra PACKage (LAPACK) library
+
+This module finds an installed Fortran library that implements the
+LAPACK linear-algebra interface (see http://www.netlib.org/lapack/).
+
+The approach follows that taken for the ``autoconf`` macro file,
+``acx_lapack.m4`` (distributed at
+http://ac-archive.sourceforge.net/ac-archive/acx_lapack.html).
+
+Input Variables
+^^^^^^^^^^^^^^^
+
+The following variables may be set to influence this module's behavior:
+
+``BLA_STATIC``
+ if ``ON`` use static linkage
+
+``BLA_VENDOR``
+ If set, checks only the specified vendor, if not set checks all the
+ possibilities. List of vendors valid in this module:
+
+ * ``OpenBLAS``
+ * ``FLAME``
+ * ``Intel10_32`` (intel mkl v10 32 bit)
+ * ``Intel10_64lp`` (intel mkl v10+ 64 bit, threaded code, lp64 model)
+ * ``Intel10_64lp_seq`` (intel mkl v10+ 64 bit, sequential code, lp64 model)
+ * ``Intel10_64ilp`` (intel mkl v10+ 64 bit, threaded code, ilp64 model)
+ * ``Intel10_64ilp_seq`` (intel mkl v10+ 64 bit, sequential code, ilp64 model)
+ * ``Intel10_64_dyn`` (intel mkl v10+ 64 bit, single dynamic library)
+ * ``Intel`` (obsolete versions of mkl 32 and 64 bit)
+ * ``ACML``
+ * ``Apple``
+ * ``NAS``
+ * ``Arm``
+ * ``Arm_mp``
+ * ``Arm_ilp64``
+ * ``Arm_ilp64_mp``
+ * ``Generic``
+
+``BLA_F95``
+ if ``ON`` tries to find the BLAS95/LAPACK95 interfaces
+
+Imported targets
+^^^^^^^^^^^^^^^^
+
+This module defines the following :prop_tgt:`IMPORTED` target:
+
+``LAPACK::LAPACK``
+ The libraries to use for LAPACK, if found.
+
+Result Variables
+^^^^^^^^^^^^^^^^
+
+This module defines the following variables:
+
+``LAPACK_FOUND``
+ library implementing the LAPACK interface is found
+``LAPACK_LINKER_FLAGS``
+ uncached list of required linker flags (excluding ``-l`` and ``-L``).
+``LAPACK_LIBRARIES``
+ uncached list of libraries (using full path name) to link against
+ to use LAPACK
+``LAPACK95_LIBRARIES``
+ uncached list of libraries (using full path name) to link against
+ to use LAPACK95
+``LAPACK95_FOUND``
+ library implementing the LAPACK95 interface is found
+
+.. note::
+
+ C, CXX or Fortran must be enabled to detect a BLAS/LAPACK library.
+ C or CXX must be enabled to use Intel Math Kernel Library (MKL).
+
+ For example, to use Intel MKL libraries and/or Intel compiler:
+
+ .. code-block:: cmake
+
+ set(BLA_VENDOR Intel10_64lp)
+ find_package(LAPACK)
+#]=======================================================================]
+
+# Check the language being used
+if(NOT (CMAKE_C_COMPILER_LOADED OR CMAKE_CXX_COMPILER_LOADED OR CMAKE_Fortran_COMPILER_LOADED))
+ if(LAPACK_FIND_REQUIRED)
+ message(FATAL_ERROR "FindLAPACK requires Fortran, C, or C++ to be enabled.")
+ else()
+ message(STATUS "Looking for LAPACK... - NOT found (Unsupported languages)")
+ return()
+ endif()
+endif()
+
+if(CMAKE_Fortran_COMPILER_LOADED)
+ include(${CMAKE_ROOT}/Modules/CheckFortranFunctionExists.cmake)
+else()
+ include(${CMAKE_ROOT}/Modules/CheckFunctionExists.cmake)
+endif()
+include(${CMAKE_ROOT}/Modules/CMakePushCheckState.cmake)
+
+cmake_push_check_state()
+set(CMAKE_REQUIRED_QUIET ${LAPACK_FIND_QUIETLY})
+
+set(LAPACK_FOUND FALSE)
+set(LAPACK95_FOUND FALSE)
+
+set(_lapack_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
+if(BLA_STATIC)
+ if(WIN32)
+ set(CMAKE_FIND_LIBRARY_SUFFIXES .lib ${CMAKE_FIND_LIBRARY_SUFFIXES})
+ else()
+ set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
+ endif()
+else()
+ if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
+ # for ubuntu's libblas3gf and liblapack3gf packages
+ set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES} .so.3gf)
+ endif()
+endif()
+
+# TODO: move this stuff to a separate module
+
+macro(CHECK_LAPACK_LIBRARIES LIBRARIES _prefix _name _flags _list _threadlibs _addlibdir _subdirs _blas)
+ # This macro checks for the existence of the combination of fortran libraries
+ # given by _list. If the combination is found, this macro checks (using the
+ # Check_Fortran_Function_Exists macro) whether can link against that library
+ # combination using the name of a routine given by _name using the linker
+ # flags given by _flags. If the combination of libraries is found and passes
+ # the link test, LIBRARIES is set to the list of complete library paths that
+ # have been found. Otherwise, LIBRARIES is set to FALSE.
+
+ # N.B. _prefix is the prefix applied to the names of all cached variables that
+ # are generated internally and marked advanced by this macro.
+ # _addlibdir is a list of additional search paths. _subdirs is a list of path
+ # suffixes to be used by find_library().
+
+ set(_libraries_work TRUE)
+ set(${LIBRARIES})
+ set(_combined_name)
+
+ set(_extaddlibdir "${_addlibdir}")
+ if(WIN32)
+ list(APPEND _extaddlibdir ENV LIB)
+ elseif(APPLE)
+ list(APPEND _extaddlibdir ENV DYLD_LIBRARY_PATH)
+ else()
+ list(APPEND _extaddlibdir ENV LD_LIBRARY_PATH)
+ endif()
+ list(APPEND _extaddlibdir "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}")
+
+ foreach(_library ${_list})
+ if(_library MATCHES "^-Wl,--(start|end)-group$")
+ # Respect linker flags like --start/end-group (required by MKL)
+ set(${LIBRARIES} ${${LIBRARIES}} "${_library}")
+ else()
+ set(_combined_name ${_combined_name}_${_library})
+ if(_libraries_work)
+ find_library(${_prefix}_${_library}_LIBRARY
+ NAMES ${_library}
+ PATHS ${_extaddlibdir}
+ PATH_SUFFIXES ${_subdirs}
+ )
+ #message("DEBUG: find_library(${_library}) got ${${_prefix}_${_library}_LIBRARY}")
+ mark_as_advanced(${_prefix}_${_library}_LIBRARY)
+ set(${LIBRARIES} ${${LIBRARIES}} ${${_prefix}_${_library}_LIBRARY})
+ set(_libraries_work ${${_prefix}_${_library}_LIBRARY})
+ endif()
+ endif()
+ endforeach()
+
+ if(_libraries_work)
+ # Test this combination of libraries.
+ set(CMAKE_REQUIRED_LIBRARIES ${_flags} ${${LIBRARIES}} ${_blas} ${_threadlibs})
+ #message("DEBUG: CMAKE_REQUIRED_LIBRARIES = ${CMAKE_REQUIRED_LIBRARIES}")
+ if(CMAKE_Fortran_COMPILER_LOADED)
+ check_fortran_function_exists("${_name}" ${_prefix}${_combined_name}_WORKS)
+ else()
+ check_function_exists("${_name}_" ${_prefix}${_combined_name}_WORKS)
+ endif()
+ set(CMAKE_REQUIRED_LIBRARIES)
+ set(_libraries_work ${${_prefix}${_combined_name}_WORKS})
+ endif()
+
+ if(_libraries_work)
+ if("${_list}${_blas}" STREQUAL "")
+ set(${LIBRARIES} "${LIBRARIES}-PLACEHOLDER-FOR-EMPTY-LIBRARIES")
+ else()
+ set(${LIBRARIES} ${${LIBRARIES}} ${_blas} ${_threadlibs})
+ endif()
+ else()
+ set(${LIBRARIES} FALSE)
+ endif()
+ #message("DEBUG: ${LIBRARIES} = ${${LIBRARIES}}")
+endmacro()
+
+set(LAPACK_LINKER_FLAGS)
+set(LAPACK_LIBRARIES)
+set(LAPACK95_LIBRARIES)
+
+if(LAPACK_FIND_QUIETLY OR NOT LAPACK_FIND_REQUIRED)
+ find_package(BLAS)
+else()
+ find_package(BLAS REQUIRED)
+endif()
+
+if(BLAS_FOUND)
+ set(LAPACK_LINKER_FLAGS ${BLAS_LINKER_FLAGS})
+ if(NOT $ENV{BLA_VENDOR} STREQUAL "")
+ set(BLA_VENDOR $ENV{BLA_VENDOR})
+ else()
+ if(NOT BLA_VENDOR)
+ set(BLA_VENDOR "All")
+ endif()
+ endif()
+
+ # LAPACK in the Intel MKL 10+ library?
+ if(BLA_VENDOR MATCHES "Intel" OR BLA_VENDOR STREQUAL "All")
+ if(NOT LAPACK_LIBRARIES)
+ if(CMAKE_C_COMPILER_LOADED OR CMAKE_CXX_COMPILER_LOADED)
+ # System-specific settings
+ if(NOT WIN32)
+ set(LAPACK_mkl_LM "-lm")
+ set(LAPACK_mkl_LDL "-ldl")
+ endif()
+
+ if(LAPACK_FIND_QUIETLY OR NOT LAPACK_FIND_REQUIRED)
+ find_package(Threads)
+ else()
+ find_package(Threads REQUIRED)
+ endif()
+
+ if(BLA_VENDOR MATCHES "_64ilp")
+ set(LAPACK_mkl_ILP_MODE "ilp64")
+ else()
+ set(LAPACK_mkl_ILP_MODE "lp64")
+ endif()
+
+ set(LAPACK_SEARCH_LIBS "")
+
+ if(BLA_F95)
+ set(LAPACK_mkl_SEARCH_SYMBOL "cheev_f95")
+ set(_LIBRARIES LAPACK95_LIBRARIES)
+ set(_BLAS_LIBRARIES ${BLAS95_LIBRARIES})
+
+ # old
+ list(APPEND LAPACK_SEARCH_LIBS
+ "mkl_lapack95")
+ # new >= 10.3
+ list(APPEND LAPACK_SEARCH_LIBS
+ "mkl_intel_c")
+ list(APPEND LAPACK_SEARCH_LIBS
+ "mkl_lapack95_${LAPACK_mkl_ILP_MODE}")
+ else()
+ set(LAPACK_mkl_SEARCH_SYMBOL "cheev")
+ set(_LIBRARIES LAPACK_LIBRARIES)
+ set(_BLAS_LIBRARIES ${BLAS_LIBRARIES})
+
+ # old and new >= 10.3
+ list(APPEND LAPACK_SEARCH_LIBS
+ "mkl_lapack")
+ endif()
+
+ # MKL uses a multitude of partially platform-specific subdirectories:
+ if(BLA_VENDOR STREQUAL "Intel10_32")
+ set(LAPACK_mkl_ARCH_NAME "ia32")
+ else()
+ set(LAPACK_mkl_ARCH_NAME "intel64")
+ endif()
+ if(WIN32)
+ set(LAPACK_mkl_OS_NAME "win")
+ elseif(APPLE)
+ set(LAPACK_mkl_OS_NAME "mac")
+ else()
+ set(LAPACK_mkl_OS_NAME "lin")
+ endif()
+ if(DEFINED ENV{MKLROOT})
+ file(TO_CMAKE_PATH "$ENV{MKLROOT}" LAPACK_mkl_MKLROOT)
+ # If MKLROOT points to the subdirectory 'mkl', use the parent directory instead
+ # so we can better detect other relevant libraries in 'compiler' or 'tbb':
+ get_filename_component(LAPACK_mkl_MKLROOT_LAST_DIR "${LAPACK_mkl_MKLROOT}" NAME)
+ if(LAPACK_mkl_MKLROOT_LAST_DIR STREQUAL "mkl")
+ get_filename_component(LAPACK_mkl_MKLROOT "${LAPACK_mkl_MKLROOT}" DIRECTORY)
+ endif()
+ endif()
+ set(LAPACK_mkl_LIB_PATH_SUFFIXES
+ "compiler/lib" "compiler/lib/${LAPACK_mkl_ARCH_NAME}_${LAPACK_mkl_OS_NAME}"
+ "mkl/lib" "mkl/lib/${LAPACK_mkl_ARCH_NAME}_${LAPACK_mkl_OS_NAME}"
+ "lib/${LAPACK_mkl_ARCH_NAME}_${LAPACK_mkl_OS_NAME}")
+
+ # First try empty lapack libs
+ if(NOT ${_LIBRARIES})
+ check_lapack_libraries(
+ ${_LIBRARIES}
+ LAPACK
+ ${LAPACK_mkl_SEARCH_SYMBOL}
+ ""
+ ""
+ "${CMAKE_THREAD_LIBS_INIT};${LAPACK_mkl_LM};${LAPACK_mkl_LDL}"
+ "${LAPACK_mkl_MKLROOT}"
+ "${LAPACK_mkl_LIB_PATH_SUFFIXES}"
+ "${_BLAS_LIBRARIES}"
+ )
+ endif()
+
+ # Then try the search libs
+ foreach(IT ${LAPACK_SEARCH_LIBS})
+ string(REPLACE " " ";" SEARCH_LIBS ${IT})
+ if(NOT ${_LIBRARIES})
+ check_lapack_libraries(
+ ${_LIBRARIES}
+ LAPACK
+ ${LAPACK_mkl_SEARCH_SYMBOL}
+ ""
+ "${SEARCH_LIBS}"
+ "${CMAKE_THREAD_LIBS_INIT};${LAPACK_mkl_LM};${LAPACK_mkl_LDL}"
+ "${LAPACK_mkl_MKLROOT}"
+ "${LAPACK_mkl_LIB_PATH_SUFFIXES}"
+ "${_BLAS_LIBRARIES}"
+ )
+ endif()
+ endforeach()
+
+ unset(LAPACK_mkl_ILP_MODE)
+ unset(LAPACK_mkl_SEARCH_SYMBOL)
+ unset(LAPACK_mkl_LM)
+ unset(LAPACK_mkl_LDL)
+ unset(LAPACK_mkl_MKLROOT)
+ unset(LAPACK_mkl_ARCH_NAME)
+ unset(LAPACK_mkl_OS_NAME)
+ unset(LAPACK_mkl_LIB_PATH_SUFFIXES)
+ endif()
+ endif()
+ endif()
+
+ # gotoblas? (http://www.tacc.utexas.edu/tacc-projects/gotoblas2)
+ if(BLA_VENDOR STREQUAL "Goto" OR BLA_VENDOR STREQUAL "All")
+ if(NOT LAPACK_LIBRARIES)
+ check_lapack_libraries(
+ LAPACK_LIBRARIES
+ LAPACK
+ cheev
+ ""
+ "goto2"
+ ""
+ ""
+ ""
+ "${BLAS_LIBRARIES}"
+ )
+ endif()
+ endif()
+
+ # OpenBLAS? (http://www.openblas.net)
+ if(BLA_VENDOR STREQUAL "OpenBLAS" OR BLA_VENDOR STREQUAL "All")
+ if(NOT LAPACK_LIBRARIES)
+ check_lapack_libraries(
+ LAPACK_LIBRARIES
+ LAPACK
+ cheev
+ ""
+ "openblas"
+ ""
+ ""
+ ""
+ "${BLAS_LIBRARIES}"
+ )
+ endif()
+ endif()
+
+ # ArmPL? (https://developer.arm.com/tools-and-software/server-and-hpc/compile/arm-compiler-for-linux/arm-performance-libraries)
+ if(BLA_VENDOR MATCHES "Arm" OR BLA_VENDOR STREQUAL "All")
+
+ # Check for 64bit Integer support
+ if(BLA_VENDOR MATCHES "_ilp64")
+ set(LAPACK_armpl_LIB "armpl_ilp64")
+ else()
+ set(LAPACK_armpl_LIB "armpl_lp64")
+ endif()
+
+ # Check for OpenMP support, VIA BLA_VENDOR of Arm_mp or Arm_ipl64_mp
+ if(BLA_VENDOR MATCHES "_mp")
+ set(LAPACK_armpl_LIB "${LAPACK_armpl_LIB}_mp")
+ endif()
+
+ if(NOT LAPACK_LIBRARIES)
+ check_lapack_libraries(
+ LAPACK_LIBRARIES
+ LAPACK
+ cheev
+ ""
+ "${LAPACK_armpl_LIB}"
+ ""
+ ""
+ ""
+ "${BLAS_LIBRARIES}"
+ )
+ endif()
+ endif()
+
+ # FLAME's blis library? (https://github.com/flame/blis)
+ if(BLA_VENDOR STREQUAL "FLAME" OR BLA_VENDOR STREQUAL "All")
+ if(NOT LAPACK_LIBRARIES)
+ check_lapack_libraries(
+ LAPACK_LIBRARIES
+ LAPACK
+ cheev
+ ""
+ "flame"
+ ""
+ ""
+ ""
+ "${BLAS_LIBRARIES}"
+ )
+ endif()
+ endif()
+
+ # BLAS in acml library?
+ if(BLA_VENDOR MATCHES "ACML" OR BLA_VENDOR STREQUAL "All")
+ if(BLAS_LIBRARIES MATCHES ".+acml.+")
+ set(LAPACK_LIBRARIES ${BLAS_LIBRARIES})
+ endif()
+ endif()
+
+ # Apple LAPACK library?
+ if(BLA_VENDOR STREQUAL "Apple" OR BLA_VENDOR STREQUAL "All")
+ if(NOT LAPACK_LIBRARIES)
+ check_lapack_libraries(
+ LAPACK_LIBRARIES
+ LAPACK
+ cheev
+ ""
+ "Accelerate"
+ ""
+ ""
+ ""
+ "${BLAS_LIBRARIES}"
+ )
+ endif()
+ endif()
+
+ # Apple NAS (vecLib) library?
+ if(BLA_VENDOR STREQUAL "NAS" OR BLA_VENDOR STREQUAL "All")
+ if(NOT LAPACK_LIBRARIES)
+ check_lapack_libraries(
+ LAPACK_LIBRARIES
+ LAPACK
+ cheev
+ ""
+ "vecLib"
+ ""
+ ""
+ ""
+ "${BLAS_LIBRARIES}"
+ )
+ endif()
+ endif()
+
+ # Generic LAPACK library?
+ if(BLA_VENDOR STREQUAL "Generic" OR
+ BLA_VENDOR STREQUAL "ATLAS" OR
+ BLA_VENDOR STREQUAL "All")
+ if(NOT LAPACK_LIBRARIES)
+ check_lapack_libraries(
+ LAPACK_LIBRARIES
+ LAPACK
+ cheev
+ ""
+ "lapack"
+ ""
+ ""
+ ""
+ "${BLAS_LIBRARIES}"
+ )
+ endif()
+ if(NOT LAPACK_LIBRARIES AND NOT WIN32)
+ check_lapack_libraries(
+ LAPACK_LIBRARIES
+ LAPACK
+ cheev
+ ""
+ "lapack;-lm;-lgfortran"
+ ""
+ ""
+ ""
+ "${BLAS_LIBRARIES}"
+ )
+ endif()
+ endif()
+else()
+ message(STATUS "LAPACK requires BLAS")
+endif()
+
+if(BLA_F95)
+ if(LAPACK95_LIBRARIES)
+ set(LAPACK95_FOUND TRUE)
+ else()
+ set(LAPACK95_FOUND FALSE)
+ endif()
+ if(NOT LAPACK_FIND_QUIETLY)
+ if(LAPACK95_FOUND)
+ message(STATUS "A library with LAPACK95 API found.")
+ else()
+ if(LAPACK_FIND_REQUIRED)
+ message(FATAL_ERROR
+ "A required library with LAPACK95 API not found. Please specify library location."
+ )
+ else()
+ message(STATUS
+ "A library with LAPACK95 API not found. Please specify library location."
+ )
+ endif()
+ endif()
+ endif()
+ set(LAPACK_FOUND "${LAPACK95_FOUND}")
+ set(LAPACK_LIBRARIES "${LAPACK95_LIBRARIES}")
+else()
+ if(LAPACK_LIBRARIES)
+ set(LAPACK_FOUND TRUE)
+ else()
+ set(LAPACK_FOUND FALSE)
+ endif()
+
+ if(NOT LAPACK_FIND_QUIETLY)
+ if(LAPACK_FOUND)
+ message(STATUS "A library with LAPACK API found.")
+ else()
+ if(LAPACK_FIND_REQUIRED)
+ message(FATAL_ERROR
+ "A required library with LAPACK API not found. Please specify library location."
+ )
+ else()
+ message(STATUS
+ "A library with LAPACK API not found. Please specify library location."
+ )
+ endif()
+ endif()
+ endif()
+endif()
+
+# On compilers that implicitly link LAPACK (such as ftn, cc, and CC on Cray HPC machines)
+# we used a placeholder for empty LAPACK_LIBRARIES to get through our logic above.
+if(LAPACK_LIBRARIES STREQUAL "LAPACK_LIBRARIES-PLACEHOLDER-FOR-EMPTY-LIBRARIES")
+ set(LAPACK_LIBRARIES "")
+endif()
+
+if(NOT TARGET LAPACK::LAPACK)
+ add_library(LAPACK::LAPACK INTERFACE IMPORTED)
+ set(_lapack_libs "${LAPACK_LIBRARIES}")
+ if(_lapack_libs AND TARGET BLAS::BLAS)
+ # remove the ${BLAS_LIBRARIES} from the interface and replace it
+ # with the BLAS::BLAS target
+ list(REMOVE_ITEM _lapack_libs "${BLAS_LIBRARIES}")
+ endif()
+
+ if(_lapack_libs)
+ set_target_properties(LAPACK::LAPACK PROPERTIES
+ INTERFACE_LINK_LIBRARIES "${_lapack_libs}"
+ )
+ endif()
+ unset(_lapack_libs)
+endif()
+
+cmake_pop_check_state()
+set(CMAKE_FIND_LIBRARY_SUFFIXES ${_lapack_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})
diff --git a/ports/lapack-reference/portfile.cmake b/ports/lapack-reference/portfile.cmake new file mode 100644 index 000000000..1e3f8d6b6 --- /dev/null +++ b/ports/lapack-reference/portfile.cmake @@ -0,0 +1,123 @@ +#TODO: Features to add:
+# USE_XBLAS??? extended precision blas. needs xblas
+# LAPACKE should be its own PORT
+# USE_OPTIMIZED_LAPACK (Probably not what we want. Does a find_package(LAPACK): probably for LAPACKE only builds _> own port?)
+# LAPACKE Builds LAPACKE
+# LAPACKE_WITH_TMG Build LAPACKE with tmglib routines
+include(vcpkg_find_fortran)
+SET(VCPKG_POLICY_EMPTY_INCLUDE_FOLDER enabled)
+
+set(lapack_ver 3.8.0)
+
+vcpkg_from_github(
+ OUT_SOURCE_PATH SOURCE_PATH
+ REPO "Reference-LAPACK/lapack"
+ REF "v${lapack_ver}"
+ SHA512 17786cb7306fccdc9b4a242de7f64fc261ebe6a10b6ec55f519deb4cb673cb137e8742aa5698fd2dc52f1cd56d3bd116af3f593a01dcf6770c4dcc86c50b2a7f
+ HEAD_REF master
+)
+
+if(NOT VCPKG_TARGET_IS_WINDOWS)
+ set(ENV{FFLAGS} "$ENV{FFLAGS} -fPIC")
+endif()
+
+set(CBLAS OFF)
+if("cblas" IN_LIST FEATURES)
+ set(CBLAS ON)
+endif()
+
+set(USE_OPTIMIZED_BLAS OFF)
+if("noblas" IN_LIST FEATURES)
+ set(USE_OPTIMIZED_BLAS ON)
+ set(pcfile "${CURRENT_INSTALLED_DIR}/lib/pkgconfig/openblas.pc")
+ if(EXISTS "${pcfile}")
+ file(CREATE_LINK "${pcfile}" "${CURRENT_PACKAGES_DIR}/lib/pkgconfig/blas.pc" COPY_ON_ERROR)
+ endif()
+ set(pcfile "${CURRENT_INSTALLED_DIR}/debug/lib/pkgconfig/openblas.pc")
+ if(EXISTS "${pcfile}")
+ file(CREATE_LINK "${pcfile}" "${CURRENT_PACKAGES_DIR}/debug/lib/pkgconfig/blas.pc" COPY_ON_ERROR)
+ endif()
+endif()
+
+set(VCPKG_CRT_LINKAGE_BACKUP ${VCPKG_CRT_LINKAGE})
+vcpkg_find_fortran(FORTRAN_CMAKE)
+if(VCPKG_USE_INTERNAL_Fortran)
+ if(VCPKG_CRT_LINKAGE_BACKUP STREQUAL static)
+ # If openblas has been built with static crt linkage we cannot use it with gfortran!
+ set(USE_OPTIMIZED_BLAS OFF)
+ #Cannot use openblas from vcpkg if we are building with gfortran here.
+ if("noblas" IN_LIST FEATURES)
+ message(FATAL_ERROR "Feature 'noblas' cannot be used without supplying an external fortran compiler")
+ endif()
+ endif()
+else()
+ set(USE_OPTIMIZED_BLAS ON)
+endif()
+vcpkg_configure_cmake(
+ PREFER_NINJA
+ SOURCE_PATH ${SOURCE_PATH}
+ OPTIONS
+ "-DUSE_OPTIMIZED_BLAS=${USE_OPTIMIZED_BLAS}"
+ "-DCBLAS=${CBLAS}"
+ "${FORTRAN_CMAKE}"
+ )
+
+vcpkg_install_cmake()
+vcpkg_fixup_cmake_targets(CONFIG_PATH lib/cmake/lapack-${lapack_ver}) #Should the target path be lapack and not lapack-reference?
+
+set(pcfile "${CURRENT_PACKAGES_DIR}/lib/pkgconfig/lapack.pc")
+if(EXISTS "${pcfile}")
+ file(READ "${pcfile}" _contents)
+ set(_contents "prefix=${CURRENT_INSTALLED_DIR}\n${_contents}")
+ file(WRITE "${pcfile}" "${_contents}")
+endif()
+set(pcfile "${CURRENT_PACKAGES_DIR}/debug/lib/pkgconfig/lapack.pc")
+if(EXISTS "${pcfile}")
+ file(READ "${pcfile}" _contents)
+ set(_contents "prefix=${CURRENT_INSTALLED_DIR}/debug\n${_contents}")
+ file(WRITE "${pcfile}" "${_contents}")
+endif()
+if(NOT USE_OPTIMIZED_BLAS)
+ set(pcfile "${CURRENT_PACKAGES_DIR}/lib/pkgconfig/blas.pc")
+ if(EXISTS "${pcfile}")
+ file(READ "${pcfile}" _contents)
+ set(_contents "prefix=${CURRENT_INSTALLED_DIR}\n${_contents}")
+ file(WRITE "${pcfile}" "${_contents}")
+ endif()
+ set(pcfile "${CURRENT_PACKAGES_DIR}/debug/lib/pkgconfig/blas.pc")
+ if(EXISTS "${pcfile}")
+ file(READ "${pcfile}" _contents)
+ set(_contents "prefix=${CURRENT_INSTALLED_DIR}/debug\n${_contents}")
+ file(WRITE "${pcfile}" "${_contents}")
+ endif()
+endif()
+vcpkg_fixup_pkgconfig()
+vcpkg_copy_pdbs()
+
+# Handle copyright
+file(INSTALL "${SOURCE_PATH}/LICENSE" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}" RENAME copyright)
+
+# remove debug includs
+file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include)
+
+if(VCPKG_TARGET_IS_WINDOWS)
+ if(EXISTS "${CURRENT_PACKAGES_DIR}/lib/liblapack.lib")
+ file(RENAME "${CURRENT_PACKAGES_DIR}/lib/liblapack.lib" "${CURRENT_PACKAGES_DIR}/lib/lapack.lib")
+ endif()
+ if(EXISTS "${CURRENT_PACKAGES_DIR}/debug/lib/liblapack.lib")
+ file(RENAME "${CURRENT_PACKAGES_DIR}/debug/lib/liblapack.lib" "${CURRENT_PACKAGES_DIR}/debug/lib/lapack.lib")
+ endif()
+ if(NOT USE_OPTIMIZED_BLAS)
+ if(EXISTS "${CURRENT_PACKAGES_DIR}/lib/libblas.lib")
+ file(RENAME "${CURRENT_PACKAGES_DIR}/lib/libblas.lib" "${CURRENT_PACKAGES_DIR}/lib/blas.lib")
+ endif()
+ if(EXISTS "${CURRENT_PACKAGES_DIR}/debug/lib/libblas.lib")
+ file(RENAME "${CURRENT_PACKAGES_DIR}/debug/lib/libblas.lib" "${CURRENT_PACKAGES_DIR}/debug/lib/blas.lib")
+ endif()
+ endif()
+endif()
+
+if(NOT VCPKG_TARGET_IS_WINDOWS)
+ file(COPY ${CMAKE_CURRENT_LIST_DIR}/vcpkg-cmake-wrapper.cmake DESTINATION ${CURRENT_PACKAGES_DIR}/share/lapack)
+ file(COPY ${CMAKE_CURRENT_LIST_DIR}/FindLAPACK.cmake DESTINATION ${CURRENT_PACKAGES_DIR}/share/lapack)
+endif()
diff --git a/ports/lapack-reference/vcpkg-cmake-wrapper.cmake b/ports/lapack-reference/vcpkg-cmake-wrapper.cmake new file mode 100644 index 000000000..a91b040ca --- /dev/null +++ b/ports/lapack-reference/vcpkg-cmake-wrapper.cmake @@ -0,0 +1,2 @@ +message(STATUS "Using VCPKG FindLAPACK. Remove if CMake has been updated to account for -lm and -lgfortran in lapack-reference!") +include(${CMAKE_CURRENT_LIST_DIR}/FindLAPACK.cmake) diff --git a/ports/lapack/CONTROL b/ports/lapack/CONTROL index 0d7883a0e..c4e27f77d 100644 --- a/ports/lapack/CONTROL +++ b/ports/lapack/CONTROL @@ -1,4 +1,4 @@ Source: lapack
-Version: 0
+Version: 1
Description: Metapackage for packages which provide LAPACK
-Build-Depends: clapack (!osx)
\ No newline at end of file +Build-Depends: clapack ((arm&windows)|uwp), lapack-reference(!uwp&!(arm&windows))
\ No newline at end of file diff --git a/ports/clapack/FindLAPACK.cmake b/ports/lapack/clapack/FindLAPACK.cmake index 0b5924ff4..0b5924ff4 100644 --- a/ports/clapack/FindLAPACK.cmake +++ b/ports/lapack/clapack/FindLAPACK.cmake diff --git a/ports/clapack/vcpkg-cmake-wrapper.cmake b/ports/lapack/clapack/vcpkg-cmake-wrapper.cmake index 26a0a1624..26a0a1624 100644 --- a/ports/clapack/vcpkg-cmake-wrapper.cmake +++ b/ports/lapack/clapack/vcpkg-cmake-wrapper.cmake diff --git a/ports/lapack/portfile.cmake b/ports/lapack/portfile.cmake index cb7d75de9..ab7f28a0b 100644 --- a/ports/lapack/portfile.cmake +++ b/ports/lapack/portfile.cmake @@ -1,3 +1,10 @@ SET(VCPKG_POLICY_EMPTY_PACKAGE enabled)
# Make sure LAPACK can be found
-vcpkg_configure_cmake(SOURCE_PATH ${CURRENT_PORT_DIR})
+
+if(VCPKG_TARGET_IS_UWP OR VCPKG_TARGET_IS_WINDOWS AND VCPKG_TARGET_ARCHITECTURE MATCHES "arm")
+ # Install clapack wrappers.
+ file(INSTALL ${CMAKE_CURRENT_LIST_DIR}/clapack/vcpkg-cmake-wrapper.cmake DESTINATION ${CURRENT_PACKAGES_DIR}/share//${PORT})
+ file(INSTALL ${CMAKE_CURRENT_LIST_DIR}/clapack/FindLAPACK.cmake DESTINATION ${CURRENT_PACKAGES_DIR}/share//${PORT})
+endif()
+vcpkg_configure_cmake(SOURCE_PATH ${CURRENT_PORT_DIR}
+ OPTIONS -DCMAKE_PREFIX_PATH="${CURRENT_PACKAGES_DIR}")
diff --git a/ports/mlpack/CONTROL b/ports/mlpack/CONTROL index a56987c3b..252c66997 100644 --- a/ports/mlpack/CONTROL +++ b/ports/mlpack/CONTROL @@ -1,6 +1,6 @@ Source: mlpack Version: 3.2.2 -Port-Version: 4 +Port-Version: 5 Homepage: https://github.com/mlpack/mlpack Description: mlpack is a fast, flexible machine learning library, written in C++, that aims to provide fast, extensible implementations of cutting-edge machine learning algorithms. Build-Depends: openblas (!osx), lapack, boost, armadillo, ensmallen, stb diff --git a/ports/mlpack/cmakelists.patch b/ports/mlpack/cmakelists.patch index 9db41f912..79f176419 100644 --- a/ports/mlpack/cmakelists.patch +++ b/ports/mlpack/cmakelists.patch @@ -2,7 +2,7 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt index 26757a5..c200b40 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
-@@ -288,6 +288,7 @@ endif()
+@@ -288,6 +282,7 @@ endif()
# and find LAPACK and BLAS ourselves, using a slightly modified variant of the
# script Armadillo uses to find these.
if (WIN32)
@@ -10,16 +10,14 @@ index 26757a5..c200b40 100644 find_library(LAPACK_LIBRARY
NAMES lapack liblapack lapack_win32_MT lapack_win32
PATHS "C:/Program Files/Armadillo"
-@@ -305,24 +306,31 @@ if (WIN32)
+@@ -305,24 +306,25 @@ if (WIN32)
if (NOT BLAS_LIBRARY)
message(FATAL_ERROR "Cannot find BLAS library (.lib)!")
endif ()
+ endif()
-+ find_package(clapack CONFIG REQUIRED)
-+ set(LAPACK_LIBRARIES lapack)
-+ find_package(OpenBLAS CONFIG REQUIRED)
-+ set(BLAS_LIBRARIES OpenBLAS::OpenBLAS)
++ find_package(LAPACK REQUIRED)
++ find_package(BLAS REQUIRED)
# Piggyback LAPACK and BLAS linking into Armadillo link.
set(ARMADILLO_LIBRARIES
- ${ARMADILLO_LIBRARIES} ${BLAS_LIBRARY} ${LAPACK_LIBRARY})
@@ -28,23 +26,19 @@ index 26757a5..c200b40 100644 # Ensure that the libraries are added to the MSVC IDE runtime path.
- get_filename_component(BLAS_DIR ${BLAS_LIBRARY} DIRECTORY)
- get_filename_component(LAPACK_DIR ${LAPACK_LIBRARY} DIRECTORY)
-+ get_property(BLAS_DIR TARGET OpenBLAS::OpenBLAS PROPERTY IMPORTED_LOCATION_RELEASE)
-+ get_filename_component(BLAS_DIR ${BLAS_DIR} DIRECTORY)
-+ get_property(LAPACK_DIR TARGET lapack PROPERTY IMPORTED_LOCATION_RELEASE)
-+ get_filename_component(LAPACK_DIR ${LAPACK_DIR} DIRECTORY)
# Sometimes, especially with an OpenBLAS install via nuget, the DLLs are
# actually in ../../bin/x64/. Automatically add these.
- if (EXISTS "${BLAS_DIR}/../../bin/x64/")
- get_filename_component(BLAS_DLL_DIR "${BLAS_DIR}/../../bin/x64" ABSOLUTE)
-+ if (EXISTS "${BLAS_DIR}")
++ if (0)
+ get_filename_component(BLAS_DLL_DIR "${BLAS_DIR}" ABSOLUTE)
set(DLL_COPY_DIRS ${DLL_COPY_DIRS} "${BLAS_DLL_DIR}")
endif ()
- if (EXISTS "${LAPACK_DIR}/../../bin/x64/")
- get_filename_component(LAPACK_DLL_DIR "${LAPACK_DIR}/../../bin/x64" ABSOLUTE)
-+ if (EXISTS "${LAPACK_DIR}")
++ if (0)
+ get_filename_component(LAPACK_DLL_DIR "${LAPACK_DIR}" ABSOLUTE)
set(DLL_COPY_DIRS ${DLL_COPY_DIRS} "${BLAS_DLL_DIR}")
endif ()
diff --git a/ports/openblas/CONTROL b/ports/openblas/CONTROL index 3c2b0b7eb..ea246834d 100644 --- a/ports/openblas/CONTROL +++ b/ports/openblas/CONTROL @@ -1,5 +1,6 @@ Source: openblas -Version: 0.3.9-1 +Version: 0.3.9 +Port-Version: 2 Homepage: https://github.com/xianyi/OpenBLAS -Build-Depends: pthread (linux) +Build-Depends: pthread (linux&osx) Description: OpenBLAS is an optimized BLAS library based on GotoBLAS2 1.13 BSD version. diff --git a/ports/openblas/portfile.cmake b/ports/openblas/portfile.cmake index 2decb5883..57b9236ac 100644 --- a/ports/openblas/portfile.cmake +++ b/ports/openblas/portfile.cmake @@ -1,5 +1,3 @@ -include(vcpkg_common_functions) - vcpkg_from_github( OUT_SOURCE_PATH SOURCE_PATH REPO xianyi/OpenBLAS @@ -22,13 +20,15 @@ set(SED_EXE_PATH "${GIT_EXE_PATH}/../usr/bin") # openblas require perl to generate .def for exports vcpkg_find_acquire_program(PERL) get_filename_component(PERL_EXE_PATH ${PERL} DIRECTORY) -set(ENV{PATH} "$ENV{PATH};${PERL_EXE_PATH};${SED_EXE_PATH}") +set(PATH_BACKUP "$ENV{PATH}") +vcpkg_add_to_path("${PERL_EXE_PATH}") +vcpkg_add_to_path("${SED_EXE_PATH}") set(COMMON_OPTIONS -DBUILD_WITHOUT_LAPACK=ON) # for UWP version, must build non uwp first for helper # binaries. -if(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "WindowsStore") +if(VCPKG_TARGET_IS_UWP) message(STATUS "Building Windows helper files") set(TEMP_CMAKE_SYSTEM_NAME "${VCPKG_CMAKE_SYSTEM_NAME}") set(TEMP_CMAKE_SYSTEM_VERSION "${VCPKG_CMAKE_SYSTEM_VERSION}") @@ -46,7 +46,7 @@ if(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "WindowsStore") # add just built path to environment for gen_config_h.exe, # getarch.exe and getarch_2nd.exe - set(ENV{PATH} "$ENV{PATH};${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel") + vcpkg_add_to_path("${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel") # restore target build information set(VCPKG_CMAKE_SYSTEM_NAME "${TEMP_CMAKE_SYSTEM_NAME}") @@ -63,7 +63,7 @@ if(VCPKG_CMAKE_SYSTEM_NAME STREQUAL "WindowsStore") -DVS_WINRT_COMPONENT=TRUE "-DBLASHELPER_BINARY_DIR=${CURRENT_BUILDTREES_DIR}/x64-windows-rel") -elseif(NOT VCPKG_CMAKE_SYSTEM_NAME) +elseif(VCPKG_TARGET_IS_WINDOWS) vcpkg_configure_cmake( PREFER_NINJA SOURCE_PATH ${SOURCE_PATH} @@ -85,6 +85,23 @@ endif() vcpkg_install_cmake() vcpkg_fixup_cmake_targets(CONFIG_PATH share/cmake/OpenBLAS TARGET_PATH share/openblas) +set(ENV{PATH} "${PATH_BACKUP}") + +set(pcfile "${CURRENT_PACKAGES_DIR}/lib/pkgconfig/openblas.pc") +if(EXISTS "${pcfile}") + file(READ "${pcfile}" _contents) + set(_contents "prefix=${CURRENT_INSTALLED_DIR}\n${_contents}") + file(WRITE "${pcfile}" "${_contents}") + #file(CREATE_LINK "${pcfile}" "${CURRENT_PACKAGES_DIR}/lib/pkgconfig/blas.pc" COPY_ON_ERROR) +endif() +set(pcfile "${CURRENT_PACKAGES_DIR}/debug/lib/pkgconfig/openblas.pc") +if(EXISTS "${pcfile}") + file(READ "${pcfile}" _contents) + set(_contents "prefix=${CURRENT_INSTALLED_DIR}/debug\n${_contents}") + file(WRITE "${pcfile}" "${_contents}") + #file(CREATE_LINK "${pcfile}" "${CURRENT_PACKAGES_DIR}/debug/lib/pkgconfig/blas.pc" COPY_ON_ERROR) +endif() +vcpkg_fixup_pkgconfig() #maybe we need also to write a wrapper inside share/blas to search implicitly for openblas, whenever we feel it's ready for its own -config.cmake file # openblas do not make the config file , so I manually made this @@ -97,8 +114,7 @@ string(REPLACE "#include \"common.h\"" "#include \"openblas_common.h\"" CBLAS_H file(WRITE ${CURRENT_PACKAGES_DIR}/include/cblas.h "${CBLAS_H}") # openblas is BSD -file(COPY ${SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/openblas) -file(RENAME ${CURRENT_PACKAGES_DIR}/share/openblas/LICENSE ${CURRENT_PACKAGES_DIR}/share/openblas/copyright) +file(INSTALL ${SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/${PORT} RENAME copyright) file(COPY ${CMAKE_CURRENT_LIST_DIR}/vcpkg-cmake-wrapper.cmake DESTINATION ${CURRENT_PACKAGES_DIR}/share/blas) file(COPY ${CMAKE_CURRENT_LIST_DIR}/FindBLAS.cmake DESTINATION ${CURRENT_PACKAGES_DIR}/share/blas) diff --git a/ports/vcpkg-gfortran/CONTROL b/ports/vcpkg-gfortran/CONTROL new file mode 100644 index 000000000..80484175a --- /dev/null +++ b/ports/vcpkg-gfortran/CONTROL @@ -0,0 +1,4 @@ +Source: vcpkg-gfortran
+Version: 1
+Description: Metaport to install gfortran dependencies from msys if VCPKG_USE_EXTERNAL_Fortran is false
+Supports: windows & !arm
\ No newline at end of file diff --git a/ports/vcpkg-gfortran/portfile.cmake b/ports/vcpkg-gfortran/portfile.cmake new file mode 100644 index 000000000..5dd1965cd --- /dev/null +++ b/ports/vcpkg-gfortran/portfile.cmake @@ -0,0 +1,53 @@ +vcpkg_fail_port_install(ON_ARCH "arm" ON_TARGET "linux" "osx")
+include(vcpkg_find_fortran)
+vcpkg_find_fortran(FORTRAN_CMAKE)
+if(VCPKG_USE_INTERNAL_Fortran)
+ set(VCPKG_CRT_LINKAGE dynamic) # Will always be dynamic no way to overwrite internal CRT linkage here
+ vcpkg_check_linkage(ONLY_DYNAMIC_LIBRARY)
+ if(DEFINED ENV{PROCESSOR_ARCHITEW6432})
+ set(HOST_ARCH $ENV{PROCESSOR_ARCHITEW6432})
+ else()
+ set(HOST_ARCH $ENV{PROCESSOR_ARCHITECTURE})
+ endif()
+
+ if(HOST_ARCH MATCHES "(amd|AMD)64")
+ set(MINGW_W w64)
+ set(MSYS_HOST x86_64)
+ elseif(HOST_ARCH MATCHES "(x|X)86")
+ set(MINGW_W w32)
+ set(MSYS_HOST i686)
+ else()
+ message(FATAL_ERROR "Unsupported host architecture ${HOST_ARCH}!" )
+ endif()
+
+ if(VCPKG_TARGET_ARCHITECTURE MATCHES "(x|X)64")
+ set(MSYS_TARGET x86_64)
+ set(MINGW_W_TARGET 64)
+ set(GCC_LIB_SUFFIX s_seh-1)
+ elseif(VCPKG_TARGET_ARCHITECTURE MATCHES "(x|X)86")
+ set(MSYS_TARGET i686)
+ set(MINGW_W_TARGET 32)
+ set(GCC_LIB_SUFFIX s_dw2-1)
+ else()
+ message(FATAL_ERROR "Unsupported target architecture ${VCPKG_TARGET_ARCHITECTURE}!" )
+ endif()
+
+
+ vcpkg_acquire_msys(MSYS_ROOT PACKAGES "mingw-w64-${MSYS_TARGET}-gcc-fortran") # TODO: make x86 work
+
+ set(MINGW_BIN "${MSYS_ROOT}/mingw${MINGW_W_TARGET}/bin/")
+ set(MINGW_Fortran_DLLS "${MINGW_BIN}/libgfortran-5.dll"
+ "${MINGW_BIN}/libquadmath-0.dll"
+ "${MINGW_BIN}/libwinpthread-1.dll"
+ "${MINGW_BIN}/libgcc_${GCC_LIB_SUFFIX}.dll")
+ file(INSTALL ${MINGW_Fortran_DLLS} DESTINATION "${CURRENT_PACKAGES_DIR}/bin")
+ file(INSTALL ${MINGW_Fortran_DLLS} DESTINATION "${CURRENT_PACKAGES_DIR}/debug/bin")
+ set(VCPKG_POLICY_SKIP_DUMPBIN_CHECKS enabled) # due to outdated msvcrt
+ set(VCPKG_POLICY_DLLS_WITHOUT_LIBS enabled)
+ set(VCPKG_POLICY_EMPTY_INCLUDE_FOLDER enabled)
+ file(INSTALL "${MSYS_ROOT}/mingw${MINGW_W_TARGET}/share/licenses/winpthreads" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}/license")
+ file(INSTALL "${MSYS_ROOT}/mingw${MINGW_W_TARGET}/share/licenses/gcc-libs" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}/license")
+ file(INSTALL "${MSYS_ROOT}/mingw${MINGW_W_TARGET}/share/licenses/crt/COPYING.MinGW-w64-runtime.txt" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}" RENAME copyright)
+else()
+ set(VCPKG_POLICY_EMPTY_PACKAGE enabled)
+endif()
\ No newline at end of file diff --git a/scripts/ci.baseline.txt b/scripts/ci.baseline.txt index a6cc7c886..9bf7bcf16 100644 --- a/scripts/ci.baseline.txt +++ b/scripts/ci.baseline.txt @@ -208,6 +208,11 @@ chmlib:x64-uwp=fail civetweb:arm64-windows = skip civetweb:arm-uwp = skip civetweb:x64-uwp = skip +# clapack is replaced by lapack-reference. +clapack:x64-linux = skip +clapack:x64-windows = skip +clapack:x64-windows-static = skip +clapack:x86-windows = skip clapack:x64-uwp=fail clblas:arm64-windows=fail clblast:x64-linux=fail diff --git a/scripts/cmake/vcpkg_find_fortran.cmake b/scripts/cmake/vcpkg_find_fortran.cmake new file mode 100644 index 000000000..e6be2722e --- /dev/null +++ b/scripts/cmake/vcpkg_find_fortran.cmake @@ -0,0 +1,61 @@ +## # vcpkg_find_fortran
+##
+## Checks if a Fortran compiler can be found.
+## Windows(x86/x64) Only: If not it will switch/enable MinGW gfortran
+## and return required cmake args for building.
+##
+## ## Usage
+## ```cmake
+## vcpkg_find_fortran(<additional_cmake_args_out>
+## )
+## ```
+
+function(vcpkg_find_fortran additional_cmake_args_out)
+ set(ARGS_OUT)
+ set(CMAKE_BINARY_DIR "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}")
+ set(CMAKE_CURRENT_BINARY_DIR "${CMAKE_BINARY_DIR}")
+ set(CMAKE_PLATFORM_INFO_DIR "${CMAKE_BINARY_DIR}/Platform")
+ include(CMakeDetermineFortranCompiler)
+ if(NOT CMAKE_Fortran_COMPILER AND NOT VCPKG_CHAINLOAD_TOOLCHAIN_FILE)
+ # This intentionally breaks users with a custom toolchain which do not have a Fortran compiler setup
+ # because they either need to use a port-overlay (for e.g. lapack), remove the toolchain for the port using fortran
+ # or setup fortran in their VCPKG_CHAINLOAD_TOOLCHAIN_FILE themselfs!
+ if(WIN32)
+ message(STATUS "No Fortran compiler found on the PATH. Using MinGW gfortran!")
+ # If no Fortran compiler is on the path we switch to use gfortan from MinGW within vcpkg
+ set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE "${SCRIPTS}/toolchains/mingw.cmake") # Switching to mingw toolchain
+ if(VCPKG_TARGET_ARCHITECTURE STREQUAL "x86")
+ set(MINGW_PATH mingw32)
+ set(MSYS_TARGET i686)
+ set(MACHINE_FLAG -m32)
+ elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "x64")
+ set(MINGW_PATH mingw64)
+ set(MSYS_TARGET x86_64)
+ set(MACHINE_FLAG -m64)
+ else()
+ message(FATAL_ERROR "Unknown architecture '${VCPKG_TARGET_ARCHITECTURE}' for MinGW Fortran build!")
+ endif()
+ vcpkg_acquire_msys(MSYS_ROOT "mingw-w64-${MSYS_TARGET}-gcc-fortran")
+ set(MINGW_BIN "${MSYS_ROOT}/${MINGW_PATH}/bin")
+ vcpkg_add_to_path(PREPEND "${MINGW_BIN}")
+ list(APPEND ARGS_OUT -DCMAKE_GNUtoMS=ON
+ "-DCMAKE_Fortran_COMPILER=${MINGW_BIN}/gfortran.exe"
+ "-DCMAKE_C_COMPILER=${MINGW_BIN}/gcc.exe"
+ "-DCMAKE_Fortran_FLAGS_INIT:STRING= -mabi=ms ${MACHINE_FLAG} ${VCPKG_Fortran_FLAGS}")
+ set(VCPKG_USE_INTERNAL_Fortran TRUE PARENT_SCOPE)
+ set(VCPKG_POLICY_SKIP_DUMPBIN_CHECKS enabled PARENT_SCOPE)
+ set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE "${SCRIPTS}/toolchains/mingw.cmake" PARENT_SCOPE) # Switching to MinGW toolchain for Fortran
+ if(VCPKG_CRT_LINKAGE STREQUAL "static")
+ set(VCPKG_CRT_LINKAGE dynamic PARENT_SCOPE)
+ message(STATUS "VCPKG_CRT_LINKAGE linkage for ${PORT} using vcpkg's internal gfortran cannot be static due to linking against MinGW libraries. Forcing dynamic CRT linkage")
+ endif()
+ if(VCPKG_LIBRARY_LINKAGE STREQUAL "static")
+ set(VCPKG_LIBRARY_LINKAGE dynamic PARENT_SCOPE)
+ message(STATUS "VCPKG_LIBRARY_LINKAGE linkage for ${PORT} using vcpkg's internal gfortran cannot be static due to linking against MinGW libraries. Forcing dynamic library linkage")
+ endif()
+ else()
+ message(FATAL_ERROR "Unable to find a Fortran compiler using 'CMakeDetermineFortranCompiler'. Please install one (e.g. gfortran) and make it available on the PATH!")
+ endif()
+ endif()
+ set(${additional_cmake_args_out} ${ARGS_OUT} PARENT_SCOPE)
+endfunction()
\ No newline at end of file |
