Přemysl Janouch
616c49a505
This is required for gtkdoc-scangobj. So far it's much like it's been before, the main differences are that source files are in two directories from now on and the build process has two stages.
209 lines
6.3 KiB
CMake
209 lines
6.3 KiB
CMake
project (logdiag)
|
|
cmake_minimum_required (VERSION 2.6.2)
|
|
|
|
# Default to 2.6.3 behaviour
|
|
cmake_policy (VERSION 2.6.3)
|
|
|
|
# Options
|
|
option (OPTION_NOINSTALL "Only for developers; work without installing" OFF)
|
|
|
|
if (OPTION_NOINSTALL)
|
|
set (OPTION_NOINSTALL 1)
|
|
else (OPTION_NOINSTALL)
|
|
set (OPTION_NOINSTALL 0)
|
|
endif (OPTION_NOINSTALL)
|
|
|
|
|
|
# Version
|
|
set (project_VERSION_MAJOR "0")
|
|
set (project_VERSION_MINOR "0")
|
|
set (project_VERSION_PATCH "1")
|
|
|
|
set (project_VERSION "${project_VERSION_MAJOR}")
|
|
set (project_VERSION "${project_VERSION}.${project_VERSION_MINOR}")
|
|
set (project_VERSION "${project_VERSION}.${project_VERSION_PATCH}")
|
|
|
|
# For custom modules
|
|
set (CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
|
|
|
|
# Gather package information
|
|
find_package (GTK2 2.12 REQUIRED gtk)
|
|
|
|
# Test this machine
|
|
include (CheckCSourceCompiles)
|
|
|
|
CHECK_C_SOURCE_COMPILES (
|
|
"typedef struct abc *d;
|
|
int test (d __restrict x);
|
|
int main (void) {return 0;}"
|
|
HAVE_SANE___RESTRICT)
|
|
|
|
CHECK_C_SOURCE_COMPILES (
|
|
"int test (void *restrict x);
|
|
int main (void) {return 0;}"
|
|
HAVE_RESTRICT)
|
|
|
|
include (CheckFunctionExists)
|
|
|
|
CHECK_FUNCTION_EXISTS ("strtok_r" HAVE_STRTOK_R)
|
|
CHECK_FUNCTION_EXISTS ("strtok_s" HAVE_STRTOK_S)
|
|
|
|
if (WIN32)
|
|
set (HAVE_THREADSAFE_STRTOK true)
|
|
endif (WIN32)
|
|
|
|
|
|
# Dependencies
|
|
find_package (Lua51 REQUIRED)
|
|
find_package (JsonGlib REQUIRED)
|
|
|
|
# Localization
|
|
find_package (Gettext)
|
|
if (GETTEXT_FOUND)
|
|
set (HAVE_GETTEXT true)
|
|
file (GLOB project_TRANSLATIONS ${CMAKE_CURRENT_SOURCE_DIR}/po/*.po)
|
|
GETTEXT_CREATE_TRANSLATIONS (
|
|
${CMAKE_CURRENT_SOURCE_DIR}/po/${PROJECT_NAME}.pot
|
|
ALL ${project_TRANSLATIONS})
|
|
endif (GETTEXT_FOUND)
|
|
|
|
# Documentation
|
|
# TODO: Pregenerated docs
|
|
|
|
#set (GTK_DOC_ENABLE OFF CACHE BOOL
|
|
# "Use gtk-doc to build documentation")
|
|
#set (GTK_DOC_ENABLE_HTML ON CACHE BOOL
|
|
# "Build documentation in HTML format")
|
|
|
|
find_package (GtkDoc)
|
|
set (project_DOC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/docs/reference")
|
|
|
|
# Project source files
|
|
set (liblogdiag_SOURCES
|
|
liblogdiag/ld-marshal.c
|
|
liblogdiag/ld-types.c
|
|
liblogdiag/ld-diagram.c
|
|
liblogdiag/ld-diagram-object.c
|
|
liblogdiag/ld-diagram-symbol.c
|
|
liblogdiag/ld-canvas.c
|
|
liblogdiag/ld-library.c
|
|
liblogdiag/ld-symbol-category.c
|
|
liblogdiag/ld-symbol.c
|
|
liblogdiag/ld-lua.c
|
|
liblogdiag/ld-lua-symbol.c)
|
|
set (liblogdiag_HEADERS
|
|
${CMAKE_CURRENT_BINARY_DIR}/config.h
|
|
liblogdiag/liblogdiag.h
|
|
liblogdiag/ld-marshal.h
|
|
liblogdiag/ld-types.h
|
|
liblogdiag/ld-diagram.h
|
|
liblogdiag/ld-diagram-object.h
|
|
liblogdiag/ld-diagram-symbol.h
|
|
liblogdiag/ld-canvas.h
|
|
liblogdiag/ld-library.h
|
|
liblogdiag/ld-symbol-category.h
|
|
liblogdiag/ld-symbol.h
|
|
liblogdiag/ld-lua.h
|
|
liblogdiag/ld-lua-private.h
|
|
liblogdiag/ld-lua-symbol.h
|
|
liblogdiag/ld-lua-symbol-private.h)
|
|
|
|
set (logdiag_SOURCES
|
|
src/ld-window-main.c
|
|
src/logdiag.c)
|
|
set (logdiag_HEADERS
|
|
${liblogdiag_HEADERS}
|
|
src/ld-window-main.h)
|
|
|
|
# Generate a configure file
|
|
configure_file (${CMAKE_CURRENT_SOURCE_DIR}/config.h.in
|
|
${CMAKE_CURRENT_BINARY_DIR}/config.h)
|
|
include_directories (${CMAKE_CURRENT_BINARY_DIR})
|
|
|
|
# Generate marshallers
|
|
function (glib_genmarshal base prefix)
|
|
find_program (GLIB_GENMARSHAL_EXECUTABLE glib-genmarshal)
|
|
|
|
if (GLIB_GENMARSHAL_EXECUTABLE)
|
|
get_filename_component (base_path "${base}" PATH)
|
|
get_filename_component (base_name "${base}" NAME)
|
|
set (command_base ${GLIB_GENMARSHAL_EXECUTABLE}
|
|
--prefix ${prefix} "${base_name}.list")
|
|
|
|
# On Windows, the final makefile may contain:
|
|
# cd e:\abc && ...
|
|
# That won't actually change the directory. We have to do:
|
|
# cd e:\abc && e: && ...
|
|
if (WIN32 AND "${base_path}" MATCHES "^.:[/\\\\]")
|
|
string (SUBSTRING "${base_path}" 0 2 base_drive)
|
|
set (command_base "${base_drive}" && "${command_base}")
|
|
endif (WIN32 AND "${base_path}" MATCHES "^.:[/\\\\]")
|
|
|
|
# NOTE: VERBATIM would cause problems, so it is not used here
|
|
add_custom_command (OUTPUT ${base}.c
|
|
COMMAND ${command_base} --body > "${base_name}.c"
|
|
DEPENDS "${base}.list"
|
|
WORKING_DIRECTORY "${base_path}"
|
|
COMMENT "Generating marshallers source file")
|
|
add_custom_command (OUTPUT ${base}.h
|
|
COMMAND ${command_base} --header > "${base_name}.h"
|
|
DEPENDS "${base}.list"
|
|
WORKING_DIRECTORY "${base_path}"
|
|
COMMENT "Generating marshallers header file")
|
|
else (GLIB_GENMARSHAL_EXECUTABLE)
|
|
message (WARNING "glib-genmarshal is not present on this system")
|
|
endif (GLIB_GENMARSHAL_EXECUTABLE)
|
|
endfunction (glib_genmarshal)
|
|
|
|
glib_genmarshal (${CMAKE_CURRENT_SOURCE_DIR}/liblogdiag/ld-marshal
|
|
g_cclosure_user_marshal)
|
|
|
|
include_directories (${CMAKE_CURRENT_SOURCE_DIR}/liblogdiag)
|
|
include_directories (${GTK2_INCLUDE_DIRS} ${JSON_GLIB_INCLUDE_DIRS} ${LUA_INCLUDE_DIR})
|
|
|
|
# Build the library
|
|
add_library (liblogdiag STATIC ${liblogdiag_SOURCES} ${liblogdiag_HEADERS})
|
|
set_target_properties (liblogdiag PROPERTIES OUTPUT_NAME logdiag)
|
|
|
|
# Build the executable
|
|
add_executable (logdiag ${logdiag_SOURCES} ${logdiag_HEADERS})
|
|
target_link_libraries (logdiag liblogdiag ${GTK2_LIBRARIES} ${JSON_GLIB_LIBRARIES} ${LUA_LIBRARIES})
|
|
|
|
# Generate documentation
|
|
if (GTK_DOC_FOUND)
|
|
GTK_DOC_RUN (WORKING_DIR ${project_DOC_DIR}
|
|
SOURCE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/liblogdiag
|
|
XML ${project_DOC_DIR}/xml --sgml-mode
|
|
HTML ${project_DOC_DIR}/html)
|
|
endif (GTK_DOC_FOUND)
|
|
|
|
# Installation
|
|
install (TARGETS logdiag DESTINATION bin)
|
|
|
|
if (NOT WIN32)
|
|
install (FILES share/logdiag.desktop DESTINATION share/applications)
|
|
install (DIRECTORY "${project_DOC_DIR}/html/"
|
|
DESTINATION usr/gtk-doc/${CMAKE_PROJECT_NAME})
|
|
endif (NOT WIN32)
|
|
|
|
# CPack
|
|
set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "Electric diagram designer.")
|
|
set (CPACK_PACKAGE_VENDOR "Přemysl Janouch")
|
|
set (CPACK_PACKAGE_CONTACT "p.janouch@gmail.com")
|
|
set (CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
|
|
set (CPACK_PACKAGE_VERSION_MAJOR ${project_VERSION_MAJOR})
|
|
set (CPACK_PACKAGE_VERSION_MINOR ${project_VERSION_MINOR})
|
|
set (CPACK_PACKAGE_VERSION_PATCH ${project_VERSION_PATCH})
|
|
set (CPACK_GENERATOR "TGZ;ZIP")
|
|
set (CPACK_PACKAGE_FILE_NAME
|
|
"${PROJECT_NAME}-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
|
|
set (CPACK_PACKAGE_INSTALL_DIRECTORY
|
|
"${PROJECT_NAME}-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}")
|
|
set (CPACK_SOURCE_GENERATOR "TGZ;ZIP")
|
|
set (CPACK_SOURCE_IGNORE_FILES "/build;/.svn;/.git")
|
|
set (CPACK_SOURCE_PACKAGE_FILE_NAME
|
|
"${PROJECT_NAME}-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}")
|
|
|
|
include (CPack)
|
|
|