ChipMaster's trial hacks on C++CMS starting with v1.2.1. Not sure I'll follow on with the v2 since it looks to be breaking and mostly frivolous.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

786 lines
21 KiB

  1. cmake_minimum_required(VERSION 2.6)
  2. set(CMAKE_LEGACY_CYGWIN_WIN32 0)
  3. project(cppcms)
  4. set(CPPCMS_PACKAGE_NAME "CppCMS")
  5. set(CPPCMS_PACKAGE_STRING "CppCMS/0.99.8")
  6. set(CPPCMS_PACKAGE_VERSION "0.99.8")
  7. include(CheckFunctionExists)
  8. include(CheckCXXSourceCompiles)
  9. include(CheckLibraryExists)
  10. include(CPack)
  11. enable_testing()
  12. #############################################################################
  13. #
  14. # Setup default build options
  15. #
  16. #############################################################################
  17. option(DISABLE_SHARED "Disable shared libraries build" OFF)
  18. option(DISABLE_STATIC "Disable static libraries build" OFF)
  19. option(DISABLE_GCRYPT "Disable usage of gcrypt library" OFF)
  20. option(DISABLE_OPENSSL "Disable usage of openssl library" OFF)
  21. option(DISABLE_FCGI "Disable fastcgi web server api" OFF)
  22. option(DISABLE_SCGI "Disable scgi web server api" OFF)
  23. option(DISABLE_HTTP "Disable http web server" OFF)
  24. option(DISABLE_CACHE "Disable cache beckend" OFF)
  25. option(DISABLE_TCPCACHE "Disable distributed cache beckend" OFF)
  26. option(DISABLE_GZIP "Disable support of gzip output compression" OFF)
  27. if(CMAKE_CXX_COMPILER_ID STREQUAL "SunPro")
  28. option(DISABLE_PREFORK_CACHE "Disable prefork-cache beckend" ON)
  29. else()
  30. option(DISABLE_PREFORK_CACHE "Disable prefork-cache beckend" OFF)
  31. endif()
  32. add_subdirectory(booster)
  33. include_directories(booster)
  34. include_directories(src)
  35. include_directories(private)
  36. include_directories(cppcms_boost)
  37. include_directories(${CMAKE_BINARY_DIR})
  38. include_directories(${CMAKE_CURRENT_BINARY_DIR})
  39. include_directories(${CMAKE_CURRENT_BINARY_DIR}/booster)
  40. include_directories(${CMAKE_SOURCE_DIR})
  41. if(DISABLE_CACHE)
  42. set(DISABLE_PREFORK_CACHE ON)
  43. set(DISABLE_TCPCACHE ON)
  44. endif()
  45. if(WIN32 OR CYGWIN)
  46. set(IS_WINDOWS TRUE)
  47. else()
  48. set(IS_WINDOWS FALSE)
  49. endif()
  50. if(WIN32 AND NOT CYGWIN)
  51. set(WINDOWS_NATIVE TRUE)
  52. else()
  53. set(WINDOWS_NATIVE FALSE)
  54. endif()
  55. if(CYGWIN)
  56. set(IS_CYGWIN TRUE)
  57. else()
  58. set(IS_CYGWIN FALSE)
  59. endif()
  60. #############################################################################
  61. #
  62. # Setup various build flags for different supported compilers and systems
  63. #
  64. #############################################################################
  65. if(CMAKE_COMPILER_IS_GNUCXX)
  66. check_cxx_source_compiles(
  67. "#if __GNUC__ < 4
  68. #error
  69. #endif
  70. int main() {}"
  71. GCC_IS_GCC4)
  72. set(CXX_FLAGS "-Wall -Wextra")
  73. if(CMAKE_SYSTEM_NAME STREQUAL "SunOS")
  74. set(CXX_FLAGS "${CXX_FLAGS} -pthreads")
  75. endif()
  76. if(NOT GCC_IS_GCC4)
  77. # Uninitalized checks are bogous under gcc-3.4
  78. set(CXX_FLAGS "${CXX_FLAGS} -Wno-uninitialized")
  79. endif()
  80. if(IS_WINDOWS)
  81. if(GCC_IS_GCC4)
  82. # Very important, otherwise process would not start under cygwin
  83. set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -Wl,--enable-auto-import")
  84. else()
  85. # gcc-3 does not have shared library for libstdc++ -- cause dll faitures with locale
  86. set(DISABLE_SHARED ON)
  87. endif()
  88. endif()
  89. if(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
  90. set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -rdynamic")
  91. endif()
  92. elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
  93. set(CXX_FLAGS "-Wall")
  94. elseif(MSVC)
  95. set(CXX_FLAGS "/EHsc /W3")
  96. elseif(CMAKE_CXX_COMPILER_ID STREQUAL "SunPro")
  97. #
  98. # We use STL port under Sun Studio, standard library is broken
  99. #
  100. set(CXX_FLAGS "-library=stlport4 -xannotate=no")
  101. if(CMAKE_SYSTEM_NAME STREQUAL "SunOS")
  102. set(CXX_FLAGS "${CXX_FLAGS} -mt")
  103. endif()
  104. endif()
  105. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX_FLAGS}")
  106. #############################################################################
  107. #
  108. # Set default RelWithDebInfo build
  109. #
  110. #############################################################################
  111. if(NOT CMAKE_BUILD_TYPE)
  112. set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
  113. "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
  114. FORCE)
  115. endif(NOT CMAKE_BUILD_TYPE)
  116. if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
  117. if(MSVC)
  118. set(ZLIB_SUFFIX "d")
  119. if(NOT CPPCMS_SUFFIX)
  120. set(CPPCMS_SUFFIX "-d")
  121. else()
  122. set(CPPCMS_SUFFIX "${CPPCMS_SUFFIX}d")
  123. endif()
  124. endif()
  125. endif()
  126. check_cxx_source_compiles(
  127. "#include <stdint.h>
  128. int main(){int32_t x; int64_t y; return 0; }"
  129. CPPCMS_HAVE_STDINT_H)
  130. check_cxx_source_compiles(
  131. "#include <inttypes.h>
  132. int main(){int32_t x; int64_t y; return 0; }"
  133. CPPCMS_HAVE_INTTYPES_H)
  134. check_function_exists(atoll CPPCMS_HAVE_ATOLL)
  135. check_function_exists(_atoi64 CPPCMS_HAVE_ATOI64)
  136. check_function_exists(snprintf CPPCMS_HAVE_SNPRINTF)
  137. check_function_exists(stat CPPCMS_HAVE_STAT)
  138. check_function_exists(_stat CPPCMS_HAVE__STAT)
  139. set(CPPCMS_LIBRARY_SUFFIX ${CMAKE_SHARED_LIBRARY_SUFFIX})
  140. set(CPPCMS_LIBRARY_PREFIX ${CMAKE_SHARED_LIBRARY_PREFIX})
  141. #
  142. # Atomic API tests
  143. #
  144. check_cxx_source_compiles(
  145. "#include <string>
  146. int main() { std::wstring s; }"
  147. CPPCMS_HAVE_STD_WSTRING)
  148. check_cxx_source_compiles(
  149. "#include <time.h>
  150. int main() { struct tm t; char const *p=t.tm_zone; long o=t.tm_gmtoff; }"
  151. CPPCMS_HAVE_BSD_TM)
  152. check_cxx_source_compiles(
  153. "#include <string>
  154. int main() { std::u16string s16; std::u32string s32; }"
  155. CPPCMS_HAVE_CPP0X_UXSTRING)
  156. check_cxx_source_compiles(
  157. "#include <list>
  158. int main(){std::list<int> l; auto p=l.begin();}"
  159. CPPCMS_HAVE_CPP_0X_AUTO)
  160. check_cxx_source_compiles(
  161. "#include <list>
  162. int main(){std::list<int> l; decltype(l.begin()) p=l.begin();}"
  163. CPPCMS_HAVE_CPP_0X_DECLTYPE)
  164. check_cxx_source_compiles(
  165. "#include <list>
  166. int main(){std::list<int> l; typeof(l.begin()) p=l.begin();}"
  167. CPPCMS_HAVE_GCC_TYPEOF)
  168. check_cxx_source_compiles(
  169. "#include <list>
  170. int main(){std::list<int> l; __typeof__(l.begin()) p=l.begin();}"
  171. CPPCMS_HAVE_UNDERSCORE_TYPEOF)
  172. if(NOT DISABLE_GZIP)
  173. find_library(ZLIB NAMES z zdll zlib${ZLIB_SUFFIX} zlib)
  174. find_path(ZLIB_INCLUDE_DIR zlib.h)
  175. include_directories(${ZLIB_INCLUDE_DIR})
  176. endif()
  177. if(IS_WINDOWS)
  178. find_library(WS2_32 ws2_32)
  179. find_library(WSOCK32 wsock32)
  180. else()
  181. check_function_exists(dlopen CPPCMS_HAVE_DLOPEN)
  182. if(NOT CPPCMS_HAVE_DLOPEN)
  183. check_library_exists(dl dlopen "" CPPCMS_HAVE_LIB_DL)
  184. if(NOT CPPCMS_HAVE_LIB_DL)
  185. message(FATAL " No library with dlopen found")
  186. else(NOT CPPCMS_HAVE_LIB_DL)
  187. find_library(LIB_DL dl)
  188. endif(NOT CPPCMS_HAVE_LIB_DL)
  189. endif(NOT CPPCMS_HAVE_DLOPEN)
  190. check_function_exists(socket CPPCMS_HAVE_SOCKET)
  191. if(NOT CPPCMS_HAVE_SOCKET)
  192. check_library_exists(socket socket "" CPPCMS_HAVE_LIB_SOCKET)
  193. if(NOT CPPCMS_HAVE_LIB_SOCKET)
  194. message(FATAL " No library with socket found")
  195. else(NOT CPPCMS_HAVE_LIB_SOCKET)
  196. find_library(LIB_SOCKET socket)
  197. endif(NOT CPPCMS_HAVE_LIB_SOCKET)
  198. endif(NOT CPPCMS_HAVE_SOCKET)
  199. check_function_exists(gethostbyname CPPCMS_HAVE_GETHOSTBYNAME)
  200. if(NOT CPPCMS_HAVE_GETHOSTBYNAME)
  201. check_library_exists(socket gethostbyname "" LIB_SOCKGETHOSTBYNAME)
  202. if(NOT LIB_SOCKGETHOSTBYNAME)
  203. check_library_exists(nsl gethostbyname "" CPPCMS_HAVE_LIB_NSL)
  204. if(NOT CPPCMS_HAVE_LIB_NSL)
  205. message(FATAL " No library with gethostbyname found")
  206. else(NOT CPPCMS_HAVE_LIB_NSL)
  207. find_library(LIB_NSL nsl)
  208. endif(NOT CPPCMS_HAVE_LIB_NSL)
  209. endif(NOT LIB_SOCKGETHOSTBYNAME)
  210. endif(NOT CPPCMS_HAVE_GETHOSTBYNAME)
  211. endif()
  212. check_function_exists(canonicalize_file_name CPPCMS_HAVE_CANONICALIZE_FILE_NAME)
  213. add_definitions(-DCPPCMS_BOOST_ALL_NO_LIB)
  214. if(DISABLE_TCPCACHE)
  215. set(CPPCMS_NO_TCP_CACHE 1)
  216. endif()
  217. if(DISABLE_CACHE)
  218. set(CPPCMS_NO_CACHE 1)
  219. endif()
  220. if(DISABLE_PREFORK_CACHE)
  221. set(CPPCMS_NO_PREFOK_CACHE 1)
  222. endif()
  223. if(DISABLE_GZIP)
  224. set(CPPCMS_NO_GZIP 1)
  225. endif()
  226. set(CPPCMS_PUBLIC_HEADERS ${CMAKE_CURRENT_BINARY_DIR}/cppcms/config.h)
  227. set(CPPCMS_SOURCES
  228. src/service.cpp
  229. src/cgi_api.cpp
  230. src/http_request.cpp
  231. src/http_response.cpp
  232. src/http_context.cpp
  233. src/cppcms_error.cpp
  234. src/cppcms_error_category.cpp
  235. src/thread_pool.cpp
  236. src/applications_pool.cpp
  237. src/application.cpp
  238. src/url_dispatcher.cpp
  239. src/url_mapper.cpp
  240. src/http_cookie.cpp
  241. src/http_file.cpp
  242. src/http_content_type.cpp
  243. src/util.cpp
  244. src/base64.cpp
  245. src/base_view.cpp
  246. src/base_content.cpp
  247. src/views_pool.cpp
  248. src/internal_file_server.cpp
  249. src/json.cpp
  250. src/encoding.cpp
  251. src/form.cpp
  252. src/filters.cpp
  253. src/cache_pool.cpp
  254. src/cache_interface.cpp
  255. src/cache_storage.cpp
  256. src/forwarder.cpp
  257. src/session_pool.cpp
  258. src/hmac_encryptor.cpp
  259. src/aes_encryptor.cpp
  260. src/md5.cpp
  261. src/urandom.cpp
  262. src/aes.cpp
  263. src/session_cookies.cpp
  264. src/session_dual.cpp
  265. src/session_sid.cpp
  266. src/session_interface.cpp
  267. src/session_memory_storage.cpp
  268. src/rpc_json.cpp
  269. src/mount_point.cpp
  270. src/archive.cpp
  271. src/crypto.cpp
  272. src/daemonize.cpp
  273. src/xss.cpp
  274. src/copy_filter.cpp
  275. )
  276. if(NOT DISABLE_GZIP)
  277. set(CPPCMS_SOURCES ${CPPCMS_SOURCES}
  278. cppcms_boost/src/zlib.cpp
  279. cppcms_boost/src/gzip.cpp)
  280. endif()
  281. if(NOT DISABLE_TCPCACHE)
  282. set(CPPCMS_SOURCES ${CPPCMS_SOURCES}
  283. src/tcp_cache_client.cpp
  284. src/cache_over_ip.cpp
  285. src/tcp_messenger.cpp
  286. src/tcp_connector.cpp
  287. src/tcp_cache_server.cpp)
  288. endif()
  289. if(NOT DISABLE_GCRYPT)
  290. find_path(GCRYPT_INCLUDE_DIR gcrypt.h)
  291. find_library(LIB_GCRYPT gcrypt)
  292. endif()
  293. if(NOT DISABLE_OPENSSL)
  294. find_path(OPENSSL_INCLUDE_DIR openssl/aes.h)
  295. find_library(LIB_OPENSSL crypto)
  296. endif()
  297. if(GCRYPT_INCLUDE_DIR AND LIB_GCRYPT)
  298. set(LIB_CRYPT ${LIB_GCRYPT})
  299. set(CPPCMS_HAVE_GCRYPT 1)
  300. include_directories(${GCRYPT_INCLUDE_DIR})
  301. elseif (OPENSSL_INCLUDE_DIR AND LIB_OPENSSL)
  302. set(LIB_CRYPT ${LIB_OPENSSL})
  303. set(CPPCMS_HAVE_OPENSSL 1)
  304. include_directories(${OPENSSL_INCLUDE_DIR})
  305. endif()
  306. if(NOT LIB_CRYPT)
  307. message("GNU-TLS Gcrypt or OpenSSL librarys are not found, disabling AES encryption support")
  308. endif()
  309. if(NOT DISABLE_FCGI)
  310. set(CPPCMS_SOURCES ${CPPCMS_SOURCES} src/fastcgi_api.cpp)
  311. set(CPPCMS_HAS_FCGI 1)
  312. endif()
  313. if(NOT DISABLE_SCGI)
  314. set(CPPCMS_SOURCES ${CPPCMS_SOURCES} src/scgi_api.cpp)
  315. set(CPPCMS_HAS_SCGI 1)
  316. endif()
  317. if(NOT DISABLE_HTTP)
  318. set(CPPCMS_SOURCES ${CPPCMS_SOURCES} src/http_api.cpp)
  319. set(CPPCMS_HAS_HTTP 1)
  320. endif()
  321. if(WINDOWS_NATIVE)
  322. set(CPPCMS_SOURCES ${CPPCMS_SOURCES} src/session_win32_file_storage.cpp)
  323. else()
  324. set(CPPCMS_SOURCES ${CPPCMS_SOURCES} src/session_posix_file_storage.cpp)
  325. endif()
  326. if(NOT DISABLE_SHARED)
  327. add_library(cppcms SHARED ${CPPCMS_SOURCES})
  328. set(CPPCMS_LIB cppcms)
  329. else(NOT DISABLE_SHARED)
  330. set(CPPCMS_LIB cppcms-static)
  331. endif(NOT DISABLE_SHARED)
  332. if(NOT DISABLE_STATIC)
  333. add_library(cppcms-static STATIC ${CPPCMS_SOURCES})
  334. endif(NOT DISABLE_STATIC)
  335. if(DISABLE_SHARED OR DISABLE_STATIC)
  336. set(CPPCMS_LIBS ${CPPCMS_LIB})
  337. else(DISABLE_SHARED OR DISABLE_STATIC)
  338. set(CPPCMS_LIBS cppcms; cppcms-static)
  339. endif(DISABLE_SHARED OR DISABLE_STATIC)
  340. foreach(ALIB ${CPPCMS_LIBS})
  341. if(DISABLE_SHARED)
  342. target_link_libraries(${ALIB} booster-static)
  343. else(DISABLE_SHARED)
  344. target_link_libraries(${ALIB} booster)
  345. endif(DISABLE_SHARED)
  346. if(LIB_CRYPT)
  347. target_link_libraries(${ALIB} ${LIB_CRYPT})
  348. endif(LIB_CRYPT)
  349. if(WS2_32 AND WSOCK32)
  350. target_link_libraries(${ALIB} ${WS2_32})
  351. target_link_libraries(${ALIB} ${WSOCK32})
  352. endif(WS2_32 AND WSOCK32)
  353. if(LIB_SOCKGETHOSTBYNAME)
  354. target_link_libraries(${ALIB} ${LIB_SOCKGETHOSTBYNAME})
  355. endif(LIB_SOCKGETHOSTBYNAME)
  356. if(LIB_NSL)
  357. target_link_libraries(${ALIB} ${LIB_NSL})
  358. endif(LIB_NSL)
  359. if(LIB_SOCKET)
  360. target_link_libraries(${ALIB} ${LIB_SOCKET})
  361. endif(LIB_SOCKET)
  362. if(LIB_DL)
  363. target_link_libraries(${ALIB} ${LIB_DL})
  364. endif(LIB_DL)
  365. if(NOT DISABLE_GZIP)
  366. target_link_libraries(${ALIB} ${ZLIB})
  367. endif()
  368. endforeach(ALIB)
  369. find_program(PYTHON NAMES python2 python)
  370. if(NOT PYTHON)
  371. message(FATAL "Can't build without Python interpreter")
  372. endif(NOT PYTHON)
  373. # Templates builds
  374. add_custom_command(
  375. OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/skin1.cpp
  376. COMMAND ${PYTHON} ${CMAKE_CURRENT_SOURCE_DIR}/bin/cppcms_tmpl_cc
  377. -s skin1
  378. -o ${CMAKE_CURRENT_BINARY_DIR}/skin1.cpp
  379. ${CMAKE_CURRENT_SOURCE_DIR}/src/hello_world_skin1.tmpl
  380. ${CMAKE_CURRENT_SOURCE_DIR}/src/hello_world_view1.tmpl
  381. DEPENDS
  382. ${CMAKE_CURRENT_SOURCE_DIR}/bin/cppcms_tmpl_cc
  383. ${CMAKE_CURRENT_SOURCE_DIR}/src/hello_world_skin1.tmpl
  384. ${CMAKE_CURRENT_SOURCE_DIR}/src/hello_world_view1.tmpl)
  385. add_custom_command(
  386. OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/skin2.cpp
  387. COMMAND ${PYTHON} ${CMAKE_CURRENT_SOURCE_DIR}/bin/cppcms_tmpl_cc
  388. -s skin2
  389. -o ${CMAKE_CURRENT_BINARY_DIR}/skin2.cpp
  390. ${CMAKE_CURRENT_SOURCE_DIR}/src/hello_world_skin2.tmpl
  391. ${CMAKE_CURRENT_SOURCE_DIR}/src/hello_world_view1.tmpl
  392. DEPENDS
  393. ${CMAKE_CURRENT_SOURCE_DIR}/bin/cppcms_tmpl_cc
  394. ${CMAKE_CURRENT_SOURCE_DIR}/src/hello_world_skin2.tmpl
  395. ${CMAKE_CURRENT_SOURCE_DIR}/src/hello_world_view1.tmpl)
  396. add_custom_command(
  397. OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/tc_skin_a.cpp
  398. COMMAND ${PYTHON} ${CMAKE_CURRENT_SOURCE_DIR}/bin/cppcms_tmpl_cc
  399. -o ${CMAKE_CURRENT_BINARY_DIR}/tc_skin_a.cpp
  400. ${CMAKE_CURRENT_SOURCE_DIR}/tests/tc_skin_a.tmpl
  401. DEPENDS
  402. ${CMAKE_CURRENT_SOURCE_DIR}/bin/cppcms_tmpl_cc
  403. ${CMAKE_CURRENT_SOURCE_DIR}/tests/tc_skin_a.tmpl)
  404. add_custom_command(
  405. OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/tc_skin_b.cpp
  406. COMMAND ${PYTHON} ${CMAKE_CURRENT_SOURCE_DIR}/bin/cppcms_tmpl_cc
  407. -o ${CMAKE_CURRENT_BINARY_DIR}/tc_skin_b.cpp
  408. ${CMAKE_CURRENT_SOURCE_DIR}/tests/tc_skin_b.tmpl
  409. DEPENDS
  410. ${CMAKE_CURRENT_SOURCE_DIR}/bin/cppcms_tmpl_cc
  411. ${CMAKE_CURRENT_SOURCE_DIR}/tests/tc_skin_b.tmpl)
  412. add_custom_command(
  413. OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/tc_skin.cpp
  414. COMMAND ${PYTHON} ${CMAKE_CURRENT_SOURCE_DIR}/bin/cppcms_tmpl_cc
  415. -o ${CMAKE_CURRENT_BINARY_DIR}/tc_skin.cpp
  416. ${CMAKE_CURRENT_SOURCE_DIR}/tests/tc_skin.tmpl
  417. DEPENDS
  418. ${CMAKE_CURRENT_SOURCE_DIR}/bin/cppcms_tmpl_cc
  419. ${CMAKE_CURRENT_SOURCE_DIR}/tests/tc_skin.tmpl)
  420. if(NOT DISABLE_SHARED)
  421. add_custom_command(
  422. OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/skin3.cpp
  423. COMMAND ${PYTHON} ${CMAKE_CURRENT_SOURCE_DIR}/bin/cppcms_tmpl_cc
  424. -s skin3
  425. -o ${CMAKE_CURRENT_BINARY_DIR}/skin3.cpp
  426. ${CMAKE_CURRENT_SOURCE_DIR}/src/hello_world_skin2.tmpl
  427. ${CMAKE_CURRENT_SOURCE_DIR}/src/hello_world_view1.tmpl
  428. DEPENDS
  429. ${CMAKE_CURRENT_SOURCE_DIR}/bin/cppcms_tmpl_cc
  430. ${CMAKE_CURRENT_SOURCE_DIR}/src/hello_world_skin2.tmpl
  431. ${CMAKE_CURRENT_SOURCE_DIR}/src/hello_world_view1.tmpl)
  432. add_library(skin3 SHARED skin3.cpp)
  433. set(SKIN3_DEFS DLL_EXPORT)
  434. set_target_properties(skin3 PROPERTIES
  435. COMPILE_DEFINITIONS "${SKIN3_DEFS}")
  436. target_link_libraries(skin3 ${CPPCMS_LIB})
  437. endif(NOT DISABLE_SHARED)
  438. foreach(SKIN tc_skin_a tc_skin_b tc_skin)
  439. add_library(${SKIN} SHARED ${CMAKE_CURRENT_BINARY_DIR}/${SKIN}.cpp)
  440. target_link_libraries(${SKIN} ${CPPCMS_LIB})
  441. if(IS_WINDOWS)
  442. set_target_properties(${SKIN} PROPERTIES COMPILE_DEFINITIONS DLL_EXPORT)
  443. endif()
  444. endforeach()
  445. add_executable(hello_world src/hello_world.cpp skin1.cpp skin2.cpp)
  446. target_link_libraries(hello_world ${CPPCMS_LIB})
  447. if(NOT DISABLE_TCPCACHE)
  448. add_executable(cppcms_scale src/cache_server_main.cpp)
  449. target_link_libraries(cppcms_scale ${CPPCMS_LIB})
  450. endif()
  451. add_executable(cppcms_config_find_param src/cppcms_config_find_param.cpp src/json.cpp)
  452. if(DISABLE_SHARED)
  453. target_link_libraries(cppcms_config_find_param booster-static)
  454. else(DISABLE_SHARED)
  455. target_link_libraries(cppcms_config_find_param booster)
  456. endif(DISABLE_SHARED)
  457. #########################################
  458. # Tests
  459. #########################################
  460. set(ALL_TESTS
  461. form_test
  462. proto_test
  463. disco_test
  464. encryptor_test
  465. storage_test
  466. json_test
  467. base64_test
  468. forwarder_test
  469. jsonrpc_test
  470. cookie_test
  471. multipart_parser_test
  472. content_type_parser_test
  473. serialization_test
  474. status_test
  475. xss_test
  476. url_mapper_test
  477. copy_filter_test
  478. tc_test
  479. )
  480. if(NOT DISABLE_TCPCACHE)
  481. set(ALL_TESTS ${ALL_TESTS} cache_backend_test)
  482. endif()
  483. foreach(TEST ${ALL_TESTS})
  484. add_executable(${TEST} tests/${TEST}.cpp)
  485. target_link_libraries(${TEST} ${CPPCMS_LIB})
  486. endforeach()
  487. foreach(LFILE ${LOCALE_TEST_SOURCES})
  488. string(REGEX REPLACE ".*noicu/src/(.*)\\.cpp" "\\1" TEST_NAME ${LFILE})
  489. add_executable(${TEST_NAME} ${LFILE})
  490. target_link_libraries(${TEST_NAME} ${CPPCMS_LIB})
  491. set(LOCALE_TESTS "${LOCALE_TESTS} ${TEST_NAME}")
  492. add_test(${TEST_NAME} ${TEST_NAME} "${CMAKE_CURRENT_SOURCE_DIR}/tests")
  493. endforeach()
  494. #####################################
  495. # End of tests
  496. #####################################
  497. # These are use export
  498. if(IS_WINDOWS AND NOT DISABLE_SHARED)
  499. set_target_properties(${ALL_TESTS} hello_world cppcms PROPERTIES
  500. COMPILE_DEFINITIONS DLL_EXPORT)
  501. endif()
  502. set_target_properties(${CPPCMS_LIBS} PROPERTIES CLEAN_DIRECT_OUTPUT 1)
  503. set_target_properties(${CPPCMS_LIBS} PROPERTIES OUTPUT_NAME "cppcms${CPPCMS_SUFFIX}")
  504. if(IS_WINDOWS)
  505. set_target_properties(${CPPCMS_LIBS} PROPERTIES VERSION 1 SOVERSION 1)
  506. else()
  507. set_target_properties(${CPPCMS_LIBS} PROPERTIES VERSION 1.0.0 SOVERSION 1)
  508. endif()
  509. set_target_properties(${CPPCMS_LIBS} PROPERTIES
  510. PUBLIC_HEADER "${CPPCMS_PUBLIC_HEADERS}")
  511. if(MSVC AND NOT DISABLE_STATIC)
  512. set_target_properties(cppcms-static PROPERTIES PREFIX "lib")
  513. endif(MSVC AND NOT DISABLE_STATIC)
  514. configure_file(config.cmake.h cppcms/config.h)
  515. set(CPPCMS_INSTALL_TARGETS ${CPPCMS_LIBS} cppcms_config_find_param)
  516. if(NOT DISABLE_TCPCACHE)
  517. set(CPPCMS_INSTALL_TARGETS ${CPPCMS_INSTALL_TARGETS} cppcms_scale)
  518. endif()
  519. #################
  520. # Installation
  521. #################
  522. install(TARGETS ${CPPCMS_INSTALL_TARGETS}
  523. RUNTIME DESTINATION bin
  524. LIBRARY DESTINATION lib
  525. ARCHIVE DESTINATION lib
  526. PUBLIC_HEADER DESTINATION include/cppcms)
  527. install(PROGRAMS bin/cppcms_tmpl_cc bin/cppcms_run
  528. DESTINATION bin)
  529. install(DIRECTORY cppcms DESTINATION include
  530. PATTERN ".svn" EXCLUDE)
  531. #############
  532. # TESTS
  533. #############
  534. set(CNF "${CMAKE_CURRENT_SOURCE_DIR}/tests")
  535. add_test(base64_test base64_test)
  536. add_test(encryptor_test encryptor_test "${CNF}")
  537. add_test(storage_test storage_test)
  538. add_test(json_test json_test)
  539. add_test(multipart_parser_test multipart_parser_test "${CNF}")
  540. add_test(content_type_parser_test content_type_parser_test)
  541. if(NOT DISABLE_TCPCACHE)
  542. add_test(cache_backend_test cache_backend_test)
  543. endif()
  544. add_test(serialization_test serialization_test)
  545. add_test(xss_test xss_test)
  546. add_test(url_mapper_test url_mapper_test)
  547. add_test(copy_filter_test copy_filter_test)
  548. add_test(tc_test tc_test)
  549. add_test(status_test
  550. status_test "-c" "${CNF}/status_test.js"
  551. "--test-exec=${PYTHON} ${CNF}/status_test.py")
  552. add_test(async_status_test
  553. status_test "-c" "${CNF}/status_test.js" "--test-async=async"
  554. "--test-exec=${PYTHON} ${CNF}/status_test.py async")
  555. add_test(form_test
  556. form_test "-c" "${CNF}/form_test.js"
  557. "--test-exec=${PYTHON} ${CNF}/form_test.py")
  558. add_test(cookie_test
  559. cookie_test "-c" "${CNF}/cookie_test.js"
  560. "--test-exec=${PYTHON} ${CNF}/cookie_test.py")
  561. add_test(internal_forwarder_test
  562. forwarder_test "-c" "${CNF}/forwarder_test.js"
  563. "--test-exec=${PYTHON} ${CNF}/forwarder_test.py"
  564. "--test-internal=true")
  565. add_test(forwarder_test
  566. forwarder_test "-c" "${CNF}/forwarder_test.js"
  567. "--test-exec=${PYTHON} ${CNF}/forwarder_test.py"
  568. "--test-internal=false")
  569. add_test(jsonrpc_test
  570. jsonrpc_test "-c" "${CNF}/jsonrpc_test.js"
  571. "--test-exec=${PYTHON} ${CNF}/jsonrpc_test.py")
  572. add_test(disco_test_http
  573. disco_test "-c" "${CNF}/proto_test.js"
  574. "--service-api=http" "--service-port=8080" "--service-ip=127.0.0.1"
  575. "--test-exec=${PYTHON} ${CNF}/disco_test.py http")
  576. add_test(disco_test_fastcgi_tcp
  577. disco_test "-c" "${CNF}/proto_test.js"
  578. "--service-api=fastcgi" "--service-port=8080" "--service-ip=127.0.0.1"
  579. "--test-exec=${PYTHON} ${CNF}/disco_test.py fastcgi_tcp")
  580. add_test(disco_test_scgi_tcp
  581. disco_test "-c" "${CNF}/proto_test.js"
  582. "--service-api=scgi" "--service-port=8080" "--service-ip=127.0.0.1"
  583. "--test-exec=${PYTHON} ${CNF}/disco_test.py scgi_tcp")
  584. if(NOT IS_WINDOWS)
  585. add_test(disco_test_fastcgi_unix
  586. disco_test "-c" "${CNF}/proto_test.js"
  587. "--service-api=fastcgi" "--service-socket=/tmp/cppcms_test_socket"
  588. "--test-exec=${PYTHON} ${CNF}/disco_test.py fastcgi_unix")
  589. add_test(disco_test_scgi_unix
  590. disco_test "-c" "${CNF}/proto_test.js"
  591. "--service-api=scgi" "--service-socket=/tmp/cppcms_test_socket"
  592. "--test-exec=${PYTHON} ${CNF}/disco_test.py scgi_unix")
  593. endif()
  594. foreach(TYPE async sync)
  595. add_test(proto_test_${TYPE}_http
  596. proto_test "-c" "${CNF}/proto_test.js"
  597. "--test-async=${TYPE}" "--service-api=http" "--service-port=8080" "--service-ip=127.0.0.1"
  598. "--test-exec=${PYTHON} ${CNF}/proto_test.py http")
  599. add_test(proto_test_${TYPE}_scgi
  600. proto_test "-c" "${CNF}/proto_test.js"
  601. "--test-async=${TYPE}" "--service-api=scgi" "--service-port=8080" "--service-ip=127.0.0.1"
  602. "--test-exec=${PYTHON} ${CNF}/proto_test.py scgi_tcp")
  603. add_test(proto_test_${TYPE}_fastcgi
  604. proto_test "-c" "${CNF}/proto_test.js"
  605. "--test-async=${TYPE}" "--service-api=fastcgi" "--service-port=8080" "--service-ip=127.0.0.1"
  606. "--test-exec=${PYTHON} ${CNF}/proto_test.py fastcgi_tcp")
  607. if(NOT IS_WINDOWS)
  608. add_test(proto_test_${TYPE}_scgi_unix
  609. proto_test "-c" "${CNF}/proto_test.js"
  610. "--test-async=${TYPE}" "--service-api=scgi" "--service-socket=/tmp/cppcms_test_socket"
  611. "--test-exec=${PYTHON} ${CNF}/proto_test.py scgi_unix")
  612. add_test(proto_test_${TYPE}_fastcgi_unix
  613. proto_test "-c" "${CNF}/proto_test.js"
  614. "--test-async=${TYPE}" "--service-api=fastcgi" "--service-socket=/tmp/cppcms_test_socket"
  615. "--test-exec=${PYTHON} ${CNF}/proto_test.py fastcgi_unix")
  616. endif()
  617. endforeach()
  618. set(TESTS_WITH_TIMEOUT
  619. forwarder_test
  620. jsonrpc_test
  621. proto_test_sync_http
  622. proto_test_async_http
  623. proto_test_sync_scgi
  624. proto_test_async_scgi)
  625. if(NOT DISABLE_TCPCACHE)
  626. set(TESTS_WITH_TIMEOUT ${TESTS_WITH_TIMEOUT} cache_backend_test)
  627. endif()
  628. set_tests_properties(
  629. ${TESTS_WITH_TIMEOUT}
  630. PROPERTIES TIMEOUT 120)
  631. if(NOT IS_WINDOWS)
  632. set_tests_properties(
  633. proto_test_sync_scgi_unix
  634. proto_test_async_scgi_unix
  635. PROPERTIES TIMEOUT 120)
  636. endif()