Merge remote branch 'origin/demonstration'
[deska.git] / CMakeLists.txt
blobfd5a597c3fcc9c21fea0e577651ca14247150e29
1 # Copyright (C) 2011 Jan Kundrát <kundratj@fzu.cz>
3 # This file is part of the Deska, a tool for central administration of a grid site
4 # http://projects.flaska.net/projects/show/deska
6 # This program is free software; you can redistribute it and/or
7 # modify it under the terms of the GNU General Public
8 # License as published by the Free Software Foundation; either
9 # version 2 of the License, or the version 3 of the License.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 # General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program; see the file COPYING.  If not, write to
18 # the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 # Boston, MA 02110-1301, USA.
22 project(deska)
23 SET(DESKA_VERSION 1.0)
24 SET(DESKA_SOVERSION 1.0)
26 cmake_minimum_required(VERSION 2.6)
28 SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -ggdb -pipe")
29 # boost::optional fails with strict aliasing, unfortunately.
30 # http://boost.2283326.n4.nabble.com/optional-Strict-Aliasing-Warnings-on-Trunk-td2644713i20.html
31 # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41874
32 SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-strict-aliasing")
33 # STL debugging breaks ABI compatibility with virtualy any library that uses STL, hence disabled
34 # add_definitions(-D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC)
35 #SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Weffc++")
36 #SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wextra -Wnon-virtual-dtor -Wold-style-cast -Woverloaded-virtual -fdiagnostics-show-option" )
38 set(CMAKE_CONFIGURATION_TYPES ${CMAKE_CONFIGURATION_TYPES} Coverage )
39 set(CMAKE_CXX_FLAGS_COVERAGE "${CMAKE_CXX_FLAGS_DEBUG} -fprofile-arcs -ftest-coverage")
40 set(CMAKE_C_FLAGS_COVERAGE "${CMAKE_C_FLAGS_DEBUG} -fprofile-arcs -ftest-coverage")
41 set(CMAKE_EXE_LINKER_FLAGS_COVERAGE "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage")
43 IF(NOT CMAKE_BUILD_TYPE)
44   SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
45       "Choose the type of build"
46       FORCE)
47 ENDIF(NOT CMAKE_BUILD_TYPE)
49 add_definitions(-DCMAKE_CURRENT_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}")
51 # RHEL5 with EPEL Boost
52 SET(BOOST_INCLUDEDIR /usr/include/boost141)
53 SET(BOOST_LIBRARYDIR /usr/lib64/boost141)
54 FIND_PACKAGE(Boost 1.41.0 REQUIRED COMPONENTS system date_time unit_test_framework python program_options filesystem)
55 if(Boost_FOUND)
56     include_directories(${Boost_INCLUDE_DIRS})
57 endif(Boost_FOUND)
58 # we do not want to link with whole boost here; there's simply no point in our libraries bringing the test framework in
59 set(DESKA_BOOST_LIBS ${Boost_SYSTEM_LIBRARY} ${Boost_DATE_TIME_LIBRARY} ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_FILESYSTEM_LIBRARY})
61 FIND_PATH(LIBEBT_PATH libebt/libebt.hh
62     ${CMAKE_CURRENT_SOURCE_DIR}/src/3rd-party/libebt-1.3.0)
63 if(NOT LIBEBT_PATH)
64     message(FATAL "Cannot find libebt, and the internal copy seems unusable")
65 else()
66     message(STATUS "Using libebt from ${LIBEBT_PATH}")
67     include_directories(${LIBEBT_PATH})
68 endif()
70 FIND_PATH(JSON_SPIRIT_PATH json_spirit/json_spirit_value.h
71     ${CMAKE_CURRENT_SOURCE_DIR}/src/3rd-party/json_spirit_4.04)
72 if(NOT JSON_SPIRIT_PATH)
73     message(FATAL "Cannot find json_spirit, and the internal copy seems unusable")
74 else()
75     message(STATUS "Using json_spirit from ${JSON_SPIRIT_PATH}")
76     include_directories(${JSON_SPIRIT_PATH})
77 endif()
79 FIND_PATH(BOOST_PROCESS_PATH boost/process.hpp
80     ${CMAKE_CURRENT_SOURCE_DIR}/src/3rd-party/process)
81 if(NOT BOOST_PROCESS_PATH)
82     message(FATAL "Cannot find boost::process, and the internal copy seems unusable")
83 else()
84     message(STATUS "Using boost::process from ${BOOST_PROCESS_PATH}")
85     include_directories(${BOOST_PROCESS_PATH})
86 endif()
88 SET(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR})
89 FIND_PACKAGE(Readline REQUIRED)
90 if(EXTRA_READLINE_LIBRARY)
91     # support extra library to link with due to the RHEL5 borkage
92     # https://bugzilla.redhat.com/show_bug.cgi?id=499837
93     set(READLINE_LIBRARY ${READLINE_LIBRARY} ${EXTRA_READLINE_LIBRARY})
94 endif()
95 if(READLINE_FOUND)
96     include_directories(${READLINE_INCLUDE_DIR})
97 endif()
99 # We have to bring in Python explicitly
100 find_package(PythonLibs REQUIRED)
101 # yay, different versions of this package use different variable names for increased fun
102 include_directories(${PYTHON_INCLUDE_DIR} ${PYTHON_INCLUDE_PATH})
103 #link_directories(${PYTHON_LIBRARIES})
105 if(PYTHON_SITE_PACKAGES)
106     message(STATUS "Python site-packages dir specified by hand: ${PYTHON_SITE_PACKAGES}")
107 else()
108     # We also require the interpreter to be able to tell the PYTHONPATH
109     find_package(PythonInterp REQUIRED)
110     if(PYTHONINTERP_FOUND)
111         execute_process(COMMAND ${PYTHON_EXECUTABLE} -c
112             "import distutils.sysconfig; import sys; sys.stdout.write(distutils.sysconfig.get_python_lib())"
113             OUTPUT_VARIABLE PYTHON_SITE_PACKAGES)
114         message(STATUS "Python site-packages target: ${PYTHON_SITE_PACKAGES}")
115     else()
116         message(FATAL "Couldn't determine the PYTHON_SITE_PACKAGES directory")
117     endif()
118 endif()
120 if(PYTHON_SITE_PACKAGES_ARCH)
121     message(STATUS "Python arch-specific site-packages dir specified by hand: ${PYTHON_SITE_PACKAGES_ARCH}")
122 else()
123     # We also require the interpreter to be able to tell the PYTHONPATH
124     find_package(PythonInterp REQUIRED)
125     if(PYTHONINTERP_FOUND)
126         execute_process(COMMAND ${PYTHON_EXECUTABLE} -c
127             "import distutils.sysconfig; import sys; sys.stdout.write(distutils.sysconfig.get_python_lib(1))"
128             OUTPUT_VARIABLE PYTHON_SITE_PACKAGES_ARCH)
129         message(STATUS "Python arch-specific site-packages target: ${PYTHON_SITE_PACKAGES_ARCH}")
130     else()
131         message(FATAL "Couldn't determine the PYTHON_SITE_PACKAGES_ARCH directory")
132     endif()
133 endif()
136 INCLUDE_DIRECTORIES(
137     ${CMAKE_CURRENT_SOURCE_DIR}/src
141 set(libDeskaDb_SRCS
142     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/db/Objects.cpp
143     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/db/MacAddress.cpp
144     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/db/Revisions.cpp
145     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/db/ObjectModification.cpp
146     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/db/Filter.cpp
147     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/db/Api.cpp
148     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/db/FakeApi.cpp
149     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/db/JsonApi.cpp
150     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/db/JsonHandler.cpp
151     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/db/JsonException.cpp
152     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/db/JsonExtraction.cpp
153     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/db/CachingJsonApi.cpp
154     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/db/IOSocket.cpp
155     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/db/ProcessIO.cpp
156     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/db/UnixFdIO.cpp
157     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/db/Connection.cpp
158     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/db/Connection_p.cpp
161 set(libDeskaCli_SRCS
162     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/PredefinedRules.cpp
163     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/InfoExtractor.cpp
164     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/ContextStack.cpp
165     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/Parser.cpp
166     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/Parser_p.cpp
167     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/Parser_p_AttributeRemovalsParser.cpp
168     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/Parser_p_AttributesSettingParser.cpp
169     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/Parser_p_IdentifiersSetsParser.cpp
170     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/Parser_p_AttributesParser.cpp
171     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/Parser_p_FunctionWordsParser.cpp
172     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/Parser_p_KindsOnlyParser.cpp
173     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/Parser_p_KindsConstructParser.cpp
174     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/Parser_p_FilterExpressionsParser.cpp
175     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/Parser_p_FiltersParser.cpp
176     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/Parser_p_KindsFiltersParser.cpp
177     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/Parser_p_WholeKindParser.cpp
178     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/Parser_p_KindsParser.cpp
179     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/Parser_p_TopLevelParser.cpp
180     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/ParserKeyword.cpp
181     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/ParserErrors.cpp
182     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/Exceptions.cpp
183     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/CliConfigBase.cpp
184     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/CliObjects.cpp
185     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/DbInteraction.cpp
186     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/ParserSignals.cpp
187     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/CliCommands.cpp
188     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/CliCommands_Log.cpp
189     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/CliCommands_DiffRebase.cpp
190     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/UserInterface.cpp
191     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/UserInterfaceIO.cpp
192     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/ReadlineWrapper.cpp
193     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/ChildProcess.cpp
196 set(deskaCliApp_SRCS
197     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/main.cpp
198     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/CliConfig.cpp
201 set(libLowLevelPyDeska_SRCS
202     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/LowLevelPyDeska/Module.cpp
203     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/LowLevelPyDeska/Value.cpp
204     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/LowLevelPyDeska/Filter.cpp
205     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/LowLevelPyDeska/DateTimeConversions.cpp
208 add_library(DeskaDb SHARED ${libDeskaDb_SRCS})
209 target_link_libraries(DeskaDb ${DESKA_BOOST_LIBS})
210 set_target_properties(DeskaDb PROPERTIES
211     VERSION ${DESKA_SOVERSION}
212     SOVERSION ${DESKA_SOVERSION}
215 add_library(DeskaCli SHARED ${libDeskaCli_SRCS})
216 target_link_libraries(DeskaCli DeskaDb ${READLINE_LIBRARY})
217 set_target_properties(DeskaCli PROPERTIES
218     VERSION ${DESKA_SOVERSION}
219     SOVERSION ${DESKA_SOVERSION}
222 add_executable(deska-cli ${deskaCliApp_SRCS})
223 target_link_libraries(deska-cli DeskaCli)
225 find_file(GIT_DOT_GIT_HEAD HEAD PATHS ${CMAKE_CURRENT_SOURCE_DIR}/.git
226     NO_DEFAULT_PATH NO_CMAKE_ENVIRONMENT_PATH NO_CMAKE_PATH
227     NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_PATH)
228 if(GIT_DOT_GIT_HEAD)
229     add_custom_target(gitversion
230         "${CMAKE_CURRENT_SOURCE_DIR}/git-generate-version.sh" "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/src/deska/cli/gitversion-include.cpp"
231         )
232     add_dependencies(deska-cli gitversion)
233     set(DESKA_HAVE_GITVERSION 1)
234 else()
235     set(DESKA_HAVE_GITVERSION 0)
236 endif()
238 SET(DESKA_VERSION_STR "${DESKA_VERSION}")
239 SET(DESKA_EXECUTABLE deska-cli)
240 include_directories(${CMAKE_CURRENT_BINARY_DIR}/src/deska/cli)
241 CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/src/deska/cli/cli-config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/src/deska/cli/cli-config.h)
243 add_library(LowLevelPyDeska SHARED ${libLowLevelPyDeska_SRCS})
244 target_link_libraries(LowLevelPyDeska DeskaDb ${DESKA_BOOST_LIBS} ${Boost_PYTHON_LIBRARY} ${PYTHON_LIBRARIES})
246 install(FILES
247     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/db/Api.h
248     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/db/AdditionalValueStreamOperators.h
249     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/db/Connection.h
250     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/db/Filter.h
251     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/db/JsonException.h
252     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/db/MacAddress.h
253     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/db/Objects.h
254     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/db/ObjectModification.h
255     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/db/Revisions.h
256     DESTINATION include/deska/db
258 install(TARGETS DeskaDb DeskaCli DESTINATION lib${LIB_SUFFIX})
259 install(TARGETS deska-cli DESTINATION bin)
260 install(FILES
261     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/server/app/deska-server
262     PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
263     DESTINATION bin)
264 install(DIRECTORY
265     ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/server/app/deska_server_utils
266     DESTINATION ${PYTHON_SITE_PACKAGES})
268 install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/python/deska
269     DESTINATION ${PYTHON_SITE_PACKAGES})
270 install(TARGETS LowLevelPyDeska
271     DESTINATION ${PYTHON_SITE_PACKAGES_ARCH}/deska)
273 install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/install
274     DESTINATION share/deska/install-scripts
277 install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/src/deska/server/db
278     DESTINATION share/deska/install-scripts/src/deska/server
279     PATTERN "*/data_generator/*" EXCLUDE
282 install(FILES
283     ${CMAKE_CURRENT_SOURCE_DIR}/tests/prepare-git-repo.sh
284     PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
285     DESTINATION share/deska/install-scripts/tests/
288 install(DIRECTORY
289     ${CMAKE_CURRENT_SOURCE_DIR}/tests/sql
290     DESTINATION share/deska/install-scripts/tests
291     FILES_MATCHING PATTERN "util-*.sh"
296 include(CTest)
297 add_subdirectory(tests)
299 if(BUILD_QML2IMAGE)
300     message(STATUS "Will build the qml2image tool")
301     add_subdirectory(src/qml2image)
302 else()
303     message(STATUS "Will skip the qml2image tool")
304 endif()
306 if(BUILD_DOCS)
307     message(STATUS "Will build PDF documentation")
308     add_subdirectory(doc/technical)
309 else()
310     message(STATUS "Will not build PDF documentation")
311 endif(BUILD_DOCS)