Skip to content

Commit 91a3d75

Browse files
committed
fix: Simplify build-system and support editable install
* Switch to using "FetchContent_Populate" instead of custom logic for checking archive integrity * Disambiguate executable location installing it into `s5cmd/bin` * Add support for editable install using `importlib.metadata` to lookup location of executable.
1 parent 476aead commit 91a3d75

File tree

2 files changed

+24
-57
lines changed

2 files changed

+24
-57
lines changed

CMakeLists.txt

Lines changed: 13 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,31 @@
11
cmake_minimum_required(VERSION 3.15...3.26)
22
project(${SKBUILD_PROJECT_NAME} LANGUAGES NONE)
33

4-
function(_check_archive dest_file expected_sha256 output_var)
5-
get_filename_component(filename ${dest_file} NAME)
6-
message(STATUS "Checking ${filename}")
7-
8-
if(NOT EXISTS ${dest_file})
9-
message(STATUS "Checking ${filename} - nonexistent")
10-
set(${output_var} "nonexistent" PARENT_SCOPE)
11-
return()
12-
endif()
13-
14-
file(SHA256 ${dest_file} current_hash)
15-
if(NOT ${current_hash} STREQUAL ${expected_sha256})
16-
message(STATUS "Checking ${filename} - expired")
17-
set(${output_var} "expired" PARENT_SCOPE)
18-
return()
19-
endif()
20-
21-
message(STATUS "Checking ${filename} - up-to-date")
22-
set(${output_var} "ok" PARENT_SCOPE)
23-
endfunction()
24-
254
# Set in the current scope the following variables:
265
# - s5cmd_archive_url
276
# - s5cmd_archive_sha256
287
include(${CMAKE_CURRENT_SOURCE_DIR}/s5cmdUrls.cmake)
298

309
#
31-
# Download archive
10+
# Download & extract archive
3211
#
33-
cmake_path(GET s5cmd_archive_url FILENAME archive_filename)
34-
set(destination_file "${CMAKE_CURRENT_BINARY_DIR}/${archive_filename}")
35-
36-
_check_archive(${destination_file} ${s5cmd_archive_sha256} result)
37-
38-
if(result MATCHES "^(nonexistent|expired)$")
39-
message(STATUS "Downloading ${s5cmd_archive_url}")
40-
file(
41-
DOWNLOAD
42-
${s5cmd_archive_url}
43-
${destination_file}
44-
EXPECTED_HASH SHA256=${s5cmd_archive_sha256}
45-
)
46-
elseif(result STREQUAL "ok")
47-
# ok
48-
else()
49-
message(FATAL_ERROR "Unknown result value: ${result}")
50-
endif()
12+
set(download_dir "${PROJECT_BINARY_DIR}")
13+
set(extract_dir "${PROJECT_BINARY_DIR}/s5cmd-binary-distribution")
14+
include(FetchContent)
15+
FetchContent_Populate(s5cmd
16+
URL ${s5cmd_archive_url}
17+
URL_HASH SHA256=${s5cmd_archive_sha256}
18+
DOWNLOAD_DIR ${download_dir}
19+
SOURCE_DIR "${extract_dir}"
20+
)
5121

5222
#
53-
# Extract archive
23+
# Install executable
5424
#
55-
set(executable_name "s5cmd${CMAKE_EXECUTABLE_SUFFIX}")
56-
57-
string(MAKE_C_IDENTIFIER ${archive_filename} extract_subdir)
58-
set(extract_dir "${CMAKE_CURRENT_BINARY_DIR}/${extract_subdir}")
59-
message(STATUS "Extracting ${archive_filename} into ${extract_dir}")
60-
file(ARCHIVE_EXTRACT
61-
INPUT ${destination_file}
62-
DESTINATION ${extract_dir}
63-
PATTERNS "${executable_name}"
64-
VERBOSE
65-
)
66-
6725
set(_permissions PERMISSIONS
6826
OWNER_READ OWNER_WRITE OWNER_EXECUTE
6927
GROUP_READ GROUP_EXECUTE
7028
WORLD_READ WORLD_EXECUTE
7129
)
72-
73-
install(PROGRAMS ${extract_dir}/${executable_name} DESTINATION "s5cmd" ${_permissions})
30+
set(executable_name "s5cmd${CMAKE_EXECUTABLE_SUFFIX}")
31+
install(PROGRAMS ${extract_dir}/${executable_name} DESTINATION "s5cmd/bin" ${_permissions})

src/s5cmd/__init__.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import subprocess
1111
import sys
12+
from importlib.metadata import distribution
1213
from pathlib import Path
1314
from typing import NoReturn
1415

@@ -17,11 +18,19 @@
1718
__all__ = ["__version__", "s5cmd"]
1819

1920

20-
S5CMD_BIN_DIR: Path = Path(__file__).parent
21+
def _lookup(name: str) -> Path:
22+
executable_path = f"s5cmd/bin/{name}"
23+
files = distribution("s5cmd").files
24+
if files is not None:
25+
for _file in files:
26+
if str(_file).startswith(executable_path):
27+
return Path(_file.locate()).resolve(strict=True)
28+
msg = f"Failed to lookup '{executable_path}` directory."
29+
raise FileNotFoundError(msg)
2130

2231

2332
def _program(name: str, args: list[str]) -> int:
24-
return subprocess.call([S5CMD_BIN_DIR / name, *args], close_fds=False)
33+
return subprocess.call([_lookup(name), *args], close_fds=False)
2534

2635

2736
def s5cmd() -> NoReturn:

0 commit comments

Comments
 (0)