rake-compiler-dock 1.5.1 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +7 -1
- data/.github/workflows/publish-images.yml +13 -3
- data/Dockerfile.mri.erb +11 -52
- data/History.md +38 -0
- data/Rakefile +2 -2
- data/build/sudoers +1 -1
- data/lib/rake_compiler_dock/starter.rb +1 -0
- data/lib/rake_compiler_dock/version.rb +2 -2
- data/test/test_environment_variables.rb +7 -1
- metadata +3 -4
- data/build/math_h.patch +0 -189
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 53dbaea874777b182361051f1c425df03d7223cde61a63bb60d6284593c0e273
|
4
|
+
data.tar.gz: a389f202249d9ee8415c5adc010030b6c6b026ed8127a77520c5f1b1f5a7831a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3f3397f9b5db932ae5a9370d80af39a30475ede7053049e4dd8aec035da1fe1e82d79a38127ea3d0232666ac1965927cc92fb1d03161754d93663ca5ccadf645
|
7
|
+
data.tar.gz: 02f7cedfbbcc5e13f51f9f428d4fade38de5bf6032dd28d3f1717a0f1315d8afee2d4bb6f92715bb609f165e2093d9469219db086b0842cdaffe7c81d3851eeb
|
data/.github/workflows/ci.yml
CHANGED
@@ -382,21 +382,27 @@ jobs:
|
|
382
382
|
matrix:
|
383
383
|
include:
|
384
384
|
- from_image: amd64/centos
|
385
|
+
image_platform: linux/amd64
|
385
386
|
platform: x86_64-linux # centos-8 ships ruby 2.5, rubygems won't recognize -gnu suffix
|
386
387
|
dockerfile: centos
|
387
388
|
- from_image: navikey/raspbian-bullseye
|
389
|
+
image_platform: linux/arm/v7
|
388
390
|
platform: arm-linux # bullseye ships ruby 2.7, rubygems won't recognize -gnu suffix
|
389
391
|
dockerfile: debian
|
390
392
|
- from_image: arm64v8/ubuntu
|
393
|
+
image_platform: linux/aarch64
|
391
394
|
platform: aarch64-linux # arm64v8 ships ruby 3.0, rubygems won't recognize -gnu suffix
|
392
395
|
dockerfile: debian
|
393
396
|
- from_image: i386/alpine
|
397
|
+
image_platform: linux/386
|
394
398
|
platform: x86-linux-musl
|
395
399
|
dockerfile: alpine
|
396
400
|
- from_image: arm32v6/alpine
|
401
|
+
image_platform: linux/arm/v6
|
397
402
|
platform: arm-linux-musl
|
398
403
|
dockerfile: alpine
|
399
404
|
- from_image: alpine
|
405
|
+
image_platform: linux/amd64
|
400
406
|
platform: x86_64-linux-musl
|
401
407
|
dockerfile: alpine
|
402
408
|
runs-on: ubuntu-latest
|
@@ -409,6 +415,6 @@ jobs:
|
|
409
415
|
- name: Build ${{ matrix.from_image }} image
|
410
416
|
run: |
|
411
417
|
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
|
412
|
-
docker build --rm --build-arg from_image=${{ matrix.from_image }} -t ruby-test -f test/env/Dockerfile.${{ matrix.dockerfile }} .
|
418
|
+
docker build --rm --build-arg from_image=${{ matrix.from_image }} --platform=${{ matrix.image_platform }} -t ruby-test -f test/env/Dockerfile.${{ matrix.dockerfile }} .
|
413
419
|
- name: Run tests
|
414
420
|
run: docker run --rm -t --network=host -v `pwd`:/build ruby-test
|
@@ -41,7 +41,8 @@ jobs:
|
|
41
41
|
with:
|
42
42
|
ruby-version: "3.1"
|
43
43
|
bundler-cache: true
|
44
|
-
-
|
44
|
+
- name: Generate docker image names
|
45
|
+
id: rcd_config
|
45
46
|
run: |
|
46
47
|
bundle exec ruby -e ' \
|
47
48
|
require "rake_compiler_dock"; \
|
@@ -49,8 +50,11 @@ jobs:
|
|
49
50
|
puts RakeCompilerDock::Starter.container_image_name(:platform => %q(${{matrix.platform}})); \
|
50
51
|
print "snapshot_name="; \
|
51
52
|
puts RakeCompilerDock::Starter.container_image_name(:platform => %q(${{matrix.platform}}), :version => %q(snapshot)); \
|
53
|
+
if %q(${{matrix.platform}}).end_with?("-gnu"); \
|
54
|
+
print "generic_linux_snapshot_name="; \
|
55
|
+
puts RakeCompilerDock::Starter.container_image_name(:platform => %q(${{matrix.platform}}), :version => %q(snapshot)).chomp("-gnu"); \
|
56
|
+
end \
|
52
57
|
' | tee -a $GITHUB_OUTPUT
|
53
|
-
|
54
58
|
- name: Build docker image
|
55
59
|
env:
|
56
60
|
RCD_DOCKER_BUILD: docker buildx build --cache-from=type=local,src=tmp/build-cache --cache-to=type=local,dest=tmp/build-cache-new --load
|
@@ -65,7 +69,13 @@ jobs:
|
|
65
69
|
registry: ghcr.io
|
66
70
|
username: ${{github.actor}}
|
67
71
|
password: ${{secrets.GITHUB_TOKEN}}
|
68
|
-
-
|
72
|
+
- name: Push the docker image
|
73
|
+
run: |
|
69
74
|
docker images
|
70
75
|
docker tag ${{steps.rcd_config.outputs.image_name}} ${{steps.rcd_config.outputs.snapshot_name}}
|
71
76
|
docker push ${{steps.rcd_config.outputs.snapshot_name}}
|
77
|
+
- name: Push a generic linux image
|
78
|
+
if: ${{ steps.rcd_config.outputs.generic_linux_snapshot_name }}
|
79
|
+
run: |
|
80
|
+
docker tag ${{steps.rcd_config.outputs.image_name}} ${{steps.rcd_config.outputs.generic_linux_snapshot_name}}
|
81
|
+
docker push ${{steps.rcd_config.outputs.generic_linux_snapshot_name}}
|
data/Dockerfile.mri.erb
CHANGED
@@ -1,32 +1,14 @@
|
|
1
|
-
<%
|
2
|
-
image = case platform
|
3
|
-
when /x86_64-linux-gnu/ then "quay.io/pypa/manylinux2014_x86_64:latest@sha256:b4d7d9e15f3f5d143cd5aa0e2a2b6f2563bed17df1808c8f6662f9d57db72fa1"
|
4
|
-
when /x86-linux-gnu/ then "quay.io/pypa/manylinux2014_i686:latest@sha256:f2b004703f4712e0c88d89cd206447fe67d9efa881916dc7f4afefd7387eb0b2"
|
5
|
-
else "docker.io/library/ubuntu:20.04@sha256:80ef4a44043dec4490506e6cc4289eeda2d106a70148b74b5ae91ee670e9c35d"
|
6
|
-
end
|
7
|
-
manylinux = !!(image =~ /manylinux/)
|
8
|
-
%>
|
1
|
+
<% image = "ubuntu:20.04" %>
|
9
2
|
FROM <%= image %>
|
10
3
|
|
11
4
|
##
|
12
5
|
## Install required base packages for compiling ruby
|
13
6
|
##
|
14
|
-
|
15
|
-
RUN yum install -y sudo ruby less git wget curl autoconf libtool cmake gcc-c++ xz readline-devel sqlite-devel openssl-devel libffi-devel libyaml-devel
|
16
|
-
|
17
|
-
## Prepare sudo
|
18
|
-
RUN rm -f /usr/local/bin/sudo && \
|
19
|
-
groupadd -r sudo && \
|
20
|
-
echo "%sudo ALL=(ALL) ALL" >> /etc/sudoers
|
21
|
-
|
22
|
-
<% else %>
|
23
|
-
ENV DEBIAN_FRONTEND noninteractive
|
7
|
+
ENV DEBIAN_FRONTEND=noninteractive
|
24
8
|
RUN apt-get -y update && \
|
25
9
|
apt-get install -y sudo wget curl git-core build-essential xz-utils unzip dirmngr && \
|
26
10
|
apt-get install -y autoconf cmake pkg-config zlib1g-dev libreadline-dev libsqlite0-dev libssl-dev libyaml-dev libffi-dev && \
|
27
11
|
rm -rf /var/lib/apt/lists/*
|
28
|
-
<% end %>
|
29
|
-
|
30
12
|
|
31
13
|
##
|
32
14
|
## install rbenv and ruby-build
|
@@ -68,23 +50,18 @@ RUN dpkg -i /debs/*.deb
|
|
68
50
|
COPY build/mk_musl_cross.sh /tmp
|
69
51
|
RUN /tmp/mk_musl_cross.sh <%= target %>
|
70
52
|
|
71
|
-
<%
|
53
|
+
<% else %>
|
72
54
|
RUN apt-get -y update && \
|
73
55
|
apt-get install -y <%
|
74
|
-
if platform =~ /darwin/
|
56
|
+
if platform =~ /darwin/ %> clang python lzma-dev libxml2-dev libssl-dev libc++-10-dev <% end %><%
|
75
57
|
if platform =~ /aarch64-linux-gnu/ %> gcc-aarch64-linux-gnu g++-aarch64-linux-gnu <% end %><%
|
76
58
|
if platform =~ /arm-linux-gnu/ %> gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf <% end %><%
|
77
|
-
if platform =~ /x86-
|
78
|
-
if platform =~ /
|
59
|
+
if platform =~ /x86-linux-gnu/ %> gcc-i686-linux-gnu g++-i686-linux-gnu <% end %><%
|
60
|
+
if platform =~ /x86-mingw32/ %> gcc-mingw-w64-i686 g++-mingw-w64-i686 <% end %><%
|
61
|
+
if platform =~ /x64-mingw32/ %> gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64 <% end %> && \
|
79
62
|
rm -rf /var/lib/apt/lists/*
|
80
63
|
<% end %>
|
81
64
|
|
82
|
-
<% if manylinux %>
|
83
|
-
# Create dev tools x86-linux-*
|
84
|
-
COPY build/mk_i686.rb /root/
|
85
|
-
RUN /root/mk_i686.rb
|
86
|
-
<% end %>
|
87
|
-
|
88
65
|
<% if platform =~ /darwin/ %>
|
89
66
|
COPY build/mk_osxcross.sh /tmp
|
90
67
|
RUN /tmp/mk_osxcross.sh
|
@@ -133,7 +110,7 @@ RUN sudo mkdir -p /usr/local/rake-compiler && \
|
|
133
110
|
xrubies_build_plan = if platform =~ /x64-mingw-ucrt/
|
134
111
|
[
|
135
112
|
# Rubyinstaller-3.1.0+ is platform x64-mingw-ucrt
|
136
|
-
["3.3.
|
113
|
+
["3.3.5:3.2.0:3.1.0", "3.1.3"],
|
137
114
|
]
|
138
115
|
elsif platform =~ /x64-mingw32/
|
139
116
|
[
|
@@ -144,7 +121,7 @@ elsif platform =~ /x64-mingw32/
|
|
144
121
|
else
|
145
122
|
[
|
146
123
|
["2.6.0:2.5.0:2.4.0", "2.5.9"],
|
147
|
-
["3.3.
|
124
|
+
["3.3.5:3.2.0:3.1.0:3.0.0:2.7.0", "3.1.3"],
|
148
125
|
]
|
149
126
|
end
|
150
127
|
|
@@ -171,7 +148,7 @@ RUN bash -c " \
|
|
171
148
|
RUN find /usr/local/rake-compiler/ruby/*linux*/ -name libruby.so | xargs rm
|
172
149
|
RUN find /usr/local/rake-compiler/ruby/*linux*/ -name libruby-static.a | while read f ; do cp $f `echo $f | sed s/-static//` ; done
|
173
150
|
RUN find /usr/local/rake-compiler/ruby/*linux*/ -name libruby.a | while read f ; do ar t $f | xargs ar d $f ; done
|
174
|
-
RUN find /usr/local/rake-compiler/ruby/*linux*/ -name mkmf.rb | while read f ; do sed -i ':a;N;$!ba;s/TRY_LINK = [^\n]*\n[^\n]*\n[^\n]*LOCAL_LIBS)/& -lruby-static -lpthread -lrt -ldl <% if platform =~ /
|
151
|
+
RUN find /usr/local/rake-compiler/ruby/*linux*/ -name mkmf.rb | while read f ; do sed -i ':a;N;$!ba;s/TRY_LINK = [^\n]*\n[^\n]*\n[^\n]*LOCAL_LIBS)/& -lruby-static -lpthread -lrt -ldl <% if platform =~ /x86_64/ %> -lcrypt <% if platform !~ /musl/ %> -lz <% end %> <% end %>/' $f ; done
|
175
152
|
<% end %>
|
176
153
|
|
177
154
|
<% if platform =~ /mingw/ %>
|
@@ -221,24 +198,6 @@ RUN mv /opt/osxcross/target/bin/<%= target %>-strip /opt/osxcross/target/bin/<%=
|
|
221
198
|
ln /root/strip_wrapper_codesign /opt/osxcross/target/bin/<%= target %>-strip
|
222
199
|
<% end %>
|
223
200
|
|
224
|
-
<% if manylinux %>
|
225
|
-
# Enable modern compiler toolset of manylinux image
|
226
|
-
RUN echo "export PATH=\$DEVTOOLSET_ROOTPATH/usr/bin:\$PATH" >> /etc/rubybashrc
|
227
|
-
|
228
|
-
# Add prefixed versions of compiler tools
|
229
|
-
RUN for f in addr2line gcc gcov-tool ranlib ar dwp gcc-ranlib nm readelf as elfedit gcc-ar gprof objcopy size c++filt g++ gcov ld objdump strings cpp gcc-nm strip ; do ln -sf $DEVTOOLSET_ROOTPATH/usr/bin/$f $DEVTOOLSET_ROOTPATH/usr/bin/<%= target %>-$f ; done
|
230
|
-
|
231
|
-
# Use builtin functions of newer gcc to avoid linker issues on Musl based Linux
|
232
|
-
# TODO: remove in v1.6.0 once musl builds have been out for full minor release cycle, see 864be5b2
|
233
|
-
COPY build/math_h.patch /root/
|
234
|
-
RUN cd /usr/include/ && \
|
235
|
-
patch -p1 < /root/math_h.patch
|
236
|
-
|
237
|
-
# Update pkg-config because the distro ships 0.27.1 which is old and has bugs and performance issues.
|
238
|
-
COPY build/mk_pkg_config.sh /root/
|
239
|
-
RUN /root/mk_pkg_config.sh
|
240
|
-
<% end %>
|
241
|
-
|
242
201
|
<% if platform =~ /arm64-darwin/ %>
|
243
202
|
# Add a arm64 darwin target as alternative to aarch64
|
244
203
|
RUN grep -E 'rbconfig-aarch64-darwin' /usr/local/rake-compiler/config.yml | sed 's/rbconfig-[a-z0-9_]*-darwin/rbconfig-<%= platform %>/' >> /usr/local/rake-compiler/config.yml
|
@@ -258,6 +217,6 @@ COPY build/sudoers /etc/sudoers.d/rake-compiler-dock
|
|
258
217
|
|
259
218
|
RUN bash -c "rbenv global 3.1.3"
|
260
219
|
|
261
|
-
ENV RUBY_CC_VERSION
|
220
|
+
ENV RUBY_CC_VERSION=3.3.5:3.2.0:3.1.0:3.0.0:2.7.0:2.6.0:2.5.0:2.4.0
|
262
221
|
|
263
222
|
CMD bash
|
data/History.md
CHANGED
@@ -1,5 +1,43 @@
|
|
1
1
|
# `rake-compiler/rake-compiler-dock` Changelog
|
2
2
|
|
3
|
+
## v1.6.0 / 2024-12-13
|
4
|
+
|
5
|
+
### Notable changes
|
6
|
+
|
7
|
+
#### Standardizing all Linux build images on Ubuntu
|
8
|
+
|
9
|
+
In this release, we upgraded the base image for the `x86_64-linux-gnu` and `x86-linux-gnu` images from `manylinux2014` to `ubuntu:20.04`. (`manylinux2014` reached end-of-life earlier this year.) As a result, all of the build images are using the same base image, simplifying things considerably. (#122, #126) @flavorjones
|
10
|
+
|
11
|
+
⚠ **Note** there are two important changes due to this upgrade:
|
12
|
+
|
13
|
+
1. The minimum supported version of GLIBC for the `x86*-linux-gnu` images has increased from 2.17 to 2.29 for `x86_64` and `x86` architectures. (Note that GLIBC was already pinned to 2.29 for ARM architectures.)
|
14
|
+
2. Precompiled gems built with the `x86*linux-gnu` images are less likely to be compatible with Musl systems, and may segfault.
|
15
|
+
|
16
|
+
For (2) above, if you have been shipping a single `x86_64-linux` native gem for both GNU and Musl systems, **please make sure you test your gems on a Musl system before shipping them**. See the [actions workflow in flavorjones/ruby-c-extensions-explained](https://github.com/flavorjones/ruby-c-extensions-explained/blob/6619a0d94e627897838a79144704387db65a03bc/.github/workflows/precompiled.yml#L137) for an example of how to do this rigorously.
|
17
|
+
|
18
|
+
|
19
|
+
### Ruby 3.3 support upgraded to `3.3.5`
|
20
|
+
|
21
|
+
Update Ruby 3.3 support from 3.3.0-rc1 to 3.3.5. Note that the 3.3.x releases are not usable until 3.3.5 because of https://bugs.ruby-lang.org/issues/20088.
|
22
|
+
|
23
|
+
⚠ **Note** that if you were specifying `3.3.0` in your `RUBY_CC_VERSION` environment variable, that string will must be updated to `3.3.5`.
|
24
|
+
|
25
|
+
|
26
|
+
### Added
|
27
|
+
|
28
|
+
- Add support for the `SOURCE_DATE_EPOCH` environment variable, which can be used to create reproducible builds. (#128) @segiddins
|
29
|
+
|
30
|
+
|
31
|
+
## 1.5.2 / 2024-07-30
|
32
|
+
|
33
|
+
With CentOS 7 becoming EOL as of 2024-06-30, `yum` will no longer work in the `x86_64-linux-gnu` and
|
34
|
+
`x86-linux-gnu` images shipped with v1.5.1 and earlier.
|
35
|
+
|
36
|
+
In this release, we've updated the `manylinux2014` base image for the `x86_64-linux-gnu` and
|
37
|
+
`x86-linux-gnu` images to point at a version patched by `pypa` to use valid yum mirrors. See
|
38
|
+
https://github.com/pypa/manylinux/pull/1628 for more information.
|
39
|
+
|
40
|
+
|
3
41
|
## 1.5.1 / 2024-06-03
|
4
42
|
|
5
43
|
### Improvements
|
data/Rakefile
CHANGED
@@ -17,11 +17,11 @@ platforms = [
|
|
17
17
|
["arm64-darwin", "aarch64-apple-darwin"],
|
18
18
|
["x64-mingw-ucrt", "x86_64-w64-mingw32"],
|
19
19
|
["x64-mingw32", "x86_64-w64-mingw32"],
|
20
|
-
["x86-linux-gnu", "i686-
|
20
|
+
["x86-linux-gnu", "i686-linux-gnu"],
|
21
21
|
["x86-linux-musl", "i686-unknown-linux-musl"],
|
22
22
|
["x86-mingw32", "i686-w64-mingw32"],
|
23
23
|
["x86_64-darwin", "x86_64-apple-darwin"],
|
24
|
-
["x86_64-linux-gnu", "x86_64-
|
24
|
+
["x86_64-linux-gnu", "x86_64-linux-gnu"],
|
25
25
|
["x86_64-linux-musl", "x86_64-unknown-linux-musl"],
|
26
26
|
]
|
27
27
|
|
data/build/sudoers
CHANGED
@@ -1 +1 @@
|
|
1
|
-
Defaults env_keep += "http_proxy https_proxy ftp_proxy GEM_PRIVATE_KEY_PASSPHRASE RCD_HOST_RUBY_PLATFORM RCD_HOST_RUBY_VERSION RCD_IMAGE RUBY_CC_VERSION LD_LIBRARY_PATH DEVTOOLSET_ROOTPATH"
|
1
|
+
Defaults env_keep += "http_proxy https_proxy ftp_proxy GEM_PRIVATE_KEY_PASSPHRASE RCD_HOST_RUBY_PLATFORM RCD_HOST_RUBY_VERSION RCD_IMAGE RUBY_CC_VERSION LD_LIBRARY_PATH DEVTOOLSET_ROOTPATH SOURCE_DATE_EPOCH"
|
@@ -32,7 +32,7 @@ class TestEnvironmentVariables
|
|
32
32
|
unless IS_JRUBY
|
33
33
|
def test_RUBY_CC_VERSION
|
34
34
|
df = File.read(File.expand_path("../../Dockerfile.mri.erb", __FILE__))
|
35
|
-
df =~ /^ENV RUBY_CC_VERSION
|
35
|
+
df =~ /^ENV RUBY_CC_VERSION=(.*)$/
|
36
36
|
assert_equal $1, rcd_env['RUBY_CC_VERSION']
|
37
37
|
end
|
38
38
|
|
@@ -75,6 +75,12 @@ class TestEnvironmentVariables
|
|
75
75
|
def test_PWD
|
76
76
|
assert_equal Dir.pwd, rcd_env['PWD']
|
77
77
|
end
|
78
|
+
|
79
|
+
def test_SOURCE_DATE_EPOCH
|
80
|
+
cmd = "SOURCE_DATE_EPOCH=1234567890 " + invocation("echo \$SOURCE_DATE_EPOCH")
|
81
|
+
sde = %x(#{cmd}).strip
|
82
|
+
assert_equal "1234567890", sde
|
83
|
+
end
|
78
84
|
end
|
79
85
|
|
80
86
|
class AsIfContinuousIntegration < Test::Unit::TestCase
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rake-compiler-dock
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lars Kanis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-12-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -82,7 +82,6 @@ files:
|
|
82
82
|
- Rakefile
|
83
83
|
- bin/rake-compiler-dock
|
84
84
|
- build/gem_helper.rb
|
85
|
-
- build/math_h.patch
|
86
85
|
- build/mk_i686.rb
|
87
86
|
- build/mk_musl_cross.sh
|
88
87
|
- build/mk_osxcross.sh
|
@@ -141,7 +140,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
141
140
|
- !ruby/object:Gem::Version
|
142
141
|
version: '0'
|
143
142
|
requirements: []
|
144
|
-
rubygems_version: 3.
|
143
|
+
rubygems_version: 3.3.22
|
145
144
|
signing_key:
|
146
145
|
specification_version: 4
|
147
146
|
summary: Easy to use and reliable cross compiler environment for building Windows
|
data/build/math_h.patch
DELETED
@@ -1,189 +0,0 @@
|
|
1
|
-
--- centos7/math.h 2020-12-31 23:15:40.678843646 +0100
|
2
|
-
+++ builtin/math.h 2022-03-16 21:35:13.086169875 +0100
|
3
|
-
@@ -206,68 +206,142 @@
|
4
|
-
FP_NORMAL
|
5
|
-
};
|
6
|
-
|
7
|
-
+
|
8
|
-
+/* Depending on the type of TG_ARG, call an appropriately suffixed
|
9
|
-
+ version of FUNC with arguments (including parentheses) ARGS.
|
10
|
-
+ Suffixed functions may not exist for long double if it has the same
|
11
|
-
+ format as double, or for other types with the same format as float,
|
12
|
-
+ double or long double. The behavior is undefined if the argument
|
13
|
-
+ does not have a real floating type. The definition may use a
|
14
|
-
+ conditional expression, so all suffixed versions of FUNC must
|
15
|
-
+ return the same type (FUNC may include a cast if necessary rather
|
16
|
-
+ than being a single identifier). */
|
17
|
-
+#ifdef __NO_LONG_DOUBLE_MATH
|
18
|
-
+# if __HAVE_DISTINCT_FLOAT128
|
19
|
-
+# error "Distinct _Float128 without distinct long double not supported."
|
20
|
-
+# endif
|
21
|
-
+# define __MATH_TG(TG_ARG, FUNC, ARGS) \
|
22
|
-
+ (sizeof (TG_ARG) == sizeof (float) ? FUNC ## f ARGS : FUNC ARGS)
|
23
|
-
+#elif __HAVE_DISTINCT_FLOAT128
|
24
|
-
+# if __HAVE_GENERIC_SELECTION
|
25
|
-
+# if __HAVE_FLOATN_NOT_TYPEDEF && __HAVE_FLOAT32
|
26
|
-
+# define __MATH_TG_F32(FUNC, ARGS) _Float32: FUNC ## f ARGS,
|
27
|
-
+# else
|
28
|
-
+# define __MATH_TG_F32(FUNC, ARGS)
|
29
|
-
+# endif
|
30
|
-
+# if __HAVE_FLOATN_NOT_TYPEDEF && __HAVE_FLOAT64X
|
31
|
-
+# if __HAVE_FLOAT64X_LONG_DOUBLE
|
32
|
-
+# define __MATH_TG_F64X(FUNC, ARGS) _Float64x: FUNC ## l ARGS,
|
33
|
-
+# else
|
34
|
-
+# define __MATH_TG_F64X(FUNC, ARGS) _Float64x: FUNC ## f128 ARGS,
|
35
|
-
+# endif
|
36
|
-
+# else
|
37
|
-
+# define __MATH_TG_F64X(FUNC, ARGS)
|
38
|
-
+# endif
|
39
|
-
+# define __MATH_TG(TG_ARG, FUNC, ARGS) \
|
40
|
-
+ _Generic ((TG_ARG), \
|
41
|
-
+ float: FUNC ## f ARGS, \
|
42
|
-
+ __MATH_TG_F32 (FUNC, ARGS) \
|
43
|
-
+ default: FUNC ARGS, \
|
44
|
-
+ long double: FUNC ## l ARGS, \
|
45
|
-
+ __MATH_TG_F64X (FUNC, ARGS) \
|
46
|
-
+ _Float128: FUNC ## f128 ARGS)
|
47
|
-
+# else
|
48
|
-
+# if __HAVE_FLOATN_NOT_TYPEDEF
|
49
|
-
+# error "Non-typedef _FloatN but no _Generic."
|
50
|
-
+# endif
|
51
|
-
+# define __MATH_TG(TG_ARG, FUNC, ARGS) \
|
52
|
-
+ __builtin_choose_expr \
|
53
|
-
+ (__builtin_types_compatible_p (__typeof (TG_ARG), float), \
|
54
|
-
+ FUNC ## f ARGS, \
|
55
|
-
+ __builtin_choose_expr \
|
56
|
-
+ (__builtin_types_compatible_p (__typeof (TG_ARG), double), \
|
57
|
-
+ FUNC ARGS, \
|
58
|
-
+ __builtin_choose_expr \
|
59
|
-
+ (__builtin_types_compatible_p (__typeof (TG_ARG), long double), \
|
60
|
-
+ FUNC ## l ARGS, \
|
61
|
-
+ FUNC ## f128 ARGS)))
|
62
|
-
+# endif
|
63
|
-
+#else
|
64
|
-
+# define __MATH_TG(TG_ARG, FUNC, ARGS) \
|
65
|
-
+ (sizeof (TG_ARG) == sizeof (float) \
|
66
|
-
+ ? FUNC ## f ARGS \
|
67
|
-
+ : sizeof (TG_ARG) == sizeof (double) \
|
68
|
-
+ ? FUNC ARGS \
|
69
|
-
+ : FUNC ## l ARGS)
|
70
|
-
+#endif
|
71
|
-
+
|
72
|
-
/* Return number of classification appropriate for X. */
|
73
|
-
-# ifdef __NO_LONG_DOUBLE_MATH
|
74
|
-
-# define fpclassify(x) \
|
75
|
-
- (sizeof (x) == sizeof (float) ? __fpclassifyf (x) : __fpclassify (x))
|
76
|
-
-# else
|
77
|
-
-# define fpclassify(x) \
|
78
|
-
- (sizeof (x) == sizeof (float) \
|
79
|
-
- ? __fpclassifyf (x) \
|
80
|
-
- : sizeof (x) == sizeof (double) \
|
81
|
-
- ? __fpclassify (x) : __fpclassifyl (x))
|
82
|
-
+# if ((__GNUC_PREREQ (4,4) && !defined __SUPPORT_SNAN__) \
|
83
|
-
+ ) \
|
84
|
-
+ && (!defined __OPTIMIZE_SIZE__ || defined __cplusplus)
|
85
|
-
+ /* The check for __cplusplus allows the use of the builtin, even
|
86
|
-
+ when optimization for size is on. This is provided for
|
87
|
-
+ libstdc++, only to let its configure test work when it is built
|
88
|
-
+ with -Os. No further use of this definition of fpclassify is
|
89
|
-
+ expected in C++ mode, since libstdc++ provides its own version
|
90
|
-
+ of fpclassify in cmath (which undefines fpclassify). */
|
91
|
-
+# define fpclassify(x) __builtin_fpclassify (FP_NAN, FP_INFINITE, \
|
92
|
-
+ FP_NORMAL, FP_SUBNORMAL, FP_ZERO, x)
|
93
|
-
+# else
|
94
|
-
+# define fpclassify(x) __MATH_TG ((x), __fpclassify, (x))
|
95
|
-
# endif
|
96
|
-
|
97
|
-
/* Return nonzero value if sign of X is negative. */
|
98
|
-
-# ifdef __NO_LONG_DOUBLE_MATH
|
99
|
-
-# define signbit(x) \
|
100
|
-
- (sizeof (x) == sizeof (float) ? __signbitf (x) : __signbit (x))
|
101
|
-
-# else
|
102
|
-
-# define signbit(x) \
|
103
|
-
- (sizeof (x) == sizeof (float) \
|
104
|
-
- ? __signbitf (x) \
|
105
|
-
- : sizeof (x) == sizeof (double) \
|
106
|
-
- ? __signbit (x) : __signbitl (x))
|
107
|
-
+# if __GNUC_PREREQ (6,0)
|
108
|
-
+# define signbit(x) __builtin_signbit (x)
|
109
|
-
+# elif defined __cplusplus
|
110
|
-
+ /* In C++ mode, __MATH_TG cannot be used, because it relies on
|
111
|
-
+ __builtin_types_compatible_p, which is a C-only builtin.
|
112
|
-
+ The check for __cplusplus allows the use of the builtin instead of
|
113
|
-
+ __MATH_TG. This is provided for libstdc++, only to let its configure
|
114
|
-
+ test work. No further use of this definition of signbit is expected
|
115
|
-
+ in C++ mode, since libstdc++ provides its own version of signbit
|
116
|
-
+ in cmath (which undefines signbit). */
|
117
|
-
+# define signbit(x) __builtin_signbitl (x)
|
118
|
-
+# elif __GNUC_PREREQ (4,0)
|
119
|
-
+# define signbit(x) __MATH_TG ((x), __builtin_signbit, (x))
|
120
|
-
+# else
|
121
|
-
+# define signbit(x) __MATH_TG ((x), __signbit, (x))
|
122
|
-
# endif
|
123
|
-
|
124
|
-
/* Return nonzero value if X is not +-Inf or NaN. */
|
125
|
-
-# ifdef __NO_LONG_DOUBLE_MATH
|
126
|
-
-# define isfinite(x) \
|
127
|
-
- (sizeof (x) == sizeof (float) ? __finitef (x) : __finite (x))
|
128
|
-
-# else
|
129
|
-
-# define isfinite(x) \
|
130
|
-
- (sizeof (x) == sizeof (float) \
|
131
|
-
- ? __finitef (x) \
|
132
|
-
- : sizeof (x) == sizeof (double) \
|
133
|
-
- ? __finite (x) : __finitel (x))
|
134
|
-
+# if (__GNUC_PREREQ (4,4) && !defined __SUPPORT_SNAN__)
|
135
|
-
+# define isfinite(x) __builtin_isfinite (x)
|
136
|
-
+# else
|
137
|
-
+# define isfinite(x) __MATH_TG ((x), __finite, (x))
|
138
|
-
# endif
|
139
|
-
|
140
|
-
/* Return nonzero value if X is neither zero, subnormal, Inf, nor NaN. */
|
141
|
-
-# define isnormal(x) (fpclassify (x) == FP_NORMAL)
|
142
|
-
+# if (__GNUC_PREREQ (4,4) && !defined __SUPPORT_SNAN__)
|
143
|
-
+# define isnormal(x) __builtin_isnormal (x)
|
144
|
-
+# else
|
145
|
-
+# define isnormal(x) (fpclassify (x) == FP_NORMAL)
|
146
|
-
+# endif
|
147
|
-
|
148
|
-
/* Return nonzero value if X is a NaN. We could use `fpclassify' but
|
149
|
-
we already have this functions `__isnan' and it is faster. */
|
150
|
-
-# ifdef __NO_LONG_DOUBLE_MATH
|
151
|
-
-# define isnan(x) \
|
152
|
-
- (sizeof (x) == sizeof (float) ? __isnanf (x) : __isnan (x))
|
153
|
-
-# else
|
154
|
-
-# define isnan(x) \
|
155
|
-
- (sizeof (x) == sizeof (float) \
|
156
|
-
- ? __isnanf (x) \
|
157
|
-
- : sizeof (x) == sizeof (double) \
|
158
|
-
- ? __isnan (x) : __isnanl (x))
|
159
|
-
+# if (__GNUC_PREREQ (4,4) && !defined __SUPPORT_SNAN__)
|
160
|
-
+# define isnan(x) __builtin_isnan (x)
|
161
|
-
+# else
|
162
|
-
+# define isnan(x) __MATH_TG ((x), __isnan, (x))
|
163
|
-
# endif
|
164
|
-
|
165
|
-
/* Return nonzero value if X is positive or negative infinity. */
|
166
|
-
-# ifdef __NO_LONG_DOUBLE_MATH
|
167
|
-
+# if __HAVE_DISTINCT_FLOAT128 && !__GNUC_PREREQ (7,0) \
|
168
|
-
+ && !defined __SUPPORT_SNAN__ && !defined __cplusplus
|
169
|
-
+ /* Since __builtin_isinf_sign is broken for float128 before GCC 7.0,
|
170
|
-
+ use the helper function, __isinff128, with older compilers. This is
|
171
|
-
+ only provided for C mode, because in C++ mode, GCC has no support
|
172
|
-
+ for __builtin_types_compatible_p (and when in C++ mode, this macro is
|
173
|
-
+ not used anyway, because libstdc++ headers undefine it). */
|
174
|
-
# define isinf(x) \
|
175
|
-
- (sizeof (x) == sizeof (float) ? __isinff (x) : __isinf (x))
|
176
|
-
+ (__builtin_types_compatible_p (__typeof (x), _Float128) \
|
177
|
-
+ ? __isinff128 (x) : __builtin_isinf_sign (x))
|
178
|
-
+# elif (__GNUC_PREREQ (4,4) && !defined __SUPPORT_SNAN__)
|
179
|
-
+# define isinf(x) __builtin_isinf_sign (x)
|
180
|
-
# else
|
181
|
-
-# define isinf(x) \
|
182
|
-
- (sizeof (x) == sizeof (float) \
|
183
|
-
- ? __isinff (x) \
|
184
|
-
- : sizeof (x) == sizeof (double) \
|
185
|
-
- ? __isinf (x) : __isinfl (x))
|
186
|
-
+# define isinf(x) __MATH_TG ((x), __isinf, (x))
|
187
|
-
# endif
|
188
|
-
|
189
|
-
/* Bitmasks for the math_errhandling macro. */
|