Codebase list juffed / 8bba6bea-30b6-4427-8d8d-124119a664c3/main CMakeLists.txt
8bba6bea-30b6-4427-8d8d-124119a664c3/main

Tree @8bba6bea-30b6-4427-8d8d-124119a664c3/main (Download .tar.gz)

CMakeLists.txt @8bba6bea-30b6-4427-8d8d-124119a664c3/mainraw · history · blame

# juffed CMakeLists.txt
# 
# To build juffed, you will need cmake 2.8.11.
# To build the application run this commands:
# 
# mkdir build
# cd build
# cmake .. -DCMAKE_INSTALL_PREFIX=/usr (or whatever prefix you'd like)
# make
# make install
#
# mac os x notes:
# juffed.app is build by default. There are some additions to steps above. 
# "make install" is required to get plugins working
# "make bundle" an optional make target to build bundle with all dependencies inside
#


project (juffed)
cmake_minimum_required (VERSION 2.8.11)

# build options
option(USE_QT5 "Use Qt5. Defaults to Qt4" $ENV{USE_QT5})
option(USE_SYSTEM_QTSINGLEAPPLICATION "Try to find system-wide QtSingleApplication library" $ENV{USE_SYSTEM_SINGLETON})
option(USE_ENCA "Try to find Enca library for file encoding check" $ENV{USE_ENCA})


if (COMMAND cmake_policy)
    CMAKE_POLICY (SET CMP0003 NEW)
endif (COMMAND cmake_policy)

set ( CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH} )
set ( PREFIX ${CMAKE_INSTALL_PREFIX} )

# switch verbose mode ON or OFF
set ( CMAKE_VERBOSE_MAKEFILE $ENV{VERBOSE_MAKEFILE} )

####################
# Names and Version
####################

set ( JUFFED  "juffed" CACHE STRING "Name of the executeable" )
set ( JUFFLIB "juff"   CACHE STRING "Name of the library" )
set ( QSCI_ENGINE "juffed-engine-qsci" CACHE STRING "" )
file   ( READ "${CMAKE_SOURCE_DIR}/version"      JUFFED_VERSION )
file   ( READ "${CMAKE_SOURCE_DIR}/base_version" BASE_VERSION )
string ( STRIP "${JUFFED_VERSION}" JUFFED_VERSION )
string ( STRIP "${BASE_VERSION}"   BASE_VERSION )

# flag indicating that this is a development version
set ( DEV 0 )

if ( DEV )
    # SVN revision
#    find_package(Subversion)
#    if(Subversion_FOUND)
#        Subversion_WC_INFO(${PROJECT_SOURCE_DIR} SVN)
#    endif(Subversion_FOUND)
#    set ( REV ${SVN_WC_REVISION} )
#    set ( JUFFED_VERSION "${BASE_VERSION}.${REV}" )
endif ( DEV )

message ( STATUS "" )
message ( STATUS "${JUFFED} version: ${JUFFED_VERSION}" )


####################
# Directories
####################

include ( cmake/LibSuffix.cmake )

set (BIN_INSTALL_DIR
    "${PREFIX}/bin"
    CACHE PATH "Install path for executables"
)

set (LIB_INSTALL_DIR
    "${PREFIX}/lib${LIB_SUFFIX}"
    CACHE PATH "Install path for libraries"
)

set (DATA_INSTALL_DIR
    "${PREFIX}/share/${CMAKE_PROJECT_NAME}"
    CACHE PATH "Install path for shared data"
)

message ( STATUS "Install path for executables: ${BIN_INSTALL_DIR}" )
message ( STATUS "Install path for libraries: ${LIB_INSTALL_DIR}" )
message ( STATUS "" )
#set (CMAKE_INSTALL_RPATH "${LIB_INSTALL_DIR}")

set (CMAKE_AUTOMOC ON)

if (USE_QT5)
    find_package ( Qt5 COMPONENTS Widgets Xml Network PrintSupport LinguistTools CONFIG REQUIRED )
    set (JUFF_QT_IMPORTED_TARGETS Qt5::Widgets Qt5::Xml Qt5::Network Qt5::PrintSupport)

    macro(qt_wrap_ui)
      qt5_wrap_ui(${ARGN})
    endmacro()

    macro(qt_add_resources)
      qt5_add_resources(${ARGN})
    endmacro()

    macro(qt_add_translation)
      qt5_add_translation(${ARGN})
    endmacro()
else (USE_QT5)
    find_package ( Qt4 COMPONENTS QtCore QtGui QtXml QtNetwork REQUIRED )
    set (JUFF_QT_IMPORTED_TARGETS Qt4::QtCore Qt4::QtGui Qt4::QtXml Qt4::QtNetwork)

    macro(qt_wrap_ui)
      qt4_wrap_ui(${ARGN})
    endmacro()

    macro(qt_add_resources)
      qt4_add_resources(${ARGN})
    endmacro()

    macro(qt_add_translation)
      qt4_add_translation(${ARGN})
    endmacro()
endif (USE_QT5)

# this is mandatory for Apple builds to load plugin correctly
add_definitions(-DQT_NO_DEBUG)

find_package ( QScintilla2 REQUIRED)


include ( cmake/FileSets.cmake )
include ( cmake/SomeLexers.cmake )

if(USE_SYSTEM_QTSINGLEAPPLICATION)
    find_package ( QtSingleApplication REQUIRED)
else(USE_SYSTEM_QTSINGLEAPPLICATION)
    set(QTSINGLEAPPLICATION_INCLUDE_DIR src/3rd_party/qtsingleapplication)
    SET ( juffed_app_SRCS
        ${juffed_app_SRCS}
        src/3rd_party/qtsingleapplication/qtsinglecoreapplication.cpp
        src/3rd_party/qtsingleapplication/qtsingleapplication.cpp
        src/3rd_party/qtsingleapplication/qtlockedfile.cpp
        src/3rd_party/qtsingleapplication/qtlocalpeer.cpp
    )
    IF ( WIN32 )
        SET ( juffed_app_SRCS
            ${juffed_app_SRCS}
            src/3rd_party/qtsingleapplication/qtlockedfile_win.cpp
        )
    ENDIF ( WIN32 )

    IF ( UNIX )
        SET ( juffed_app_SRCS
            ${juffed_app_SRCS}
            src/3rd_party/qtsingleapplication/qtlockedfile_unix.cpp
        )
    ENDIF ( UNIX )
endif(USE_SYSTEM_QTSINGLEAPPLICATION)


QT_ADD_RESOURCES ( juffed_app_RESOURCES ${juffed_app_RESOURCES} )
QT_ADD_RESOURCES ( juffed_lib_RESOURCES ${juffed_lib_RESOURCES} )
QT_WRAP_UI ( juffed_qsci_UIS_H ${juffed_qsci_UIS} )
QT_WRAP_UI ( juffed_app_UIS_H ${juffed_app_UIS} )
QT_ADD_TRANSLATION ( juffed_QM ${juffed_TS} )


include(FindPkgConfig)
if (USE_ENCA)
# try to find libenca - optional
pkg_check_modules(ENCA enca)
if (ENCA_FOUND)
    add_definitions(-DHAVE_ENCA)
    include_directories(${ENCA_INCLUDE_DIRS})
    link_directories(${ENCA_LIBRARY_DIRS})
    message(STATUS "Enca includes: ${ENCA_INCLUDE_DIRS}")
    message(STATUS "Enca library dir: ${ENCA_LIBRARY_DIRS}")
    message(STATUS "Enca library: ${ENCA_LIBRARIES}")
else (ENCA_FOUND)
    message(WARNING "No enca library found. Building without auto-language-detection")
endif (ENCA_FOUND)
endif (USE_ENCA)


# include directories
include_directories(
    ${CMAKE_BINARY_DIR}
    ${QSCINTILLA_INCLUDE_DIR}
    ${QSCINTILLA_INCLUDE_DIR}/Qsci
    ${QTSINGLEAPPLICATION_INCLUDE_DIR}
    src/app/ui
    src/app/qsci
    ./include
)

configure_file ("${CMAKE_SOURCE_DIR}/cmake/AppInfo.nix.h.cmake" "${CMAKE_BINARY_DIR}/AppInfo.nix.h" @ONLY)
configure_file ("${CMAKE_SOURCE_DIR}/cmake/AppInfo.win.h.cmake" "${CMAKE_BINARY_DIR}/AppInfo.win.h" @ONLY)
configure_file ("${CMAKE_SOURCE_DIR}/cmake/AppInfo.apple.h.cmake" "${CMAKE_BINARY_DIR}/AppInfo.apple.h" @ONLY)


####################
# Targets
####################

# library
add_library ( ${JUFFLIB} SHARED
    ${juffed_lib_SRCS}
    ${juffed_lib_MOC_HEADERS}
    ${juffed_lib_RESOURCES}
)
target_link_libraries ( ${JUFFLIB}
    ${JUFF_QT_IMPORTED_TARGETS}
)
if (ENCA_FOUND)
    target_link_libraries( ${JUFFLIB} ${ENCA_LIBRARIES} )
endif (ENCA_FOUND)

add_library ( ${QSCI_ENGINE} SHARED
    ${juffed_qsci_SRCS}
    ${juffed_qsci_UIS_H}
)
target_link_libraries ( ${QSCI_ENGINE}
    ${JUFFLIB}
    ${JUFF_QT_IMPORTED_TARGETS}
    ${QSCINTILLA_LIBRARY} 
    ${QTSINGLEAPPLICATION_LIBRARY} 
)

if (APPLE)
    message ( STATUS "Building as an apple bundle" )
    set ( APPLE_PREFIX "${CMAKE_INSTALL_PREFIX}/${JUFFED}.app/Contents" )
    
    add_definitions(-DAPPLEBUNDLE)
    set(GUI_TYPE MACOSX_BUNDLE)
    # create Info.plist file
    set(MACOSX_BUNDLE_ICON_FILE juffed.icns)
    set(MACOSX_BUNDLE_INFO_STRING "juffed ${JUFFED_VERSION}")
    set(MACOSX_BUNDLE_GUI_IDENTIFIER "com.juffed")
    set(MACOSX_BUNDLE_LONG_VERSION_STRING "${JUFFED_VERSION}")
    set(MACOSX_BUNDLE_BUNDLE_NAME "${JUFFED}")
    set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${JUFFED_VERSION}")
    set(MACOSX_BUNDLE_BUNDLE_VERSION "${JUFFED_VERSION}")
    set(MACOSX_BUNDLE_COPYRIGHT "(c) juffed.com")
    set_source_files_properties(${CMAKE_SOURCE_DIR}/macosx/juffed.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
    # use icon for app bundle to be visible in finder
    set(APPLE_BUNDLE_SOURCES ${CMAKE_SOURCE_DIR}/macosx/juffed.icns)
    # this is a must to load the lib correctly
    set_target_properties( ${JUFFLIB} PROPERTIES INSTALL_NAME_DIR "@executable_path/../MacOS" )
    set_target_properties( ${QSCI_ENGINE} PROPERTIES INSTALL_NAME_DIR "@executable_path/../MacOS" )
else (APPLE)
    set(GUI_TYPE "")
    set(APPLE_BUNDLE_SOURCES "")
    # now we want to use soversion etc.
    if (NOT APPLE)
        # this causes a build fail on mac (unix-like build)
        set_target_properties ( ${JUFFLIB} PROPERTIES VERSION ${BASE_VERSION} SOVERSION ${BASE_VERSION} )
        set_target_properties ( ${QSCI_ENGINE} PROPERTIES VERSION ${BASE_VERSION} SOVERSION ${BASE_VERSION} )
    else (NOT APPLE)
        # apple requires this one to keep sane dyn-linking
        set_target_properties( ${JUFFLIB} PROPERTIES INSTALL_NAME_DIR ${LIB_INSTALL_DIR} )
        set_target_properties( ${QSCI_ENGINE} PROPERTIES INSTALL_NAME_DIR ${LIB_INSTALL_DIR} )
    endif (NOT APPLE)
endif (APPLE)

if ( MINGW )
    add_definitions(
        -DQSCINTILLA_DLL
    )

    add_definitions( -D__SPECIAL_WINDOWS_DEFINE__ )

    # resource compilation for MinGW
    add_custom_command ( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/src/app/juffed_ico.o
        COMMAND $ENV{WINDRES} -I${CMAKE_CURRENT_SOURCE_DIR}/src/app -i${CMAKE_CURRENT_SOURCE_DIR}/src/app/juffed.rc 
            -o ${CMAKE_CURRENT_BINARY_DIR}/src/app/juffed_ico.o )
    set ( juffed_app_SRCS ${juffed_app_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/src/app/juffed_ico.o)
endif ( MINGW )


# executable
add_executable ( ${JUFFED}
    ${GUI_TYPE}
    ${juffed_app_SRCS} 
    ${juffed_UIS} 
    ${juffed_app_UIS_H}
    ${juffed_app_RESOURCES} 
    ${juffed_QM} 
    ${APPLE_BUNDLE_SOURCES}
)

if ( MINGW )
    set_target_properties( ${JUFFED} PROPERTIES LINK_FLAGS "-mwindows" )
endif ( MINGW )

target_link_libraries ( ${JUFFED}
    ${JUFFLIB}
    ${QSCI_ENGINE}
    ${JUFF_QT_IMPORTED_TARGETS}
)

if ( UNIX )
    set(CMAKE_CXX_FLAGS "-Wall -Wextra")
endif ( UNIX )

#
# plugins
message(STATUS "Plugins: all externally linked cmake-ready plugs will be built")
set(JUFFED_CMAKE_PLUGINS 1)
if (UNIX)
    set(JUFFED_PLUGINS_DIR ${LIB_INSTALL_DIR}/juffed/plugins)
endif (UNIX)
if (APPLE)
    set(JUFFED_PLUGINS_DIR ${APPLE_PREFIX}/plugins)
endif (APPLE)
if (WIN32)
    set(JUFFED_PLUGINS_DIR ${CMAKE_INSTALL_PREFIX}/plugins)
endif(WIN32)
set(JUFFED_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/include)
set(JUFFED_LIBRARY ${JUFFLIB})
add_subdirectory(plugins)

#configure_file ("${CMAKE_SOURCE_DIR}/cmake/version.cmake" "${CMAKE_BINARY_DIR}/version.real" @ONLY)




####################
# Installs
####################
if (NOT APPLE)

    install ( TARGETS ${JUFFED} DESTINATION ${BIN_INSTALL_DIR} )
    install ( TARGETS ${JUFFLIB} DESTINATION ${LIB_INSTALL_DIR} )
    install ( TARGETS ${QSCI_ENGINE} DESTINATION ${LIB_INSTALL_DIR} )
    install ( FILES ${juffed_QM} DESTINATION ${DATA_INSTALL_DIR}/l10n )
    install ( DIRECTORY hlschemes DESTINATION ${DATA_INSTALL_DIR} PATTERN ".svn" EXCLUDE PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ )
    install ( DIRECTORY apis DESTINATION ${DATA_INSTALL_DIR} PATTERN "*.svn" EXCLUDE PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ )
    install ( FILES juffed.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/pixmaps )
    install ( FILES juffed.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications )
    install ( FILES ${juffed_DEV_HEADERS} DESTINATION ${CMAKE_INSTALL_PREFIX}/include/${CMAKE_PROJECT_NAME} )

    ## uninstall 
    configure_file ( "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY )
    add_custom_target ( uninstall "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")

else (NOT APPLE)

    install(CODE "message(STATUS \"Cleaning previously installed bundle (rm -r)\")")
    install(CODE "execute_process(COMMAND rm -r ${CMAKE_INSTALL_PREFIX}/${JUFFED}.app)")

    install( TARGETS ${JUFFED} DESTINATION "${CMAKE_INSTALL_PREFIX}" )
    # lib is linked directly into binary in bundles to prevent Info.plist hacking
    install( TARGETS ${JUFFLIB} DESTINATION "${APPLE_PREFIX}/MacOS" )
    install( TARGETS ${QSCI_ENGINE} DESTINATION "${APPLE_PREFIX}/MacOS" )
    install ( FILES ${juffed_QM} DESTINATION "${APPLE_PREFIX}/Resources/l10n" )

    install ( DIRECTORY hlschemes DESTINATION "${APPLE_PREFIX}/Resources" PATTERN ".svn" EXCLUDE PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ )
    install ( DIRECTORY apis DESTINATION "${APPLE_PREFIX}/Resources" PATTERN "*.svn" EXCLUDE PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ )

    # helper stuff to create real apple bundle.
    # Black magic is summoned here...
        # create a "transportable" bundle - all libs into the bundle: "make bundle" after make install
        configure_file(macosx/bundle.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/bundle.cmake @ONLY)
        add_custom_target(bundle ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/bundle.cmake)

endif (NOT APPLE)


# make dist custom target
SET(CPACK_PACKAGE_NAME ${JUFFED})
SET(CPACK_PACKAGE_VERSION ${JUFFED_VERSION})
SET(CPACK_SOURCE_GENERATOR "TGZ;TBZ2;ZIP;")
SET(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}")
SET(CPACK_IGNORE_FILES "/CVS/;/\\\\.svn/;/\\\\.git/;\\\\.swp$;\\\\.#;/#;\\\\.tar.gz$;\\\\~$;/CMakeFiles/;CMakeCache.txt;\\\\.qm$;/win32/;/build/;")
SET(CPACK_SOURCE_IGNORE_FILES ${CPACK_IGNORE_FILES})
INCLUDE(CPack)
# simulate autotools' "make dist"
add_custom_target(dist COMMAND ${CMAKE_MAKE_PROGRAM} package_source)