CMake: infra to build modules (static, on or off).
authorGustavo Sverzut Barbieri <barbieri@profusion.mobi>
Thu, 19 Jan 2017 22:49:44 +0000 (20:49 -0200)
committerMarcel Hollerbach <marcel-hollerbach@t-online.de>
Mon, 23 Jan 2017 17:23:40 +0000 (18:23 +0100)
cmake/config/common.cmake
cmake/config/eina.cmake
cmake/helpers/EflMacros.cmake
src/lib/efl/config.h.cmake
src/modules/eina/CMakeLists.txt [deleted file]
src/modules/eina/mp/chained_pool/CMakeLists.txt [new file with mode: 0644]
src/modules/eina/mp/one_big/CMakeLists.txt [new file with mode: 0644]
src/modules/eina/mp/pass_through/CMakeLists.txt [new file with mode: 0644]

index f411662..adb0bce 100644 (file)
@@ -16,12 +16,7 @@ set(VREV ${PROJECT_VERSION_TWEAK})
 set(EFL_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
 set(EFL_VERSION_MINOR ${PROJECT_VERSION_MINOR})
 
-set(BUILD_ALL_PROFILES release dev debug)
-EFL_OPTION(BUILD_PROFILE "How to build EFL (one of: ${BUILD_ALL_PROFILES})" "release" STRING)
-list(FIND BUILD_ALL_PROFILES ${BUILD_PROFILE} RET)
-if (${RET} EQUAL -1)
-  message(FATAL_ERROR "Unknown BUILD_PROFILE=${BUILD_PROFILE}")
-endif()
+EFL_OPTION(BUILD_PROFILE "How to build EFL" release CHOICE release;dev;debug)
 
 EFL_OPTION(EFL_NOLEGACY_API_SUPPORT "Whenever to disable non-Eo (Legacy) APIs" ON)
 EFL_OPTION(EFL_EO_API_SUPPORT "Whenever to enable new Eo APIs" ON)
index 3614880..20f9a12 100644 (file)
@@ -19,6 +19,19 @@ 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(VALGRIND "valgrind support" ${VALGRIND})
 
+EFL_OPTION(EINA_BUILD_CHAINED "Build Eina's chained mempool" "ON" CHOICE ON;OFF;STATIC)
+EFL_OPTION(EINA_BUILD_ONE_BIG "Build Eina's one-big mempool" "ON" CHOICE ON;OFF;STATIC)
+EFL_OPTION(EINA_BUILD_PASS_THROUGH "Build Eina's pass-through mempool" "STATIC" CHOICE ON;OFF;STATIC)
+
+if(EINA_BUILD_CHAINED STREQUAL "STATIC")
+  set(EINA_STATIC_BUILD_CHAINED_POOL 1)
+endif()
+if(EINA_BUILD_ONE_BIG STREQUAL "STATIC")
+  set(EINA_STATIC_BUILD_ONE_BIG 1)
+endif()
+if(EINA_BUILD_PASS_THROUGH STREQUAL "STATIC")
+  set(EINA_STATIC_BUILD_PASS_THROUGH 1)
+endif()
 
 #check for symbols in pthread
 #TODO Make the definitions depending on the platform
index cb5d3e5..9ae80aa 100644 (file)
@@ -6,16 +6,38 @@
 # To extend the EFL_OPTIONS_SUMMARY() message, use
 # EFL_OPTION_SET_MESSAGE(Name Message)
 macro(EFL_OPTION _name _help _defval)
-  set(_type ${ARGN})
-  if(NOT _type)
+  set(_extra_args ${ARGN})
+  set(_type)
+  set(_choices)
+  list(LENGTH _extra_args _argc)
+  if(_argc LESS 1)
     set(_type BOOL)
+  else()
+    list(GET _extra_args 0 _type)
+    list(REMOVE_AT _extra_args 0)
+  endif()
+  if(${_type} STREQUAL "CHOICE")
+    set(_type STRING)
+    set(EFL_OPTION_CHOICES_${_name} ${_extra_args})
+    set(_choices " (Choices: ${_extra_args})")
   endif()
   list(APPEND EFL_ALL_OPTIONS ${_name})
   set(EFL_OPTION_DEFAULT_${_name} "${_defval}")
   set(EFL_OPTION_TYPE_${_name} "${_type}")
-  set(${_name} ${_defval} CACHE ${_type} "${_help}")
-  option(${_name} "${_help}" ${_defval})
+  set(${_name} ${_defval} CACHE ${_type} "${_help}${_choices}")
+  option(${_name} "${_help}${_choices}" ${_defval})
+
+  if(_extra_args)
+    list(FIND _extra_args ${${_name}} RET)
+    if(${RET} EQUAL -1)
+      message(FATAL_ERROR "Invalid choice ${_name}=${${_name}}${_choices}")
+    endif()
+  endif()
+
   unset(_type)
+  unset(_choices)
+  unset(_extra_args)
+  unset(_argc)
 endmacro()
 
 # EFL_OPTION_SET_MESSAGE(Name Message)
@@ -32,7 +54,6 @@ function(EFL_OPTIONS_SUMMARY)
   message(STATUS "EFL Options Summary:")
   message(STATUS "  CMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}")
   message(STATUS "  CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}")
-  message(STATUS "  BUILD_PROFILE=${BUILD_PROFILE}")
   foreach(_o ${EFL_ALL_OPTIONS})
     set(_v ${${_o}})
     set(_d ${EFL_OPTION_DEFAULT_${_o}})
@@ -46,6 +67,19 @@ function(EFL_OPTIONS_SUMMARY)
     endif()
     message(STATUS "  ${_o}=${_v} (${_i})${_m}")
   endforeach()
+  message(STATUS "EFL Libraries:")
+  foreach(_o ${EFL_ALL_LIBS})
+    message(STATUS "  ${_o}${_mods}")
+    foreach(_m ${${_o}_MODULES})
+      string(REGEX REPLACE "^${_o}-module-" "" _m ${_m})
+      message(STATUS "    dynamic: ${_m}")
+    endforeach()
+    foreach(_m ${${_o}_STATIC_MODULES})
+      string(REGEX REPLACE "^${_o}-module-" "" _m ${_m})
+      message(STATUS "    static.: ${_m}")
+    endforeach()
+    unset(_m)
+  endforeach()
 endfunction()
 
 set(EFL_ALL_LIBS)
@@ -158,9 +192,34 @@ macro(EFL_LIB _target)
     ARCHIVE DESTINATION lib
     LIBRARY DESTINATION lib)
 
+  file(GLOB modules RELATIVE ${EFL_MODULES_SOURCE_DIR} ${EFL_MODULES_SOURCE_DIR}/*)
+  foreach(module ${modules})
+    if(IS_DIRECTORY ${EFL_MODULES_SOURCE_DIR}/${module})
+      set(EFL_MODULE_SCOPE ${module})
+
+      include(${EFL_MODULES_SOURCE_DIR}/${module}/CMakeLists.txt OPTIONAL)
+
+      file(GLOB submodules RELATIVE ${EFL_MODULES_SOURCE_DIR}/${EFL_MODULE_SCOPE} ${EFL_MODULES_SOURCE_DIR}/${EFL_MODULE_SCOPE}/*)
+      foreach(submodule ${submodules})
+        if(IS_DIRECTORY ${EFL_MODULES_SOURCE_DIR}/${EFL_MODULE_SCOPE}/${submodule})
+          EFL_MODULE(${submodule})
+        endif()
+        unset(submodule)
+        unset(submodules)
+      endforeach()
+    else()
+      set(EFL_MODULE_SCOPE)
+      EFL_MODULE(${module})
+    endif()
+    unset(EFL_MODULE_SCOPE)
+  endforeach()
+  unset(module)
+  unset(modules)
+
   foreach(t ${${_target}_TESTS})
     EFL_TEST(${t})
   endforeach()
+  unset(t)
   add_custom_target(${_target}-tests DEPENDS ${${_target}_TESTS})
   add_custom_target(${_target}-modules DEPENDS ${${_target}_MODULES})
   list(APPEND EFL_ALL_LIBS ${_target})
@@ -220,13 +279,15 @@ function(EFL_TEST _testname)
       list(APPEND _deps "${EFL_TESTS_BINARY_DIR}/${f}")
     endif()
   endforeach()
-  # TODO: depend on modules!
+  add_dependencies(${_testname} ${EFL_LIB_CURRENT}-modules)
   set_target_properties(${_testname} PROPERTIES OBJECT_DEPENDS "${_deps}")
-  message(STATUS "${_testname} ${_deps}")
 
-  target_include_directories(${_testname} SYSTEM PUBLIC
+  target_include_directories(${_testname} PRIVATE
     ${EFL_TESTS_SOURCE_DIR}
     ${EFL_TESTS_BINARY_DIR}
+    ${${_testname}_INCLUDE_DIRECTORIES})
+  target_include_directories(${_testname} SYSTEM PRIVATE
+    ${${_testname}_SYSTEM_INCLUDE_DIRECTORIES}
     ${CHECK_INCLUDE_DIRS})
   target_link_libraries(${_testname}
     ${EFL_LIB_CURRENT}
@@ -251,3 +312,118 @@ function(EFL_TEST _testname)
 
   add_test(NAME ${_testname} COMMAND ${_testname})
 endfunction()
+
+# EFL_MODULE(Name)
+#
+# Adds a module for ${EFL_LIB_CURRENT} using
+# ${EFL_MODULES_SOURCE_DIR} and ${EFL_MODULES_BINARY_DIR}
+# as well as ${EFL_MODULE_SCOPE} if it's contained into
+# a subdir, such as eina's "mp" or evas "engines".
+#
+# To keep it simple to use, user is only expected to define variables:
+#  - SOURCES
+#  - DEPENDENCIES
+#  - LIBRARIES
+#  - INCLUDE_DIRECTORIES
+#  - SYSTEM_INCLUDE_DIRECTORIES
+#  - DEFINITIONS
+#
+# NOTE: since the file will be included it shouldn't mess with global variables!
+function(EFL_MODULE _modname)
+  if(EFL_MODULE_SCOPE)
+    set(_modsrcdir ${EFL_MODULES_SOURCE_DIR}/${EFL_MODULE_SCOPE}/${_modname})
+  else()
+    set(_modsrcdir ${EFL_MODULES_SOURCE_DIR}/${_modname})
+  endif()
+
+  set(SOURCES)
+  set(DEPENDENCIES)
+  set(LIBRARIES)
+  set(INCLUDE_DIRECTORIES)
+  set(SYSTEM_INCLUDE_DIRECTORIES)
+  set(DEFINITIONS)
+  set(MODULE_TYPE "ON")
+
+  include(${_modsrcdir}/CMakeLists.txt)
+
+  if(NOT SOURCES)
+    message(WARNING "${_modsrcdir}/CMakeLists.txt defines no SOURCES")
+    return()
+  endif()
+
+  if(EFL_MODULE_SCOPE)
+    set(_modbindir ${EFL_MODULES_BINARY_DIR}/${EFL_MODULE_SCOPE}/${_modname})
+    set(_modtarget ${EFL_LIB_CURRENT}-module-${EFL_MODULE_SCOPE}-${_modname})
+    set(_modoutdir ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${EFL_LIB_CURRENT}/modules/${EFL_MODULE_SCOPE}/${_modname}/v-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR})
+  else()
+    set(_modbindir ${EFL_MODULES_BINARY_DIR}/${_modname})
+    set(_modtarget ${EFL_LIB_CURRENT}-module-${_modname})
+    set(_modoutdir ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${EFL_LIB_CURRENT}/modules/${_modname}/v-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR})
+  endif()
+
+  if("${MODULE_TYPE}" STREQUAL "OFF")
+    message(WARNING "${_modsrcdir} disabled")
+    return()
+  elseif("${MODULE_TYPE}" STREQUAL "STATIC")
+    set(_modtype STATIC)
+  else()
+    set(_modtype MODULE)
+  endif()
+
+  set(_sources "")
+  foreach(f ${SOURCES})
+    if(EXISTS "${_modsrcdir}/${f}")
+      list(APPEND _sources "${_modsrcdir}/${f}")
+    else()
+      list(APPEND _sources "${_modbindir}/${f}")
+    endif()
+  endforeach()
+
+  set(_deps "")
+  foreach(f ${DEPENDENCIES})
+    if(EXISTS "${_modsrcdir}/${f}")
+      list(APPEND _deps "${_modsrcdir}/${f}")
+    else()
+      list(APPEND _deps "${_modbindir}/${f}")
+    endif()
+  endforeach()
+
+  add_library(${_modtarget} ${_modtype} ${_sources})
+  set_target_properties(${_modtarget} PROPERTIES
+    OBJECT_DEPENDS "${_deps}"
+    PREFIX ""
+    OUTPUT_NAME "module")
+
+  target_include_directories(${_modtarget} PRIVATE
+    ${_modsrcdir}
+    ${_modbindir}
+    ${INCLUDE_DIRECTORIES})
+  target_include_directories(${_modtarget} SYSTEM PUBLIC
+    ${SYSTEM_INCLUDE_DIRECTORIES})
+  target_link_libraries(${_modtarget} ${LIBRARIES})
+
+  target_compile_definitions(${_modtarget} PRIVATE ${DEFINITIONS})
+
+  set_target_properties(${_modtarget} PROPERTIES
+    LIBRARY_OUTPUT_DIRECTORY "${_modoutdir}"
+    ARCHIVE_OUTPUT_DIRECTORY "${_modoutdir}"
+    RUNTIME_OUTPUT_DIRECTORY "${_modoutdir}")
+
+  if("${MODULE_TYPE}" STREQUAL "STATIC")
+    target_link_libraries(${EFL_LIB_CURRENT} ${_modtarget})
+    target_include_directories(${_modtarget} PRIVATE
+      ${EFL_LIB_SOURCE_DIR}
+      ${EFL_LIB_BINARY_DIR})
+    set_target_properties(${_modtarget} PROPERTIES
+      POSITION_INDEPENDENT_CODE TRUE)
+
+    set(_all_mods ${${EFL_LIB_CURRENT}_STATIC_MODULES})
+    list(APPEND _all_mods ${_modtarget})
+    set(${EFL_LIB_CURRENT}_STATIC_MODULES ${_all_mods} PARENT_SCOPE)
+  else()
+    set(_all_mods ${${EFL_LIB_CURRENT}_MODULES})
+    list(APPEND _all_mods ${_modtarget})
+    set(${EFL_LIB_CURRENT}_MODULES ${_all_mods} PARENT_SCOPE)
+    target_link_libraries(${_modtarget} ${EFL_LIB_CURRENT})
+  endif()
+endfunction()
index 4cd524a..277a78d 100644 (file)
 #cmakedefine NVALGRIND 1
 #cmakedefine HAVE_CLOCK_GETTIME 1
 
+#cmakedefine EINA_STATIC_BUILD_CHAINED_POOL 1
+#cmakedefine EINA_STATIC_BUILD_ONE_BIG 1
+#cmakedefine EINA_STATIC_BUILD_PASS_THROUGH 1
+
 #define PACKAGE_LIB_DIR "bla"
 #define MODULE_ARCH "bla"
 #define SHARED_LIB_SUFFIX "bla"
diff --git a/src/modules/eina/CMakeLists.txt b/src/modules/eina/CMakeLists.txt
deleted file mode 100644 (file)
index 4938162..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-include_directories(
-${PROJECT_SOURCE_DIR}/
-${PROJECT_SOURCE_DIR}/src/lib/eina
-${PROJECT_SOURCE_DIR}/src/lib/efl
-${VG_INCLUDE_DIRS}
-)
-
-if (EINA_STATIC_BUILD_PASS_THROUGH)
-    add_library(pass_through MODULE "mp/pass_through/eina_pass_through.c")
-endif(EINA_STATIC_BUILD_PASS_THROUGH)
-
-
-if (EINA_STATIC_BUILD_ONE_BIG)
-    add_library(one_big MODULE mp/one_big/eina_one_big.c)
-endif(EINA_STATIC_BUILD_ONE_BIG)
-
-
-if (EINA_STATIC_BUILD_CHAINED_POOL)
-    add_library(chained_pool MODULE mp/chained_pool/eina_chained_mempool.c)
-endif(EINA_STATIC_BUILD_CHAINED_POOL)
\ No newline at end of file
diff --git a/src/modules/eina/mp/chained_pool/CMakeLists.txt b/src/modules/eina/mp/chained_pool/CMakeLists.txt
new file mode 100644 (file)
index 0000000..1fb1dd5
--- /dev/null
@@ -0,0 +1,2 @@
+set(MODULE_TYPE ${EINA_BUILD_CHAINED})
+set(SOURCES eina_chained_mempool.c)
diff --git a/src/modules/eina/mp/one_big/CMakeLists.txt b/src/modules/eina/mp/one_big/CMakeLists.txt
new file mode 100644 (file)
index 0000000..42a3929
--- /dev/null
@@ -0,0 +1,2 @@
+set(MODULE_TYPE ${EINA_BUILD_ONE_BIG})
+set(SOURCES eina_one_big.c)
diff --git a/src/modules/eina/mp/pass_through/CMakeLists.txt b/src/modules/eina/mp/pass_through/CMakeLists.txt
new file mode 100644 (file)
index 0000000..f863843
--- /dev/null
@@ -0,0 +1,2 @@
+set(MODULE_TYPE ${EINA_BUILD_PASS_THROUGH})
+set(SOURCES eina_pass_through.c)