ruby-magic 0.0.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/AUTHORS +1 -1
- data/CHANGELOG.md +60 -0
- data/CONTRIBUTORS.md +17 -0
- data/COPYRIGHT +1 -1
- data/NOTICE +505 -0
- data/README.md +49 -0
- data/dependencies.yml +93 -0
- data/ext/magic/common.h +130 -59
- data/ext/magic/extconf.rb +404 -64
- data/ext/magic/functions.c +265 -187
- data/ext/magic/functions.h +46 -79
- data/ext/magic/ruby-magic.c +1288 -641
- data/ext/magic/ruby-magic.h +383 -173
- data/kwilczynski-public.pem +25 -0
- data/lib/magic.rb +86 -87
- data/lib/magic/core/file.rb +8 -66
- data/lib/magic/core/string.rb +4 -47
- data/lib/magic/version.rb +14 -48
- data/patches/libmagic/0001-Don-t-attempt-to-build-tests-documentation-and-Python-bindings.patch +44 -0
- data/ports/archives/file-5.39.tar.gz +0 -0
- metadata +36 -99
- data/CHANGES +0 -5
- data/CHANGES.rdoc +0 -5
- data/README +0 -1
- data/README.rdoc +0 -7
- data/Rakefile +0 -78
- data/TODO +0 -21
- data/VERSION +0 -1
- data/bin/magic +0 -33
- data/ruby-magic.gemspec +0 -68
- data/test/test_constants.rb +0 -47
- data/test/test_magic.rb +0 -260
data/README.md
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
# File Magic in Ruby
|
2
|
+
|
3
|
+
[](https://travis-ci.com/kwilczynski/ruby-magic)
|
4
|
+
[](https://inch-ci.org/github/kwilczynski/ruby-magic)
|
5
|
+
[](http://badge.fury.io/rb/ruby-magic)
|
6
|
+
[](https://opensource.org/licenses/Apache-2.0)
|
7
|
+
|
8
|
+
## Introduction
|
9
|
+
|
10
|
+
Provides simple interface to [libmagic][1] for Ruby Programming Language.
|
11
|
+
|
12
|
+
## Table of Contents
|
13
|
+
|
14
|
+
1. [Contributing](#contributing)
|
15
|
+
2. [Versioning](#versioning)
|
16
|
+
3. [Author](#author)
|
17
|
+
4. [Contributors](#contributors)
|
18
|
+
4. [Copyright](#copyright)
|
19
|
+
5. [License](#license)
|
20
|
+
|
21
|
+
## Contributing
|
22
|
+
|
23
|
+
See the [CONTRIBUTING.md](CONTRIBUTING.md) for best practices and instructions
|
24
|
+
on setting up your development environment.
|
25
|
+
|
26
|
+
## Versioning
|
27
|
+
|
28
|
+
This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
29
|
+
For the versions available, see the tags on this repository.
|
30
|
+
|
31
|
+
## Author
|
32
|
+
|
33
|
+
Krzysztof Wilczyński (<kw@linux.com>)
|
34
|
+
|
35
|
+
## Contributors
|
36
|
+
|
37
|
+
See the [CONTRIBUTORS.md](CONTRIBUTORS.md) file for a list of contributors to
|
38
|
+
the project.
|
39
|
+
|
40
|
+
## Copyright
|
41
|
+
|
42
|
+
Copyright 2013-2021 Krzysztof Wilczyński
|
43
|
+
|
44
|
+
## License
|
45
|
+
|
46
|
+
This project is licensed under the terms of the Apache License, Version 2.0 license.
|
47
|
+
To view the full license see the included [LICENSE](LICENSE) file.
|
48
|
+
|
49
|
+
[1]: https://en.wikipedia.org/wiki/File_(command)
|
data/dependencies.yml
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
libmagic:
|
2
|
+
version: "5.39"
|
3
|
+
sha256: "f05d286a76d9556243d0cb05814929c2ecf3a5ba07963f8f70bfaaa70517fad1"
|
4
|
+
# Manually verified checksum:
|
5
|
+
#
|
6
|
+
# $ gpg --verify file-5.39.tar.gz.asc file-5.39.tar.gz
|
7
|
+
# gpg: Signature made Mon Jun 15 02:06:08 2020 CEST
|
8
|
+
# gpg: using DSA key 0x71112AB16CB33B3A
|
9
|
+
# gpg: Good signature from "Christos Zoulas (personal key) <christos@zoulas.com>" [unknown]
|
10
|
+
# gpg: aka "Christos Zoulas (NetBSD key) <christos@netbsd.org>" [unknown]
|
11
|
+
# gpg: WARNING: This key is not certified with a trusted signature!
|
12
|
+
# gpg: There is no indication that the signature belongs to the owner.
|
13
|
+
# Primary key fingerprint: BE04 995B A8F9 0ED0 C0C1 76C4 7111 2AB1 6CB3 3B3A
|
14
|
+
#
|
15
|
+
# Using this PGP signature:
|
16
|
+
#
|
17
|
+
# -----BEGIN PGP PUBLIC KEY BLOCK-----
|
18
|
+
# mQGiBEg60Q8RBAC89+Oyi+iU1dMftAqXKh9Ml2PDCRk+Q6gwSY2BwmnKrPYvLSx9/YApjDp4
|
19
|
+
# BzhjaMCiDtDkbVDO3JuLQqUsCUWRJr9UxgfkQPMx3obkgoyCCvUcG5eK9CHeztjz5UK3jOzD
|
20
|
+
# 939UtupUXs+5z4dK1oAFFEL3sV6m5O4cuHyeWpjLCwCg9LYwmG2wIB65/2619W2kRMShDwkD
|
21
|
+
# /1KweB5mmXdQCDpzSg02Q4kGOzWmN2Dpv5kvKd9Lj/qxkj5PFOJ56Rmm04K0lPE6AnDgvEeu
|
22
|
+
# SqO8pkA8OY5IQNIjlgg3tshoMBRdsj9JLKv67smQXy01eQmadJWoiIZFuSLX7nrRLm3x3i1K
|
23
|
+
# 4/tcKorXoD5QBgOWaYFzkOcQ5jrwA/9tn0MEkkVqez88xGhOjq6jooRWrP2lhNWb+Q7ayEvW
|
24
|
+
# 9Wm9CYS0dXxlCCJfqBOc+cZo8iVVbqiOzwAQ7uAAUv8azuaeRWpOD7MSjkXjYtkPwZevEd6x
|
25
|
+
# FKODaB2BDO4WMlxO9mp3Q/gPfrM41v9n33tYsAzQMW7c9W5mX/XH2Cv/57QyQ2hyaXN0b3Mg
|
26
|
+
# Wm91bGFzIChOZXRCU0Qga2V5KSA8Y2hyaXN0b3NAbmV0YnNkLm9yZz6IXgQQEQgABgUCWcg8
|
27
|
+
# UAAKCRCWb7A7gPrCzP43AP9pxzM85lwZxHRG8vPw16wWUYGcGW44g/u1zqavRUksvgD/fX1y
|
28
|
+
# 6+cj5kNEqp5bHgCvOJiSYADIUQaPTYbwMvnQ1IuIZAQTEQIAJAIbAwYLCQgHAwIDFQIDAxYC
|
29
|
+
# AQIeAQIXgAUCV7RsLgUJIkWeFwAKCRBxESqxbLM7Oi/LAKC1PdNLcoP06p6nsGh4ApH0gkSl
|
30
|
+
# fgCg7k7lwLPdN0djOMUPMFnqN+TYAoaIZAQTEQIAJAUCSDrTKgIbAwUJDwmcAAYLCQgHAwID
|
31
|
+
# FQIDAxYCAQIeAQIXgAAKCRBxESqxbLM7OqXeAJ9tkhVpTsdkix5oWzsBCbU4vHO2CACfbd8k
|
32
|
+
# PWR68VgvDK5RPQchyghfIZGJARwEEAECAAYFAlnOXIQACgkQWrHF/qWWAmTEhggAmTr9PxSU
|
33
|
+
# wQ8dAvno6I30mDY+r4V2FaD+WvhITDV/CYfU4ImDCfknDC1x4f44YAgN94YQfnTmAixWLLk9
|
34
|
+
# NhvgKWHg5Sq2p7S3hLe3hQHUu+4mHq2t+oBtiwnb+GPUAz3ko1hjQ2fN3nZdwKNA3P37NJuj
|
35
|
+
# EiXOR1UsxO8TaTuf/mB+9vdrUpHsgRaZwYIJ7oszkRkr2V82QsMwgcIdnCPEVY7q+foi2DUF
|
36
|
+
# UW3eujRLpW9M/NUXrA8f2wQZVaLNy+Zpai57uXW7bVRc82+uRDVwckhKq+YRpfRiD/JCWzKP
|
37
|
+
# AJJfabUkKiA6NUe51aQJm64BUKh7p8ZR4qjCr/Roofsh9okCHAQQAQIABgUCWduxXQAKCRBm
|
38
|
+
# Bw6ljCki37ulD/4iZ9hjimgichG5F5Ht2CfPx3Qm16QYjnuB2l7FZNPYlcThdNgjJjc4Wro3
|
39
|
+
# jrcfj6KMTGXnkRuY7794co6z/U/x9sVz9wQYr0ugrJsVQeHRWbJGl2vFhOOtgj9hfJQM44nz
|
40
|
+
# 3ZZR4VDh/KU4njBhPR1Mzxoop1WBnWcE9RpTIyMlaB6RK9I8JGOpvNYzQaODnsG7z144G/3W
|
41
|
+
# gIWZnjVVozv/szvtabd+L1N3hMPI2jNkmKWSGuZWdIIcPBEp2e9AYmb9mVhp8UanrMWVTUi0
|
42
|
+
# q7Cc0Jw4tkTwXYaEeRcbbB87p+IV0an7o+m9e2hrdZJan276tDOFe+HgcZ4NiEM8LTcOBIHn
|
43
|
+
# VWaRLwQD4AAB8zmMHiVTN3oUdQsYlZmHhBYv8Bkfzwi8JdxMq7V2zGntQnROl9Ust3qL8g28
|
44
|
+
# xI/dzt396qupywaF/2bUKyZx/079Y3eEluPQlU+iof+hJ2roetJNwMzs/hTDLQgI4T8ZhsMO
|
45
|
+
# MewZUVI59YrqjETR1U6+L9txmULgL16jBpLqvFBGhUOIDqjI5uxapEjCGy3inocjUeejy5iN
|
46
|
+
# PehQwt2TKC2Exsyd02kJrPErYVcMLYbO90d2ykBItoSXsDcuOTgfyxpvxTUih4tHVf5B69Ht
|
47
|
+
# HAPPYqSEfwlVazLnoe/z5KU2h415vcwuRuI1WU0ghdGFCMmH1rQ0Q2hyaXN0b3MgWm91bGFz
|
48
|
+
# IChwZXJzb25hbCBrZXkpIDxjaHJpc3Rvc0B6b3VsYXMuY29tPoheBBARCAAGBQJZyDxEAAoJ
|
49
|
+
# EJZvsDuA+sLMa3oA/Rub7s6Vp61CJ4kDTyfAJg0vL2Y6dqb0l1qZfg7kHWDTAQDK85IGzegN
|
50
|
+
# dAftzh5ZBgOOByQ8C8nprbxQWNTKXwWBH4hkBBMRAgAkAhsDBgsJCAcDAgMVAgMDFgIBAh4B
|
51
|
+
# AheABQJXtGwxBQkiRZ4XAAoJEHERKrFsszs6XGUAn2mngFtwV1va2adBDUrx4ZpXHQNBAJ9w
|
52
|
+
# EZ8bIqAmyTrAE8r0iOXe1bzWrIhkBBMRAgAkBQJIOtEPAhsDBQkPCZwABgsJCAcDAgMVAgMD
|
53
|
+
# FgIBAh4BAheAAAoJEHERKrFsszs63YcAnRjURIBsnyKeY+f6jO8pVYx499LHAJwP4h+X2i+r
|
54
|
+
# drCNiSYYVCYbkNjysokBHAQQAQIABgUCWc5chAAKCRBascX+pZYCZA6bCACAB7DFdL0DfXUU
|
55
|
+
# +BTcJQXvlD9fKBoGmonUACPX/wq7phmnvJL0Btl1KJlcLuiu94PgLPXH4nWwpGnWG2Ogigqf
|
56
|
+
# HxM4Jx6skqkBQI6npacTU1nSaIBW4hKZpo/6QvgjmO1wsSPemIvZ/8+ijfS5AHPh0gew3BFj
|
57
|
+
# ESPvwWxxode3zDKD5n6g1vU4Id9i0OqjUUkUnCBy8pz6b/n3VuyYXM+OnMgZw+tXfYUJkf3v
|
58
|
+
# 15gWhXlmpeLCPdmSZ8NRy80lrY45EHra2lPx3RgX88AF3cgwLrKfjLRc1yuSZ1mipT+pI1Fs
|
59
|
+
# uUe14XfXHiLM2ESp2HLDLmCY8lwYelmWPO76skwEiQIcBBABAgAGBQJZ27FdAAoJEGYHDqWM
|
60
|
+
# KSLft9UP/3ZxzMkr2m8/itBLOBJbMlvCb5gfZLHrQV/GF9OIDDSdu0+4cbbVqeXyg4tEQHHi
|
61
|
+
# 8Gr9WZI3CgqWbJN66NkKnaPqZ4RE7a98h9AvRxWsGhBI+I8r8LTlsQQrhjUyEinsr7oqNP9M
|
62
|
+
# SO7vicg6df5SuWmQxTrap8A1noX6O0djzJ9Ea721hCHDxGQ9nxCAPOIvS7lI06soNLuuTdp+
|
63
|
+
# E+r1d3+saHGU6YK8GsnqFSTdxb9WBUJU8BQpcI9kL3iIGA8Azw6L5CFra9InCCQIjzHIbL/r
|
64
|
+
# WLIJKxJicHJib009atUeLDCwmdaLHoqOkqOJIYrnbbEkPQunY6A68KkNx05N5p46eRwKxKA0
|
65
|
+
# TJQAMyzdkCYKaiQe+pETwsyO89P9RK84P5wCG4jqSe29JW7VeuBOQDJ3khBN3whDu9s5gVlh
|
66
|
+
# UGjIeLo85g7IIKTtv5fbopAUCjbVwccqws54PmiSqTy5OlOCbbYGDtoermnXME+sFcNRT8MI
|
67
|
+
# ktWShC6GrF1BhVrS4ex9e6jsQxKQRMlab2bBeJ6rUXT/i8cnpJERViPspDvVgL7Oer+K2gep
|
68
|
+
# uNa2DeCaNardaAYo2IYu985pqRZYJVTCydmX+Wlhfp12tzToW1/9QsLTvKUhuI0WB/cC839t
|
69
|
+
# lJRXapfKjwjj91VEX7Y26vHWli5noHMSNIRlIjT5RqouuQQNBEg60jMQEADIcUV/L4XmXXqj
|
70
|
+
# GvglW2ZAPn/FIm+N4GM/vTjxUXAc2ciiIsTDuO+1+e4sB9eN05rcvtTyt28W6N6hL8HfQIFq
|
71
|
+
# 5WEsd86vd+cSiBlisq1BglNgFiAfRy/guoLHiYnBlSdS6/Gab86zR4m6Bg1JZOcV0c9Irffv
|
72
|
+
# 5XLlT/LX45V46ju3PQSJYGboKdEaX4jUWcSQgUQ4+HyyP2DsWPyfrJj4sFA0T78b1ywsyKK2
|
73
|
+
# OOv7KUQk/Hwq2C68aG6YlvvVKywucoSX2uk0ZnWjCCwgOtXxyHIysqAxcz9IPRbtJ3PjjScM
|
74
|
+
# kv9NMrb5SDswwZy1vfL8s1sa8w7uZgXlpOaFb/yYMuzvwKRwJNxptVW0TTcZ8ADemRiHgDzJ
|
75
|
+
# 0MbXYcmSH8CXla746Bg7oXaCMPvfivOnIsj/6d3YZPT1enwBprgL3VqlWPA4fjWyMh6+BoHu
|
76
|
+
# ak7Q4k2h2sSXo29tR6KXYbc+K+qUB+QrjGDkOL6JqN5nBLiu3H95B7ZEm8wDoYitDpt7ot9S
|
77
|
+
# 5ja+dcNyUu+XXUGXvc8SvzEmsDKMqxZSxvCyIfPhaFxVylLK02fhfXqpBImvZ6UmHOzylNlk
|
78
|
+
# TqJzDG4LOOiC/knv7ypgr7VH8TJ2PD9p2IR79hKjnVGmYvTtZ132qda+erbNb/9wwAzOeG49
|
79
|
+
# fgdiDSsUmvl15kEI+gBtZwADBQ/+PuZa9CEKryZpQ6hczzAN8oksk7MQaTBYdAd62zfaNa/Q
|
80
|
+
# QID3P5I8FsdXMCcKRipP95cZY8ZQKjBGt7O26Ts955Q71QS58rCXxeLP9/mbpm3kCwXrAkZH
|
81
|
+
# s2rH2awLOg6p8at2NJCn56AkldK1PyVtL0Qvl7nEOe+lcULqfLNEbGEgzev+ZK0v6So6lA2t
|
82
|
+
# i8derF5XkIMzCFdjcC1reZvfwNnxd/pQzuMfZOfPjPD6OKaBEWnWNZscU/ucNkgQpv+M2hCA
|
83
|
+
# paC3NaNiXl0TWsDp7981WSWnf6YZRTjLKyObdGmpo7Z+C9uVu2DbRlUiRAD3azBo4t03EZVB
|
84
|
+
# XMo/1opuqxyU6FLVW0mxLI2wh2M1Jt/RAvXLm5/Z9zGnPqwAObxkA518e71QXyM+GQ+M8Kyp
|
85
|
+
# PHr00oC+32PrKnFADI3s1oK5zMX0tjXb0voAgXTWNFsmi+efj7A3wt6G15ai70pOSTuFl9kb
|
86
|
+
# BqmCI4NmD5wV+uIR/jcmTf7jZKX5QPjDSJddJ5EeAsPXtur0wFZ9JwPM2FyNaeL92BjRYQPW
|
87
|
+
# C9vRtAUjJa2PSLofMDaEs+VD76WRI3E8kPIJiFeSqOLinclo1e41q3nyj5JBnwg50CwshW7g
|
88
|
+
# w/bU+IbzL0eZFjJ7ftJ+Xi/vlGtfbxjuKuhyD2PM3DNf9uXmcIV4ldEJzwhw2KmITwQYEQIA
|
89
|
+
# DwIbDAUCV7RsRgUJIkWdEAAKCRBxESqxbLM7OiJUAJ4y0+A//pOrp3rjo28Uyt34U+qRqwCe
|
90
|
+
# NqiZtKbSqpUgcLmKNgot+mSEAmmITwQYEQIADwUCSDrSMwIbDAUJDwmcAAAKCRBxESqxbLM7
|
91
|
+
# OnaqAJ0cUAs8+EPXqRYYbdu6ROINhExMkwCgpupi6uEG+b4yo6M+VlcQY7gl2DE=
|
92
|
+
# =XrDo
|
93
|
+
# -----END PGP PUBLIC KEY BLOCK-----
|
data/ext/magic/common.h
CHANGED
@@ -1,23 +1,3 @@
|
|
1
|
-
/* :enddoc: */
|
2
|
-
|
3
|
-
/*
|
4
|
-
* common.h
|
5
|
-
*
|
6
|
-
* Copyright 2013-2014 Krzysztof Wilczynski
|
7
|
-
*
|
8
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
9
|
-
* you may not use this file except in compliance with the License.
|
10
|
-
* You may obtain a copy of the License at
|
11
|
-
*
|
12
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
13
|
-
*
|
14
|
-
* Unless required by applicable law or agreed to in writing, software
|
15
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
16
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
17
|
-
* See the License for the specific language governing permissions and
|
18
|
-
* limitations under the License.
|
19
|
-
*/
|
20
|
-
|
21
1
|
#if !defined(_COMMON_H)
|
22
2
|
#define _COMMON_H 1
|
23
3
|
|
@@ -29,62 +9,153 @@
|
|
29
9
|
# define _BSD_SOURCE 1
|
30
10
|
#endif
|
31
11
|
|
12
|
+
#if !defined(_DEFAULT_SOURCE)
|
13
|
+
# define _DEFAULT_SOURCE 1
|
14
|
+
#endif
|
15
|
+
|
32
16
|
#if defined(__cplusplus)
|
33
17
|
extern "C" {
|
34
18
|
#endif
|
35
19
|
|
36
20
|
#include <stdio.h>
|
37
21
|
#include <stdlib.h>
|
22
|
+
#include <limits.h>
|
38
23
|
#include <string.h>
|
39
24
|
#include <unistd.h>
|
40
25
|
#include <fcntl.h>
|
41
26
|
#include <errno.h>
|
42
27
|
#include <assert.h>
|
43
|
-
#include <locale.h>
|
44
28
|
#include <sys/stat.h>
|
45
|
-
#include <magic.h>
|
46
|
-
#include <ruby.h>
|
47
|
-
|
48
|
-
#if !defined(EPERM)
|
49
|
-
# define EPERM 1
|
50
|
-
#endif
|
51
|
-
|
52
|
-
#if !defined(EFAULT)
|
53
|
-
# define EFAULT 14
|
54
|
-
#endif
|
55
29
|
|
56
|
-
#
|
57
|
-
# define EINVAL 22
|
58
|
-
#endif
|
59
|
-
|
60
|
-
#if !defined(ENOSYS)
|
61
|
-
# define ENOSYS 38
|
62
|
-
#endif
|
63
|
-
|
64
|
-
#if !defined(ANYARGS)
|
65
|
-
# if defined(__cplusplus)
|
66
|
-
# define ANYARGS ...
|
67
|
-
# else
|
68
|
-
# define ANYARGS
|
69
|
-
# endif
|
70
|
-
#endif
|
71
|
-
|
72
|
-
#if defined(UNUSED)
|
73
|
-
# undef(UNUSED)
|
74
|
-
#endif
|
75
|
-
|
76
|
-
#define UNUSED(x) (void)(x)
|
77
|
-
|
78
|
-
#if !defined(HAVE_MAGIC_VERSION) || MAGIC_VERSION < 517
|
79
|
-
# define HAVE_BROKEN_MAGIC 1
|
80
|
-
#endif
|
30
|
+
#include <magic.h>
|
81
31
|
|
82
|
-
|
32
|
+
#include <ruby.h>
|
33
|
+
#include <ruby/version.h>
|
34
|
+
|
35
|
+
#if defined(HAVE_RUBY_IO_H)
|
36
|
+
# include <ruby/io.h>
|
37
|
+
#else
|
38
|
+
# include <rubyio.h>
|
39
|
+
#endif /* HAVE_RUBY_IO_H */
|
40
|
+
|
41
|
+
#define BIT(n) (1 << (n))
|
42
|
+
|
43
|
+
#if !defined(UNUSED)
|
44
|
+
# define UNUSED(x) (void)(x)
|
45
|
+
#endif /* UNUSED */
|
46
|
+
|
47
|
+
#define ARRAY_SIZE(a) (int)(sizeof(a) / sizeof((a)[0]))
|
48
|
+
|
49
|
+
#if defined(F_DUPFD_CLOEXEC)
|
50
|
+
# define HAVE_F_DUPFD_CLOEXEC 1
|
51
|
+
#endif /* F_DUPFD_CLOEXEC */
|
52
|
+
|
53
|
+
#if defined(O_CLOEXEC)
|
54
|
+
# define HAVE_O_CLOEXEC 1
|
55
|
+
#endif /* O_CLOEXEC */
|
56
|
+
|
57
|
+
#if defined(POSIX_CLOSE_RESTART)
|
58
|
+
# define HAVE_POSIX_CLOSE_RESTART 1
|
59
|
+
#endif /* POSIX_CLOSE_RESTART */
|
60
|
+
|
61
|
+
#define MAGIC_EXTENSION_SEPARATOR "/"
|
62
|
+
#define MAGIC_CONTINUE_SEPARATOR "\n- "
|
63
|
+
|
64
|
+
#if !defined(MAGIC_SYSTEM_LIBRARIES)
|
65
|
+
# define MAGIC_STATUS_CHECK(x) x
|
66
|
+
#else
|
67
|
+
# define MAGIC_STATUS_CHECK(x) 1
|
68
|
+
#endif /* MAGIC_SYSTEM_LIBRARIES */
|
69
|
+
|
70
|
+
#if !defined(MAGIC_CUSTOM_CHECK_TYPE)
|
71
|
+
# define MAGIC_CHECK_RUBY_TYPE(o, t) Check_Type((o), (t))
|
72
|
+
#else
|
73
|
+
# define MAGIC_CHECK_RUBY_TYPE(o, t) magic_check_ruby_type((o), (t))
|
74
|
+
#endif /* MAGIC_CUSTOM_CHECK_TYPE */
|
75
|
+
|
76
|
+
#if !defined(MAGIC_NO_CHECK_CSV)
|
77
|
+
# define MAGIC_NO_CHECK_CSV 0
|
78
|
+
#endif /* MAGIC_NO_CHECK_CSV */
|
79
|
+
|
80
|
+
#if !defined(MAGIC_NO_CHECK_JSON)
|
81
|
+
# define MAGIC_NO_CHECK_JSON 0
|
82
|
+
#endif /* MAGIC_NO_CHECK_JSON */
|
83
|
+
|
84
|
+
#define DATA_P(x) (RB_TYPE_P((x), T_DATA))
|
85
|
+
#define BOOLEAN_P(x) (RB_TYPE_P((x), T_TRUE) || RB_TYPE_P((x), T_FALSE))
|
86
|
+
#define STRING_P(x) (RB_TYPE_P((x), T_STRING))
|
87
|
+
#define ARRAY_P(x) (RB_TYPE_P((x), T_ARRAY))
|
88
|
+
#define FILE_P(x) (RB_TYPE_P((x), T_FILE))
|
89
|
+
|
90
|
+
#define RVAL2CBOOL(x) (RTEST(x))
|
91
|
+
#define CBOOL2RVAL(x) ((x) ? Qtrue : Qfalse)
|
92
|
+
|
93
|
+
#define RVAL2CSTR(x) (NIL_P(x) ? NULL : StringValueCStr(x))
|
94
|
+
#define CSTR2RVAL(x) ((x) == NULL ? Qnil : rb_str_new2(x))
|
95
|
+
|
96
|
+
#define RARRAY_EMPTY rb_ary_new()
|
97
|
+
#define RARRAY_EMPTY_P(a) (RARRAY_LEN(a) == 0)
|
98
|
+
#define RARRAY_FIRST(a) (RARRAY_EMPTY_P(a) ? Qnil : rb_ary_entry((a), 0))
|
99
|
+
|
100
|
+
#if RUBY_API_VERSION_CODE > 20700
|
101
|
+
# define RVALUE_TYPE enum ruby_value_type
|
102
|
+
#else
|
103
|
+
# define RVALUE_TYPE int
|
104
|
+
#endif /* RUBY_API_VERSION_CODE > 20700 */
|
105
|
+
|
106
|
+
#if RUBY_API_VERSION_CODE >= 20700
|
107
|
+
# define HAVE_RUBY_GC_COMPACT 1
|
108
|
+
# define MAGIC_GC_MARK(x) rb_gc_mark_movable((x))
|
109
|
+
#else
|
110
|
+
# define MAGIC_GC_MARK(x) rb_gc_mark((x))
|
111
|
+
#endif /* RUBY_API_VERSION_CODE >= 20700 */
|
112
|
+
|
113
|
+
#define CLASS_NAME(o) (NIL_P((o)) ? "nil" : rb_obj_classname((o)))
|
114
|
+
|
115
|
+
#if !defined(T_INTEGER)
|
116
|
+
# define T_INTEGER rb_cInteger
|
117
|
+
#endif /* T_INTEGER */
|
118
|
+
|
119
|
+
#if !defined(HAVE_RB_IO_T)
|
120
|
+
# define rb_io_t OpenFile
|
121
|
+
#endif /* HAVE_RB_IO_T */
|
122
|
+
|
123
|
+
#if !defined(GetReadFile)
|
124
|
+
# define FPTR_TO_FD(p) ((p)->fd)
|
125
|
+
#else
|
126
|
+
# define FPTR_TO_FD(p) (fileno(GetReadFile(p)))
|
127
|
+
#endif /* GetReadFile */
|
128
|
+
|
129
|
+
#define NOGVL_FUNCTION (VALUE (*)(void *))
|
130
|
+
|
131
|
+
#if defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL) && \
|
132
|
+
defined(HAVE_RUBY_THREAD_H) && HAVE_RUBY_THREAD_H
|
133
|
+
# include <ruby/thread.h>
|
134
|
+
# define NOGVL(f, d) \
|
135
|
+
rb_thread_call_without_gvl((f), (d), RUBY_UBF_IO, NULL)
|
136
|
+
#elif defined(HAVE_RB_THREAD_BLOCKING_REGION)
|
137
|
+
# define NOGVL(f, d) \
|
138
|
+
rb_thread_blocking_region(NOGVL_FUNCTION(f), (d), RUBY_UBF_IO, NULL)
|
139
|
+
#else
|
140
|
+
# include <rubysig.h>
|
141
|
+
static inline VALUE
|
142
|
+
fake_blocking_region(VALUE (*f)(ANYARGS), void *data)
|
143
|
+
{
|
144
|
+
VALUE rv;
|
145
|
+
|
146
|
+
TRAP_BEG;
|
147
|
+
rv = f(data);
|
148
|
+
TRAP_END;
|
149
|
+
|
150
|
+
return rv;
|
151
|
+
}
|
152
|
+
# define NOGVL(f, d) \
|
153
|
+
fake_blocking_region(NOGVL_FUNCTION(f), (d))
|
154
|
+
#endif /* HAVE_RB_THREAD_CALL_WITHOUT_GVL
|
155
|
+
HAVE_RUBY_THREAD_H */
|
83
156
|
|
84
157
|
#if defined(__cplusplus)
|
85
158
|
}
|
86
159
|
#endif
|
87
160
|
|
88
161
|
#endif /* _COMMON_H */
|
89
|
-
|
90
|
-
/* vim: set ts=8 sw=4 sts=2 et : */
|
data/ext/magic/extconf.rb
CHANGED
@@ -1,115 +1,455 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require 'find'
|
4
|
+
require 'mkmf'
|
5
|
+
require 'pathname'
|
6
|
+
|
7
|
+
# helpful constants
|
8
|
+
PACKAGE_ROOT_DIR = File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
|
9
|
+
|
10
|
+
# The gem version constraint in the Rakefile is not respected at install time.
|
11
|
+
# Keep this version in sync with the one in the Rakefile !
|
12
|
+
REQUIRED_MINI_PORTILE_VERSION = "~> 2.5.0"
|
13
|
+
|
14
|
+
MAGIC_HELP_MESSAGE = <<~HELP
|
15
|
+
USAGE: ruby #{$0} [options]
|
16
|
+
|
17
|
+
Flags that are always valid:
|
18
|
+
|
19
|
+
--use-system-libraries
|
20
|
+
--enable-system-libraries
|
21
|
+
Use system libraries instead of building and using the packaged libraries.
|
22
|
+
|
23
|
+
--disable-system-libraries
|
24
|
+
Use the packaged libraries, and ignore the system libraries. This is the default on most
|
25
|
+
platforms, and overrides `--use-system-libraries` and the environment variable
|
26
|
+
`MAGIC_USE_SYSTEM_LIBRARIES`.
|
27
|
+
|
28
|
+
--disable-clean
|
29
|
+
Do not clean out intermediate files after successful build.
|
30
|
+
|
31
|
+
Flags only used when building and using the packaged libraries:
|
32
|
+
|
33
|
+
--disable-static
|
34
|
+
Do not statically link packaged libraries, instead use shared libraries.
|
35
|
+
|
36
|
+
--enable-cross-build
|
37
|
+
Enable cross-build mode. (You probably do not want to set this manually.)
|
38
|
+
|
39
|
+
Flags only used when using system libraries:
|
40
|
+
|
41
|
+
Related to libmagic:
|
42
|
+
|
43
|
+
--with-magic-dir=DIRECTORY
|
44
|
+
Look for libmagic headers and library in DIRECTORY.
|
45
|
+
|
46
|
+
--with-magic-lib=DIRECTORY
|
47
|
+
Look for libmagic library in DIRECTORY.
|
48
|
+
|
49
|
+
--with-magic-include=DIRECTORY
|
50
|
+
Look for libmagic headers in DIRECTORY.
|
51
|
+
|
52
|
+
Environment variables used:
|
53
|
+
|
54
|
+
CC
|
55
|
+
Use this path to invoke the compiler instead of `RbConfig::CONFIG['CC']`
|
56
|
+
|
57
|
+
CPPFLAGS
|
58
|
+
If this string is accepted by the C preprocessor, add it to the flags passed to the C preprocessor
|
59
|
+
|
60
|
+
CFLAGS
|
61
|
+
If this string is accepted by the compiler, add it to the flags passed to the compiler
|
62
|
+
|
63
|
+
LDFLAGS
|
64
|
+
If this string is accepted by the linker, add it to the flags passed to the linker
|
65
|
+
|
66
|
+
LIBS
|
67
|
+
Add this string to the flags passed to the linker
|
68
|
+
HELP
|
69
|
+
|
70
|
+
def process_recipe(name, version, static_p, cross_p)
|
71
|
+
require 'rubygems'
|
72
|
+
gem('mini_portile2', REQUIRED_MINI_PORTILE_VERSION)
|
73
|
+
require 'mini_portile2'
|
74
|
+
message("Using mini_portile version #{MiniPortile::VERSION}\n")
|
75
|
+
|
76
|
+
MiniPortile.new(name, version).tap do |recipe|
|
77
|
+
# Prefer host_alias over host in order to use i586-mingw32msvc as
|
78
|
+
# correct compiler prefix for cross build, but use host if not set.
|
79
|
+
recipe.host = RbConfig::CONFIG["host_alias"].empty? ? RbConfig::CONFIG["host"] : RbConfig::CONFIG["host_alias"]
|
80
|
+
recipe.target = File.join(PACKAGE_ROOT_DIR, "ports")
|
81
|
+
recipe.patch_files = Dir[File.join(PACKAGE_ROOT_DIR, "patches", name, "*.patch")].sort
|
82
|
+
recipe.configure_options << "--libdir=#{File.join(recipe.path, 'lib')}"
|
83
|
+
|
84
|
+
yield recipe
|
85
|
+
|
86
|
+
env = Hash.new do |hash, key|
|
87
|
+
hash[key] = (ENV[key]).to_s
|
88
|
+
end
|
89
|
+
|
90
|
+
recipe.configure_options.flatten!
|
91
|
+
|
92
|
+
recipe.configure_options.delete_if do |option|
|
93
|
+
case option
|
94
|
+
when /\A(\w+)=(.*)\z/
|
95
|
+
env[Regexp.last_match(1)] = if env.key?(Regexp.last_match(1))
|
96
|
+
concat_flags(env[Regexp.last_match(1)], Regexp.last_match(2))
|
97
|
+
else
|
98
|
+
Regexp.last_match(2)
|
99
|
+
end
|
100
|
+
true
|
101
|
+
else
|
102
|
+
false
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
recipe.configure_options = [
|
107
|
+
"--disable-silent-rules",
|
108
|
+
"--disable-dependency-tracking",
|
109
|
+
"--enable-fsect-man5"
|
110
|
+
]
|
111
|
+
|
112
|
+
if static_p
|
113
|
+
recipe.configure_options += [
|
114
|
+
"--disable-shared",
|
115
|
+
"--enable-static",
|
116
|
+
]
|
117
|
+
env["CFLAGS"] = concat_flags(env["CFLAGS"], "-fPIC")
|
118
|
+
else
|
119
|
+
recipe.configure_options += [
|
120
|
+
"--enable-shared",
|
121
|
+
"--disable-static",
|
122
|
+
]
|
123
|
+
end
|
124
|
+
|
125
|
+
if cross_p
|
126
|
+
recipe.configure_options += [
|
127
|
+
"--target=#{recipe.host}",
|
128
|
+
"--host=#{recipe.host}",
|
129
|
+
]
|
130
|
+
end
|
131
|
+
|
132
|
+
if RbConfig::CONFIG['target_cpu'] == 'universal'
|
133
|
+
%w[CFLAGS LDFLAGS].each do |key|
|
134
|
+
unless env[key].include?('-arch')
|
135
|
+
env[key] = concat_flags(env[key], RbConfig::CONFIG['ARCH_FLAG'])
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
recipe.configure_options += env.map do |key, value|
|
141
|
+
"#{key}=#{value.strip}"
|
142
|
+
end
|
143
|
+
|
144
|
+
checkpoint = "#{recipe.target}/#{recipe.name}-#{recipe.version}-#{recipe.host}.installed"
|
145
|
+
|
146
|
+
if File.exist?(checkpoint)
|
147
|
+
message("Building Ruby Magic with a packaged version of #{name}-#{version}.\n")
|
148
|
+
else
|
149
|
+
message(<<~EOM)
|
150
|
+
---------- IMPORTANT NOTICE ----------
|
151
|
+
Building Ruby Magic with a packaged version of #{name}-#{version}.
|
152
|
+
Configuration options: #{recipe.configure_options.shelljoin}
|
153
|
+
EOM
|
154
|
+
|
155
|
+
unless recipe.patch_files.empty?
|
156
|
+
message("The following patches are being applied:\n")
|
157
|
+
|
158
|
+
recipe.patch_files.each do |patch|
|
159
|
+
message(" - %s\n" % File.basename(patch))
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
recipe.cook
|
164
|
+
|
165
|
+
FileUtils.touch(checkpoint)
|
166
|
+
end
|
167
|
+
|
168
|
+
recipe.activate
|
169
|
+
end
|
170
|
+
end
|
4
171
|
|
5
172
|
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
# Copyright 2013-2014 Krzysztof Wilczynski
|
9
|
-
#
|
10
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
11
|
-
# you may not use this file except in compliance with the License.
|
12
|
-
# You may obtain a copy of the License at
|
173
|
+
# utility functions
|
13
174
|
#
|
14
|
-
|
175
|
+
def config_clean?
|
176
|
+
enable_config('clean', true)
|
177
|
+
end
|
178
|
+
|
179
|
+
def config_static?
|
180
|
+
default_static = !truffle?
|
181
|
+
enable_config("static", default_static)
|
182
|
+
end
|
183
|
+
|
184
|
+
def config_cross_build?
|
185
|
+
enable_config("cross-build")
|
186
|
+
end
|
187
|
+
|
188
|
+
def config_system_libraries?
|
189
|
+
enable_config("system-libraries", ENV.key?("MAGIC_USE_SYSTEM_LIBRARIES")) do |_, default|
|
190
|
+
arg_config('--use-system-libraries', default)
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
def darwin?
|
195
|
+
RbConfig::CONFIG['target_os'] =~ /darwin/
|
196
|
+
end
|
197
|
+
|
198
|
+
def windows?
|
199
|
+
RbConfig::CONFIG['target_os'] =~ /mswin|mingw32|windows/
|
200
|
+
end
|
201
|
+
|
202
|
+
def truffle?
|
203
|
+
::RUBY_ENGINE == 'truffleruby'
|
204
|
+
end
|
205
|
+
|
206
|
+
def concat_flags(*args)
|
207
|
+
args.compact.join(" ")
|
208
|
+
end
|
209
|
+
|
210
|
+
def do_help
|
211
|
+
print(MAGIC_HELP_MESSAGE)
|
212
|
+
exit!(0)
|
213
|
+
end
|
214
|
+
|
215
|
+
def do_clean
|
216
|
+
root = Pathname(PACKAGE_ROOT_DIR)
|
217
|
+
pwd = Pathname(Dir.pwd)
|
218
|
+
|
219
|
+
# Skip if this is a development work tree
|
220
|
+
unless (root + '.git').exist?
|
221
|
+
message("Cleaning files only used during build.\n")
|
222
|
+
|
223
|
+
# (root + 'tmp') cannot be removed at this stage because
|
224
|
+
# libmagic.so is yet to be copied to lib.
|
225
|
+
|
226
|
+
# clean the ports build directory
|
227
|
+
Pathname.glob(pwd.join('tmp', '*', 'ports')) do |dir|
|
228
|
+
FileUtils.rm_rf(dir, verbose: true)
|
229
|
+
end
|
230
|
+
|
231
|
+
FileUtils.rm_rf(root + 'ports' + 'archives', verbose: true)
|
232
|
+
|
233
|
+
# Remove everything but share/ directory
|
234
|
+
remove_paths = %w[bin include]
|
235
|
+
remove_paths << 'lib' if config_static?
|
236
|
+
|
237
|
+
Pathname.glob(File.join(root, 'ports', '*', 'libmagic', '*')) do |dir|
|
238
|
+
remove_paths.each do |path|
|
239
|
+
remove_dir = File.join(dir, path)
|
240
|
+
FileUtils.rm_rf(remove_dir, verbose: true)
|
241
|
+
end
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
exit!(0)
|
246
|
+
end
|
247
|
+
|
15
248
|
#
|
16
|
-
#
|
17
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
18
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
19
|
-
# See the License for the specific language governing permissions and
|
20
|
-
# limitations under the License.
|
249
|
+
# main
|
21
250
|
#
|
251
|
+
do_help if arg_config('--help')
|
252
|
+
do_clean if arg_config('--clean')
|
22
253
|
|
23
|
-
|
254
|
+
if ENV['CC']
|
255
|
+
RbConfig::CONFIG['CC'] = RbConfig::MAKEFILE_CONFIG['CC'] = ENV['CC']
|
256
|
+
end
|
257
|
+
|
258
|
+
ENV['CC'] = RbConfig::CONFIG['CC']
|
259
|
+
|
260
|
+
append_cflags(ENV["CFLAGS"].split) if ENV["CFLAGS"]
|
261
|
+
append_cppflags(ENV["CPPFLAGS"].split) if ENV["CPPFLAGS"]
|
262
|
+
append_ldflags(ENV["LDFLAGS"].split) if ENV["LDFLAGS"]
|
263
|
+
|
264
|
+
$LIBS = concat_flags($LIBS, ENV["LIBS"]) if ENV["LIBS"]
|
265
|
+
|
266
|
+
if truffle?
|
267
|
+
$CPPFLAGS += " -DMAGIC_CUSTOM_CHECK_TYPE"
|
268
|
+
end
|
269
|
+
|
270
|
+
if config_system_libraries?
|
271
|
+
message "Building ruby-magic using system libraries.\n"
|
272
|
+
|
273
|
+
$CPPFLAGS += " -DMAGIC_SYSTEM_LIBRARIES"
|
274
|
+
|
275
|
+
dir_config('magic')
|
276
|
+
else
|
277
|
+
message "Building ruby-magic using packaged libraries.\n"
|
278
|
+
|
279
|
+
require 'yaml'
|
280
|
+
dependencies = YAML.load_file(File.join(PACKAGE_ROOT_DIR, "dependencies.yml"))
|
24
281
|
|
25
|
-
|
282
|
+
static_p = config_static?
|
283
|
+
message "Static linking is #{static_p ? 'enabled' : 'disabled'}.\n"
|
284
|
+
cross_build_p = config_cross_build?
|
285
|
+
message "Cross build is #{cross_build_p ? 'enabled' : 'disabled'}.\n"
|
286
|
+
|
287
|
+
libmagic_recipe = process_recipe('libmagic', dependencies["libmagic"]["version"], static_p, cross_build_p) do |recipe|
|
288
|
+
recipe.files = [{
|
289
|
+
url: "https://ruby-magic.s3.nl-ams.scw.cloud/file-#{recipe.version}.tar.gz",
|
290
|
+
sha256: dependencies["libmagic"]["sha256"],
|
291
|
+
}]
|
292
|
+
end
|
293
|
+
|
294
|
+
$LIBPATH = [File.join(libmagic_recipe.path, 'lib')]
|
295
|
+
$CFLAGS << " -I#{File.join(libmagic_recipe.path, 'include')} "
|
296
|
+
$LDFLAGS += " -Wl,-rpath,#{libmagic_recipe.path}/lib"
|
297
|
+
|
298
|
+
if static_p
|
299
|
+
ENV['PKG_CONFIG_PATH'] = "#{libmagic_recipe.path}/lib/pkgconfig"
|
300
|
+
# mkmf appends -- to the first option
|
301
|
+
$LIBS += " " + pkg_config('libmagic', 'libs --static')
|
302
|
+
$LIBS += " " + File.join(libmagic_recipe.path, 'lib', "libmagic.#{$LIBEXT}")
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
$CFLAGS += ' -std=c99'
|
307
|
+
|
308
|
+
if RbConfig::CONFIG['CC'] =~ /gcc/
|
309
|
+
$CFLAGS += ' -O3' unless $CFLAGS =~ /-O\d/
|
310
|
+
end
|
311
|
+
|
312
|
+
%w[
|
313
|
+
-Wcast-qual
|
314
|
+
-Wwrite-strings
|
315
|
+
-Wconversion
|
316
|
+
-Wmissing-noreturn
|
317
|
+
-Winline
|
318
|
+
].select do |flag|
|
319
|
+
try_link('int main(void) { return 0; }', flag)
|
320
|
+
end.each do |flag|
|
321
|
+
$CFLAGS += " " + flag
|
322
|
+
end
|
26
323
|
|
27
|
-
|
324
|
+
unless darwin?
|
325
|
+
$LDFLAGS += ' -Wl,--as-needed -Wl,--exclude-libs,ALL'
|
326
|
+
end
|
28
327
|
|
29
|
-
|
30
|
-
$
|
328
|
+
if windows?
|
329
|
+
$LDFLAGS += ' -static-libgcc'
|
330
|
+
end
|
31
331
|
|
32
332
|
unless have_header('ruby.h')
|
33
|
-
abort <<-EOS
|
333
|
+
abort "\n" + (<<-EOS).gsub(/^[ ]{,3}/, '') + "\n"
|
334
|
+
You appear to be missing Ruby development libraries and/or header
|
335
|
+
files. You can install missing compile-time dependencies in one of
|
336
|
+
the following ways:
|
337
|
+
|
338
|
+
- Debian / Ubuntu
|
339
|
+
|
340
|
+
apt-get install ruby-dev
|
341
|
+
|
342
|
+
- Red Hat / CentOS / Fedora
|
34
343
|
|
35
|
-
|
36
|
-
files. You can install missing compile-time dependencies in one of
|
37
|
-
the following ways:
|
344
|
+
yum install ruby-devel or dnf install ruby-devel
|
38
345
|
|
39
|
-
|
346
|
+
- Mac OS X (Darwin)
|
40
347
|
|
41
|
-
|
348
|
+
brew install ruby (for Homebrew, see https://brew.sh)
|
349
|
+
port install ruby2.6 (for MacPorts, see https://www.macports.org)
|
42
350
|
|
43
|
-
|
351
|
+
- OpenBSD / NetBSD
|
44
352
|
|
45
|
-
|
353
|
+
pkg_add ruby (for pkgsrc, see https://www.pkgsrc.org)
|
46
354
|
|
355
|
+
- FreeBSD
|
47
356
|
|
48
|
-
|
49
|
-
managers in order to install Ruby locally (for your user only)
|
50
|
-
and/or system-wide:
|
357
|
+
pkg install ruby (for FreeBSD Ports, see https://www.freebsd.org/ports)
|
51
358
|
|
52
|
-
|
53
|
-
|
359
|
+
Alternatively, you can use either of the following Ruby version
|
360
|
+
managers in order to install Ruby locally (for your user only)
|
361
|
+
and/or system-wide:
|
54
362
|
|
363
|
+
- Ruby Version Manager (for RVM, see https://rvm.io)
|
364
|
+
- Ruby Environment (for rbenv, see https://github.com/sstephenson/rbenv)
|
365
|
+
- Change Ruby (for chruby, see https://github.com/postmodern/chruby)
|
366
|
+
|
367
|
+
More information about how to install Ruby on various platforms
|
368
|
+
available at the following web site:
|
369
|
+
|
370
|
+
https://www.ruby-lang.org/en/documentation/installation
|
55
371
|
EOS
|
56
372
|
end
|
57
373
|
|
374
|
+
have_func('rb_thread_call_without_gvl')
|
375
|
+
have_func('rb_thread_blocking_region')
|
376
|
+
|
58
377
|
unless have_header('magic.h')
|
59
|
-
abort <<-EOS
|
378
|
+
abort "\n" + (<<-EOS).gsub(/^[ ]{,3}/, '') + "\n"
|
379
|
+
You appear to be missing libmagic(3) library and/or necessary header
|
380
|
+
files. You can install missing compile-time dependencies in one of
|
381
|
+
the following ways:
|
60
382
|
|
61
|
-
|
62
|
-
files. You can install missing compile-time dependencies in one of
|
63
|
-
the following ways:
|
383
|
+
- Debian / Ubuntu
|
64
384
|
|
65
|
-
|
385
|
+
apt-get install libmagic-dev
|
66
386
|
|
67
|
-
|
387
|
+
- Red Hat / CentOS / Fedora
|
68
388
|
|
69
|
-
|
389
|
+
yum install file-devel or dns install file-devel
|
70
390
|
|
71
|
-
|
391
|
+
- Mac OS X (Darwin)
|
72
392
|
|
73
|
-
|
393
|
+
brew install libmagic (for Homebrew, see https://brew.sh)
|
394
|
+
port install libmagic (for MacPorts, see https://www.macports.org)
|
74
395
|
|
75
|
-
|
76
|
-
port install libmagic (for MacPorts, see http://www.macports.org/)
|
396
|
+
- OpenBSD / NetBSD
|
77
397
|
|
398
|
+
pkg_add file (for pkgsrc, see https://www.pkgsrc.org)
|
78
399
|
|
79
|
-
|
80
|
-
from the following web site and attempt to compile libmagic(3) manually:
|
400
|
+
- FreeBSD
|
81
401
|
|
82
|
-
|
402
|
+
pkg install file (for FreeBSD Ports, see https://www.freebsd.org/ports)
|
83
403
|
|
404
|
+
Alternatively, you can download recent release of the file(1) package
|
405
|
+
from the following web site and attempt to compile libmagic(3) manually:
|
406
|
+
|
407
|
+
https://www.darwinsys.com/file
|
84
408
|
EOS
|
85
409
|
end
|
86
410
|
|
87
|
-
|
88
|
-
abort <<-EOS
|
89
|
-
|
90
|
-
Your version of libmagic(3) appears to be too old. Please, consider
|
91
|
-
upgrading to at least version 5.09 or newer if possible ...
|
411
|
+
have_library('magic')
|
92
412
|
|
93
|
-
|
94
|
-
|
413
|
+
unless have_func('magic_getpath')
|
414
|
+
abort "\n" + (<<-EOS).gsub(/^[ ]{,3}/, '') + "\n"
|
415
|
+
Your version of libmagic(3) appears to be too old.
|
95
416
|
|
96
|
-
|
417
|
+
Please, consider upgrading to at least version 5.29 or newer,
|
418
|
+
if possible. For more information about file(1) command and
|
419
|
+
libmagic(3) please visit the following web site:
|
97
420
|
|
421
|
+
https://www.darwinsys.com/file
|
98
422
|
EOS
|
99
423
|
end
|
100
424
|
|
101
|
-
have_func('
|
102
|
-
|
103
|
-
have_func('utime', ['utime.h', 'sys/types.h'])
|
104
|
-
have_func('utimes', 'sys/time.h')
|
425
|
+
have_func('magic_getflags')
|
105
426
|
|
106
|
-
|
107
|
-
|
427
|
+
%w[
|
428
|
+
utime.h
|
429
|
+
sys/types.h
|
430
|
+
sys/time.h
|
431
|
+
].each do |h|
|
432
|
+
have_header(h)
|
433
|
+
end
|
108
434
|
|
109
|
-
|
435
|
+
%w[
|
436
|
+
utime
|
437
|
+
utimes
|
438
|
+
].each do |f|
|
439
|
+
have_func(f)
|
440
|
+
end
|
110
441
|
|
111
442
|
create_header
|
112
443
|
create_makefile('magic/magic')
|
113
444
|
|
114
|
-
|
115
|
-
#
|
445
|
+
if config_clean?
|
446
|
+
# Do not clean if run in a development work tree.
|
447
|
+
File.open('Makefile', 'at') do |mk|
|
448
|
+
mk.print(<<~EOF)
|
449
|
+
|
450
|
+
all: clean-ports
|
451
|
+
clean-ports: $(DLLIB)
|
452
|
+
\t-$(Q)$(RUBY) $(srcdir)/extconf.rb --clean --#{static_p ? 'enable' : 'disable'}-static
|
453
|
+
EOF
|
454
|
+
end
|
455
|
+
end
|