Skip to content

Commit f109f27

Browse files
committed
Change zip library to ZIpper and fix windows.
1 parent 23267c9 commit f109f27

File tree

7 files changed

+76
-124
lines changed

7 files changed

+76
-124
lines changed

.github/workflows/cmake.yml

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,6 @@ jobs:
4242
sudo apt-get install -y uuid-dev
4343
if: matrix.os == 'ubuntu-latest'
4444

45-
- name: Install Packages (Windows)
46-
run: |
47-
powershell -Command "(Invoke-WebRequest -Uri https://git.io/JnHTY -OutFile install_zlib.bat)"; ./install_zlib.bat; del install_zlib.bat
48-
if: matrix.os == 'windows-latest'
49-
5045
- name: Configure CMake
5146
# Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make.
5247
# See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type

CMakeLists.txt

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,7 @@ include(cmake/CPM.cmake)
2929

3030
CPMAddPackage("gh:nlohmann/json@3.11.3")
3131
CPMAddPackage("gh:bshoshany/thread-pool@5.0.0")
32-
33-
set(BUILD_TOOLS OFF CACHE BOOL "")
34-
set(BUILD_REGRESS OFF CACHE BOOL "")
35-
set(BUILD_OSSFUZZ OFF CACHE BOOL "")
36-
set(BUILD_EXAMPLES OFF CACHE BOOL "")
37-
set(BUILD_DOC OFF CACHE BOOL "")
38-
CPMAddPackage("gh:nih-at/libzip@1.11.4")
32+
CPMAddPackage("gh:Lecrapouille/zipper@3.0.0")
3933

4034
# -----------------------------------------------------------------------------
4135
# Library
@@ -93,7 +87,10 @@ endif()
9387

9488
target_link_libraries(${PROJECT_NAME} PUBLIC
9589
nlohmann_json::nlohmann_json
96-
zip
90+
)
91+
92+
target_link_libraries(${PROJECT_NAME} PRIVATE
93+
zipper
9794
)
9895

9996
# -----------------------------------------------------------------------------

cmake/FlowModule.cmake

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
function(CreateFlowModule module_name)
2+
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
3+
set(MODULE_BINARY_DIR "linux")
4+
elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") # macOS uses Darwin as its kernel name
5+
set(MODULE_BINARY_DIR "macos")
6+
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
7+
set(MODULE_BINARY_DIR "windows")
8+
else()
9+
message(FATAL_ERROR "Unsupported platform: ${CMAKE_SYSTEM_NAME}")
10+
endif()
11+
12+
if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(x86_64|amd64|AMD64)$")
13+
set(MODULE_BINARY_DIR "${MODULE_BINARY_DIR}/x86_64")
14+
elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(arm64|aarch64)$")
15+
set(MODULE_BINARY_DIR "${MODULE_BINARY_DIR}/arm64")
16+
elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(i386|i686)$")
17+
set(MODULE_BINARY_DIR "${MODULE_BINARY_DIR}/x86")
18+
else()
19+
message(FATAL_ERROR "Unsupported architecture: ${CMAKE_SYSTEM_PROCESSOR}")
20+
endif()
21+
22+
add_custom_command(TARGET ${module_name} POST_BUILD
23+
COMMAND ${CMAKE_COMMAND} -E copy
24+
$<TARGET_FILE:${module_name}>
25+
$<TARGET_FILE_DIR:${module_name}>/${module_name}/${MODULE_BINARY_DIR}/${module_name}${CMAKE_SHARED_LIBRARY_SUFFIX}
26+
)
27+
add_custom_command(TARGET ${module_name} POST_BUILD
28+
COMMAND ${CMAKE_COMMAND} -E copy
29+
${CMAKE_CURRENT_SOURCE_DIR}/module.json
30+
$<TARGET_FILE_DIR:${module_name}>/${module_name}/module.json
31+
)
32+
add_custom_command(TARGET ${module_name} POST_BUILD
33+
COMMAND ${CMAKE_COMMAND} -E copy
34+
${CMAKE_CURRENT_SOURCE_DIR}/README.md
35+
$<TARGET_FILE_DIR:${module_name}>/${module_name}/README.md
36+
)
37+
38+
add_custom_command(TARGET ${module_name} POST_BUILD
39+
WORKING_DIRECTORY $<TARGET_FILE_DIR:${module_name}>
40+
COMMAND ${CMAKE_COMMAND} -E tar -cfv ${CMAKE_CURRENT_BINARY_DIR}/${module_name}.fmod --format=zip ${module_name}/
41+
)
42+
endfunction()

src/Module.cpp

Lines changed: 8 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55

66
#include "flow/core/NodeFactory.hpp"
77

8+
#include <Zipper/Unzipper.hpp>
89
#include <nlohmann/json.hpp>
9-
#include <zip.h>
1010

1111
#include <bit>
1212
#include <format>
@@ -21,7 +21,9 @@
2121

2222
FLOW_NAMESPACE_BEGIN
2323

24-
const std::string Module::FileExtension = "flowmod";
24+
using namespace zipper;
25+
26+
const std::string Module::FileExtension = "fmod";
2527

2628
#ifdef FLOW_WINDOWS
2729
constexpr const char* platform = "windows";
@@ -116,55 +118,14 @@ bool Module::Load(const std::filesystem::path& path)
116118
throw std::runtime_error(std::format("Path is not a file. (file={})", path.string()));
117119
}
118120

119-
zip_t* archive = zip_open(path.string().c_str(), ZIP_RDONLY, nullptr);
120-
if (!archive)
121+
Unzipper unzipper(path.string());
122+
if (!unzipper.isOpened())
121123
{
122124
throw std::runtime_error(std::format("Failed to open module archive. (file={})", path.string()));
123125
}
124126

125-
const zip_int64_t num_entries = zip_get_num_entries(archive, 0);
126-
for (zip_int64_t i = 0; i < num_entries; ++i)
127-
{
128-
zip_stat_t file_info;
129-
zip_stat_init(&file_info);
130-
131-
if (zip_stat_index(archive, i, 0, &file_info) != 0)
132-
{
133-
zip_close(archive);
134-
throw std::runtime_error(
135-
std::format("Failed to get file info from module archive. (file={})", path.string()));
136-
}
137-
138-
auto file_path = GetTempModulePath() / file_info.name;
139-
auto file = zip_fopen(archive, file_info.name, 0);
140-
if (!file)
141-
{
142-
zip_close(archive);
143-
throw std::runtime_error(
144-
std::format("Failed to open file in module archive. (file={})", file_path.string()));
145-
}
146-
147-
std::vector<char> buffer(file_info.size);
148-
zip_fread(file, buffer.data(), file_info.size);
149-
zip_fclose(file);
150-
151-
std::filesystem::create_directories(file_path.parent_path());
152-
if (std::filesystem::is_directory(file_path))
153-
{
154-
continue;
155-
}
156-
157-
std::ofstream out_file(file_path, std::ios::binary);
158-
if (!out_file)
159-
{
160-
zip_close(archive);
161-
throw std::runtime_error(
162-
std::format("Failed to create file from module archive. (file={})", file_path.string()));
163-
}
164-
165-
out_file.write(buffer.data(), buffer.size());
166-
out_file.close();
167-
}
127+
unzipper.extractAll(GetTempModulePath().string(), Unzipper::OverwriteMode::Overwrite);
128+
unzipper.close();
168129

169130
auto module_metadata_path = GetModuleMetaDataPath(GetTempModulePath() / path.stem());
170131
std::ifstream metadata_fs(module_metadata_path);

tests/CMakeLists.txt

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,14 @@ set(CMAKE_CXX_STANDARD 20)
44
set(CMAKE_CXX_STANDARD_REQUIRED ON)
55

66
#=============================================================================#
7-
# Fetch testing dependencies
7+
# Dependencies
88
#=============================================================================#
99

10-
find_package(GTest CONFIG QUIET)
11-
if (NOT GTest_FOUND)
12-
include(FetchContent)
13-
FetchContent_Declare(
14-
googletest OVERRIDE_FIND_PACKAGE
15-
URL https://github.com/google/googletest/releases/download/v1.15.2/googletest-1.15.2.tar.gz
16-
GIT_TAG v1.15.2
17-
)
18-
19-
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
20-
FetchContent_MakeAvailable(googletest)
21-
endif()
10+
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
11+
CPMAddPackage("gh:google/googletest@1.15.2")
2212

2313
#=============================================================================#
24-
# Test Module
14+
# Add Test Module
2515
#=============================================================================#
2616

2717
add_subdirectory(test_module)
@@ -30,8 +20,9 @@ add_subdirectory(test_module)
3020
# Test Executable
3121
#=============================================================================#
3222

23+
set(TEST_EXE flow_core_tests)
3324
add_executable(
34-
flow_core_tests
25+
${TEST_EXE}
3526

3627
factory_test.cpp
3728
graph_test.cpp
@@ -43,28 +34,26 @@ add_executable(
4334

4435
if(MSVC)
4536
add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
46-
target_compile_options(flow_core_tests PRIVATE /W4 /MP)
37+
target_compile_options(${TEST_EXE} PRIVATE /W4 /MP)
4738
endif()
4839

49-
target_link_libraries(
50-
flow_core_tests
51-
40+
target_link_libraries(${TEST_EXE}
5241
flow-core
5342
GTest::gtest_main
5443
)
5544

56-
target_include_directories(flow_core_tests PRIVATE
57-
../include/flow/core
45+
target_include_directories(${TEST_EXE} PRIVATE
46+
${CMAKE_SOURCE_DIR}/include/flow/core
5847
${thread_pool_SOURCE_DIR}/include
5948
)
6049

6150
if(MSVC)
6251
add_custom_command(TARGET flow_core_tests POST_BUILD
6352
COMMAND ${CMAKE_COMMAND} -E copy_if_different
6453
$<TARGET_FILE:${PROJECT_NAME}>
65-
$<TARGET_FILE_DIR:flow_core_tests>
54+
$<TARGET_FILE_DIR:${TEST_EXE}>
6655
)
6756
endif()
6857

6958
include(GoogleTest)
70-
gtest_discover_tests(flow_core_tests)
59+
gtest_discover_tests(${TEST_EXE})

tests/module_test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
using namespace flow;
1414

15-
const std::filesystem::path module_path = std::filesystem::current_path() / "test_module.flowmod";
15+
const std::filesystem::path module_path = std::filesystem::current_path() / "test_module.fmod";
1616

1717
auto factory = std::make_shared<NodeFactory>();
1818
auto env = Env::Create(factory);

tests/test_module/CMakeLists.txt

Lines changed: 8 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -21,44 +21,12 @@ add_dependencies(${PROJECT_NAME} flow-core)
2121
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
2222
target_link_libraries(${PROJECT_NAME} PUBLIC flow-core)
2323

24-
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
25-
set(MODULE_BINARY_DIR "linux")
26-
elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") # macOS uses Darwin as its kernel name
27-
set(MODULE_BINARY_DIR "macos")
28-
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
29-
set(MODULE_BINARY_DIR "windows")
30-
else()
31-
message(FATAL_ERROR "Unsupported platform: ${CMAKE_SYSTEM_NAME}")
32-
endif()
33-
34-
if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(x86_64|amd64|AMD64)$")
35-
set(MODULE_BINARY_DIR "${MODULE_BINARY_DIR}/x86_64")
36-
elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(arm64|aarch64)$")
37-
set(MODULE_BINARY_DIR "${MODULE_BINARY_DIR}/arm64")
38-
elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(i386|i686)$")
39-
set(MODULE_BINARY_DIR "${MODULE_BINARY_DIR}/x86")
40-
else()
41-
message(FATAL_ERROR "Unsupported architecture: ${CMAKE_SYSTEM_PROCESSOR}")
42-
endif()
43-
44-
45-
get_filename_component(lib_file $<TARGET_FILE:${PROJECT_NAME}> NAME)
46-
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
47-
COMMAND ${CMAKE_COMMAND} -E copy
48-
$<TARGET_FILE:${PROJECT_NAME}>
49-
$<TARGET_FILE_DIR:${PROJECT_NAME}>/${PROJECT_NAME}/${MODULE_BINARY_DIR}/${PROJECT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}
50-
)
51-
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
52-
COMMAND ${CMAKE_COMMAND} -E copy
53-
${CMAKE_CURRENT_SOURCE_DIR}/module.json
54-
$<TARGET_FILE_DIR:${PROJECT_NAME}>/${PROJECT_NAME}/module.json
55-
)
56-
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
57-
COMMAND ${CMAKE_COMMAND} -E copy
58-
${CMAKE_CURRENT_SOURCE_DIR}/README.md
59-
$<TARGET_FILE_DIR:${PROJECT_NAME}>/${PROJECT_NAME}/README.md
60-
)
61-
62-
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
63-
COMMAND ${CMAKE_COMMAND} -E tar cfv ${CMAKE_CURRENT_BINARY_DIR}/../${PROJECT_NAME}.flowmod --format=zip ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}
24+
include(../../cmake/FlowModule.cmake)
25+
CreateFlowModule(${PROJECT_NAME})
26+
27+
add_custom_command(TARGET ${PROJECT_NAME}
28+
POST_BUILD
29+
COMMAND ${CMAKE_COMMAND} -E copy
30+
${CMAKE_CURRENT_BINARY_DIR}/test_module.fmod
31+
$<TARGET_FILE_DIR:flow_core_tests>
6432
)

0 commit comments

Comments
 (0)