Skip to content

Commit 9974a20

Browse files
authored
add asset bundling (#497)
1 parent 65ea0b0 commit 9974a20

13 files changed

Lines changed: 154 additions & 70 deletions

.github/workflows/build_test.yml

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -122,16 +122,7 @@ jobs:
122122
install
123123
build/test/odr_test
124124
build/test/Release/odr_test.exe
125-
build/_deps/odr.js-src
126-
if-no-files-found: error
127-
include-hidden-files: true
128-
129-
# TODO this is only needed because of data files from dependencies; there should be a better solution
130-
- name: upload conan directory to github
131-
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7
132-
with:
133-
name: conan-${{ matrix.host_profile }}
134-
path: ${{ env.CONAN_HOME }}
125+
build/data
135126
if-no-files-found: error
136127
include-hidden-files: true
137128

@@ -226,20 +217,14 @@ jobs:
226217
with:
227218
python-version: 3.14
228219
- name: install python dependencies
229-
run: pip install htmlcmp==1.2.1
220+
run: pip install htmlcmp==1.2.4
230221

231222
- name: download binaries
232223
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
233224
with:
234225
name: bin-${{ matrix.host_profile }}
235226
path: .
236227

237-
- name: download conan directory
238-
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
239-
with:
240-
name: conan-${{ matrix.host_profile }}
241-
path: ${{ env.CONAN_HOME }}
242-
243228
- name: fix artifact permissions
244229
if: runner.os != 'Windows'
245230
run: chmod +x build/test/odr_test

CMakeLists.txt

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ option(ODR_CLANG_TIDY "Run clang-tidy static analysis" OFF)
1717
option(WITH_PDF2HTMLEX "Build with pdf2htmlEX" ON)
1818
option(WITH_WVWARE "Build with wvWare" ON)
1919
option(WITH_LIBMAGIC "Build with libmagic" ON)
20+
option(ODR_BUNDLE_ASSETS "Bundle assets during build and install" ON)
21+
22+
include(GNUInstallDirs)
2023

2124
# TODO defining global compiler flags seems to be bad practice with conan
2225
# TODO consider using conan profiles
@@ -54,10 +57,6 @@ FetchContent_Declare(odr.js
5457
)
5558
FetchContent_MakeAvailable(odr.js)
5659

57-
set(ODR_DATA_PATH "${odr.js_SOURCE_DIR}")
58-
59-
configure_file("src/odr/internal/project_info.cpp.in" "src/odr/internal/project_info.cpp")
60-
6160
set(PRE_CONFIGURE_FILE "src/odr/internal/git_info.cpp.in")
6261
set(POST_CONFIGURE_FILE "${CMAKE_CURRENT_BINARY_DIR}/src/odr/internal/git_info.cpp")
6362
if (EXISTS "${PROJECT_SOURCE_DIR}/.git")
@@ -213,6 +212,10 @@ target_link_libraries(odr
213212
argon2::argon2
214213
)
215214

215+
set(ODR_BUILD_ODR_DATA_PATH "${CMAKE_CURRENT_BINARY_DIR}/data")
216+
file(COPY "${odr.js_SOURCE_DIR}/" DESTINATION "${ODR_BUILD_ODR_DATA_PATH}")
217+
set(ODR_INSTALL_ODR_DATA_PATH "${CMAKE_INSTALL_DATADIR}")
218+
216219
if (WITH_PDF2HTMLEX)
217220
find_package(pdf2htmlEX REQUIRED)
218221
find_package(poppler REQUIRED)
@@ -230,6 +233,28 @@ if (WITH_PDF2HTMLEX)
230233
PRIVATE
231234
ODR_WITH_PDF2HTMLEX
232235
)
236+
237+
if (ODR_BUNDLE_ASSETS)
238+
set(ODR_BUILD_FONTCONFIG_DATA_PATH "${ODR_BUILD_ODR_DATA_PATH}/fontconfig")
239+
set(ODR_BUILD_POPPLER_DATA_PATH "${ODR_BUILD_ODR_DATA_PATH}/poppler")
240+
set(ODR_BUILD_PDF2HTMLEX_DATA_PATH "${ODR_BUILD_ODR_DATA_PATH}/pdf2htmlex")
241+
242+
file(COPY "${FONTCONFIG_DATA_PATH}/" DESTINATION "${ODR_BUILD_FONTCONFIG_DATA_PATH}")
243+
file(COPY "${POPPLER_DATA_PATH}/" DESTINATION "${ODR_BUILD_POPPLER_DATA_PATH}")
244+
file(COPY "${PDF2HTMLEX_DATA_PATH}/" DESTINATION "${ODR_BUILD_PDF2HTMLEX_DATA_PATH}")
245+
246+
set(ODR_INSTALL_FONTCONFIG_DATA_PATH "${ODR_INSTALL_ODR_DATA_PATH}/fontconfig")
247+
set(ODR_INSTALL_POPPLER_DATA_PATH "${ODR_INSTALL_ODR_DATA_PATH}/poppler")
248+
set(ODR_INSTALL_PDF2HTMLEX_DATA_PATH "${ODR_INSTALL_ODR_DATA_PATH}/pdf2htmlex")
249+
else ()
250+
set(ODR_BUILD_FONTCONFIG_DATA_PATH "${FONTCONFIG_DATA_PATH}")
251+
set(ODR_BUILD_POPPLER_DATA_PATH "${POPPLER_DATA_PATH}")
252+
set(ODR_BUILD_PDF2HTMLEX_DATA_PATH "${PDF2HTMLEX_DATA_PATH}")
253+
254+
set(ODR_INSTALL_FONTCONFIG_DATA_PATH "${FONTCONFIG_DATA_PATH}")
255+
set(ODR_INSTALL_POPPLER_DATA_PATH "${POPPLER_DATA_PATH}")
256+
set(ODR_INSTALL_PDF2HTMLEX_DATA_PATH "${PDF2HTMLEX_DATA_PATH}")
257+
endif ()
233258
endif ()
234259
if (WITH_WVWARE)
235260
find_package(wvware REQUIRED)
@@ -261,8 +286,22 @@ if (WITH_LIBMAGIC)
261286
PRIVATE
262287
ODR_WITH_LIBMAGIC
263288
)
289+
290+
if (ODR_BUNDLE_ASSETS)
291+
set(ODR_BUILD_LIBMAGIC_DATABASE_PATH "${ODR_BUILD_ODR_DATA_PATH}/magic.mgc")
292+
293+
file(COPY_FILE "${LIBMAGIC_DATABASE_PATH}" "${ODR_BUILD_LIBMAGIC_DATABASE_PATH}")
294+
295+
set(ODR_INSTALL_LIBMAGIC_DATABASE_PATH "${ODR_INSTALL_ODR_DATA_PATH}/magic.mgc")
296+
else ()
297+
set(ODR_BUILD_LIBMAGIC_DATABASE_PATH "${LIBMAGIC_DATABASE_PATH}")
298+
299+
set(ODR_INSTALL_LIBMAGIC_DATABASE_PATH "${LIBMAGIC_DATABASE_PATH}")
300+
endif ()
264301
endif ()
265302

303+
configure_file("src/odr/internal/project_info.cpp.in" "src/odr/internal/project_info.cpp")
304+
266305
if (EXISTS "${PROJECT_SOURCE_DIR}/.git")
267306
add_dependencies(odr check_git)
268307
endif ()
@@ -279,8 +318,6 @@ if (ODR_CLANG_TIDY)
279318
add_subdirectory("static_analysis/clang-tidy")
280319
endif ()
281320

282-
include(GNUInstallDirs)
283-
284321
install(
285322
DIRECTORY src/ "${CMAKE_CURRENT_BINARY_DIR}/src/"
286323
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
@@ -294,6 +331,6 @@ install(
294331
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
295332
)
296333
install(
297-
DIRECTORY "${ODR_DATA_PATH}/"
298-
DESTINATION "${CMAKE_INSTALL_DATADIR}"
334+
DIRECTORY "${ODR_BUILD_ODR_DATA_PATH}/"
335+
DESTINATION "${ODR_INSTALL_ODR_DATA_PATH}"
299336
)

src/odr/global_params.hpp

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

55
namespace odr {
66

7-
class GlobalParams {
7+
class GlobalParams final {
88
public:
99
static const std::string &odr_core_data_path();
1010
static const std::string &fontconfig_data_path();

src/odr/internal/git_info.cpp.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ const char *git_info::commit_hash() noexcept { return "@GIT_HEAD_SHA1@"; }
66

77
bool git_info::is_dirty() noexcept { return @GIT_IS_DIRTY@; }
88

9-
}
9+
} // namespace odr::internal

src/odr/internal/project_info.cpp.in

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,58 +2,60 @@
22

33
namespace odr::internal {
44

5-
const char *project_info::version() noexcept { return "${CMAKE_PROJECT_VERSION}"; }
5+
const char *project_info::version() noexcept {
6+
return "${CMAKE_PROJECT_VERSION}";
7+
}
68

79
bool project_info::is_debug() noexcept {
810
#ifdef NDEBUG
9-
return false;
11+
return false;
1012
#else
11-
return true;
13+
return true;
1214
#endif
1315
}
1416

1517
bool project_info::has_wvware() noexcept {
1618
#ifdef ODR_WITH_WVWARE
17-
return true;
19+
return true;
1820
#else
19-
return false;
21+
return false;
2022
#endif
2123
}
2224

23-
bool project_info::has_pdf2htmlex() noexcept{
25+
bool project_info::has_pdf2htmlex() noexcept {
2426
#ifdef ODR_WITH_PDF2HTMLEX
25-
return true;
27+
return true;
2628
#else
27-
return false;
29+
return false;
2830
#endif
2931
}
3032

31-
bool project_info::has_libmagic() noexcept{
33+
bool project_info::has_libmagic() noexcept {
3234
#ifdef ODR_WITH_LIBMAGIC
33-
return true;
35+
return true;
3436
#else
35-
return false;
37+
return false;
3638
#endif
3739
}
3840

3941
const char *project_info::odr_data_path() noexcept {
40-
return "${ODR_DATA_PATH}";
42+
return "${ODR_INSTALL_ODR_DATA_PATH}";
4143
}
4244

4345
const char *project_info::fontconfig_data_path() noexcept {
44-
return "${FONTCONFIG_DATA_PATH}";
46+
return "${ODR_INSTALL_FONTCONFIG_DATA_PATH}";
4547
}
4648

4749
const char *project_info::poppler_data_path() noexcept {
48-
return "${POPPLER_DATA_PATH}";
50+
return "${ODR_INSTALL_POPPLER_DATA_PATH}";
4951
}
5052

51-
const char *project_info::pdf2htmlex_data_path() noexcept{
52-
return "${PDF2HTMLEX_DATA_PATH}";
53+
const char *project_info::pdf2htmlex_data_path() noexcept {
54+
return "${ODR_INSTALL_PDF2HTMLEX_DATA_PATH}";
5355
}
5456

55-
const char *project_info::libmagic_database_path() noexcept{
56-
return "${LIBMAGIC_DATABASE_PATH}";
57+
const char *project_info::libmagic_database_path() noexcept {
58+
return "${ODR_INSTALL_LIBMAGIC_DATABASE_PATH}";
5759
}
5860

5961
} // namespace odr::internal

test/CMakeLists.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@ find_package(GTest REQUIRED)
22

33
include(GoogleTest REQUIRED)
44

5-
set(ODR_RESOURCE_DIRECTORY "${odr.js_SOURCE_DIR}")
65
set(ODR_TEST_DATA_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/data")
7-
configure_file("src/test_constants.cpp.in" "src/test_constants.cpp")
6+
configure_file("src/test_info.cpp.in" "src/test_info.cpp")
87

98
enable_testing()
109
add_executable(odr_test
10+
"src/test_main.cpp"
11+
1112
"src/test_util.cpp"
12-
"${CMAKE_CURRENT_BINARY_DIR}/src/test_constants.cpp"
13+
"${CMAKE_CURRENT_BINARY_DIR}/src/test_info.cpp"
1314

1415
"src/document_path_test.cpp"
1516
"src/document_test.cpp"
@@ -61,7 +62,6 @@ target_link_libraries(odr_test
6162
vincentlaucsb-csv-parser::vincentlaucsb-csv-parser
6263
uchardet::uchardet
6364
GTest::gtest
64-
GTest::gtest_main
6565

6666
odr
6767
)

test/src/html_output_test.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <odr/internal/util/odr_meta_util.hpp>
66
#include <odr/internal/util/string_util.hpp>
77

8+
#include <test_info.hpp>
89
#include <test_util.hpp>
910

1011
#include <filesystem>
@@ -158,7 +159,7 @@ TEST_P(HtmlOutputTests, html_meta) {
158159

159160
const std::string resource_path =
160161
Path(output_path_prefix).parent().join(RelPath("resources")).string();
161-
std::filesystem::copy(TestData::resource_directory(), resource_path,
162+
std::filesystem::copy(info::odr_data_path(), resource_path,
162163
fs::copy_options::recursive |
163164
fs::copy_options::overwrite_existing);
164165

test/src/test_constants.cpp.in

Lines changed: 0 additions & 9 deletions
This file was deleted.

test/src/test_info.cpp.in

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#include <test_info.hpp>
2+
3+
namespace odr::test {
4+
5+
const char *info::odr_data_path() noexcept {
6+
return "${ODR_BUILD_ODR_DATA_PATH}";
7+
}
8+
9+
const char *info::fontconfig_data_path() noexcept {
10+
return "${ODR_BUILD_FONTCONFIG_DATA_PATH}";
11+
}
12+
13+
const char *info::poppler_data_path() noexcept {
14+
return "${ODR_BUILD_POPPLER_DATA_PATH}";
15+
}
16+
17+
const char *info::pdf2htmlex_data_path() noexcept {
18+
return "${ODR_BUILD_PDF2HTMLEX_DATA_PATH}";
19+
}
20+
21+
const char *info::libmagic_database_path() noexcept {
22+
return "${ODR_BUILD_LIBMAGIC_DATABASE_PATH}";
23+
}
24+
25+
const char *info::odr_test_data_path() noexcept { return "${ODR_TEST_DATA_DIRECTORY}"; }
26+
27+
} // namespace odr::test

test/src/test_info.hpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#pragma once
2+
3+
namespace odr::test::info {
4+
5+
const char *odr_data_path() noexcept;
6+
const char *fontconfig_data_path() noexcept;
7+
const char *poppler_data_path() noexcept;
8+
const char *pdf2htmlex_data_path() noexcept;
9+
const char *libmagic_database_path() noexcept;
10+
11+
const char *odr_test_data_path() noexcept;
12+
13+
} // namespace odr::test::info

0 commit comments

Comments
 (0)