Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[vcpkg/fortran] Switch to ifort as the Fortran compiler #19413

Closed
wants to merge 61 commits into from
Closed
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
e913fac
add fortran helper port
Neumann-A Aug 6, 2021
7c044f0
update lapack port and switch to new fortran helper
Neumann-A Aug 6, 2021
b013d52
[skip ci] cleanup
Neumann-A Aug 6, 2021
265dc58
[skip ci] add vcpkg-ifort to copy dlls + more cleanup
Neumann-A Aug 6, 2021
748c1a6
Merge remote-tracking branch 'upstream/master' into use_oneapi_fortran
Neumann-A Aug 13, 2021
aa1bae1
[skip actions] apply format diff
Neumann-A Aug 13, 2021
7f18045
[skip actions] consider 19 20 and 21 and a bit of cleanup
Neumann-A Aug 13, 2021
1598ae8
[skip actions] fix vcpkg-ifort
Neumann-A Aug 13, 2021
d9578d8
[skip actions] make it work in static builds
Neumann-A Aug 13, 2021
95e522e
Merge remote-tracking branch 'upstream/master' into use_oneapi_fortran
Neumann-A Aug 16, 2021
4645f90
[skip actions] fix uwp builds.
Neumann-A Aug 16, 2021
5dae300
[skip actions] apply format diff
Neumann-A Aug 16, 2021
958dcf4
Merge remote-tracking branch 'upstream/master' into use_oneapi_fortran
Neumann-A Aug 18, 2021
165a35d
Merge branch 'use_oneapi_fortran' of https://github.com/Neumann-A/vcp…
Neumann-A Aug 18, 2021
5bbd0ff
[skip actions] update vcpkg-fortran to the changes made in rollup
Neumann-A Aug 18, 2021
ebe763f
[skip actions] switch to version-date and revert changes to the portfile
Neumann-A Aug 18, 2021
0c88af0
[skip actions] version stuff
Neumann-A Aug 18, 2021
920d824
add lapack-reference:x64-uwp=skip on the ci baseline until VM is upda…
Neumann-A Aug 18, 2021
23b8903
revisit portfile of vcpkg-ifort
Neumann-A Aug 18, 2021
a4a8d4b
overwrite version
Neumann-A Aug 18, 2021
a5a5cbb
fix dependency stuff.
Neumann-A Aug 19, 2021
1ca71a6
Merge remote-tracking branch 'upstream/master' into use_oneapi_fortran
Neumann-A Aug 19, 2021
72e9b55
fix manifest stuff
Neumann-A Aug 19, 2021
18a79ac
version stuff
Neumann-A Aug 19, 2021
ef66652
fix supports field
Neumann-A Aug 19, 2021
81334b6
update version
Neumann-A Aug 19, 2021
4b11744
Merge remote-tracking branch 'upstream/master' into use_oneapi_fortran
Neumann-A Sep 3, 2021
3a2aa16
update version stuff lost in merge
Neumann-A Sep 3, 2021
51bc1c8
Merge remote-tracking branch 'upstream/master' into use_oneapi_fortran
Neumann-A Sep 30, 2021
fa3d306
version stuff
Neumann-A Sep 30, 2021
fdeac76
remove ws change in baseline
Neumann-A Sep 30, 2021
190d8ae
Merge remote-tracking branch 'upstream/master' into use_oneapi_fortran
Neumann-A Oct 26, 2021
2834bf1
Merge remote-tracking branch 'upstream/master' into use_oneapi_fortran
Neumann-A Dec 27, 2021
a1c7798
version stuff
Neumann-A Dec 27, 2021
e548037
Merge branch 'use_oneapi_fortran' of https://github.com/Neumann-A/vcp…
Neumann-A Dec 27, 2021
bd501bb
Merge remote-tracking branch 'upstream/master' into use_oneapi_fortran
Neumann-A Jan 27, 2022
5df8d64
version stuff
Neumann-A Jan 27, 2022
83cd7b1
Merge remote-tracking branch 'upstream/master' into use_oneapi_fortran
Feb 22, 2022
0365bde
add license stuff
Feb 22, 2022
ff140f3
version stuff
Feb 22, 2022
f92a679
make helper ports use host dependencies
Feb 22, 2022
237e6ad
version stuff
Feb 22, 2022
1f3d434
remove wrong dep
Feb 22, 2022
d5046a2
version stuff
Feb 22, 2022
0a948fe
remove deprecated function
Feb 23, 2022
0dd65bb
version stuff
Feb 23, 2022
dc90292
Merge remote-tracking branch 'upstream/master' into use_oneapi_fortran
Feb 24, 2022
abfc0f0
Merge remote-tracking branch 'upstream/master' into use_oneapi_fortran
Neumann-A Mar 17, 2022
0609d55
version stuff
Neumann-A Mar 17, 2022
bf21246
fix license file
Mar 18, 2022
f94bb10
v stuff
Mar 18, 2022
b3a7158
debug stuff
Mar 18, 2022
9e0234c
Merge remote-tracking branch 'upstream/master' into use_oneapi_fortran
Neumann-A Apr 17, 2022
d6c3f7d
Merge remote-tracking branch 'upstream/master' into use_oneapi_fortran
Apr 20, 2022
a83fda7
version stuff
Neumann-A Apr 23, 2022
b0d0816
Merge remote-tracking branch 'upstream/master' into use_oneapi_fortran
Apr 27, 2022
c51de5e
detect intel fortran compiler to apply patch in lapack.
Apr 27, 2022
5f56132
version stuff
Apr 27, 2022
32dd4db
Merge remote-tracking branch 'upstream/master' into use_oneapi_fortran
Apr 28, 2022
e111bf2
version date bump
Apr 28, 2022
bf206e2
version stuff
Apr 28, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 0 additions & 17 deletions ports/lapack-reference/CONTROL

This file was deleted.

28 changes: 28 additions & 0 deletions ports/lapack-reference/intel.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
diff --git a/INSTALL/dsecnd_EXT_ETIME.f b/INSTALL/dsecnd_EXT_ETIME.f
index 35377643b..f98aad7a9 100644
--- a/INSTALL/dsecnd_EXT_ETIME.f
+++ b/INSTALL/dsecnd_EXT_ETIME.f
@@ -34,6 +34,9 @@
*
* =====================================================================
DOUBLE PRECISION FUNCTION DSECND( )
+#if defined(__INTEL_COMPILER)
+ USE IFPORT
+#endif
*
* -- LAPACK auxiliary routine --
* -- LAPACK is a software package provided by Univ. of Tennessee, --
diff --git a/INSTALL/second_EXT_ETIME.f b/INSTALL/second_EXT_ETIME.f
index 43044cda7..0e2a9a331 100644
--- a/INSTALL/second_EXT_ETIME.f
+++ b/INSTALL/second_EXT_ETIME.f
@@ -34,6 +34,9 @@
*
* =====================================================================
REAL FUNCTION SECOND( )
+#if defined(__INTEL_COMPILER)
+ USE IFPORT
+#endif
*
* -- LAPACK auxiliary routine --
* -- LAPACK is a software package provided by Univ. of Tennessee, --
32 changes: 17 additions & 15 deletions ports/lapack-reference/portfile.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,15 @@ endif()
include(vcpkg_find_fortran)
SET(VCPKG_POLICY_EMPTY_INCLUDE_FOLDER enabled)

set(lapack_ver 3.8.0)
set(lapack_ver 3.10.0)

vcpkg_from_github(
OUT_SOURCE_PATH SOURCE_PATH
REPO "Reference-LAPACK/lapack"
REF "v${lapack_ver}"
SHA512 17786cb7306fccdc9b4a242de7f64fc261ebe6a10b6ec55f519deb4cb673cb137e8742aa5698fd2dc52f1cd56d3bd116af3f593a01dcf6770c4dcc86c50b2a7f
SHA512 56055000c241bab8f318ebd79249ea012c33be0c4c3eca6a78e247f35ad9e8088f46605a0ba52fd5ad3e7898be3b7bc6c50ceb3af327c4986a266b06fe768cbf
HEAD_REF master
PATCHES intel.patch
)

if(NOT VCPKG_TARGET_IS_WINDOWS)
Expand Down Expand Up @@ -47,24 +48,25 @@ if("noblas" IN_LIST FEATURES)
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()
x_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}"
"-DBLA_VENDOR=OpenBLAS"
"-DCBLAS=${CBLAS}"
${FORTRAN_CMAKE}
)
Expand Down
38 changes: 38 additions & 0 deletions ports/lapack-reference/vcpkg.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{
"name": "lapack-reference",
"version-string": "3.10.0",
"description": "LAPACK — Linear Algebra PACKage http://www.netlib.org/lapack/",
"dependencies": [
{
"name": "vcpkg-fortran",
"platform": "windows"
}
],
"default-features": [
"blas-select"
],
"features": {
"blas-select": {
"description": "Use external optimized BLAS",
"dependencies": [
{
"name": "lapack-reference",
"default-features": false,
"features": [
"noblas"
],
"platform": "!windows | !static"
}
]
},
"cblas": {
"description": "Builds CBLAS"
},
"noblas": {
"description": "Use external optimized BLAS",
"dependencies": [
"blas"
]
}
}
}
23 changes: 23 additions & 0 deletions ports/vcpkg-fortran/copyright
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
Copyright (c) Microsoft Corporation

All rights reserved.

MIT License

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
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
16 changes: 16 additions & 0 deletions ports/vcpkg-fortran/portfile.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
set(FUNCTION_NAME x_vcpkg_find_fortran)

if(VCPKG_CROSSCOMPILING)
# make FATAL_ERROR in CI when issue #16773 fixed
message(WARNING "${PORT} is a host-only port; please mark it as a host port in your dependencies.")
endif()

file(COPY
"${CMAKE_CURRENT_LIST_DIR}/${FUNCTION_NAME}.cmake"
"${CMAKE_CURRENT_LIST_DIR}/z_vcpkg_load_environment_from_batch.cmake"
"${CMAKE_CURRENT_LIST_DIR}/copyright"
DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}")

configure_file("${CMAKE_CURRENT_LIST_DIR}/vcpkg-port-config.cmake.in" "${CURRENT_PACKAGES_DIR}/share/${PORT}/vcpkg-port-config.cmake" @ONLY)

set(VCPKG_POLICY_EMPTY_PACKAGE enabled)
2 changes: 2 additions & 0 deletions ports/vcpkg-fortran/vcpkg-port-config.cmake.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
include("${CMAKE_CURRENT_LIST_DIR}/z_vcpkg_load_environment_from_batch.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@[email protected]")
6 changes: 6 additions & 0 deletions ports/vcpkg-fortran/vcpkg.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"name": "vcpkg-fortran",
"version-string": "1",
"description": "Metaport to use a fortran compiler",
"supports": "windows & !arm"
}
67 changes: 67 additions & 0 deletions ports/vcpkg-fortran/x_vcpkg_find_fortran.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
#[===[.md:
# x_vcpkg_find_fortran

Checks if a Fortran compiler can be found.
Windows(x86/x64) Only: If it will try to enable the IntelOneAPI ifort compiler
and return required cmake args for building.

## Usage
```cmake
x_vcpkg_find_fortran(<additional_cmake_args_out>)
```
#]===]

function(x_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. Trying to find ifort!")
set(PATH_SUFFIX "bin/intel64")
if(VCPKG_TARGET_ARCHITECTURE STREQUAL "x86")
string(APPEND PATH_SUFFIX "_ia32")
endif()
find_program(IFORT NAMES ifort PATHS ENV IFORT_COMPILER19 PATH_SUFFIXES "${PATH_SUFFIX}")
if(NOT IFORT)
message(FATAL_ERROR "ifort not found! Please install IntelOne API for HPC!")
endif()
find_file(SETVARS NAMES setvars.bat PATHS ENV ONEAPI_ROOT)
if(NOT SETVARS)
message(FATAL_ERROR "Batch file to setup IntelOneAPI not found! Please provide a correct ONEAPI_ROOT and make sure it contains setvars.bat!")
endif()
z_vcpkg_load_environment_from_batch(BATCH_FILE_PATH "${SETVARS}")
list(APPEND ARGS_OUT "-DCMAKE_Fortran_COMPILER=${IFORT}"
"-DCMAKE_Fortran_FLAGS_INIT:STRING=/Z7 /names:lowercase /assume:underscore /assume:protect_parens")
# message(STATUS "No Fortran compiler found on the PATH. Using trying to use ifort!")

# 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}")
# # This is for private use by vcpkg-gfortran
# set(vcpkg_find_fortran_MSYS_ROOT "${MSYS_ROOT}" PARENT_SCOPE)
# 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()
86 changes: 86 additions & 0 deletions ports/vcpkg-fortran/z_vcpkg_load_environment_from_batch.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
#[===[.md:
# x_vcpkg_load_environment_from_batch

Load environment variables from a batch filed

## Usage
```cmake
z_vcpkg_load_environment_from_batch(BATCH_FILE_PATH <FILEPATH>
[ARGUMENTS <ARGS>])
```

## Parameters
### BATCH_FILE_PATH
Batch file to load
### BATCH_FILE_PATH
Arguments to pass to the batch file
#]===]
function(z_vcpkg_load_environment_from_batch)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@strega-nil @ras0219-msft : Should I put this into scripts/cmake ? The only reason I did not do it here is because I didn't want to force a world rebuild until the required changes to vcpkg-tool are merged.
I also need this for the community intel triplet. (also to load the required env variables)

cmake_parse_arguments(PARSE_ARGV 0 args "" "BATCH_FILE_PATH" "ARGUMENTS")
if(args_BATCH_FILE_PATH STREQUAL "")
message(FATAL_ERROR "'${CMAKE_CURRENT_FUNCTION}' requires argument BATCH_FILE_PATH")
endif()

# Get original environment
vcpkg_execute_required_process(
COMMAND "${CMAKE_COMMAND}" "-E" "environment"
WORKING_DIRECTORY "${CURRENT_BUILDTREES_DIR}"
LOGNAME "environment-initial"
)
file(READ "${CURRENT_BUILDTREES_DIR}/environment-initial-out.log" ENVIRONMENT_INITIAL)

# Get modified envirnoment
string (REPLACE ";" " " SPACE_SEPARATED_ARGUMENTS "${args_ARGUMENTS}")
message(STATUS "args_BATCH_FILE_PATH:${args_BATCH_FILE_PATH}")
file(WRITE "${CURRENT_BUILDTREES_DIR}/get-modified-environment.bat" "call \"${args_BATCH_FILE_PATH}\" ${SPACE_SEPARATED_ARGUMENTS}\n\"${CMAKE_COMMAND}\" -E environment")
vcpkg_execute_required_process(
COMMAND "cmd" "/c" "${CURRENT_BUILDTREES_DIR}/get-modified-environment.bat"
WORKING_DIRECTORY "${CURRENT_BUILDTREES_DIR}"
LOGNAME "environment-after"
)
file(READ "${CURRENT_BUILDTREES_DIR}/environment-after-out.log" ENVIRONMENT_AFTER)

# Escape characters that have a special meaning in CMake strings.
string(REPLACE "\\" "/" ENVIRONMENT_INITIAL "${ENVIRONMENT_INITIAL}")
string(REPLACE ";" "\\\\;" ENVIRONMENT_INITIAL "${ENVIRONMENT_INITIAL}")
string(REPLACE "\n" ";" ENVIRONMENT_INITIAL "${ENVIRONMENT_INITIAL}")

string(REPLACE "\\" "/" ENVIRONMENT_AFTER "${ENVIRONMENT_AFTER}")
string(REPLACE ";" "\\\\;" ENVIRONMENT_AFTER "${ENVIRONMENT_AFTER}")
string(REPLACE "\n" ";" ENVIRONMENT_AFTER "${ENVIRONMENT_AFTER}")

# Apply the environment changes to the current CMake environment
foreach(AFTER_LINE IN LISTS ENVIRONMENT_AFTER)
if("${AFTER_LINE}" MATCHES "^([^=]+)=(.+)$")
set(AFTER_VAR_NAME "${CMAKE_MATCH_1}")
set(AFTER_VAR_VALUE "${CMAKE_MATCH_2}")

set(FOUND "FALSE")
foreach(INITIAL_LINE IN LISTS ENVIRONMENT_INITIAL)
if("${INITIAL_LINE}" MATCHES "^([^=]+)=(.+)$")
set(INITIAL_VAR_NAME "${CMAKE_MATCH_1}")
set(INITIAL_VAR_VALUE "${CMAKE_MATCH_2}")

if("${AFTER_VAR_NAME}" STREQUAL "${INITIAL_VAR_NAME}")
set(FOUND "TRUE")
if(NOT "${AFTER_VAR_VALUE}" STREQUAL "${INITIAL_VAR_VALUE}")

# Variable has been modified
# NOTE: we do not revert the escape changes that have previously been applied
# since the only change that should be visible in a single environment variable
# should be a conversion from `\` to `/` and this should not have any effect on
# windows paths.
#message(STATUS "MODIFIED ${AFTER_VAR_NAME}=${AFTER_VAR_VALUE}")
set(ENV{${AFTER_VAR_NAME}} "${AFTER_VAR_VALUE}")
endif()
endif()
endif()
endforeach()

if(NOT FOUND)
# Variable has been added
set(ENV{${AFTER_VAR_NAME}} "${AFTER_VAR_VALUE}")
endif()
endif()
endforeach()
endfunction()