From be7283ea7cf07aacf5533947626504c47d87281b Mon Sep 17 00:00:00 2001 From: MintoDA1 <51412913+MintoDA1@users.noreply.github.com> Date: Thu, 31 Aug 2023 13:30:06 -0400 Subject: [PATCH] More updates to build scripts for more stable Mac build --- buildscripts/_build_getopts.sh | 11 +-------- buildscripts/build_macwheels.sh | 35 ++++++++++++++++++++++++++ buildscripts/build_swiftest.sh | 21 ++++++---------- buildscripts/set_compilers.sh | 38 ++++++++++++++--------------- cmake/Modules/SetFortranFlags.cmake | 4 +-- distclean.cmake | 4 ++- 6 files changed, 66 insertions(+), 47 deletions(-) create mode 100755 buildscripts/build_macwheels.sh diff --git a/buildscripts/_build_getopts.sh b/buildscripts/_build_getopts.sh index f9356684a..4380b4ad7 100755 --- a/buildscripts/_build_getopts.sh +++ b/buildscripts/_build_getopts.sh @@ -46,18 +46,9 @@ done read -r OS ARCH < <($SCRIPT_DIR/get_platform.sh) BUILD_DIR=${BUILD_DIR:-$(mktemp -ut swiftest_build)} -if [ $OS = "MacOSX" ]; then - printf "MACOSX_DEPLOYMENT_TARGET: ${MACOSX_DEPLOYMENT_TARGET}\n" - PREFIX=${PREFIX:-${BUILD_DIR}/${OS}${MACOSX_DEPLOYMENT_TARGET}/${ARCH}} -else - PREFIX=${PREFIX:-${BUILD_DIR}/${OS}/${ARCH}} -fi - +PREFIX=${PREFIX:-${ROOT_DIR}} DEPENDENCY_DIR=${DEPENDENCY_DIR:-${BUILD_DIR}/downloads} -printf "DEPENDENCY_DIR: ${DEPENDENCY_DIR}\n" -printf "PREFIX : ${PREFIX}\n" - if [ -z ${DEPENDENCY_ENV_VARS+x} ]; then . ${SCRIPT_DIR}/set_compilers.sh diff --git a/buildscripts/build_macwheels.sh b/buildscripts/build_macwheels.sh new file mode 100755 index 000000000..97997bed4 --- /dev/null +++ b/buildscripts/build_macwheels.sh @@ -0,0 +1,35 @@ +#!/bin/bash +# This script will build all versions of the MacOS wheels, for both Apple Silicon (arm64) and Intel (x86_64) and for a variety +# of OS versions. +# +# Copyright 2023 - David Minton +# This file is part of Swiftest. +# Swiftest 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. +# Swiftest 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 Swiftest. +# If not, see: https://www.gnu.org/licenses. +set -a +SCRIPT_DIR=$(realpath $(dirname $0)) +ROOT_DIR=$(realpath ${SCRIPT_DIR}/..) +BUILD_DIR=$(mktemp -ut swiftest_build) +PREFIX=${ROOT_DIR} +DEPENDENCY_DIR=${BUILD_DIR}/downloads + +# The versions of MacOS that we have development tools for +declare -a MACVER=("10.13" "11.0" "12.4" "13.0") + +for MACOSX_DEPLOYMENT_TARGET in "${MACVER[@]}"; do + ARGS="-p ${PREFIX} -d ${DEPENDENCY_DIR} -m ${MACOSX_DEPLOYMENT_TARGET}" + if [ "${MACOSX_DEPLOYMENT_TARGET}" != "10.13" ]; then + ${SCRIPT_DIR}/build_swiftest.sh ${ARGS} + cmake -P distclean.cmake + fi + arch -x86_64 /bin/bash -c "${SCRIPT_DIR}/build_swiftest.sh ${ARGS}" + cmake -P distclean.cmake +done +python3 -m build --sdist + + + diff --git a/buildscripts/build_swiftest.sh b/buildscripts/build_swiftest.sh index 10acbfae7..5fac4b0b2 100755 --- a/buildscripts/build_swiftest.sh +++ b/buildscripts/build_swiftest.sh @@ -12,6 +12,7 @@ set -a if [ -z ${SCRIPT_DIR+x} ]; then SCRIPT_DIR=$(realpath $(dirname $0)); fi ARGS=$@ + . ${SCRIPT_DIR}/_build_getopts.sh ${ARGS} ARGS="-p ${PREFIX} -d ${DEPENDENCY_DIR} -m ${MACOSX_DEPLOYMENT_TARGET}" @@ -28,8 +29,6 @@ echo $OS $ARCH printf "Using ${OS} compilers:\nFC: ${FC}\nCC: ${CC}\nCXX: ${CXX}\n\n" printf "Installing to ${PREFIX}\n" printf "Dependency libraries in ${PREFIX}\n" -read -rsn1 -p"Press any key to continue";echo - ${SCRIPT_DIR}/build_dependencies.sh ${ARGS} if [ $OS = "Linux" ]; then @@ -38,19 +37,16 @@ else SKBUILD_CONFIGURE_OPTIONS="-DBUILD_SHARED_LIBS=ON -DUSE_SIMD=OFF" SKBUILD_CONFIGURE_OPTIONS="${SKBUILD_CONFIGURE_OPTIONS} -DMACHINE_CODE_VALUE=\"generic\"" OMPROOT=${DEVTOOLDIR}/MacOSX${MACOSX_DEPLOYMENT_TARGET}/${ARCH}/usr/local - rsync -a ${OMPROOT}/lib/libgfortran*dylib ${ROOT_DIR}/lib/ - rsync -a ${OMPROOT}/lib/libgomp*dylib ${ROOT_DIR}/lib/ - rsync -a ${OMPROOT}/lib/libomp*dylib ${ROOT_DIR}/lib/ - rsync -a ${OMPROOT}/lib/libquadmath*dylib ${ROOT_DIR}/lib/ + rsync -va ${OMPROOT}/* ${ROOT_DIR}/ NETCDF_FORTRAN_HOME=${ROOT_DIR} NETCDF_INCLUDE=${ROOT_DIR}/include - CPPFLAGS="${CPPFLAGS} -Xclang -fopenmp" - LIBS="${LIBS} -lomp" - LDFLAGS="-Wl,-rpath,${OMPROOT}/lib -Wl,-rpath,${ROOT_DIR}/lib" - CPATH="${OMPROOT}/include:${CPATH}" - LD_LIBRARY_PATH="${LD_LIBRARY_PATH}" + CPPFLAGS="-Xclang -fopenmp" + LIBS="-lomp" + LDFLAGS="-Wl,-rpath,${ROOT_DIR}/lib" + CPATH="${ROOT_DIR}/include" + LD_LIBRARY_PATH="${ROOT_DIR}/lib" LIBRARY_PATH="${LD_LIBRARY_PATH}" cd $ROOT_DIR @@ -58,7 +54,6 @@ else printf "*********************************************************\n" printf "* BUILDING SWIFTEST *\n" printf "*********************************************************\n" - printf "OMPROOT: ${OMPROOT}\n" printf "LIBS: ${LIBS}\n" printf "CFLAGS: ${CFLAGS}\n" printf "FFLAGS: ${FFLAGS}\n" @@ -74,7 +69,5 @@ else printf "MACOSX_DEPLOYMENT_TARGET: ${MACOSX_DEPLOYMENT_TARGET}\n" printf "*********************************************************\n" - python3 -m pip install build pip - python3 -m build --sdist cibuildwheel --platform macos fi \ No newline at end of file diff --git a/buildscripts/set_compilers.sh b/buildscripts/set_compilers.sh index f0588f935..8659af8bb 100755 --- a/buildscripts/set_compilers.sh +++ b/buildscripts/set_compilers.sh @@ -25,44 +25,42 @@ case "$OS" in ;; esac + set -a # Only replace compiler definitions if they are not already set case $OS in Linux) - FC=${FC:-$(command -v gfortran)} - CC=${CC:-$(command -v gcc)} - CXX=${CXX:-$(command -v g++)} - CPP=${CPP:-$(command -v cpp)} + FC=${$(command -v gfortran)} + CC=${$(command -v gcc)} + CXX=${$(command -v g++)} + CPP=${$(command -v cpp)} ;; MacOSX) - COMPILER_PREFIX=${COMPILER_PREFIX:-"/usr"} - CC=${CC:-${COMPILER_PREFIX}/bin/clang} - CXX=${CXX:-${COMPILER_PREFIX}/bin/clang++} - CPP=${CPP:-${COMPILER_PREFIX}/bin/cpp} - AR=${AR:-${COMPILER_PREFIX}/bin/ar} - NM=${NM:-${COMPILER_PREFIX}/bin/nm} - RANLIB=${RANLIB:-${COMPILER_PREFIX}/bin/ranlib} + COMPILER_PREFIX="/usr" + CC=${COMPILER_PREFIX}/bin/clang + CXX=${COMPILER_PREFIX}/bin/clang++ + CPP=${COMPILER_PREFIX}/bin/cpp + AR=${COMPILER_PREFIX}/bin/ar + NM=${COMPILER_PREFIX}/bin/nm + RANLIB=${COMPILER_PREFIX}/bin/ranlib # Use custom gfortran location for a given MacOS Target version if vailable FROOT=${DEVTOOLDIR}/MacOSX${MACOSX_DEPLOYMENT_TARGET}/${ARCH}/usr/local + printf "FROOT: ${FROOT}\n" if [ -f ${FROOT}/bin/gfortran ]; then FC=${FROOT}/bin/gfortran else - FC=${FC:-$(command -v gfortran)} + FC=$(command -v gfortran) FROOT=$(realpath $(dirname $(command -v $FC))/..) fi if [ ! -f ${FC} ]; then printf "No working fortran compiler found!\n" exit 1 fi - LD_LIBRARY_PATH="${COMPILER_PREFIX}/lib:${FROOT}/lib:${LD_LIBRARY_PATH}" - LDFLAGS="${LDFLAGS} -Wl,-rpath,${COMPILER_PREFIX}/lib -Wl,-no_compact_unwind" - CPPFLAGS="${CPPFLAGS} -isystem ${COMPILER_PREFIX}/include" - LIBS="${LIBS}" - CPATH="${FROOT}/include:${CPATH}" - CXXFLAGS="${CFLAGS} ${CXXFLAGS}" - FCFLAGS="${CFLAGS} ${FCFLAGS}" - CFLAGS="-mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET} -Wno-deprecated-non-prototype ${CFLAGS}" + LDFLAGS="-Wl,-no_compact_unwind" + CFLAGS="-mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET} -Wno-deprecated-non-prototype" + LD_LIBRARY_PATH="" + CPATH="" ;; *) printf "Unknown compiler type: ${OS}\n" diff --git a/cmake/Modules/SetFortranFlags.cmake b/cmake/Modules/SetFortranFlags.cmake index 610a428ec..c5514e749 100644 --- a/cmake/Modules/SetFortranFlags.cmake +++ b/cmake/Modules/SetFortranFlags.cmake @@ -162,10 +162,10 @@ IF (NOT BUILD_SHARED_LIBS AND NOT WINOPT) # SET_COMPILE_FLAG(CMAKE_Fortran_LINK_FLAGS "${CMAKE_Fortran_LINK_FLAGS}" # Fortran "-static-libquadmath" # ) - IF (USE_OPENMP) SET_COMPILE_FLAG(CMAKE_Fortran_LINK_FLAGS "${CMAKE_Fortran_LINK_FLAGS}" - Fortran "-lgomp" + Fortran "-lomp" + "-lgomp" ) ENDIF (USE_OPENMP) ENDIF () diff --git a/distclean.cmake b/distclean.cmake index d01195c6c..c0ce74642 100644 --- a/distclean.cmake +++ b/distclean.cmake @@ -19,7 +19,7 @@ ELSE() SET(TOPDIR "${CMAKE_SOURCE_DIR}") ENDIF() -SET(CIBW_DIR "_skbuild" "swiftest.egg-info") +SET(CIBW_DIR "_skbuild" "swiftest.egg-info" "_cmake_test_compile") MACRO(GET_PARENT_DIRECTORIES search_string return_list grandparents) FILE(GLOB_RECURSE new_list ${search_string}) @@ -46,8 +46,10 @@ FILE(GLOB_RECURSE CMAKEINSTALL "${TOPDIR}/*cmake_install.cmake" FILE(GLOB_RECURSE MAKEFILE "${TOPDIR}/*Makefile") FILE(GLOB_RECURSE CMAKETESTFILES "${TOPDIR}/*CTestTestfile.cmake") SET(TOPDIRECTORIES "${TOPDIR}/lib" + "${TOPDIR}/libexec" "${TOPDIR}/bin" "${TOPDIR}/include" + "${TOPDIR}/share" ) # CMake has trouble finding directories recursively, so locate these