fast_excel 0.4.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +1 -7
  3. data/CHANGELOG.md +9 -0
  4. data/Gemfile +1 -1
  5. data/examples/example.rb +2 -0
  6. data/examples/example_date_time.rb +38 -0
  7. data/fast_excel.gemspec +2 -2
  8. data/lib/fast_excel/binding/format.rb +17 -0
  9. data/lib/fast_excel/binding/workbook.rb +39 -17
  10. data/lib/fast_excel/binding/worksheet.rb +57 -13
  11. data/lib/fast_excel/binding.rb +7 -7
  12. data/lib/fast_excel.rb +27 -20
  13. data/libxlsxwriter/.github/FUNDING.yml +1 -0
  14. data/libxlsxwriter/.github/ISSUE_TEMPLATE.md +85 -0
  15. data/libxlsxwriter/.github/PULL_REQUEST_TEMPLATE.md +130 -0
  16. data/libxlsxwriter/.github/workflows/cmake_actions.yml +48 -0
  17. data/libxlsxwriter/.github/workflows/code_style.yml +23 -0
  18. data/libxlsxwriter/.github/workflows/coverity.yml +22 -0
  19. data/libxlsxwriter/.github/workflows/make_actions.yml +52 -0
  20. data/libxlsxwriter/.github/workflows/valgrind.yml +23 -0
  21. data/libxlsxwriter/.github/workflows/windows_build.yml +54 -0
  22. data/libxlsxwriter/.github/workflows/zig_build.yml +22 -0
  23. data/libxlsxwriter/.gitignore +16 -1
  24. data/libxlsxwriter/.indent.pro +24 -0
  25. data/libxlsxwriter/CMakeLists.txt +156 -56
  26. data/libxlsxwriter/CONTRIBUTING.md +2 -2
  27. data/libxlsxwriter/Changes.txt +344 -2
  28. data/libxlsxwriter/LICENSE.txt +66 -8
  29. data/libxlsxwriter/Makefile +151 -54
  30. data/libxlsxwriter/Package.swift +42 -0
  31. data/libxlsxwriter/Readme.md +4 -2
  32. data/libxlsxwriter/build.zig +324 -0
  33. data/libxlsxwriter/build.zig.zon +11 -0
  34. data/libxlsxwriter/cmake/FindMINIZIP.cmake +3 -3
  35. data/libxlsxwriter/cocoapods/libxlsxwriter-umbrella.h +6 -0
  36. data/libxlsxwriter/include/xlsxwriter/app.h +2 -1
  37. data/libxlsxwriter/include/xlsxwriter/chart.h +236 -32
  38. data/libxlsxwriter/include/xlsxwriter/chartsheet.h +7 -7
  39. data/libxlsxwriter/include/xlsxwriter/comment.h +76 -0
  40. data/libxlsxwriter/include/xlsxwriter/common.h +111 -50
  41. data/libxlsxwriter/include/xlsxwriter/content_types.h +8 -1
  42. data/libxlsxwriter/include/xlsxwriter/core.h +1 -1
  43. data/libxlsxwriter/include/xlsxwriter/custom.h +1 -1
  44. data/libxlsxwriter/include/xlsxwriter/drawing.h +11 -20
  45. data/libxlsxwriter/include/xlsxwriter/format.h +121 -8
  46. data/libxlsxwriter/include/xlsxwriter/hash_table.h +1 -1
  47. data/libxlsxwriter/include/xlsxwriter/metadata.h +49 -0
  48. data/libxlsxwriter/include/xlsxwriter/packager.h +27 -16
  49. data/libxlsxwriter/include/xlsxwriter/relationships.h +1 -1
  50. data/libxlsxwriter/include/xlsxwriter/shared_strings.h +1 -1
  51. data/libxlsxwriter/include/xlsxwriter/styles.h +13 -7
  52. data/libxlsxwriter/include/xlsxwriter/table.h +51 -0
  53. data/libxlsxwriter/include/xlsxwriter/theme.h +1 -1
  54. data/libxlsxwriter/include/xlsxwriter/third_party/emyg_dtoa.h +26 -0
  55. data/libxlsxwriter/include/xlsxwriter/third_party/ioapi.h +27 -25
  56. data/libxlsxwriter/include/xlsxwriter/third_party/md5.h +45 -0
  57. data/libxlsxwriter/include/xlsxwriter/third_party/zip.h +155 -153
  58. data/libxlsxwriter/include/xlsxwriter/utility.h +70 -8
  59. data/libxlsxwriter/include/xlsxwriter/vml.h +55 -0
  60. data/libxlsxwriter/include/xlsxwriter/workbook.h +218 -47
  61. data/libxlsxwriter/include/xlsxwriter/worksheet.h +2770 -241
  62. data/libxlsxwriter/include/xlsxwriter/xmlwriter.h +12 -8
  63. data/libxlsxwriter/include/xlsxwriter.h +4 -2
  64. data/libxlsxwriter/libxlsxwriter.podspec +8 -5
  65. data/libxlsxwriter/src/Makefile +58 -21
  66. data/libxlsxwriter/src/app.c +5 -2
  67. data/libxlsxwriter/src/chart.c +396 -81
  68. data/libxlsxwriter/src/chartsheet.c +22 -22
  69. data/libxlsxwriter/src/comment.c +443 -0
  70. data/libxlsxwriter/src/content_types.c +40 -1
  71. data/libxlsxwriter/src/core.c +2 -2
  72. data/libxlsxwriter/src/custom.c +1 -1
  73. data/libxlsxwriter/src/drawing.c +160 -40
  74. data/libxlsxwriter/src/format.c +109 -25
  75. data/libxlsxwriter/src/hash_table.c +1 -1
  76. data/libxlsxwriter/src/metadata.c +283 -0
  77. data/libxlsxwriter/src/packager.c +794 -94
  78. data/libxlsxwriter/src/relationships.c +1 -1
  79. data/libxlsxwriter/src/shared_strings.c +2 -4
  80. data/libxlsxwriter/src/styles.c +353 -58
  81. data/libxlsxwriter/src/table.c +304 -0
  82. data/libxlsxwriter/src/theme.c +1 -1
  83. data/libxlsxwriter/src/utility.c +143 -43
  84. data/libxlsxwriter/src/vml.c +1062 -0
  85. data/libxlsxwriter/src/workbook.c +567 -77
  86. data/libxlsxwriter/src/worksheet.c +6668 -1462
  87. data/libxlsxwriter/src/xmlwriter.c +95 -5
  88. data/libxlsxwriter/third_party/dtoa/Makefile +42 -0
  89. data/libxlsxwriter/third_party/dtoa/emyg_dtoa.c +461 -0
  90. data/libxlsxwriter/third_party/dtoa/emyg_dtoa.h +26 -0
  91. data/libxlsxwriter/third_party/md5/Makefile +42 -0
  92. data/libxlsxwriter/third_party/md5/md5.c +291 -0
  93. data/libxlsxwriter/third_party/md5/md5.h +45 -0
  94. data/libxlsxwriter/third_party/minizip/Makefile +3 -8
  95. data/libxlsxwriter/third_party/minizip/Makefile.orig +8 -4
  96. data/libxlsxwriter/third_party/minizip/MiniZip64_Changes.txt +1 -1
  97. data/libxlsxwriter/third_party/minizip/configure.ac +1 -1
  98. data/libxlsxwriter/third_party/minizip/crypt.h +13 -16
  99. data/libxlsxwriter/third_party/minizip/ioapi.c +31 -57
  100. data/libxlsxwriter/third_party/minizip/ioapi.h +31 -23
  101. data/libxlsxwriter/third_party/minizip/iowin32.c +29 -45
  102. data/libxlsxwriter/third_party/minizip/iowin32.h +4 -4
  103. data/libxlsxwriter/third_party/minizip/miniunz.c +29 -56
  104. data/libxlsxwriter/third_party/minizip/minizip.c +38 -49
  105. data/libxlsxwriter/third_party/minizip/mztools.c +1 -7
  106. data/libxlsxwriter/third_party/minizip/unzip.c +202 -342
  107. data/libxlsxwriter/third_party/minizip/unzip.h +74 -74
  108. data/libxlsxwriter/third_party/minizip/zip.c +165 -218
  109. data/libxlsxwriter/third_party/minizip/zip.h +164 -154
  110. data/libxlsxwriter/third_party/tmpfileplus/Makefile +3 -3
  111. data/libxlsxwriter/version.txt +1 -1
  112. data/test/auto_width_test.rb +20 -0
  113. data/test/default_format_test.rb +1 -1
  114. data/test/validations_test.rb +3 -3
  115. data/test/worksheet_test.rb +6 -1
  116. metadata +33 -7
  117. data/libxlsxwriter/.travis.yml +0 -37
@@ -47,6 +47,24 @@
47
47
  # during configuration. This may produce bugs while cross-
48
48
  # compiling or using MinGW/MSYS.
49
49
  #
50
+ # USE_DTOA_LIBRARY
51
+ # Use the third party emyg_dtoa() library (default off). The
52
+ # emyg_dtoa() library is used to avoid sprintf double issues with
53
+ # different locale settings. To enable this library, pass
54
+ # `-DUSE_DTOA_LIBRARY=ON` during configuration.
55
+ #
56
+ # USE_NO_MD5
57
+ # Compile without third party MD5 support. This will turn off the
58
+ # functionality of avoiding duplicate image files in the output xlsx
59
+ # file. To enable this option pass `-DUSE_NO_MD5=ON` during
60
+ # configuration.
61
+ #
62
+ # USE_OPENSSL_MD5 Compile with OpenSSL MD5 support. This will link
63
+ # against libcrypto for MD5 support rather than using the local MD5
64
+ # support. MD5 support is required to avoid duplicate image files in
65
+ # the output xlsx file. To enable this option pass
66
+ # `-DUSE_OPENSSL_MD5=ON` during configuration.
67
+ #
50
68
  # USE_STATIC_MSVC_RUNTIME
51
69
  # Use the static msvc runtime library when compiling with msvc (default off)
52
70
  # To enable, pass `-DUSE_STATIC_MSVC_RUNTIME` during configuration.
@@ -88,24 +106,39 @@ else()
88
106
  cmake_minimum_required(VERSION 3.1)
89
107
  endif()
90
108
 
91
- SET(PROJECT_NAME "xlsxwriter" CACHE STRING "Optional project and binary name")
109
+ SET(XLSX_PROJECT_NAME "xlsxwriter" CACHE STRING "Optional project and binary name")
92
110
  set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
93
- project(${PROJECT_NAME} C)
111
+ project(${XLSX_PROJECT_NAME} C)
94
112
  enable_testing()
95
113
 
114
+ # POLICY
115
+ # ------
116
+
117
+ # The use of the word ZLIB_ROOT should still work prior to "3.12.0",
118
+ # just it's been generalized for all packages now. Just set the policy
119
+ # to new, so we use it, and it will be used prior to 3.12 anyway.
120
+ if(${CMAKE_VERSION} VERSION_GREATER "3.12" OR ${CMAKE_VERSION} VERSION_EQUAL "3.12")
121
+ cmake_policy(SET CMP0074 NEW)
122
+ endif()
123
+
96
124
  # OPTIONS
97
125
  # -------
98
-
99
126
  SET(ZLIB_ROOT "" CACHE STRING "Optional root for the ZLIB installation")
100
127
 
101
128
  option(BUILD_TESTS "Build libxlsxwriter tests" OFF)
102
129
  option(BUILD_EXAMPLES "Build libxlsxwriter examples" OFF)
103
130
  option(USE_SYSTEM_MINIZIP "Use system minizip installation" OFF)
104
131
  option(USE_STANDARD_TMPFILE "Use the C standard library's tmpfile()" OFF)
132
+ option(USE_NO_MD5 "Build libxlsxwriter without third party MD5 lib" OFF)
133
+ option(USE_OPENSSL_MD5 "Build libxlsxwriter with the OpenSSL MD5 lib" OFF)
134
+ option(USE_MEM_FILE "Use fmemopen()/open_memstream() in place of temporary files" OFF)
105
135
  option(IOAPI_NO_64 "Disable 64-bit filesystem support" OFF)
136
+ option(USE_DTOA_LIBRARY "Use the locale independent third party Milo Yip DTOA library" OFF)
137
+
106
138
  if(MSVC)
107
139
  option(USE_STATIC_MSVC_RUNTIME "Use the static runtime library" OFF)
108
140
  endif()
141
+
109
142
  if(DEFINED ENV{${ZLIB_ROOT}})
110
143
  set(ZLIB_ROOT $ENV{ZLIB_ROOT})
111
144
  endif()
@@ -116,7 +149,6 @@ endif()
116
149
 
117
150
  # CONFIGURATIONS
118
151
  # --------------
119
-
120
152
  if(USE_SYSTEM_MINIZIP)
121
153
  list(APPEND LXW_PRIVATE_COMPILE_DEFINITIONS USE_SYSTEM_MINIZIP)
122
154
  endif()
@@ -125,6 +157,25 @@ if(USE_STANDARD_TMPFILE)
125
157
  list(APPEND LXW_PRIVATE_COMPILE_DEFINITIONS USE_STANDARD_TMPFILE)
126
158
  endif()
127
159
 
160
+ if(NOT USE_OPENSSL_MD5 AND USE_NO_MD5)
161
+ list(APPEND LXW_PRIVATE_COMPILE_DEFINITIONS USE_NO_MD5)
162
+ endif()
163
+
164
+ if(USE_OPENSSL_MD5)
165
+ list(APPEND LXW_PRIVATE_COMPILE_DEFINITIONS USE_OPENSSL_MD5)
166
+ if(NOT MSVC)
167
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations")
168
+ endif()
169
+ endif()
170
+
171
+ if(USE_MEM_FILE OR USE_FMEMOPEN)
172
+ list(APPEND LXW_PRIVATE_COMPILE_DEFINITIONS USE_FMEMOPEN)
173
+ endif()
174
+
175
+ if(USE_DTOA_LIBRARY)
176
+ list(APPEND LXW_PRIVATE_COMPILE_DEFINITIONS USE_DTOA_LIBRARY)
177
+ endif()
178
+
128
179
  if(NOT BUILD_SHARED_LIBS)
129
180
  if(UNIX)
130
181
  set(CMAKE_POSITION_INDEPENDENT_CODE ON)
@@ -132,15 +183,13 @@ if(NOT BUILD_SHARED_LIBS)
132
183
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -static -static-libgcc -Wno-char-subscripts -Wno-long-long")
133
184
  list(APPEND LXW_PRIVATE_COMPILE_DEFINITIONS USE_FILE32API)
134
185
  elseif(MSVC)
135
- set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /O0 /Fd${CMAKE_BINARY_DIR}/${PROJECT_NAME}.pdb")
136
- set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Ox /Zi /Fd${CMAKE_BINARY_DIR}/${PROJECT_NAME}.pdb")
137
- set(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} /Zi /Fd${CMAKE_BINARY_DIR}/${PROJECT_NAME}.pdb")
138
- set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} /Fd${CMAKE_BINARY_DIR}/${PROJECT_NAME}.pdb")
186
+ set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /Fd\"${CMAKE_BINARY_DIR}/${PROJECT_NAME}.pdb\"")
187
+ set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Ox /Zi /Fd\"${CMAKE_BINARY_DIR}/${PROJECT_NAME}.pdb\"")
188
+ set(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} /Zi /Fd\"${CMAKE_BINARY_DIR}/${PROJECT_NAME}.pdb\"")
189
+ set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} /Fd\"${CMAKE_BINARY_DIR}/${PROJECT_NAME}.pdb\"")
139
190
  endif()
140
191
  endif()
141
192
 
142
- message(status "BEFORE: ${CMAKE_C_FLAGS_DEBUG}")
143
-
144
193
  if(MSVC AND USE_STATIC_MSVC_RUNTIME)
145
194
  foreach(flag_var CMAKE_C_FLAGS
146
195
  CMAKE_C_FLAGS_DEBUG
@@ -153,33 +202,37 @@ if(MSVC AND USE_STATIC_MSVC_RUNTIME)
153
202
  endforeach()
154
203
  endif()
155
204
 
205
+ # Configure pkg-config
206
+ file(READ "include/xlsxwriter.h" ver)
207
+
208
+ string(REGEX MATCH "LXW_VERSION \"([^\"]+)\"" _ ${ver})
209
+ set(VERSION ${CMAKE_MATCH_1})
210
+ string(REGEX MATCH "LXW_SOVERSION \"([^\"]+)\"" _ ${ver})
211
+ set(SOVERSION ${CMAKE_MATCH_1})
212
+ set(PREFIX ${CMAKE_INSTALL_PREFIX})
213
+
214
+ configure_file(dev/release/pkg-config.txt xlsxwriter.pc @ONLY)
215
+
156
216
  # INCLUDES
157
217
  # --------
158
-
159
218
  enable_language(CXX)
160
219
  list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
161
220
 
162
221
  # ZLIB
163
- find_package(ZLIB REQUIRED "1.0")
222
+ find_package(ZLIB "1.0" REQUIRED)
164
223
  list(APPEND LXW_PRIVATE_INCLUDE_DIRS ${ZLIB_INCLUDE_DIRS})
165
224
  message("zlib version: " ${ZLIB_VERSION})
166
225
 
167
226
  # MINIZIP
168
227
  if (USE_SYSTEM_MINIZIP)
169
- find_package(MINIZIP REQUIRED "1.0")
228
+ find_package(MINIZIP "1.0" REQUIRED)
170
229
  list(APPEND LXW_PRIVATE_INCLUDE_DIRS ${MINIZIP_INCLUDE_DIRS})
171
230
  endif()
172
231
 
173
232
  # LIBRARY
174
233
  # -------
175
-
176
234
  list(APPEND LXW_PRIVATE_COMPILE_DEFINITIONS NOCRYPT NOUNCRYPT)
177
235
 
178
- # Fix for modified zconf.h on Gentoo.
179
- if(${CMAKE_HOST_SYSTEM} MATCHES gentoo)
180
- list(APPEND LXW_PRIVATE_COMPILE_DEFINITIONS OF=_Z_OF)
181
- endif()
182
-
183
236
  # Ensure CRT Secure warnings are disabled
184
237
  if(MSVC)
185
238
  list(APPEND LXW_PRIVATE_COMPILE_DEFINITIONS _CRT_SECURE_NO_WARNINGS)
@@ -190,27 +243,64 @@ if(BUILD_TESTS)
190
243
  list(APPEND LXW_PRIVATE_COMPILE_DEFINITIONS TESTING)
191
244
  endif()
192
245
 
246
+ # Define "LXW_BIG_ENDIAN" macro on big-endian architectures
247
+ include(TestBigEndian)
248
+ TEST_BIG_ENDIAN(LXW_TARGET_BIG_ENDIAN)
249
+ if(LXW_TARGET_BIG_ENDIAN)
250
+ list(APPEND LXW_PRIVATE_COMPILE_DEFINITIONS LXW_BIG_ENDIAN)
251
+ endif()
252
+
193
253
  file(GLOB LXW_SOURCES src/*.c)
194
254
  file(GLOB_RECURSE LXW_HEADERS RELATIVE include *.h)
255
+
195
256
  if(NOT USE_SYSTEM_MINIZIP)
196
257
  list(APPEND LXW_SOURCES third_party/minizip/ioapi.c third_party/minizip/zip.c)
197
258
  if(MSVC)
198
259
  list(APPEND LXW_SOURCES third_party/minizip/iowin32.c)
199
260
  endif()
200
261
  endif()
262
+
201
263
  if (NOT USE_STANDARD_TMPFILE)
202
264
  list(APPEND LXW_SOURCES third_party/tmpfileplus/tmpfileplus.c)
203
265
  endif()
204
266
 
267
+ if(NOT USE_OPENSSL_MD5 AND NOT USE_NO_MD5)
268
+ list(APPEND LXW_SOURCES third_party/md5/md5.c)
269
+ endif()
270
+
271
+ if(USE_OPENSSL_MD5)
272
+ find_package(OpenSSL REQUIRED)
273
+ if(OpenSSL_FOUND)
274
+ include_directories(${OPENSSL_INCLUDE_DIR})
275
+ message(STATUS "OpenSSL version: ${OPENSSL_VERSION}")
276
+ endif()
277
+ endif()
278
+
279
+ if (USE_DTOA_LIBRARY)
280
+ list(APPEND LXW_SOURCES third_party/dtoa/emyg_dtoa.c)
281
+ endif()
282
+
205
283
  set(LXW_PROJECT_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
206
284
  set(LXW_LIB_DIR "${LXW_PROJECT_DIR}/lib")
207
285
  add_library(${PROJECT_NAME} "")
286
+ set_target_properties(${PROJECT_NAME} PROPERTIES SOVERSION ${SOVERSION})
208
287
  target_sources(${PROJECT_NAME}
209
288
  PRIVATE ${LXW_SOURCES}
210
289
  PUBLIC ${LXW_HEADERS}
211
290
  )
212
- target_link_libraries(${PROJECT_NAME} LINK_PUBLIC ${ZLIB_LIBRARIES} ${MINIZIP_LIBRARIES})
291
+ target_link_libraries(${PROJECT_NAME} LINK_PUBLIC ${ZLIB_LIBRARIES} ${MINIZIP_LIBRARIES} ${LIB_CRYPTO} ${OPENSSL_CRYPTO_LIBRARY})
213
292
  target_compile_definitions(${PROJECT_NAME} PRIVATE ${LXW_PRIVATE_COMPILE_DEFINITIONS})
293
+
294
+ # /utf-8 needs VS2015 Update 2 or above.
295
+ # In CMake 3.7 and above, we can use (MSVC_VERSION GREATER_EQUAL 1900) here.
296
+ if(MSVC AND NOT (MSVC_VERSION LESS 1900))
297
+ target_compile_options(${PROJECT_NAME} PRIVATE /utf-8)
298
+ endif()
299
+
300
+ if (WINDOWSSTORE)
301
+ target_compile_definitions(${PROJECT_NAME} PRIVATE -DIOWIN32_USING_WINRT_API)
302
+ endif()
303
+
214
304
  target_include_directories(${PROJECT_NAME}
215
305
  PRIVATE ${LXW_PRIVATE_INCLUDE_DIRS}
216
306
  PUBLIC include include/xlsxwriter
@@ -225,6 +315,7 @@ target_include_directories(${PROJECT_NAME}
225
315
  # sources Name of variable holding source files
226
316
  # target Test name
227
317
  #
318
+
228
319
  macro(CreateTest sources target)
229
320
  set(output_name xlsxwriter_${target})
230
321
  set(dependencies ${output_name})
@@ -238,7 +329,6 @@ macro(CreateTest sources target)
238
329
  )
239
330
  endmacro(CreateTest)
240
331
 
241
-
242
332
  file(GLOB LXW_UTILITY_SOURCES test/unit/utility/test*.c)
243
333
  file(GLOB LXW_XMLWRITER_SOURCES test/unit/xmlwriter/test*.c)
244
334
  file(GLOB LXW_WORKSHEET_SOURCES test/unit/worksheet/test*.c)
@@ -255,6 +345,8 @@ file(GLOB LXW_CHART_SOURCES test/unit/chart/test*.c)
255
345
  file(GLOB LXW_CUSTOM_SOURCES test/unit/custom/test*.c)
256
346
  file(GLOB LXW_FUNCTIONAL_SOURCES test/functional/src/*.c)
257
347
 
348
+ if(NOT MSVC)
349
+ # Skip unit tests on Windows since ctest.h doesn't support it.
258
350
  set(LXW_UNIT_SOURCES
259
351
  test/unit/test_all.c
260
352
  ${LXW_UTILITY_SOURCES}
@@ -272,25 +364,52 @@ set(LXW_UNIT_SOURCES
272
364
  ${LXW_CHART_SOURCES}
273
365
  ${LXW_CUSTOM_SOURCES}
274
366
  )
367
+ else()
368
+ set(LXW_UNIT_SOURCES
369
+ test/cpp/test_compilation.cpp
370
+ )
371
+ endif()
275
372
 
276
373
  if(BUILD_TESTS)
277
374
  # unit tests
278
375
  CreateTest(LXW_UNIT_SOURCES unit)
279
376
 
280
377
  # functional tests
281
- # WARNING: currently doesn't work, since the Python tests expect
282
- # in-source builds
283
- #find_program(PYTHON python)
284
- #foreach(source ${LXW_FUNCTIONAL_SOURCES})
285
- # get_filename_component(basename ${source} NAME_WE)
286
- # add_executable(${basename} ${source})
287
- # target_link_libraries(${basename} xlsxwriter)
288
- #endforeach(source)
378
+ find_package(Python COMPONENTS Interpreter REQUIRED)
379
+ find_program(Pytest_EXECUTABLE NAMES pytest)
380
+
381
+ if (NOT Pytest_EXECUTABLE)
382
+ message("Please install the Python pytest library to run functional tests:")
383
+ message(" pip install pytest\n")
384
+ endif()
385
+
386
+ foreach(source ${LXW_FUNCTIONAL_SOURCES})
387
+ get_filename_component(basename ${source} NAME_WE)
388
+ add_executable(${basename} ${source})
389
+ target_link_libraries(${basename} xlsxwriter)
390
+ set_target_properties(${basename} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "test/functional/src")
391
+ endforeach(source)
392
+
393
+ add_custom_command(TARGET xlsxwriter_unit POST_BUILD
394
+ COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/test/functional test/functional
395
+ )
396
+
397
+ if(USE_NO_MD5)
398
+ add_test(NAME functional
399
+ COMMAND pytest -v test/functional -m "not skipif"
400
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
401
+ )
402
+ else()
403
+ add_test(NAME functional
404
+ COMMAND pytest -v test/functional
405
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
406
+ )
407
+ endif()
408
+
289
409
  endif()
290
410
 
291
411
  # EXAMPLES
292
412
  # --------
293
-
294
413
  file(GLOB LXW_EXAMPLE_SOURCES examples/*.c)
295
414
 
296
415
  if(BUILD_EXAMPLES)
@@ -298,41 +417,22 @@ if(BUILD_EXAMPLES)
298
417
  get_filename_component(basename ${source} NAME_WE)
299
418
  add_executable(${basename} ${source})
300
419
  target_link_libraries(${basename} ${PROJECT_NAME})
420
+ set_target_properties(${basename} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "examples")
301
421
  endforeach(source)
302
422
  endif()
303
423
 
304
424
  # INSTALL
305
425
  # -------
306
-
307
426
  include(GNUInstallDirs)
308
427
 
309
- if(MSVC)
310
- if(CMAKE_CL_64)
311
- set(MSVC_FOLDER_PREFIX x64)
312
- else()
313
- set(MSVC_FOLDER_PREFIX Win32)
314
- endif()
315
-
316
- install(TARGETS ${PROJECT_NAME}
317
- LIBRARY DESTINATION "lib/${MSVC_FOLDER_PREFIX}/\${CMAKE_INSTALL_CONFIG_NAME}"
318
- ARCHIVE DESTINATION "lib/${MSVC_FOLDER_PREFIX}/\${CMAKE_INSTALL_CONFIG_NAME}"
319
- RUNTIME DESTINATION "bin/${MSVC_FOLDER_PREFIX}/\${CMAKE_INSTALL_CONFIG_NAME}"
320
- )
321
- if (NOT BUILD_SHARED_LIBS)
322
- install(FILES ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.pdb
323
- DESTINATION "lib/${MSVC_FOLDER_PREFIX}/\${CMAKE_INSTALL_CONFIG_NAME}"
324
- )
325
- endif()
326
-
327
- else(MSVC)
328
- install(TARGETS ${PROJECT_NAME}
329
- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
330
- ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
331
- RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
332
- )
333
- endif(MSVC)
428
+ install(TARGETS ${PROJECT_NAME}
429
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
430
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
431
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
432
+ )
334
433
  install(FILES include/xlsxwriter.h DESTINATION include)
335
434
  install(DIRECTORY include/xlsxwriter
336
435
  DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
337
436
  FILES_MATCHING PATTERN "*.h"
338
437
  )
438
+ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/xlsxwriter.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
@@ -181,9 +181,9 @@ If you have `valgrind` installed you can use the test suite to check for memory
181
181
  ```
182
182
 
183
183
  When you push your changes they will also be tested automatically using
184
- [Travis CI][travis].
184
+ [GitHub Actions][actions].
185
185
 
186
- [Travis]: https://travis-ci.org/jmcnamara/libxlsxwriter/
186
+ [actions]: https://github.com/jmcnamara/libxlsxwriter/actions
187
187
  [pytest]: http://pytest.org/
188
188
 
189
189