Skip to content

Commit 91d289c

Browse files
committed
Improve tooling & support for multiple platforms
1 parent c6b2208 commit 91d289c

13 files changed

+130
-39
lines changed

.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@
77
.phpunit.cache
88
.php-cs-fixer.cache
99
vendor
10-
build
1110
scratch
11+
build/crc32fast-lib-rust
12+
build/crc64fast-nvme

Makefile

+5-19
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
.PHONY: build
2-
build: build-crc64nvme build-crc32isohdlc
3-
41
.PHONY: validate
52
validate: phpcs php-cs-fixer-check static-analysis test cli
63

@@ -53,22 +50,11 @@ composer:
5350
# Psalm v5.26.1 doesn't like PHP-8.4
5451
composer install --ignore-platform-req=php+
5552

56-
.PHONY: build-directory
57-
build-directory:
58-
@if [ ! -d "./build" ]; then mkdir build; fi
59-
60-
.PHONY: build-crc64nvme
61-
build-crc64nvme: build-directory
62-
@cd build && (if [ ! -d "./crc64fast-nvme" ]; then git clone https://github.com/awesomized/crc64fast-nvme.git; fi || true)
63-
@cd build/crc64fast-nvme && git fetch && git checkout 1.1.0
64-
@cd build/crc64fast-nvme && cargo build --release
65-
66-
.PHONY: build-crc32isohdlc
67-
build-crc32isohdlc: build-directory
68-
@cd build && (if [ ! -d "./crc32fast-lib-rust" ]; then git clone https://github.com/awesomized/crc32fast-lib-rust.git; fi || true)
69-
@cd build/crc32fast-lib-rust && git fetch && git checkout 1.0.0
70-
@cd build/crc32fast-lib-rust && cargo build --release
53+
.PHONY: build
54+
build:
55+
@cd build && make
7156

7257
.PHONY: clean
7358
clean:
74-
rm -rf build
59+
rm -rf vendor
60+
cd make && make clean

build/Makefile

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
# TODO: Support Windows? x86? Other platforms and architectures?
2+
3+
BUILD_CROSS = cross build --release
4+
BUILD_CARGO = cargo build --release
5+
6+
TARGET_LINUX_X86_64 = --target=x86_64-unknown-linux-gnu
7+
TARGET_LINUX_ARM64 = --target=aarch64-unknown-linux-gnu
8+
TARGET_DARWIN = --target=aarch64-apple-darwin
9+
10+
# default is just to use cross-rs to cross-compile for all targets
11+
# https://github.com/cross-rs/cross
12+
BUILD_LINUX_X86_64_TARGET = $(BUILD_CROSS) $(TARGET_LINUX_X86_64)
13+
BUILD_LINUX_ARM64_TARGET = $(BUILD_CROSS) $(TARGET_LINUX_ARM64)
14+
BUILD_DARWIN_TARGET = $(BUILD_CROSS) $(TARGET_DARWIN)
15+
16+
# then override to use cargo for the native platform
17+
UNAME_S := $(shell uname -s)
18+
ifeq ($(UNAME_S),Linux)
19+
UNAME_P := $(shell uname -p)
20+
ifeq ($(UNAME_P),x86_64)
21+
BUILD_LINUX_X86_64_TARGET = $(BUILD_CARGO) $(TARGET_LINUX_X86_64)
22+
BUILD_DEFAULT_TARGET = $(BUILD_LINUX_X86_64_TARGET)
23+
endif
24+
ifneq ($(filter aarch64%,$(UNAME_P)),)
25+
BUILD_LINUX_ARM64_TARGET = $(BUILD_CARGO) $(TARGET_LINUX_ARM64)
26+
BUILD_DEFAULT_TARGET = $(BUILD_LINUX_ARM64_TARGET)
27+
endif
28+
endif
29+
ifeq ($(UNAME_S),Darwin)
30+
BUILD_DARWIN_TARGET = $(BUILD_CARGO) $(TARGET_DARWIN)
31+
BUILD_DEFAULT_TARGET = $(BUILD_DARWIN_TARGET)
32+
endif
33+
34+
.PHONY: build
35+
build: build-crc64nvme build-crc32isohdlc
36+
37+
.PHONY: build-all
38+
build-all: build-crc64nvme-all build-crc32isohdlc-all
39+
40+
.PHONY: build-crc64nvme
41+
build-crc64nvme: checkout-crc64nvme
42+
@cd crc64fast-nvme && $(BUILD_DEFAULT_TARGET)
43+
44+
.PHONY: build-crc32isohdlc
45+
build-crc32isohdlc: checkout-crc32isohdlc
46+
@cd crc32fast-lib-rust && $(BUILD_DEFAULT_TARGET)
47+
48+
.PHONY: build-crc64nvme-all
49+
build-crc64nvme-all: checkout-crc32isohdlc
50+
@cd crc64fast-nvme && $(BUILD_LINUX_X86_64_TARGET)
51+
@cd crc64fast-nvme && $(BUILD_LINUX_ARM64_TARGET)
52+
@cd crc64fast-nvme && $(BUILD_DARWIN_TARGET)
53+
54+
.PHONY: build-crc32isohdlc-all
55+
build-crc32isohdlc-all: checkout-crc32isohdlc
56+
@cd crc32fast-lib-rust && $(BUILD_LINUX_X86_64_TARGET)
57+
@cd crc32fast-lib-rust && $(BUILD_LINUX_ARM64_TARGET)
58+
@cd crc32fast-lib-rust && $(BUILD_DARWIN_TARGET)
59+
60+
.PHONY: checkout-crc64nvme
61+
checkout-crc64nvme:
62+
@if [ ! -d "./crc64fast-nvme" ]; then git clone https://github.com/awesomized/crc64fast-nvme.git; fi || true
63+
@cd crc64fast-nvme && git fetch && git checkout 1.1.0
64+
65+
.PHONY: checkout-crc32isohdlc
66+
checkout-crc32isohdlc:
67+
@if [ ! -d "./crc32fast-lib-rust" ]; then git clone https://github.com/awesomized/crc32fast-lib-rust.git; fi || true
68+
@cd crc32fast-lib-rust && git fetch && git checkout 1.0.0
69+
70+
.PHONY: clean
71+
clean:
72+
rm -rf crc32fast-lib-rust crc64fast-nvme

include/crc32iso-hdlc-windows.h include/crc32iso-hdlc-aarch64-linux.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#define FFI_SCOPE "CRC32ISOHDLC"
2-
#define FFI_LIB "build/crc32fast-lib-rust/target/release/libcrc32fast_lib.dll"
2+
#define FFI_LIB "build/crc32fast-lib-rust/target/aarch64-unknown-linux-gnu/release/libcrc32fast_lib.so"
33

44
typedef struct HasherHandle HasherHandle;
55

include/crc32iso-hdlc-darwin.h include/crc32iso-hdlc-arm64-darwin.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#define FFI_SCOPE "CRC32ISOHDLC"
2-
#define FFI_LIB "build/crc32fast-lib-rust/target/release/libcrc32fast_lib.dylib"
2+
#define FFI_LIB "build/crc32fast-lib-rust/target/aarch64-apple-darwin/release/libcrc32fast_lib.dylib"
33

44
typedef struct HasherHandle HasherHandle;
55

include/crc32iso-hdlc-linux.h include/crc32iso-hdlc-x86_64-linux.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#define FFI_SCOPE "CRC32ISOHDLC"
2-
#define FFI_LIB "build/crc32fast-lib-rust/target/release/libcrc32fast_lib.so"
2+
#define FFI_LIB "build/crc32fast-lib-rust/target/x86_64-unknown-linux-gnu/release/libcrc32fast_lib.so"
33

44
typedef struct HasherHandle HasherHandle;
55

include/crc64nvme-darwin.h include/crc64nvme-aarch64-linux.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#define FFI_SCOPE "CRC64NVME"
2-
#define FFI_LIB "build/crc64fast-nvme/target/release/libcrc64fast_nvme.dylib"
2+
#define FFI_LIB "build/crc64fast-nvme/target/aarch64-unknown-linux-gnu/release/libcrc64fast_nvme.so"
33

44
typedef struct DigestHandle DigestHandle;
55

include/crc64nvme-linux.h include/crc64nvme-arm64-darwin.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#define FFI_SCOPE "CRC64NVME"
2-
#define FFI_LIB "build/crc64fast-nvme/target/release/libcrc64fast_nvme.so"
2+
#define FFI_LIB "build/crc64fast-nvme/target/aarch64-apple-darwin/release/libcrc64fast_nvme.dylib"
33

44
typedef struct DigestHandle DigestHandle;
55

include/crc64nvme-windows.h include/crc64nvme-x86_64-linux.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#define FFI_SCOPE "CRC64NVME"
2-
#define FFI_LIB "build/crc64fast-nvme/target/release/libcrc64fast_nvme.dll"
2+
#define FFI_LIB "build/crc64fast-nvme/x86_64-unknown-linux-gnu/target/release/libcrc64fast_nvme.so"
33

44
typedef struct DigestHandle DigestHandle;
55

src/FfiInterface.php

+7
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,11 @@ public static function whichHeaderFile(): string;
7272
* @return string The name of the shared library
7373
*/
7474
public static function whichLibrary(): string;
75+
76+
/**
77+
* Attempts to determine the correct library target for the current platform (e.g. 'aarch64-unknown-linux-gnu').
78+
*
79+
* @return string The target of the shared library for this platform
80+
*/
81+
public static function whichLibraryTarget(): string;
7582
}

src/FfiTrait.php

+22-5
Original file line numberDiff line numberDiff line change
@@ -85,11 +85,12 @@ public static function fromHeaderFile(
8585

8686
public static function whichHeaderFile(): string
8787
{
88-
$headerFile = match (PHP_OS_FAMILY) {
89-
self::OS_DARWIN => self::PREFIX_HEADER . '-darwin.h',
90-
self::OS_WINDOWS => self::PREFIX_HEADER . '-windows.h',
91-
default => self::PREFIX_HEADER . '-linux.h',
92-
};
88+
$headerFile = self::PREFIX_HEADER
89+
. '-'
90+
. php_uname('m')
91+
. '-'
92+
. strtolower(PHP_OS_FAMILY)
93+
. '.h';
9394

9495
// default non-vendor context
9596
$headerDirectory = \dirname(__DIR__);
@@ -110,10 +111,26 @@ public static function whichHeaderFile(): string
110111

111112
public static function whichLibrary(): string
112113
{
114+
// TODO: add more library names as needed
113115
return match (PHP_OS_FAMILY) {
114116
self::OS_DARWIN => self::PREFIX_LIB . '.dylib',
115117
self::OS_WINDOWS => self::PREFIX_LIB . '.dll',
116118
default => self::PREFIX_LIB . '.so',
117119
};
118120
}
121+
122+
public static function whichLibraryTarget(): string
123+
{
124+
// TODO: add more targets as needed
125+
return match (php_uname('m')) {
126+
'aarch64', 'arm64' => 'aarch64',
127+
default => 'x86_64',
128+
}
129+
. '-'
130+
. match (PHP_OS_FAMILY) {
131+
self::OS_DARWIN => 'apple-darwin',
132+
self::OS_WINDOWS => 'pc-windows-gnu',
133+
default => 'unknown-linux-gnu',
134+
};
135+
}
119136
}

tests/unit/Crc32/IsoHdlc/FfiTest.php

+8-6
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@ public function testFfiFromCodeInvalidCodeShouldFail(): void
2323

2424
$ffi = Crc32\IsoHdlc\Ffi::fromCode(
2525
code: '',
26-
library: __DIR__
27-
. '/../../../../build/crc32fast-lib-rust/target/release/'
28-
. Crc32\IsoHdlc\Ffi::whichLibrary(),
26+
library: \dirname(__DIR__, 4)
27+
. '/build/crc32fast-lib-rust/target/'
28+
. Crc32\IsoHdlc\Ffi::whichLibraryTarget()
29+
. '/release/' . Crc32\IsoHdlc\Ffi::whichLibrary(),
2930
);
3031

3132
/**
@@ -94,9 +95,10 @@ public function testFfiFromCodeValidInputShouldSucceed(): void
9495

9596
$ffi = Crc32\IsoHdlc\Ffi::fromCode(
9697
code: $code,
97-
library: __DIR__
98-
. '/../../../../build/crc32fast-lib-rust/target/release/'
99-
. Crc32\IsoHdlc\Ffi::whichLibrary(),
98+
library: \dirname(__DIR__, 4)
99+
. '/build/crc32fast-lib-rust/target/'
100+
. Crc32\IsoHdlc\Ffi::whichLibraryTarget()
101+
. '/release/' . Crc32\IsoHdlc\Ffi::whichLibrary(),
100102
);
101103

102104
$this->testFfiCalculateCrc32ShouldSucceed($ffi);

tests/unit/Crc64/Nvme/FfiTest.php

+8-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,10 @@ public function testFfiFromCodeInvalidCodeShouldFail(): void
2424

2525
$ffi = Crc64\Nvme\Ffi::fromCode(
2626
code: '',
27-
library: __DIR__ . '/../../../../build/crc64fast-nvme/target/release/' . Crc64\Nvme\Ffi::whichLibrary(),
27+
library: \dirname(__DIR__, 4)
28+
. '/build/crc64fast-nvme/target/'
29+
. Crc64\Nvme\Ffi::whichLibraryTarget()
30+
. '/release/' . Crc64\Nvme\Ffi::whichLibrary(),
2831
);
2932

3033
/**
@@ -93,7 +96,10 @@ public function testFfiFromCodeValidInputShouldSucceed(): void
9396

9497
$ffi = Crc64\Nvme\Ffi::fromCode(
9598
code: $code,
96-
library: __DIR__ . '/../../../../build/crc64fast-nvme/target/release/' . Crc64\Nvme\Ffi::whichLibrary(),
99+
library: \dirname(__DIR__, 4)
100+
. '/build/crc64fast-nvme/target/'
101+
. Crc64\Nvme\Ffi::whichLibraryTarget()
102+
. '/release/' . Crc64\Nvme\Ffi::whichLibrary(),
97103
);
98104

99105
$this->testFfiCalculateCrc64ShouldSucceed($ffi);

0 commit comments

Comments
 (0)