Skip to content

Commit

Permalink
External CMake build system added
Browse files Browse the repository at this point in the history
Fixed CMake core file for Win, need to be fixed for other OS
  • Loading branch information
Mikhan committed Jan 24, 2016
1 parent 25994cd commit 5caf485
Show file tree
Hide file tree
Showing 3 changed files with 469 additions and 81 deletions.
172 changes: 91 additions & 81 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# Project: NextGIS Form Builder
# Purpose: cmake script
#***************************************************************************
# Copyright (c) 2014, 2015 NextGIS
# Copyright (c) 2014, 2015, 2016 NextGIS
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
Expand All @@ -26,60 +26,71 @@
#Note that setting the minimum required CMake version to 2.8.11
#is required for automatic linking to the qtmain.lib library on Windows.
cmake_minimum_required(VERSION 2.8.11)

project(fb)

# Settings for nextgis-extra
# set path to additional CMake modules
set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})

#if(${CMAKE_SYSTEM_NAME} MATCHES "Windows")
# path example: <qt core dir>/qtbase
if(WIN32)
set(QT_DIR_PREFIX_PATH "C:/Qt" CACHE PATH "This path will be set to CMAKE_PREFIX_PATH variable")
set(CMAKE_PREFIX_PATH ${QT_DIR_PREFIX_PATH})
set(CMAKE_PREFIX_PATH ${QT_DIR_PREFIX_PATH})
endif(WIN32)

# Tell CMake to run moc when necessary:
set(CMAKE_AUTOMOC ON)
# As moc files are generated in the binary dir, tell CMake
# to always look for includes there:
set(CMAKE_INCLUDE_CURRENT_DIR ON)


# set path to additional CMake modules
set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})
# To correctly build for Win XP
#set(CMAKE_EXE_LINKER_FLAGS "/SUBSYSTEM:WINDOWS,5.01")
if(WIN32)
add_definitions(-D_WIN32_WINNT=0x0501)
endif(WIN32)


###############################################################################
## includes & find ############################################################
###############################################################################

# Qt5Widgets finds its own dependencies (QtGui and QtCore).
find_package(Qt5Widgets REQUIRED)
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/json)

include(FindAnyProject)

# path example: <qt core dir>/qtbase/lib/cmake/Qt5Core
find_package(Qt5Widgets REQUIRED) # finds its own dependencies (QtGui and QtCore)
find_package(Qt5Network REQUIRED)
find_package(Qt5LinguistTools)
find_package(Qt5LinguistTools) # TODO: do we need it here?

# The Qt5Widgets_INCLUDES also includes the include directories for
# dependencies QtCore and QtGui
include_directories(${Qt5Widgets_INCLUDES})
include_directories(${Qt5Widgets_INCLUDES}) # also includes QtCore and QtGui
include_directories(${Qt5Network_INCLUDES})
include_directories(${Qt5LinguistTools_INCLUDES})

#find_package(GDAL REQUIRED)
find_anyproject(GDAL REQUIRED)# VERSION 2.1)

find_package(GDAL REQUIRED)
if(GDAL_FOUND)
include_directories(${GDAL_INCLUDE_DIR})
FOREACH(file_path ${GDAL_INCLUDE_DIR})
include_directories(${file_path}/ogr)
include_directories(${file_path}/ogr/ogrsf_frmts)
include_directories(${file_path}/port)
include_directories(${file_path}/gcore)
include_directories(${file_path}/alg)
include_directories(${file_path}/frmts/vrt)
FOREACH(FILE_PATH ${GDAL_INCLUDE_DIR})
include_directories(${FILE_PATH}/ogr)
include_directories(${FILE_PATH}/ogr/ogrsf_frmts)
include_directories(${FILE_PATH}/port)
include_directories(${FILE_PATH}/gcore)
include_directories(${FILE_PATH}/alg)
include_directories(${FILE_PATH}/frmts/vrt)
ENDFOREACH()
endif(GDAL_FOUND)


set(APP_NAME fb)
###############################################################################
## target definitions #########################################################
###############################################################################

qt5_wrap_ui(fb_ui fb.ui)
set(UIS_HDRS ${fb_ui})

qt5_add_resources(fb_res res.qrc)
set(RESOURCES ${fb_res})
set(APP_NAME fb)

set(PROJECT_SOURCES
jsoncpp.cpp
Expand All @@ -100,34 +111,39 @@ fieldmanagerdialog.cpp
datetimedialog.cpp
forappicon.rc)

# TODO: make automatic updating *.ts files via qt5_create_translation()
# Use lupdate utility directly for now.
set(TS_FILES translations/fb_en_GB.ts) # manually written .ts files
qt5_add_translation(QM_FILES ${TS_FILES}) # no lupdate calling.



#set(CMAKE_EXE_LINKER_FLAGS "/SUBSYSTEM:WINDOWS,5.01")
if(WIN32)
add_definitions(-D_WIN32_WINNT=0x0501)
endif(WIN32)
qt5_wrap_ui(fb_ui fb.ui)
set(UIS_HDRS ${fb_ui})

qt5_add_resources(fb_res res.qrc)
set(RESOURCES ${fb_res})

if(WIN32)
add_executable(${APP_NAME} WIN32 ${PROJECT_SOURCES} ${RESOURCES} ${UIS_HDRS} ${QM_FILES})
else(WIN32)
add_executable(${APP_NAME} ${PROJECT_SOURCES} ${RESOURCES} ${UIS_HDRS} ${QM_FILES})
endif(WIN32)

target_link_libraries(${APP_NAME} ${GDAL_LIBRARIES})
# TODO: make automatic updating *.ts files via qt5_create_translation()
# Use lupdate utility directly for now.
set(TS_FILES translations/fb_en_GB.ts) # manually written .ts files
qt5_add_translation(QM_FILES ${TS_FILES}) # no lupdate calling.


qt5_use_modules(${APP_NAME} Widgets Network LinguistTools)
###############################################################################
## dependencies ###############################################################
###############################################################################

qt5_use_modules(${APP_NAME} Widgets Network LinguistTools)

message(STATUS "TARGET_LINK_LIB ${TARGET_LINK_LIB}")

#target_link_libraries(${APP_NAME} ${GDAL_LIBRARIES})
target_link_extlibraries(${APP_NAME} ${GDAL_LIBRARIES})


#install
###############################################################################
## installation ###############################################################
###############################################################################

if(WIN32)
install(TARGETS ${APP_NAME} RUNTIME DESTINATION ./)
Expand All @@ -137,56 +153,50 @@ else(WIN32)
)
endif(WIN32)

# TODO: google for Qt macros for install release stuff (Qt dlls, /platforms dir, etc)

install(FILES ${QT_DIR_PREFIX_PATH}/lib/Qt5Core.dll DESTINATION ./)
install(FILES ${QT_DIR_PREFIX_PATH}/lib/Qt5Gui.dll DESTINATION ./)
install(FILES ${QT_DIR_PREFIX_PATH}/lib/Qt5Widgets.dll DESTINATION ./)
install(FILES ${QT_DIR_PREFIX_PATH}/lib/Qt5Network.dll DESTINATION ./)

# TODO: find Qt macros for install release stuff (Qt dlls, /platforms dir, etc)
if(WIN32)
install(FILES ${QT_DIR_PREFIX_PATH}/lib/Qt5Core.dll DESTINATION ./)
install(FILES ${QT_DIR_PREFIX_PATH}/lib/Qt5Gui.dll DESTINATION ./)
install(FILES ${QT_DIR_PREFIX_PATH}/lib/Qt5Widgets.dll DESTINATION ./)
install(FILES ${QT_DIR_PREFIX_PATH}/lib/Qt5Network.dll DESTINATION ./)
install(FILES ${QT_DIR_PREFIX_PATH}/plugins/platforms/qwindows.dll DESTINATION platforms)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/gdal201.dll DESTINATION ./)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libcurl.dll DESTINATION ./)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libeay32.dll DESTINATION ./)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libiconv.dll DESTINATION ./)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/msvcp110.dll DESTINATION ./)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/msvcr110.dll DESTINATION ./)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/proj.dll DESTINATION ./)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/ssleay32.dll DESTINATION ./)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/zlib.dll DESTINATION ./)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/fb_en_GB.qm DESTINATION ./)
endif(WIN32)

install(FILES ${CMAKE_CURRENT_BINARY_DIR}/fb_tr_en.qm DESTINATION ./)

install(FILES ${CMAKE_CURRENT_BINARY_DIR}/gdal201.dll DESTINATION ./)

install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libcurl.dll DESTINATION ./)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libeay32.dll DESTINATION ./)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libiconv.dll DESTINATION ./)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/msvcp110.dll DESTINATION ./)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/msvcr110.dll DESTINATION ./)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/proj4.dll DESTINATION ./)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/ssleay32.dll DESTINATION ./)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/zlib.dll DESTINATION ./)



#cpack
###############################################################################
## packaging ##################################################################
###############################################################################

configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/CPackOptions.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/CPackOptions.cmake @ONLY)

#INCLUDE(InstallRequiredSystemLibraries)
SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "NextGIS Form Builder")
SET(CPACK_PACKAGE_VENDOR "NextGIS")
SET(CPACK_PACKAGE_INSTALL_DIRECTORY "nextgis/form-builder")
SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "ngfb")
SET(CPACK_PROJECT_CONFIG_FILE ${CMAKE_BINARY_DIR}/CPackOptions.cmake)
IF(WIN32 AND NOT UNIX)
SET(CPACK_BINARY_NSIS ON)
SET(CPACK_BINARY_ZIP ON)
SET(CPACK_NSIS_MODIFY_PATH ON)
SET(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
ELSE(WIN32 AND NOT UNIX)
#SET(CPACK_STRIP_FILES "bin/wxgiscat")
#SET(CPACK_SOURCE_STRIP_FILES "")
ENDIF(WIN32 AND NOT UNIX)
SET(CPACK_PACKAGE_EXECUTABLES "ngfb" "NextGIS Form Builder")

INCLUDE(CPack)


set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "NextGIS Form Builder")
set(CPACK_PACKAGE_VENDOR "NextGIS")
set(CPACK_PACKAGE_INSTALL_DIRECTORY "nextgis/form-builder")
set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "ngfb")
set(CPACK_PROJECT_CONFIG_FILE ${CMAKE_BINARY_DIR}/CPackOptions.cmake)
if(WIN32 AND NOT UNIX)
set(CPACK_BINARY_NSIS ON)
set(CPACK_BINARY_ZIP ON)
set(CPACK_NSIS_MODIFY_PATH ON)
set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
else(WIN32 AND NOT UNIX)
#set(CPACK_STRIP_FILES "bin/wxgiscat")
#set(CPACK_SOURCE_STRIP_FILES "")
endif(WIN32 AND NOT UNIX)
set(CPACK_PACKAGE_EXECUTABLES "ngfb" "NextGIS Form Builder")

include(CPack)



131 changes: 131 additions & 0 deletions src/cmake/FindAnyProject.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
################################################################################
# Project: external projects
# Purpose: CMake build scripts
# Author: Dmitry Baryshnikov, [email protected]
################################################################################
# Copyright (C) 2015, NextGIS <[email protected]>
# Copyright (C) 2015 Dmitry Baryshnikov
#
# This script is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# This script is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this script. If not, see <http://www.gnu.org/licenses/>.
################################################################################

set(TARGET_LINK_LIB) # ${TARGET_LINK_LIB} ""
set(DEPENDENCY_LIB) # ${DEPENDENCY_LIB} ""
set(WITHOPT ${WITHOPT} "")
set(EXPORTS_PATHS)

function(find_anyproject name)

include (CMakeParseArguments)
set(options OPTIONAL REQUIRED QUIET EXACT MODULE)
set(oneValueArgs DEFAULT VERSION)
set(multiValueArgs CMAKE_ARGS COMPONENTS)
cmake_parse_arguments(find_anyproject "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )

if (find_anyproject_REQUIRED OR find_anyproject_DEFAULT)
set(_WITH_OPTION_ON TRUE)
else()
set(_WITH_OPTION_ON FALSE)
endif()

set(WITHOPT "${WITHOPT}option(WITH_${name} \"Set ON to use ${name}\" ${_WITH_OPTION_ON})\n")
set(WITHOPT "${WITHOPT}option(WITH_${name}_EXTERNAL \"Set ON to use external ${name}\" OFF)\n")

option(WITH_${name} "Set ON to use ${name}" ${_WITH_OPTION_ON})

string(TOUPPER ${name}_FOUND IS_FOUND)
if(NOT DEFINED ${IS_FOUND}) #if the package was found anywhere
set(${IS_FOUND} FALSE)
endif()
string(TOUPPER ${name} UPPER_NAME)

if(WITH_${name})
option(WITH_${name}_EXTERNAL "Set ON to use external ${name}" OFF)
if(WITH_${name}_EXTERNAL)
include(FindExtProject)
find_extproject(${name} ${ARGN})
else()
# transfer some input options to find_package arguments
if(find_anyproject_VERSION)
set(FIND_PROJECT_ARG ${find_anyproject_VERSION})
endif()
if(find_anyproject_EXACT)
set(FIND_PROJECT_ARG ${FIND_PROJECT_ARG} EXACT)
endif()
if(find_anyproject_QUIET)
set(FIND_PROJECT_ARG ${FIND_PROJECT_ARG} QUIET)
endif()
if(find_anyproject_MODULE)
set(FIND_PROJECT_ARG ${FIND_PROJECT_ARG} MODULE)
endif()
if(find_anyproject_REQUIRED)
set(FIND_PROJECT_ARG ${FIND_PROJECT_ARG} REQUIRED)
endif()
if(find_anyproject_COMPONENTS)
set(FIND_PROJECT_ARG ${FIND_PROJECT_ARG} COMPONENTS ${find_anyproject_COMPONENTS})
endif()

find_package(${name} ${FIND_PROJECT_ARG})
endif()

# message(STATUS "IS_FOUND ${IS_FOUND} ${${IS_FOUND}}")
if(${IS_FOUND})
set(${IS_FOUND} TRUE CACHE BOOL "use ${name} external")
mark_as_advanced(${IS_FOUND})
elseif(find_anyproject_REQUIRED)
message(FATAL_ERROR "${name} is required in ${PROJECT_NAME}!")
else()
message(WARNING "${name} not found and will be disabled in ${PROJECT_NAME}!")
endif()
endif()

if(NOT WITH_${name}_EXTERNAL AND ${IS_FOUND})
if(${UPPER_NAME}_INCLUDE_DIRS)
include_directories(${${UPPER_NAME}_INCLUDE_DIRS})
elseif(${UPPER_NAME}_INCLUDE_DIR)
include_directories(${${UPPER_NAME}_INCLUDE_DIR})
endif()
if(${UPPER_NAME}_LIBRARIES)
set(TARGET_LINK_LIB ${TARGET_LINK_LIB} ${${UPPER_NAME}_LIBRARIES} PARENT_SCOPE)
elseif(${UPPER_NAME}_LIBRARY)
set(TARGET_LINK_LIB ${TARGET_LINK_LIB} ${${UPPER_NAME}_LIBRARY} PARENT_SCOPE)
endif()
else()
set(TARGET_LINK_LIB ${TARGET_LINK_LIB} PARENT_SCOPE)
set(DEPENDENCY_LIB ${DEPENDENCY_LIB} PARENT_SCOPE)
endif()
set(WITHOPT ${WITHOPT} PARENT_SCOPE)
set(EXPORTS_PATHS ${EXPORTS_PATHS} PARENT_SCOPE)
endfunction()

function(target_link_extlibraries name)
if(DEPENDENCY_LIB)
add_dependencies(${name} ${DEPENDENCY_LIB})
endif()
if(TARGET_LINK_LIB)
#list(REMOVE_DUPLICATES TARGET_LINK_LIB) debug;...;optimised;... etc. if filter out
target_link_libraries(${name} ${TARGET_LINK_LIB})
endif()
write_ext_options()
endfunction()

function(write_ext_options)
if(NOT BUILD_SHARED_LIBS AND EXPORTS_PATHS)
foreach(EXPORT_PATH ${EXPORTS_PATHS})
string(CONCAT EXPORTS_PATHS_STR ${EXPORTS_PATHS_STR} " \"${EXPORT_PATH}\"")
endforeach()
set(WITHOPT "${WITHOPT}set(INCLUDE_EXPORTS_PATHS \${INCLUDE_EXPORTS_PATHS} ${EXPORTS_PATHS_STR})\n")
endif()
file(WRITE ${CMAKE_BINARY_DIR}/ext_options.cmake ${WITHOPT})
endfunction()
Loading

0 comments on commit 5caf485

Please sign in to comment.