File: CMakeLists.txt

package info (click to toggle)
libapache2-mod-rivet 3.2.0-1
  • links: PTS
  • area: main
  • in suites: bullseye
  • size: 5,868 kB
  • sloc: xml: 8,496; tcl: 7,212; ansic: 6,959; sh: 5,030; makefile: 261; sql: 91; lisp: 78
file content (504 lines) | stat: -rw-r--r-- 22,233 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
# Georgios Petasis, petasis@iit.demokritos.gr

# The minimum version of cmake required. This may work also in 2.8,
# but I have not tested. My cmake is version 3.9.0.
cmake_minimum_required(VERSION 3.2 FATAL_ERROR)
if(POLICY CMP0074)
  cmake_policy(SET CMP0074 NEW)
endif()

# Rivet version:
# In order to avoid chasing around multiple definition of the module version we infer
# this information from the file VERSION, which must stay in the project root directory
# and assuming we are working from a direct child directory
SET ( RIVET_TOP_DIR "${CMAKE_CURRENT_SOURCE_DIR}/.." )
# Read the file named VERSION from the top Rivet directory...
FILE ( READ "${RIVET_TOP_DIR}/VERSION" RIVET_VERSION_FROM_FILE )
STRING ( REGEX MATCH "([0-9]+)\.([0-9]+)\.([0-9]+)" _ ${RIVET_VERSION_FROM_FILE} )
SET ( RIVET_MAJOR_VERSION ${CMAKE_MATCH_1} )
SET ( RIVET_MINOR_VERSION ${CMAKE_MATCH_2} )
SET ( RIVET_PATCH_VERSION ${CMAKE_MATCH_3} )
MESSAGE ( STATUS "Rivet version: ${RIVET_MAJOR_VERSION}.${RIVET_MINOR_VERSION}.${RIVET_PATCH_VERSION}" )

set(RIVET_VERSION
  ${RIVET_MAJOR_VERSION}.${RIVET_MINOR_VERSION}.${RIVET_PATCH_VERSION})
set(INIT_VERSION ${RIVET_MAJOR_VERSION}.${RIVET_MINOR_VERSION})

# Rivetlib version:
set(RIVETLIB_PACKAGE "rivetlib")
set(RIVETLIB_PACKAGE_VERSION ${INIT_VERSION})

# The arguments argument are optional, declares version and language
# (in this case C).
project(Rivet VERSION ${RIVET_VERSION} LANGUAGES C)

#  User options...
# ===========================================================================
set(with-tclsh "" CACHE FILEPATH "location of a working tclsh executable")
set(with-tcl   "" CACHE PATH "directory containing tcl configuration (tclConfig.sh)")
set(with-post-max 0 CACHE STRING  "BYTES Maximum size of data to be sent with a POST")
set(with-rivet-core "mod_rivet_ng" CACHE STRING "mod_rivet core directory")
set(with-upload-dir "/tmp"         CACHE STRING "Default directory for uploads")
option(version-display            "Display Rivet version in Apache signature" OFF)
option(head-requests              "Returns real headers in response to a HEAD request" OFF)
option(single-thread              "forces the worker brigde to create a single thread (debug)" OFF)
option(rivet-commands-export      "prevent export from ::rivet namespace" ON)
option(import-rivet-commands      "requires explicit namespace import" OFF)
option(virtual-interps-separation "to turn on virtual host separation" OFF)
option(requests-serialization     "Forces HTTP requests serialization among threads(debug)" OFF)
option(upload-var                 "whether files are uploaded to Tcl variables" ON)
option(BUILD_SHARED_LIBS          "build and link with shared libraries" ON)
option(TCL_THREADS                "build with threads" ON)
option(TCL_MEM_DEBUG              "build with memory debugging" OFF)

include(CMakeDependentOption)
CMAKE_DEPENDENT_OPTION(BUILD_STATIC_LIBS "build as static library" ON
                       "NOT BUILD_SHARED_LIBS" OFF)

# Offer the user the choice of overriding the installation directories
set(INSTALL_LIB_DIR lib CACHE PATH "Installation directory for libraries")
set(INSTALL_BIN_DIR bin CACHE PATH "Installation directory for executables")
set(INSTALL_INCLUDE_DIR include CACHE PATH
  "Installation directory for header files")
if(WIN32 AND NOT CYGWIN)
  set(DEF_INSTALL_CMAKE_DIR CMake)
else()
  set(DEF_INSTALL_CMAKE_DIR lib/CMake/Rivet)
endif()
set(INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR} CACHE PATH
  "Installation directory for CMake files")

if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE Release)
endif()

# Use GNU install directories
include(GNUInstallDirs)

#  Rivet source files...
# ===========================================================================
set(RIVET_SRC_DIR "${PROJECT_SOURCE_DIR}/../src")
set(RIVET_LIB_DIR "${PROJECT_SOURCE_DIR}/../rivet")
set(RIVET_CORE ${with-rivet-core})

set(rivetparser_sources
  ${RIVET_SRC_DIR}/parser/rivetParser.c
  ${RIVET_SRC_DIR}/parser/parserPkgInit.c
)

set(rivetlib_sources
  ${RIVET_SRC_DIR}/librivet/rivetList.c
  ${RIVET_SRC_DIR}/librivet/rivetCrypt.c
  ${RIVET_SRC_DIR}/librivet/rivetWWW.c
  ${RIVET_SRC_DIR}/librivet/rivetPkgInit.c
)

set(rivet_worker_mpm_sources
  ${RIVET_SRC_DIR}/${RIVET_CORE}/rivet_worker_mpm.c
  ${RIVET_SRC_DIR}/${RIVET_CORE}/worker_prefork_common.c
)

set(rivet_prefork_mpm_sources
  ${RIVET_SRC_DIR}/${RIVET_CORE}/rivet_prefork_mpm.c
  ${RIVET_SRC_DIR}/${RIVET_CORE}/worker_prefork_common.c
)

set(rivet_lazy_mpm_sources
  ${RIVET_SRC_DIR}/${RIVET_CORE}/rivet_lazy_mpm.c
)

set(mod_rivet_sources
  ${RIVET_SRC_DIR}/${RIVET_CORE}/mod_rivet.c
  ${RIVET_SRC_DIR}/request/apache_multipart_buffer.c
  ${RIVET_SRC_DIR}/request/apache_request.c
  ${RIVET_SRC_DIR}/${RIVET_CORE}/rivetCore.c
  ${RIVET_SRC_DIR}/${RIVET_CORE}/rivetInspect.c
  ${RIVET_SRC_DIR}/${RIVET_CORE}/rivetChannel.c
  ${RIVET_SRC_DIR}/parser/rivetParser.c
  ${RIVET_SRC_DIR}/${RIVET_CORE}/TclWebapache.c
  ${RIVET_SRC_DIR}/${RIVET_CORE}/apache_config.c
  ${RIVET_SRC_DIR}/${RIVET_CORE}/mod_rivet_cache.c
  ${RIVET_SRC_DIR}/${RIVET_CORE}/mod_rivet_common.c
  ${RIVET_SRC_DIR}/${RIVET_CORE}/mod_rivet_generator.c
)

#  Add build targets...
# ===========================================================================
add_library(mod_rivet            ${mod_rivet_sources})
add_library(rivetparser          ${rivetparser_sources})
add_library(rivetlib             ${rivetlib_sources})
add_library(rivet_worker_mpm     ${rivet_worker_mpm_sources})
add_library(rivet_prefork_mpm    ${rivet_prefork_mpm_sources})
add_library(rivet_lazy_mpm       ${rivet_lazy_mpm_sources})
add_library(rivet::parser        ALIAS rivetparser)
add_library(rivet::lib           ALIAS rivetparser)
add_library(rivet::rivet         ALIAS mod_rivet)
add_library(rivet::worker_mpm    ALIAS rivet_worker_mpm)
add_library(rivet::prefork_mpm   ALIAS rivet_prefork_mpm)
add_library(rivet::lazy_mpm      ALIAS rivet_lazy_mpm)

SET ( RIVET_LIB_SUFFIX ".so" )
SET ( RIVET_LIB_PREFIX "lib" )

SET_TARGET_PROPERTIES(mod_rivet         PROPERTIES PREFIX "" SUFFIX ${RIVET_LIB_SUFFIX})
SET_TARGET_PROPERTIES(rivet_worker_mpm  PROPERTIES PREFIX "" SUFFIX ${RIVET_LIB_SUFFIX})
SET_TARGET_PROPERTIES(rivet_prefork_mpm PROPERTIES PREFIX "" SUFFIX ${RIVET_LIB_SUFFIX})
SET_TARGET_PROPERTIES(rivet_lazy_mpm    PROPERTIES PREFIX "" SUFFIX ${RIVET_LIB_SUFFIX})
SET_TARGET_PROPERTIES(rivetparser       PROPERTIES PREFIX ${RIVET_LIB_PREFIX})
SET_TARGET_PROPERTIES(rivetlib          PROPERTIES PREFIX ${RIVET_LIB_PREFIX})

#  Definitions...
# ===========================================================================
target_compile_definitions (rivetparser        PRIVATE
   HAVE_CONFIG_H=1 USE_TCL_STUBS=1 START_TAG="<?" END_TAG="?>" )
target_compile_definitions (rivetlib           PRIVATE
   HAVE_CONFIG_H=1 USE_TCL_STUBS=1 START_TAG="<?" END_TAG="?>" )
target_compile_definitions (rivet_worker_mpm   PRIVATE HAVE_CONFIG_H=1 )
target_compile_definitions (rivet_prefork_mpm  PRIVATE HAVE_CONFIG_H=1 )
target_compile_definitions (rivet_lazy_mpm     PRIVATE HAVE_CONFIG_H=1 )
target_compile_definitions (mod_rivet          PRIVATE
   HAVE_CONFIG_H=1 START_TAG="<?" END_TAG="?>" )

# ===========================================================================
#  Locate needed packages...
# ===========================================================================
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake_extra_modules")
include(checks)

#  Locate Tcl...
# ===========================================================================
MESSAGE ( STATUS "Searching for Tcl..." )
if (NOT "${with-tcl}" STREQUAL "")
  MESSAGE ( STATUS "  Tcl lib directory manually set by -Dwith-tcl=" ${with-tcl} )
  get_filename_component(RIVET_TCL_ROOT "${with-tcl}" DIRECTORY)
  MESSAGE ( STATUS "  Setting Tcl root to: " ${RIVET_TCL_ROOT} )
  set ( CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${RIVET_TCL_ROOT} )
  set (TCL_ROOT ${RIVET_TCL_ROOT})
  set (TclStub_ROOT ${RIVET_TCL_ROOT})
endif ()
if (NOT "${with-tclsh}" STREQUAL "")
  MESSAGE ( STATUS "  Tclsh manually set by -Dwith-tclsh=" ${with-tclsh} )
  set (TCL_TCLSH ${with-tclsh})
endif ()
FIND_PACKAGE ( TCL 8.6.1 REQUIRED )
FIND_PACKAGE ( TclStub 8.6.1 REQUIRED )
MESSAGE ( STATUS "  TCL_TCLSH:               " ${TCL_TCLSH} )
MESSAGE ( STATUS "  TCL_INCLUDE_PATH:        " ${TCL_INCLUDE_PATH} )
MESSAGE ( STATUS "  TCL_LIBRARY:             " ${TCL_LIBRARY} )
MESSAGE ( STATUS "  TCL_STUB_LIBRARY:        " ${TCL_STUB_LIBRARY} )

#  Locate Apache...
# ===========================================================================
MESSAGE ( STATUS "Searching for Apache..." )
find_package(APACHE REQUIRED)
MESSAGE ( STATUS "  APACHE_INCLUDE_DIR:      " ${APACHE_INCLUDE_DIR} )
MESSAGE ( STATUS "  APACHE_MODULE_DIR:       " ${APACHE_MODULE_DIR} )
MESSAGE ( STATUS "  APACHE_LIB_DIR:          " ${APACHE_LIB_DIR} )

#  Locate Apr...
# ===========================================================================
MESSAGE ( STATUS "Searching for Apr..." )
find_package(APR REQUIRED)
MESSAGE ( STATUS "  APR_INCLUDE_DIR:         " ${APR_INCLUDE_DIR} )
MESSAGE ( STATUS "  APR_LIBRARY:             " ${APR_LIBRARY} )
MESSAGE ( STATUS "  APRUTIL_INCLUDE_DIR:     " ${APRUTIL_INCLUDE_DIR} )
MESSAGE ( STATUS "  APRUTIL_LIBRARY:         " ${APRUTIL_LIBRARY} )

find_package(Threads)

#  Set up include directories...
# ===========================================================================
set(RIVET_GENERATE_DIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR})
set(RIVET_GENERATE_DIR ${PROJECT_BINARY_DIR}/generated)
set(RIVET_INCLUDE_DIRS_PUBLIC
  "${TCL_INCLUDE_PATH}"
  "${APACHE_INCLUDE_DIR}"
  "${APR_INCLUDE_DIR}"
  "${APRUTIL_INCLUDE_DIR}"
)
set(RIVET_INCLUDE_DIRS_PRIVATE
  "${RIVET_SRC_DIR}"
  "${RIVET_SRC_DIR}/${RIVET_CORE}"
  "${RIVET_SRC_DIR}/parser"
  "${RIVET_SRC_DIR}/request"
  "${RIVET_GENERATE_DIR}"
  "${PROJECT_BINARY_DIR}" 
)

target_include_directories(rivetparser
  PUBLIC ${RIVET_INCLUDE_DIRS_PUBLIC} PRIVATE ${RIVET_INCLUDE_DIRS_PRIVATE})
target_include_directories(rivetlib
  PUBLIC ${RIVET_INCLUDE_DIRS_PUBLIC} PRIVATE ${RIVET_INCLUDE_DIRS_PRIVATE})
target_include_directories(rivet_worker_mpm
  PUBLIC ${RIVET_INCLUDE_DIRS_PUBLIC} PRIVATE ${RIVET_INCLUDE_DIRS_PRIVATE})
target_include_directories(rivet_prefork_mpm
  PUBLIC ${RIVET_INCLUDE_DIRS_PUBLIC} PRIVATE ${RIVET_INCLUDE_DIRS_PRIVATE})
target_include_directories(rivet_lazy_mpm
  PUBLIC ${RIVET_INCLUDE_DIRS_PUBLIC} PRIVATE ${RIVET_INCLUDE_DIRS_PRIVATE})
target_include_directories(mod_rivet
  PUBLIC ${RIVET_INCLUDE_DIRS_PUBLIC} PRIVATE ${RIVET_INCLUDE_DIRS_PRIVATE})

#  Set up libraries...
# ===========================================================================
target_link_libraries(rivetparser        ${TCL_STUB_LIBRARY})
target_link_libraries(rivetlib           ${TCL_STUB_LIBRARY})
target_link_libraries(mod_rivet          ${TCL_LIBRARY})
if(WIN32)
  # Under Windows, we need to link with all libraries, even libhttpd.lib
  MESSAGE ( STATUS "Searching for libhttpd.lib (Windows)..." )
  FIND_LIBRARY(APACHE_HTTPD_LIBRARY libhttpd libhttpd.lib
    NAMES ${APACHE_HTTPD_NAMES}
    PATHS ${APACHE_HTTPD_LIBRARY_HINTS}
          ${APACHE_ROOT}/lib
  )
  MESSAGE ( STATUS "  APACHE_HTTPD_LIBRARY:    " ${APACHE_HTTPD_LIBRARY} )

  # Export all symbols from mod_rivet
  #SET_TARGET_PROPERTIES(mod_rivet PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE)

  target_link_libraries(mod_rivet          ${APR_LIBRARY} ${APACHE_HTTPD_LIBRARY} )
  target_link_libraries(rivet_worker_mpm   ${APR_LIBRARY} ${APRUTIL_LIBRARY} ${APACHE_HTTPD_LIBRARY} mod_rivet)
  target_link_libraries(rivet_prefork_mpm  ${APR_LIBRARY} ${APACHE_HTTPD_LIBRARY} mod_rivet)
  target_link_libraries(rivet_lazy_mpm     ${APR_LIBRARY} ${APACHE_HTTPD_LIBRARY} mod_rivet)
  # rivet_worker_mpm.c uses round(), which is available in C99
  SET_TARGET_PROPERTIES(rivet_worker_mpm PROPERTIES C_STANDARD 99)
  if(MSVC)
    # Libraries linked with tclstubs.lib library, cannot use /SAFESEH
    SET_TARGET_PROPERTIES(rivetparser PROPERTIES LINK_FLAGS /SAFESEH:NO )
    SET_TARGET_PROPERTIES(rivetlib    PROPERTIES LINK_FLAGS /SAFESEH:NO )
  endif(MSVC)
endif(WIN32)

#  Handle user options...
# ===========================================================================
MESSAGE( STATUS "Rivet version ${RIVET_VERSION}:")
MESSAGE( STATUS "  Core in use: " ${RIVET_CORE})
set(CONFIGURE_CMD "cmake -${CMAKE_ARGC} ${CMAKE_ARGV0}")
if(version-display)
  set(DISPLAY_VERSION 1)
else(version-display)
  set(DISPLAY_VERSION 0)
endif()
if(head-requests)
  set(HEAD_REQUESTS 1)
endif()
set(MAX_POST ${with-post-max})
if(single-thread)
  set(MPM_SINGLE_TCL_THREAD 1)
endif()
set(NAMEOFEXECUTABLE ${TCL_TCLSH})
if(import-rivet-commands)
  message(STATUS "  Forcing Rivet to import commands from ::rivet namespace")
  set(NAMESPACE_IMPORT 1)
endif()
if(rivet-commands-export)
  message(STATUS "  Forcing Rivet to export commands from ::rivet namespace")
  set(NAMESPACE_EXPORT 1)
endif()
set(SEPARATE_CHANNELS 0)
if(virtual-interps-separation)
  set(SEPARATE_VIRTUAL_INTERPS 1)
endif()
if(requests-serialization)
  set(SERIALIZE_HTTP_REQUESTS 1)
endif()
if(upload-var)
  set(UPLOAD_FILES_TO_VAR 1)
endif()
set(UPLOAD_DIR ${with-upload-dir})

#  Location of the Rivet library...
# ===========================================================================
if(NOT DEFINED RIVETLIB_DESTDIR)
  set(RIVETLIB_DESTDIR "${APACHE_LIB_DIR}/rivet${RIVET_VERSION}")
endif(NOT DEFINED RIVETLIB_DESTDIR)

if(TCL_THREADS)
  set(TCL_THREADS 1)
  if(NOT WIN32)
    set(USE_THREAD_ALLOC 1)
    set(_REENTRANT       1)
    set(_THREAD_SAFE     1)
    STRING (REGEX MATCH "SunOS" PROJECT_OS_SunOS ${CMAKE_SYSTEM_NAME})
    if(PROJECT_OS_SunOS)
      set(_POSIX_PTHREAD_SEMANTICS 1)
    endif(PROJECT_OS_SunOS)
  endif(NOT WIN32)
endif(TCL_THREADS)

#  Definitions...
# ===========================================================================
if(_REENTRANT)
  target_compile_definitions(rivetparser       PRIVATE _REENTRANT=1)
  target_compile_definitions(rivetlib          PRIVATE _REENTRANT=1)
  target_compile_definitions(rivet_worker_mpm  PRIVATE _REENTRANT=1)
  target_compile_definitions(rivet_prefork_mpm PRIVATE _REENTRANT=1)
  target_compile_definitions(rivet_lazy_mpm    PRIVATE _REENTRANT=1)
  target_compile_definitions(mod_rivet         PRIVATE _REENTRANT=1)
endif(_REENTRANT)

if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
  target_compile_definitions(rivetparser       PRIVATE LINUX=1)
  target_compile_definitions(rivetlib          PRIVATE LINUX=1)
  target_compile_definitions(rivet_worker_mpm  PRIVATE LINUX=1)
  target_compile_definitions(rivet_prefork_mpm PRIVATE LINUX=1)
  target_compile_definitions(rivet_lazy_mpm    PRIVATE LINUX=1)
  target_compile_definitions(mod_rivet         PRIVATE LINUX=1)
endif(CMAKE_SYSTEM_NAME STREQUAL "Linux")

#  Set variables for generating config files...
# ===========================================================================
set(RIVET_AC_APPLE_UNIVERSAL_BUILD ${AC_APPLE_UNIVERSAL_BUILD})
set(RIVET_CONFIGURE_CMD            ${CONFIGURE_CMD})
set(RIVET_DISPLAY_VERSION          ${DISPLAY_VERSION})
set(RIVET_HAVE_DLFCN_H             ${HAVE_DLFCN_H})
set(RIVET_HAVE_INTTYPES_H          ${HAVE_INTTYPES_H})
set(RIVET_HAVE_LIMITS_H            ${HAVE_LIMITS_H})
set(RIVET_HAVE_LSEEK64             ${HAVE_LSEEK64})
set(RIVET_HAVE_MEMORY_H            ${HAVE_MEMORY_H})
set(RIVET_HAVE_NET_ERRNO_H         ${HAVE_NET_ERRNO_H})
set(RIVET_HAVE_OPEN64              ${HAVE_OPEN64})
set(RIVET_HAVE_STDINT_H            ${HAVE_STDINT_H})
set(RIVET_HAVE_STDLIB_H            ${HAVE_STDLIB_H})
set(RIVET_HAVE_STRINGS_H           ${HAVE_STRINGS_H})
set(RIVET_HAVE_STRING_H            ${HAVE_STRING_H})
set(RIVET_HAVE_SYS_PARAM_H         ${HAVE_SYS_PARAM_H})
set(RIVET_HAVE_SYS_STAT_H          ${HAVE_SYS_STAT_H})
set(RIVET_HAVE_SYS_TYPES_H         ${HAVE_SYS_TYPES_H})
set(RIVET_HAVE_UNISTD_H            ${HAVE_UNISTD_H})
set(RIVET_HEAD_REQUESTS            ${HEAD_REQUESTS})
set(RIVET_MPM_SINGLE_TCL_THREAD    ${MPM_SINGLE_TCL_THREAD})
set(RIVET_NAMESPACE_EXPORT         ${NAMESPACE_EXPORT})
set(RIVET_NAMESPACE_IMPORT         ${NAMESPACE_IMPORT})
set(RIVET_HAVE_DIRENT_H            ${HAVE_DIRENT_H})
set(RIVET_NO_DIRENT_H              ${NO_DIRENT_H})
set(RIVET_NO_DLFCN_H               ${NO_DLFCN_H})
set(RIVET_NO_ERRNO_H               ${NO_ERRNO_H})
set(RIVET_NO_FLOAT_H               ${NO_FLOAT_H})
set(RIVET_HAVE_LIMITS_H            ${HAVE_LIMITS_H})
set(RIVET_NO_LIMITS_H              ${NO_LIMITS_H})
set(RIVET_NO_STDLIB_H              ${NO_STDLIB_H})
set(RIVET_NO_STRING_H              ${NO_STRING_H})
set(RIVET_NO_SYS_WAIT_H            ${NO_SYS_WAIT_H})
set(RIVET_NO_VALUES_H              ${NO_VALUES_H})
set(RIVET_NO_VIZ                   ${NO_VIZ})
set(RIVET_SEPARATE_CHANNELS        ${SEPARATE_CHANNELS})
set(RIVET_SEPARATE_VIRTUAL_INTERPS ${SEPARATE_VIRTUAL_INTERPS})
set(RIVET_SERIALIZE_HTTP_REQUESTS  ${SERIALIZE_HTTP_REQUESTS})
set(RIVET_STATIC_BUILD             ${STATIC_BUILD})
set(RIVET_STDC_HEADERS             ${STDC_HEADERS})
set(RIVET_TCL_MEM_DEBUG            ${TCL_MEM_DEBUG})
set(RIVET_TCL_THREADS              ${TCL_THREADS})
set(RIVET_TCL_WIDE_INT_IS_LONG     ${TCL_WIDE_INT_IS_LONG})
set(RIVET_TCL_WIDE_INT_TYPE        ${TCL_WIDE_INT_TYPE})
set(RIVET_UNDER_CE                 ${UNDER_CE})
set(RIVET_UPLOAD_FILES_TO_VAR      ${UPLOAD_FILES_TO_VAR})
set(RIVET_UPLOAD_DIR               ${UPLOAD_DIR})
set(RIVET_USE_THREAD_ALLOC         ${USE_THREAD_ALLOC})
set(RIVET__ISOC99_SOURCE           ${_ISOC99_SOURCE})
set(RIVET__LARGEFILE64_SOURCE      ${_LARGEFILE64_SOURCE})
set(RIVET__LARGEFILE_SOURCE64      ${_LARGEFILE_SOURCE64})
set(RIVET__OE_SOCKETS              ${_OE_SOCKETS})
set(RIVET__POSIX_PTHREAD_SEMANTICS ${_POSIX_PTHREAD_SEMANTICS})
set(RIVET__REENTRANT               ${_REENTRANT})
set(RIVET__THREAD_SAFE             ${_THREAD_SAFE})
set(RIVET__WIN32_WCE               ${_WIN32_WCE})
set(RIVET__XOPEN_SOURCE_EXTENDED   ${_XOPEN_SOURCE_EXTENDED})
set(RIVET_HAVE_ROUND               ${HAVE_ROUND})
set(RIVET_NO_HAVE_ROUND            ${NO_HAVE_ROUND})

#  Generate headers rivet_config.h, config.h
# ===========================================================================
MESSAGE(STATUS "Generating: " ${RIVET_GENERATE_DIR}/rivet_config.h)
configure_file("${PROJECT_SOURCE_DIR}/cmake_extra_modules/rivet_config.h.cmake"
               "${RIVET_GENERATE_DIR}/rivet_config.h" )
MESSAGE(STATUS "Generating: " ${RIVET_GENERATE_DIR}/config.h)
configure_file("${PROJECT_SOURCE_DIR}/cmake_extra_modules/config.h.cmake"
               "${RIVET_GENERATE_DIR}/config.h" )

#  Generate init.tcl
# ===========================================================================
MESSAGE(STATUS "Generating: " ${RIVET_GENERATE_DIR}/init.tcl)
configure_file("${RIVET_LIB_DIR}/init.tcl.in"
               "${RIVET_GENERATE_DIR}/init.tcl" @ONLY)

# ===========================================================================
#  Installation section...
# ===========================================================================

MESSAGE ( STATUS
"==========================================================================" )
MESSAGE ( STATUS "Rivet ${RIVET_VERSION} will be installed in the following "
                 "directories:" )
MESSAGE ( STATUS " + mod_rivet.so: " ${APACHE_MODULE_DIR} )
MESSAGE ( STATUS "     (to override this location, use -DAPACHE_MODULE_DIR=...)")
MESSAGE ( STATUS " + Rivet library: " ${RIVETLIB_DESTDIR} )
MESSAGE ( STATUS "     (to override this location, use -DAPACHE_LIB_DIR=... or")
MESSAGE ( STATUS "                                     -DRIVETLIB_DESTDIR=...)")
MESSAGE ( STATUS
"==========================================================================" )

#  Library mod_rivet (mod_rivet.so) must be installed in the directory Apache2
#  searches for modules...
# ===========================================================================
if(WIN32)
  install(TARGETS mod_rivet EXPORT Rivet_mod_rivet
    RUNTIME DESTINATION ${APACHE_MODULE_DIR})
else(WIN32)
  install(TARGETS mod_rivet EXPORT Rivet_mod_rivet
    LIBRARY DESTINATION ${APACHE_MODULE_DIR})
endif(WIN32)

#  Install mpms...
# ===========================================================================
install(TARGETS rivet_worker_mpm rivet_prefork_mpm rivet_lazy_mpm
  EXPORT Rivet_MPMs
  ARCHIVE  DESTINATION ${RIVETLIB_DESTDIR}/mpm
  LIBRARY  DESTINATION ${RIVETLIB_DESTDIR}/mpm
  RUNTIME  DESTINATION ${RIVETLIB_DESTDIR}/mpm)

#  Install libraries...
# ===========================================================================
install(TARGETS rivetparser rivetlib
	EXPORT Rivet_Libraries
  ARCHIVE  DESTINATION ${RIVETLIB_DESTDIR}
  LIBRARY  DESTINATION ${RIVETLIB_DESTDIR}
  RUNTIME  DESTINATION ${RIVETLIB_DESTDIR})

#  Install library files...
# ===========================================================================
install(FILES
       	${RIVET_GENERATE_DIR}/init.tcl
        ${RIVET_LIB_DIR}/default_request_handler.tcl
        ${RIVET_LIB_DIR}/pkgIndex.tcl
        DESTINATION ${RIVETLIB_DESTDIR})

#  Install library directories...
# ===========================================================================
install(DIRECTORY   ${RIVET_LIB_DIR}/rivet-tcl
        DESTINATION ${RIVETLIB_DESTDIR})
install(DIRECTORY
     	${RIVET_LIB_DIR}/packages/asciiglyphs
     	${RIVET_LIB_DIR}/packages/calendar
     	${RIVET_LIB_DIR}/packages/dio
     	${RIVET_LIB_DIR}/packages/entities
     	${RIVET_LIB_DIR}/packages/form
     	${RIVET_LIB_DIR}/packages/formbroker
     	${RIVET_LIB_DIR}/packages/session
     	${RIVET_LIB_DIR}/packages/tclrivet
        DESTINATION ${RIVETLIB_DESTDIR}/packages)

#  Regenerate pkgIndex.tcl in all libraries...
# ===========================================================================
SET ( RIVET_LIBS_ARCH ${RIVETLIB_DESTDIR} )
file(WRITE ${RIVETLIB_DESTDIR}/regenerate_pkgIndex.tcl
"puts \"Regenerating pkgIndex.tcl in [pwd]:\"
file delete {*}[glob [file join packages * pkgIndex.tcl]] pkgIndex.tcl
pkg_mkIndex -verbose [pwd] init.tcl packages/*/*.tcl *[info sharedlibextension]"
)
install(CODE "
  execute_process(COMMAND ${TCL_TCLSH} regenerate_pkgIndex.tcl
                  WORKING_DIRECTORY ${RIVETLIB_DESTDIR})
  file(REMOVE ${RIVETLIB_DESTDIR}/regenerate_pkgIndex.tcl)
  "
)