Skip to content

Commit 1906380

Browse files
authored
Fixed a script to build filecoin-ffi (#143)
* Fixed a script to build filecoin-ffi * Added Token for authorizing requests * Fixed file location Signed-off-by: artyom-yurin <[email protected]>
1 parent 0650e06 commit 1906380

File tree

3 files changed

+165
-21
lines changed

3 files changed

+165
-21
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ include/generated/*
3030
.scannerwork/
3131
peers.list
3232
cmake-build*
33+
deps/our-filecoin-ffi/include
34+
deps/our-filecoin-ffi/lib
35+
deps/our-filecoin-ffi/filecoin_ffi_commit_installed
3336

3437
cmake-build*
3538
.gtm
@@ -42,3 +45,4 @@ dist
4245
ninja_build_release
4346
_builds
4447
_logs
48+

deps/filecoin-ffi.cmake

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,31 @@
33
# SPDX-License-Identifier: Apache-2.0
44
#
55

6-
set(FILECOIN_FFI_PATH "${PROJECT_SOURCE_DIR}/deps/filecoin-ffi")
6+
set(FILECOIN_FFI_PATH "${PROJECT_SOURCE_DIR}/deps/our-filecoin-ffi")
7+
78
set(FILECOIN_FFI_INCLUDES
89
"${FILECOIN_FFI_PATH}/include/filecoin-ffi"
910
)
11+
1012
set(FILECOIN_FFI_LIB
11-
"${FILECOIN_FFI_PATH}/libfilecoin.a")
13+
"${FILECOIN_FFI_PATH}/lib/libfilecoin.a"
14+
)
1215

13-
file(MAKE_DIRECTORY ${FILECOIN_FFI_INCLUDES})
16+
set(FILECOIN_FFI_PKG
17+
"${FILECOIN_FFI_PATH}/lib/pkgconfig"
18+
)
1419

15-
set(ENV{PKG_CONFIG_PATH} "${PKG_CONFIG_PATH}:${FILECOIN_FFI_PATH}")
20+
set(ENV{PKG_CONFIG_PATH} "${PKG_CONFIG_PATH}:${FILECOIN_FFI_PKG}")
21+
22+
# uncomment for build from source
23+
#set(ENV{FFI_BUILD_FROM_SOURCE} "1")
1624

1725
find_package(PkgConfig REQUIRED)
1826
pkg_check_modules(PKG_FILECOIN filecoin)
1927

2028
if (NOT PKG_FILECOIN_FOUND)
2129
message("Installing filecoin-ffi")
22-
execute_process(COMMAND make clean all
23-
WORKING_DIRECTORY ${FILECOIN_FFI_PATH})
24-
25-
execute_process(COMMAND mkdir -p ${FILECOIN_FFI_INCLUDES}
26-
COMMAND cp "${FILECOIN_FFI_PATH}/filecoin.h" ${FILECOIN_FFI_INCLUDES}
30+
execute_process(COMMAND ./install-filecoin.sh
2731
WORKING_DIRECTORY ${FILECOIN_FFI_PATH})
2832

2933
pkg_check_modules(PKG_FILECOIN REQUIRED filecoin)
@@ -33,20 +37,10 @@ endif (NOT PKG_FILECOIN_FOUND)
3337

3438
add_custom_target(
3539
filecoin_ffi_build
36-
COMMAND make
37-
WORKING_DIRECTORY ${FILECOIN_FFI_PATH}
38-
)
39-
add_custom_target(
40-
filecoin_ffi_fix_include
41-
COMMAND mkdir -p ${FILECOIN_FFI_INCLUDES}
42-
COMMAND cp "${FILECOIN_FFI_PATH}/filecoin.h" ${FILECOIN_FFI_INCLUDES}
40+
COMMAND ./install-filecoin.sh
4341
WORKING_DIRECTORY ${FILECOIN_FFI_PATH}
4442
)
4543

46-
add_dependencies(filecoin_ffi_fix_include
47-
filecoin_ffi_build
48-
)
49-
5044
add_library(filecoin_ffi
5145
STATIC IMPORTED GLOBAL
5246
)
@@ -65,5 +59,5 @@ if (APPLE)
6559
endif (APPLE)
6660

6761
add_dependencies(filecoin_ffi
68-
filecoin_ffi_fix_include
62+
filecoin_ffi_build
6963
)
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
#!/usr/bin/env bash
2+
3+
set -Eeo pipefail
4+
5+
cd "$(dirname "${BASH_SOURCE[0]}")"
6+
7+
rust_sources_dir="../filecoin-ffi/rust"
8+
release_sha1=$(cd $rust_sources_dir && git rev-parse HEAD)
9+
10+
if [ -e filecoin_ffi_commit_installed ] && [ "$(cat filecoin_ffi_commit_installed)" = "$release_sha1" ]; then
11+
(>&2 echo "filecoin-ffi is already installed")
12+
exit 0
13+
fi
14+
15+
auth_header=()
16+
if [ -n "${GITHUB_TOKEN}" ]; then
17+
auth_header=("-H" "Authorization: token ${GITHUB_TOKEN}")
18+
fi
19+
20+
download_release_tarball() {
21+
__resultvar=$1
22+
__repo_name=$2
23+
__release_name="${__repo_name}-$(uname)"
24+
__release_tag="${release_sha1:0:16}"
25+
__release_tag_url="https://api.github.com/repos/filecoin-project/${__repo_name}/releases/tags/${__release_tag}"
26+
__release_response=""
27+
28+
echo "acquiring release @ ${__release_tag}"
29+
30+
__release_response=$(curl \
31+
--retry 3 \
32+
"${auth_header[@]}" \
33+
--location $__release_tag_url)
34+
35+
36+
37+
if ! [ -x "$(command -v jq)" ]; then
38+
(>&2 echo 'Error: jq is not installed.')
39+
(>&2 echo 'Install jq to resolve this problem.')
40+
return 1
41+
fi
42+
43+
__release_url=$(echo $__release_response | jq -r ".assets[] | select(.name | contains(\"${__release_name}\")) | .url")
44+
45+
if [[ -z "$__release_url" ]]; then
46+
(>&2 echo "failed to download release (tag URL: ${__release_tag_url}, response: ${__release_response})")
47+
return 1
48+
fi
49+
50+
__tar_path="/tmp/${__release_name}_$(basename ${__release_url}).tar.gz"
51+
52+
__asset_url=""
53+
54+
__asset_url=$(curl \
55+
--head \
56+
--retry 3 \
57+
--header "Accept:application/octet-stream" \
58+
"${auth_header[@]}"\
59+
--location \
60+
--output /dev/null \
61+
-w %{url_effective} \
62+
"$__release_url")
63+
64+
65+
curl --retry 3 --output "${__tar_path}" "$__asset_url"
66+
if [[ $? -ne "0" ]]; then
67+
(>&2 echo "failed to download release asset (tag URL: ${__release_tag_url}, asset URL: ${__asset_url})")
68+
return 1
69+
fi
70+
71+
eval $__resultvar="'$__tar_path'"
72+
}
73+
74+
build_from_source() {
75+
__library_name=$1
76+
__rust_sources_path=$2
77+
__repo_sha1_truncated="${release_sha1:0:16}"
78+
79+
echo "building from source @ ${__repo_sha1_truncated}"
80+
81+
if ! [ -x "$(command -v cargo)" ]; then
82+
(>&2 echo 'Error: cargo is not installed.')
83+
(>&2 echo 'Install Rust toolchain to resolve this problem.')
84+
exit 1
85+
fi
86+
87+
if ! [ -x "$(command -v rustup)" ]; then
88+
(>&2 echo 'Error: rustup is not installed.')
89+
(>&2 echo 'Install Rust toolchain installer to resolve this problem.')
90+
exit 1
91+
fi
92+
93+
pushd $__rust_sources_path
94+
95+
cargo --version
96+
97+
if [[ -f "./scripts/build-release.sh" ]]; then
98+
./scripts/build-release.sh $__library_name $(cat rust-toolchain)
99+
else
100+
cargo build --release --all
101+
fi
102+
103+
popd
104+
}
105+
106+
mkdir -p include/filecoin-ffi
107+
mkdir -p lib/pkgconfig
108+
109+
if [ "${FFI_BUILD_FROM_SOURCE}" != "1" ] && download_release_tarball tarball_path "filecoin-ffi"; then
110+
tmp_dir=$(mktemp -d)
111+
112+
tar -C "$tmp_dir" -xzf "$tarball_path"
113+
114+
find -L "${tmp_dir}" -type f -name filecoin.h -exec rsync --checksum "{}" ./include/filecoin-ffi \;
115+
find -L "${tmp_dir}" -type f -name libfilecoin.a -exec rsync --checksum "{}" ./lib \;
116+
find -L "${tmp_dir}" -type f -name filecoin.pc -exec rsync --checksum "{}" ./lib/pkgconfig \;
117+
118+
(>&2 echo "successfully installed prebuilt libfilecoin")
119+
else
120+
(>&2 echo "building libfilecoin from local sources (dir = ${rust_sources_dir})")
121+
122+
build_from_source "filecoin" "${rust_sources_dir}"
123+
124+
find -L "${rust_sources_dir}/target/release" -type f -name filecoin.h -exec rsync --checksum "{}" ./include/filecoin-ffi \;
125+
find -L "${rust_sources_dir}/target/release" -type f -name libfilecoin.a -exec rsync --checksum "{}" ./lib \;
126+
find -L "${rust_sources_dir}" -type f -name filecoin.pc -exec rsync --checksum "{}" ./lib/pkgconfig \;
127+
128+
if [[ ! -f "./include/filecoin-ffi/filecoin.h" ]]; then
129+
(>&2 echo "failed to install filecoin.h")
130+
exit 1
131+
fi
132+
133+
if [[ ! -f "./lib/libfilecoin.a" ]]; then
134+
(>&2 echo "failed to install libfilecoin.a")
135+
exit 1
136+
fi
137+
138+
if [[ ! -f "./lib/pkgconfig/filecoin.pc" ]]; then
139+
(>&2 echo "failed to install filecoin.pc")
140+
exit 1
141+
fi
142+
143+
(>&2 echo "successfully built and installed libfilecoin from source")
144+
fi
145+
146+
echo "$release_sha1" > filecoin_ffi_commit_installed

0 commit comments

Comments
 (0)