cmake: EFL_OPTION() now supports DEPENDS to handle conditionals.

This is now used by ENABLE_SYSTEMD and ENABLE_VALGRIND, which moves to
"common.cmake" since they are shared among multiple libraries.

With that I found that LINK_FLAGS is indeed a string, not a CMake List
(space separated, not ";"), then fix that so compilation actually works.
This commit is contained in:
Gustavo Sverzut Barbieri 2017-01-25 14:50:04 -02:00
parent 4d21d6c56a
commit fd8865d0d0
4 changed files with 114 additions and 34 deletions

View File

@ -6,6 +6,15 @@ include(CTest)
find_package(Threads REQUIRED)
pkg_check_modules(CHECK check)
pkg_check_modules(LIBSYSTEMD libsystemd)
pkg_check_modules(VALGRIND valgrind)
set(SUGGEST_VALGRIND OFF)
if("${BUILD_PROFILE}" STREQUAL "dev")
set(SUGGEST_VALGRIND ${VALGRIND_FOUND})
elseif("${BUILD_PROFILE}" STREQUAL "debug")
set(SUGGEST_VALGRIND ${VALGRIND_FOUND})
endif()
EFL_OPTION(BUILD_PROFILE "How to build EFL" dev CHOICE release;dev;debug)
EFL_OPTION(EFL_NOLEGACY_API_SUPPORT "Whenever to disable non-Eo (Legacy) APIs" ON)
@ -14,7 +23,8 @@ if(NOT EFL_EO_API_SUPPORT)
EFL_OPTION_SET_MESSAGE(EFL_EO_API_SUPPORT "Risky!")
endif()
EFL_OPTION(ENABLE_SYSTEMD "Enable systemd support" "${LIBSYSTEMD_FOUND}" DEPENDS "LIBSYSTEMD_FOUND" OFF)
EFL_OPTION(ENABLE_VALGRIND "Enable valgrind support" "${SUGGEST_VALGRIND}" DEPENDS "VALGRIND_FOUND" OFF)
# BEGIN: HEADER, TYPE and FUNCTION CHECKS
# KEEP EACH BLOCK SORTED
@ -64,6 +74,9 @@ if(CMAKE_THREAD_LIBS_INIT)
endif()
CHECK_APPEND_DEFINE(EFL_HAVE_THREADS "${EFL_HAVE_THREADS}")
CHECK_APPEND_DEFINE(HAVE_SYSTEMD ${ENABLE_SYSTEMD})
CHECK_APPEND_DEFINE(HAVE_VALGRIND ${ENABLE_VALGRIND})
CHECK_APPEND_DEFINE(MODULE_ARCH "\"v-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}\"")
CHECK_APPEND_DEFINE(SHARED_LIB_SUFFIX "\"${CMAKE_SHARED_LIBRARY_SUFFIX}\"")
CHECK_APPEND_DEFINE(EXEEXT "\"${CMAKE_EXECUTABLE_SUFFIX}\"")

View File

@ -1,19 +1,14 @@
pkg_check_modules(VALGRIND valgrind)
# set default option values based on BUILD_PROFILE
set(EINA_DEBUG_THREADS OFF)
set(ENABLE_VALGRIND OFF)
if("${BUILD_PROFILE}" STREQUAL "dev")
set(ENABLE_VALGRIND ${VALGRIND_FOUND})
elseif("${BUILD_PROFILE}" STREQUAL "debug")
set(EINA_DEBUG_THREADS ON)
set(ENABLE_VALGRIND ${VALGRIND_FOUND})
elseif("${BUILD_PROFILE}" STREQUAL "release")
endif()
EFL_OPTION(EINA_MAGIC_DEBUG "magic debug of eina structure" ON)
EFL_OPTION(EINA_DEBUG_THREADS "debugging of eina threads" ${EINA_DEBUG_THREADS})
EFL_OPTION(ENABLE_VALGRIND "valgrind support" ${ENABLE_VALGRIND})
set(EINA_MODULE_TYPE_MP_CHAINED_POOL_DEFAULT "STATIC")
set(EINA_MODULE_TYPE_MP_ONE_BIG_DEFAULT "STATIC")
@ -23,9 +18,6 @@ set(EINA_MODULE_TYPE_MP_PASS_THROUGH_DEFAULT "STATIC")
# HEADER_CHECK() and TYPE_CHECK() goes to src/lib/efl/config_gen.h
if(ENABLE_VALGRIND)
if(NOT VALGRIND_FOUND)
message(FATAL_ERROR "Valgrind was required but not found!")
endif()
CHECK_APPEND_DEFINE(NVALGRIND "")
else()
CHECK_APPEND_DEFINE(NVALGRIND 1)

View File

@ -28,7 +28,9 @@ unset(EFL_ALL_LIBS CACHE)
unset(EFL_ALL_TESTS CACHE)
unset(EFL_PKG_CONFIG_MISSING_OPTIONAL CACHE)
# EFL_OPTION(Name Help Default)
# EFL_OPTION(Name Help Default [STRING|BOOL|FILEPATH|PATH]
# [CHOICE c1;...;cN]
# [DEPENDS "COND1; COND2; NOT COND3" FAILED_VALUE])
#
# Declare an option() that will be automatically printed by
# EFL_OPTIONS_SUMMARY()
@ -36,33 +38,84 @@ unset(EFL_PKG_CONFIG_MISSING_OPTIONAL CACHE)
# To extend the EFL_OPTIONS_SUMMARY() message, use
# EFL_OPTION_SET_MESSAGE(Name Message)
function(EFL_OPTION _name _help _defval)
cmake_parse_arguments(PARAMS "" "" "CHOICE;DEPENDS" ${ARGN})
set(_type)
set(_vartype)
set(_choices)
list(LENGTH ARGN _argc)
list(LENGTH PARAMS_UNPARSED_ARGUMENTS _argc)
if(_argc LESS 1)
set(_type BOOL)
set(_vartype BOOL)
else()
list(GET ARGN 0 _type)
list(GET PARAMS_UNPARSED_ARGUMENTS 0 _type)
set(_vartype ${_type})
list(REMOVE_AT ARGN 0)
list(REMOVE_AT PARAMS_UNPARSED_ARGUMENTS 0)
endif()
if(${_vartype} STREQUAL "CHOICE")
set(_type STRING)
SET_GLOBAL(EFL_OPTION_CHOICES_${_name} "${ARGN}" "Possible values for ${_name}")
set(_choices " (Choices: ${ARGN})")
if(PARAMS_CHOICE)
set(_type CHOICE)
set(_vartype STRING)
SET_GLOBAL(EFL_OPTION_CHOICES_${_name} "${PARAMS_CHOICE}" "Possible values for ${_name}")
set(_choices " (Choices: ${PARAMS_CHOICE})")
endif()
if(_type STREQUAL "BOOL")
# force ON/OFF representation
if(_defval)
set(_defval ON)
else()
set(_defval OFF)
endif()
endif()
LIST_APPEND_GLOBAL(EFL_ALL_OPTIONS ${_name})
SET_GLOBAL(EFL_OPTION_DEFAULT_${_name} "${_defval}" "Default value for ${_name}")
SET_GLOBAL(EFL_OPTION_TYPE_${_name} "${_vartype}" "Type of ${_name}")
set(${_name} ${_defval} CACHE ${_type} "${_help}${_choices}")
option(${_name} "${_help}${_choices}" ${_defval})
set(_available ON)
if(PARAMS_DEPENDS)
list(LENGTH PARAMS_DEPENDS _count)
list(GET PARAMS_DEPENDS 0 _deps)
list(GET PARAMS_DEPENDS 1 _deps_failure_value)
if(_deps_failure_value STREQUAL "NOTFOUND")
message(FATAL_ERROR "EFL_OPTION(${_name}) has DEPENDS but no value when dependencies fail")
endif()
set(_missing_deps "")
foreach(_d ${_deps})
if(${_d})
else()
set(_available OFF)
list(APPEND _missing_deps "${_d}")
endif()
endforeach()
endif()
if(_available)
if(DEFINED EFL_OPTION_ORIGINAL_VALUE_${_name})
set(${_name} ${EFL_OPTION_ORIGINAL_VALUE_${_name}} CACHE ${_type} "${_help}${_choices}" FORCE)
unset(EFL_OPTION_ORIGINAL_VALUE_${_name} CACHE)
else()
set(${_name} ${_defval} CACHE ${_type} "${_help}${_choices}")
endif()
unset(EFL_OPTION_DEPENDS_MISSING_${_name} CACHE)
option(${_name} "${_help}${_choices}" "${${_name}}")
else()
if(NOT DEFINED EFL_OPTION_ORIGINAL_VALUE_${_name})
if(DEFINED ${_name})
SET_GLOBAL(EFL_OPTION_ORIGINAL_VALUE_${_name} "${${_name}}")
endif()
endif()
SET_GLOBAL(EFL_OPTION_DEPENDS_MISSING_${_name} "${_missing_deps}")
set(${_name} "${_deps_failure_value}" CACHE "${_type}" "Missing dependencies (${_help}${_choices})" FORCE)
endif()
if(_choices)
list(FIND ARGN "${${_name}}" _ret)
list(FIND PARAMS_CHOICE "${${_name}}" _ret)
if(${_ret} EQUAL -1)
message(FATAL_ERROR "Invalid choice ${_name}=${${_name}}${_choices}")
endif()
@ -86,7 +139,9 @@ function(EFL_OPTIONS_SUMMARY)
foreach(_o ${EFL_ALL_OPTIONS})
set(_v ${${_o}})
set(_d ${EFL_OPTION_DEFAULT_${_o}})
if("${_v}" STREQUAL "${_d}")
if(EFL_OPTION_DEPENDS_MISSING_${_o})
set(_i "requires: ${EFL_OPTION_DEPENDS_MISSING_${_o}}, was: ${EFL_OPTION_ORIGINAL_VALUE_${_o}}")
elseif("${_v}" STREQUAL "${_d}")
set(_i "default")
else()
set(_i "default: ${_d}")
@ -737,10 +792,15 @@ function(EFL_LIB _target)
EFL_PKG_CONFIG_EVAL(${_target} "${PKG_CONFIG_REQUIRES_PRIVATE}" "${PKG_CONFIG_REQUIRES}")
set(_link_flags ${${_target}_PKG_CONFIG_REQUIRES_PRIVATE_LDFLAGS} ${${_target}_PKG_CONFIG_REQUIRES_LDFLAGS})
set(__link_flags ${${_target}_PKG_CONFIG_REQUIRES_PRIVATE_LDFLAGS} ${${_target}_PKG_CONFIG_REQUIRES_LDFLAGS})
set(__compile_flags ${${_target}_PKG_CONFIG_REQUIRES_PRIVATE_CFLAGS} ${${_target}_PKG_CONFIG_REQUIRES_CFLAGS} -DPACKAGE_DATA_DIR=\\"${CMAKE_INSTALL_FULL_DATADIR}/${_target}/\\")
set(_link_flags)
foreach(_l ${__link_flags})
set(_link_flags "${_link_flags} ${_l}")
endforeach()
set(_compile_flags)
# CMake uses string for COMPILE_FLAGS but list for LINK_FLAGS... :-/
foreach(_c ${__compile_flags})
set(_compile_flags "${_compile_flags} ${_c}")
endforeach()
@ -931,14 +991,18 @@ function(EFL_BIN _binname)
set_target_properties(${_bintarget} PROPERTIES OUTPUT_NAME ${OUTPUT_NAME})
endif()
# CMake uses string for COMPILE_FLAGS but list for LINK_FLAGS... :-/
set(_link_flags)
foreach(_l ${${_bintarget}_PKG_CONFIG_REQUIRES_PRIVATE_LDFLAGS})
set(_link_flags "${_link_flags} ${_l}")
endforeach()
set(_compile_flags)
foreach(_c ${${_bintarget}_PKG_CONFIG_REQUIRES_PRIVATE_CFLAGS})
set(_compile_flags "${_compile_flags} ${_c}")
endforeach()
set_target_properties(${_bintarget} PROPERTIES
LINK_FLAGS "${${_bintarget}_PKG_CONFIG_REQUIRES_PRIVATE_LDFLAGS}"
LINK_FLAGS "${_link_flags}"
COMPILE_FLAGS "${_compile_flags}")
if(INSTALL_DIR)
@ -1049,14 +1113,18 @@ function(EFL_TEST _testname)
set_target_properties(${_testtarget} PROPERTIES OUTPUT_NAME ${OUTPUT_NAME})
endif()
# CMake uses string for COMPILE_FLAGS but list for LINK_FLAGS... :-/
set(_link_flags)
foreach(_l ${${_testtarget}_PKG_CONFIG_REQUIRES_PRIVATE_LDFLAGS})
set(_link_flags "${_link_flags} ${_l}")
endforeach()
set(_compile_flags)
foreach(_c ${${_testtarget}_PKG_CONFIG_REQUIRES_PRIVATE_CFLAGS})
set(_compile_flags "${_compile_flags} ${_c}")
endforeach()
set_target_properties(${_testtarget} PROPERTIES
LINK_FLAGS "${${_testtarget}_PKG_CONFIG_REQUIRES_PRIVATE_LDFLAGS}"
LINK_FLAGS "${_link_flags}"
COMPILE_FLAGS "${_compile_flags}"
LIBRARY_OUTPUT_DIRECTORY "${_testbindir}"
RUNTIME_OUTPUT_DIRECTORY "${_testbindir}")
@ -1167,14 +1235,18 @@ function(EFL_MODULE _modname)
target_compile_definitions(${_modtarget} PRIVATE ${DEFINITIONS})
# CMake uses string for COMPILE_FLAGS but list for LINK_FLAGS... :-/
set(_link_flags)
foreach(_l ${${_modtarget}_PKG_CONFIG_REQUIRES_PRIVATE_LDFLAGS})
set(_link_flags "${_link_flags} ${_l}")
endforeach()
set(_compile_flags)
foreach(_c ${${_modtarget}_PKG_CONFIG_REQUIRES_PRIVATE_CFLAGS})
set(_compile_flags "${_compile_flags} ${_c}")
endforeach()
set_target_properties(${_modtarget} PROPERTIES
LINK_FLAGS "${${_modtarget}_PKG_CONFIG_REQUIRES_PRIVATE_LDFLAGS}"
LINK_FLAGS "${_link_flags}"
COMPILE_FLAGS "${_compile_flags}"
LIBRARY_OUTPUT_DIRECTORY "${_modoutdir}"
ARCHIVE_OUTPUT_DIRECTORY "${_modoutdir}"

View File

@ -1,5 +1,12 @@
set(DESCRIPTION "A Library that implements fast data types and miscellaneous tools")
set(PKG_CONFIG_REQUIRES_PRIVATE OPTIONAL libsystemd)
if(ENABLE_SYSTEMD)
list(APPEND PKG_CONFIG_REQUIRES_PRIVATE libsystemd)
endif()
if(ENABLE_VALGRIND)
list(APPEND PKG_CONFIG_REQUIRES_PRIVATE valgrind)
endif()
set(PUBLIC_LIBRARIES
pthread
@ -11,10 +18,6 @@ set(LIBRARIES
rt
)
if(ENABLE_VALGRIND)
list(APPEND PKG_CONFIG_REQUIRES_PRIVATE valgrind)
endif()
set(PUBLIC_HEADERS
Eina.h
eina_accessor.h