CMakeLists.txt 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. cmake_minimum_required(VERSION 2.8.8)
  2. project(fuzzylite CXX)
  3. ###DEFINES SECTION
  4. if(NOT CMAKE_VERBOSE_MAKEFILE)
  5. set(CMAKE_VERBOSE_MAKEFILE false)
  6. endif()
  7. set(FL_VERSION 5.0)
  8. add_definitions(-DFL_VERSION="${FL_VERSION}")
  9. set(FL_DATE "1408")
  10. add_definitions(-DFL_DATE="${FL_DATE}")
  11. add_definitions(-DFL_BUILD_PATH="${CMAKE_SOURCE_DIR}") #used to determine FL__FILE__
  12. option(FL_BUILD_SHARED "Build shared library" ON)
  13. option(FL_BUILD_STATIC "Build static library" ON)
  14. if(FL_BUILD_SHARED)
  15. option(FL_BUILD_BINARY "Build fuzzylite binary" ON)
  16. endif()
  17. option(FL_USE_FLOAT "Use fl::scalar as float" OFF)
  18. option(FL_BACKTRACE "Provide backtrace information in case of errors" OFF)
  19. option(FL_CPP11 "Builds utilizing C++11, i.e., passing -std=c++11" OFF)
  20. if(FL_CPP11 AND MSVC)
  21. message("Warning: MSVC not compatible with FL_CPP11 flag")
  22. endif()
  23. if(FL_USE_FLOAT)
  24. add_definitions(-DFL_USE_FLOAT)
  25. endif(FL_USE_FLOAT)
  26. if(NOT FL_BACKTRACE)
  27. add_definitions(-DFL_BACKTRACE_OFF)
  28. endif()
  29. if(FL_CPP11)
  30. add_definitions(-DFL_CPP11)
  31. if(NOT MSVC)
  32. add_definitions(-std=c++11)
  33. endif(NOT MSVC)
  34. endif(FL_CPP11)
  35. if(WIN32)
  36. message("Windows")
  37. add_definitions(-DFL_WINDOWS)
  38. endif()
  39. if (UNIX)
  40. message("Unix")
  41. add_definitions(-DFL_UNIX)
  42. endif()
  43. if (APPLE)
  44. message("Apple")
  45. add_definitions(-DFL_APPLE)
  46. endif()
  47. set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY bin)
  48. set(CMAKE_LIBRARY_OUTPUT_DIRECTORY bin)
  49. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY bin)
  50. if(NOT MSVC)
  51. set(CMAKE_CXX_FLAGS "-pedantic -Werror -Wall -Wextra ${CMAKE_CXX_FLAGS}")
  52. set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
  53. set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
  54. if(NOT APPLE)
  55. set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--no-undefined ${CMAKE_SHARED_LINKER_FLAGS}") #To avoid undefined methods in library
  56. endif()
  57. endif()
  58. if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
  59. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-non-literal-null-conversion")
  60. endif()
  61. set(FL_LIBS)
  62. #link with rt lib on Linux. Fixes problem with clock_gettime()
  63. include(CheckLibraryExists)
  64. if(UNIX AND NOT APPLE)
  65. ENABLE_LANGUAGE(C)
  66. CHECK_LIBRARY_EXISTS(rt shm_open "" HAVE_RT_LIB)
  67. if(HAVE_RT_LIB)
  68. set(FL_LIBS ${FL_LIBS} rt)
  69. endif()
  70. endif()
  71. if(MSVC)
  72. set(CMAKE_CXX_FLAGS "/WX /W4 /EHsc")
  73. #Wx: Treat warnings as errors. W4: All warnings
  74. #http://msdn.microsoft.com/en-us/library/thxezb7y.aspx
  75. #EHsc: call destructors on __try __catch, and to ignore C4530: C++ exception handler used. Note, unwind semantics are not enabled
  76. #/wd4251 disable warning 4251 #http://www.unknownroad.com/rtfm/VisualStudio/warningC4251.html
  77. #To avoid issues from disabling warning 4251, MSVCRT.lib is statically linked to resolve external references
  78. #http://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx
  79. #set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD")
  80. #set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd")
  81. #By default, MD is selected.
  82. if (FL_BACKTRACE)
  83. set(FL_LIBS dbghelp)
  84. endif()
  85. endif()
  86. ###BUILD SECTION
  87. include_directories(.)
  88. link_directories(.)
  89. cmake_policy(SET CMP0015 OLD)
  90. if (APPLE)
  91. cmake_policy(SET CMP0042 NEW)
  92. endif()
  93. file(STRINGS FL_HEADERS fl-headers)
  94. file(STRINGS FL_SOURCES fl-sources)
  95. string(REGEX REPLACE "\n" " " ${fl-headers} ${fl-headers})
  96. string(REGEX REPLACE "\n" " " ${fl-sources} ${fl-sources})
  97. message("${exepath}")
  98. set(CMAKE_DEBUG_POSTFIX d)
  99. if (MSVC OR CMAKE_GENERATOR STREQUAL Xcode)
  100. if(FL_BUILD_SHARED)
  101. add_library(fl-shared SHARED ${fl-headers} ${fl-sources})
  102. endif()
  103. if(FL_BUILD_STATIC)
  104. add_library(fl-static STATIC ${fl-headers} ${fl-sources})
  105. endif()
  106. else()
  107. if(FL_BUILD_SHARED OR FL_BUILD_STATIC)
  108. add_library(fl-obj OBJECT ${fl-headers} ${fl-sources})
  109. if(NOT MINGW)
  110. set_target_properties(fl-obj PROPERTIES COMPILE_FLAGS "-fPIC")
  111. endif()
  112. endif()
  113. if(FL_BUILD_SHARED)
  114. add_library(fl-shared SHARED $<TARGET_OBJECTS:fl-obj>)
  115. endif(FL_BUILD_SHARED)
  116. if(FL_BUILD_STATIC)
  117. add_library(fl-static STATIC $<TARGET_OBJECTS:fl-obj>)
  118. endif(FL_BUILD_STATIC)
  119. endif()
  120. if(FL_BUILD_SHARED)
  121. set_target_properties(fl-shared PROPERTIES OUTPUT_NAME fuzzylite)
  122. set_target_properties(fl-shared PROPERTIES DEBUG_POSTFIX d)
  123. set_target_properties(fl-shared PROPERTIES COMPILE_DEFINITIONS "FL_EXPORT_LIBRARY")
  124. set_target_properties(fl-shared PROPERTIES VERSION 5.0)
  125. target_link_libraries(fl-shared ${FL_LIBS})
  126. endif()
  127. if(FL_BUILD_STATIC)
  128. set_target_properties(fl-static PROPERTIES OUTPUT_NAME fuzzylite-static)
  129. set_target_properties(fl-static PROPERTIES DEBUG_POSTFIX d)
  130. set_target_properties(fl-static PROPERTIES VERSION 5.0)
  131. target_link_libraries(fl-static ${FL_LIBS})
  132. endif()
  133. if(FL_BUILD_BINARY)
  134. add_executable(fl-bin src/main.cpp)
  135. set_target_properties(fl-bin PROPERTIES OUTPUT_NAME fuzzylite)
  136. set_target_properties(fl-bin PROPERTIES OUTPUT_NAME fuzzylite IMPORT_PREFIX tmp-) #To prevent LNK1149 in Windows
  137. set_target_properties(fl-bin PROPERTIES DEBUG_POSTFIX d)
  138. set_target_properties(fl-bin PROPERTIES COMPILE_DEFINITIONS "FL_IMPORT_LIBRARY")
  139. target_link_libraries(fl-bin fl-shared ${FL_LIBS})
  140. endif(FL_BUILD_BINARY)
  141. ###INSTALL SECTION
  142. if(NOT FL_INSTALL_BINDIR)
  143. set(FL_INSTALL_BINDIR bin)
  144. endif()
  145. if(NOT FL_INSTALL_LIBDIR)
  146. if(NOT CMAKE_INSTALL_LIBDIR)
  147. set(FL_INSTALL_LIBDIR lib)
  148. else()
  149. set(FL_INSTALL_LIBDIR ${CMAKE_INSTALL_LIBDIR})
  150. endif()
  151. endif()
  152. if(FL_BUILD_BINARY)
  153. install(TARGETS fl-bin
  154. RUNTIME DESTINATION ${FL_INSTALL_BINDIR}
  155. LIBRARY DESTINATION ${FL_INSTALL_LIBDIR}
  156. ARCHIVE DESTINATION ${FL_INSTALL_LIBDIR}
  157. )
  158. endif()
  159. if(FL_BUILD_SHARED)
  160. install(TARGETS fl-shared
  161. RUNTIME DESTINATION ${FL_INSTALL_BINDIR}
  162. LIBRARY DESTINATION ${FL_INSTALL_LIBDIR}
  163. ARCHIVE DESTINATION ${FL_INSTALL_LIBDIR}
  164. )
  165. endif()
  166. if(FL_BUILD_STATIC)
  167. install(TARGETS fl-static
  168. RUNTIME DESTINATION ${FL_INSTALL_BINDIR}
  169. LIBRARY DESTINATION ${FL_INSTALL_LIBDIR}
  170. ARCHIVE DESTINATION ${FL_INSTALL_LIBDIR}
  171. )
  172. endif()
  173. install(DIRECTORY fl/ DESTINATION include/fl)
  174. message("=====================================")
  175. message("fuzzylite v.${FL_VERSION}b${FL_DATE}\n")
  176. message("FL_USE_FLOAT=${FL_USE_FLOAT}")
  177. message("FL_BACKTRACE=${FL_BACKTRACE}")
  178. message("FL_CPP11=${FL_CPP11}")
  179. message("FL_INSTALL_BINDIR=${FL_INSTALL_BINDIR}")
  180. message("FL_INSTALL_LIBDIR=${FL_INSTALL_LIBDIR}")
  181. message("Build=${CMAKE_BUILD_TYPE}")
  182. message("=====================================\n")
  183. ###UNINSTALL SECTION
  184. #configure_file(
  185. #"${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
  186. #"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
  187. #IMMEDIATE @ONLY)
  188. #add_custom_target(uninstall
  189. #COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/uninstall.cmake)
  190. #unix uninstall
  191. #xargs rm < install_manifest.txt