diff --git a/F/finufft/build_tarballs.jl b/F/finufft/build_tarballs.jl index ff688e2d785..28610c6b7e2 100644 --- a/F/finufft/build_tarballs.jl +++ b/F/finufft/build_tarballs.jl @@ -3,6 +3,8 @@ using BinaryBuilder, Pkg using BinaryBuilderBase +include(joinpath(@__DIR__, "..", "..", "platforms", "microarchitectures.jl")) + name = "finufft" version = v"2.0.4" julia_compat = "1.6" @@ -15,22 +17,41 @@ sources = [ # Bash recipe for building across all platforms script = raw""" cd $WORKSPACE/srcdir/finufft*/ + +CFLAGS="-fopenmp -fPIC -O3 -funroll-loops -Iinclude" +if [[ "${target}" != *-freebsd* ]] && [[ "${target}" != *-apple-* ]]; then + CFLAGS="${CFLAGS} -fcx-limited-range" +fi + # Overwrite LIBSFFT such that we do not require fftw3_threads or fftw3_omp for OMP support. Since the libraries in FFTW_jll already provide for threading, we do not loose anything. # Make use of the -DFFTW_PLAN_SAFE flag to allow for multiple threads using finufft at the same time. -make lib CFLAGS="-fopenmp -fPIC -O3 -funroll-loops -fcx-limited-range -Iinclude" CXXFLAGS="-fopenmp -fPIC -O3 -funroll-loops -fcx-limited-range -Iinclude -std=c++14 -DFFTW_PLAN_SAFE" LIBSFFT="-lfftw3 -lfftw3f -lm" -mv lib/libfinufft.so "${libdir}/libfinufft.${dlext}" +make lib \ + CC=${CC} \ + CXX=${CXX} \ + CFLAGS="${CFLAGS}" \ + CXXFLAGS="${CFLAGS} -std=c++14 -DFFTW_PLAN_SAFE" \ + LIBSFFT="-lfftw3 -lfftw3f -lm" \ + DYNLIB="lib/libfinufft.${dlext}" +install -Dvm 0755 "lib/libfinufft.${dlext}" "${libdir}/libfinufft.${dlext}" """ -# Build for all supported platforms -platforms_x86_64 = filter(p -> p.tags["arch"]=="x86_64", supported_platforms()) -platforms_other = filter(p -> p.tags["arch"]!="x86_64", supported_platforms()) - # Expand for microarchitectures on x86_64 (library doesn't have CPU dispatching) # Tests on Linux/x86_64 yielded a slow binary with avx512 for some reason, so disable that -platforms_x86_64 = expand_microarchitectures(platforms_x86_64) -platforms_x86_64 = filter(p -> p.tags["march"] != "avx512", platforms_x86_64) +platforms = expand_cxxstring_abis(expand_microarchitectures(supported_platforms(), ["x86_64", "avx", "avx2"]); skip=!Sys.iswindows) + +augment_platform_block = """ + $(MicroArchitectures.augment) + + function augment_platform!(platform::Platform) + # We augment only x86_64 + @static if Sys.ARCH === :x86_64 + augment_microarchitecture!(platform) + else + platform + end + end + """ -platforms = vcat(platforms_x86_64, platforms_other) # The products that we will ensure are always built products = [ LibraryProduct("libfinufft", :libfinufft) @@ -38,9 +59,13 @@ products = [ # Dependencies that must be installed before this package can be built dependencies = [ - Dependency(PackageSpec(name="FFTW_jll", uuid="f5851436-0d7a-5f13-b9de-f02708fd171a")) - Dependency(PackageSpec(name="CompilerSupportLibraries_jll", uuid="e66e0078-7015-5450-92f7-15fbd957f2ae")) + Dependency(PackageSpec(name="FFTW_jll", uuid="f5851436-0d7a-5f13-b9de-f02708fd171a")), + # For OpenMP we use libomp from `LLVMOpenMP_jll` where we use LLVM as compiler (BSD + # systems), and libgomp from `CompilerSupportLibraries_jll` everywhere else. + Dependency(PackageSpec(name="CompilerSupportLibraries_jll", uuid="e66e0078-7015-5450-92f7-15fbd957f2ae"); platforms=filter(!Sys.isbsd, platforms)), + Dependency(PackageSpec(name="LLVMOpenMP_jll", uuid="1d63c593-3942-5779-bab2-d838dc0a180e"); platforms=filter(Sys.isbsd, platforms)), ] # Build the tarballs, and possibly a `build.jl` as well. -build_tarballs(ARGS, name, version, sources, script, platforms, products, dependencies; preferred_gcc_version = v"8", julia_compat=julia_compat) +build_tarballs(ARGS, name, version, sources, script, platforms, products, dependencies; + preferred_gcc_version = v"8", julia_compat, augment_platform_block) diff --git a/platforms/microarchitectures.jl b/platforms/microarchitectures.jl new file mode 100644 index 00000000000..94dc8d77230 --- /dev/null +++ b/platforms/microarchitectures.jl @@ -0,0 +1,17 @@ +module MicroArchitectures + +const augment = """ + using Base.BinaryPlatforms: arch, arch_march_isa_mapping, CPUID, HostPlatform, Platform + + function augment_microarchitecture!(platform::Platform) + haskey(platform, "march") && return platform + + host_arch = arch(HostPlatform()) + host_isas = arch_march_isa_mapping[host_arch] + idx = findlast(((name, isa),) -> isa <= CPUID.cpu_isa(), host_isas) + platform["march"] = first(host_isas[idx]) + return platform + end + """ + +end