[CMake] A bit harder question:

Steven Truppe workbench at gmx.at
Thu Jun 6 11:13:28 EDT 2019


I made a few misakes

On 06.06.19 16:54, Steven Truppe wrote:
> It's also odd that i have to include(ExternalProject) to use the command
> but i'm on cmake version 3.14 ...
>
> On 06.06.19 16:51, Steven Truppe wrote:
>> #---------------------------------------------------------------------------------------------------------------------------------------------
>>
>>
>> # This is the start
>> #---------------------------------------------------------------------------------------------------------------------------------------------
>>
>>
>>
>> ################
>> ## bsBuildLibs ##
>> #################
>> macro(bsBuildLibs)
>>     foreach(lib ${ARGN})
>>         bsIncludeLib(${lib})
>>         bsGetLibExamples(${lib})
>>         bsIncludeLibExamples(${lib})
>>     endforeach()
>> endmacro()
>>
>> ##################
>> ## bsIncludeLib ##
>> ##################
>> macro(bsIncludeLib)
>>     set(fn "${CMAKE_SOURCE_DIR}/tools/cmake/modules/lib_${ARGV0}.cmake")
>>     if(EXISTS ${fn})
>>         include(lib_${ARGV0})
>>     else()
>>         message(FATAL_ERROR "Unable to find library configuration file:
>> ${lib_${ARGV0}}!")
>>     endif()
>> endmacro()
>>
>> ######################
>> ## bsGetLibExamples ##
>> ######################
>> macro(bsGetLibExamples)
>>     string(TOUPPER ${lib} lib_upper)
>>     set(WITH_LIB_${lib_upper}_EXAMPLES "")
>>     # get all examples
>>     get_cmake_property(_vars VARIABLES)
>>     foreach(_var ${_vars})
>>         string(TOUPPER ${lib} lib_upper)
>>         if(_var MATCHES "^WITH_LIB_${lib_upper}_EXAMPLE_([A-Za-z]+)$")
>>             list(APPEND WITH_LIB_${lib_upper}_EXAMPLES ${CMAKE_MATCH_1})
>>         endif()
>>     endforeach()
>> endmacro()
>>
>> ###########################
>> ## bsIncludeLibsExamples ##
>> ###########################
>> macro(bsIncludeLibExamples)
>>     foreach(lib ${ARGN})
>>         string(TOUPPER ${lib} lib_upper)
>>         if(DEFINED "WITH_LIB_${lib_upper}_EXAMPLES")
>>             foreach(example IN LISTS WITH_LIB_${lib_upper}_EXAMPLES)
>>                 string(TOLOWER ${example} example_lower)
>>                 set(fn
>> "${CMAKE_SOURCE_DIR}/tools/cmake/modules/lib_${lib}_example_${example_lower}.cmake")
>>
>>
>>                 set(lib_name "lib_${lib}_example_${example_lower}")
>>                 if(EXISTS ${fn})
>>                     message(STATUS "Bulding lib ${lib}, example:
>> ${example}")
>>                     include(${lib_name})
>>                 else()
>>                     message(FATAL_ERROR "Could not find example file
>> ${fn} for library ${lib} and (example: ${example_lower})!")
>>                 endif()
>>             endforeach()
>>         endif()
>>     endforeach()
>> endmacro()
>>
>>
>>
>> set(ALL_LIBS "glad;glfw")
>>
>> set(WITH_LIB_GLAD 1)
>> set(WITH_LIB_GLAD_EXAMPLE_CBASIC 1)
>>
>> set(WITH_LIB_GLFW 1)
>> set(WITH_LIB_GLFW_EXAMPLE_CBASIC 1)
>> set(WITH_LIB_GLFW_EXAMPLE_CPPBASIC 1)
>>
>> bsBuildLibs(${ALL_LIBS})
>>
>> ---------------------------------------------------------------------------------------------------------------------------------------------
>>
>>
>>
>> If turns into loading different files that are part of the compilation:
>> - First the ALL_LIBS list get looped and all examples for the libraries
>> are filtered out
>> - i then i have one example .cmake file for every example with the same
>> name sheme as you see at the first set() lines like .

so 2 files: one with the ExternalExample_Add() command and one for the
build process -

in this example we have lib_glad.inc that is included first and the
lib_glad_example_cbasic.cmake file for building an example.

>> WITH_LIB_GLAD_EXAMPLE_CBASIC -
>>  this file is included and there should the build process be
>> acompilshed (the filename here would be lib_glad_example_cbasic.c).
>>
>> Here is an example if lib_glad.cmake.
>>
>> ---------------------------------------------------------------------------------------------------------------------------------------------
>>
>> (lib_glad.cmake)
>>
>>
>> IF(WITH_LIB_GLAD)
>>     ###################
>>     ## first example ##
>>     ###################
>>     find_package(OpenGL REQUIRED)
>>     find_package(X11 REQUIRED)
>>     find_package(Threads REQUIRED)
>>
>>     set(LIB_GLAD_INC_PATH
>>         ${OUTPUT_PATH}/glad/include
>>         ${OPENGL_INCLUDE_DIR}
>>         ${X11_INCLUDE_DIR}
>>     )
>>
>>     set(LIB_GLAD_LIB_PATH
>>         ${OUTPUT_PATH}/glad/lib
>>         ${OPENGL_LIBRARIES}
>>         ${X11_LIBRARIES}
>>     )
>>
>>     set(LIB_GLAD_STATIC_LIBS
>>         glad
>>         m
>>         rt
>>         ${CMAKE_DL_LIBS}
>>         OpenGL::GL
>>         Threads::Threads
>>         X11::X11
>>         X11::Xxf86vm
>>         X11::Xi
>>         X11::Xrandr
>>         X11::Xcursor
>>         X11::Xinerama
>>     )
>>
>>     cmake_print_variables(OUTPUT_PATH)
>>     ExternalProject_Add(external_glad
>>         PREFIX ${CMAKE_BINARY_DIR}/glad-log
>>         GIT_REPOSITORY ${GLAD_REPO}
>>         GIT_TAG ${GLAD_TAG}
>>         GIT_PROGRESS true
>>         GIT_SHALLOW True
>>         SOURCE_DIR ${CMAKE_BINARY_DIR}/glad
>>         UPDATE_COMMAND ""
>>         PATCH_COMMAND ""
>>         INSTALL_DIR ${CMAKE_BINARY_DIR}/glad
>>         CMAKE_ARGS -DCMAKE_BUILD_TYPE:String=${CMAKE_BUILD_TYPE}
>> -DCMAKE_INSTALL_PREFIX=${OUTPUT_PATH}/glad -DGLAD_INSTALL=True
>>         #CONFIGURE_COMMAND ""
>>         INSTALL_COMMAND ""
>>     )
>>
>> ENDIF()
>>
>>
>>
>> ---------------------------------------------------------------------------------------------------------------------------------------------
>>

lib_glad_example_cbasic.cmake

second file included

>> IF(WITH_LIB_GLAD AND WITH_LIB_GLAD_EXAMPLE_CBASIC)
>>
>>     add_executable(LIB_GLAD_EXAMPLE_CBASIC
>> ${LIB_GLAD_EXAMPLE_CBASIC_SRC})
>>     set(CMAKE_C_COMPILER ${LIB_GLAD_EXAMPLE_CBASIC_COMPILER})
>>
>>     cmake_print_variables(LIB_GLAD_INC_PATH)
>>     target_include_directories(LIB_GLAD_EXAMPLE_CBASIC PRIVATE
>> ${LIB_GLAD_INC_PATH})
>>     target_link_directories(LIB_GLAD_EXAMPLE_CBASIC PRIVATE
>> ${LIB_GLAD_LIB_PATH})
>>     target_link_libraries(LIB_GLAD_EXAMPLE_CBASIC PRIVATE
>> ${LIB_GLAD_STATIC_LIBS})
>>
>>     set(LIB_GLAD_EXAMPLE_CBASIC_C_FLAGS_DEBUG
>> ${LIB_GLAD_EXAMPLE_CBASIC_C_FLAGS_DEBUG})
>>     set(LIB_GLAD_EXAMPLE_CBASIC_C_FALGS_RELEASE
>> ${LIB_GLAD_EXAMPLE_CBASIC_C_FLAGS_RELEASE})
>>
>>     cmake_print_variables(LIB_GLAD_EXAMPLE_CBASIC_INSTALL_PATH)
>>     set_target_properties(LIB_GLAD_EXAMPLE_CBASIC PROPERTIES
>> OUTPUT_NAME_RELEASE ${LIB_GLAD_EXAMPLE_CBASIC_OUTPUT_NAME_RELEASE})
>>     set_target_properties(LIB_GLAD_EXAMPLE_CBASIC PROPERTIES
>> OUTPUT_NAME_DEBUG ${LIB_GLAD_EXAMPLE_CBASIC_OUTPUT_NAME_DEBUG})
>>     add_dependencies(LIB_GLAD_EXAMPLE_CBASIC
>> ${LIB_GLAD_EXAMPLE_CBASIC_DEPS})
>>     install(
>>         TARGETS LIB_GLAD_EXAMPLE_CBASIC
>>         RUNTIME DESTINATION ${LIB_GLAD_EXAMPLE_CBASIC_INSTALL_PATH}
>>     )
>>
>>
>> ENDIF()
>>
>> and here is the example build file lib_glad_example_cbasic.cmake:
>>
>> # i tried to remove the IF but it's the same result
>>
>> if(WITH_LIB_GLAD AND WITH_LIB_GLAD_EXAMPLE_CBASIC)
>>
>>     message(STATUS "---> Building example WITH_LIB_GLAD_EXAMPLE_CBASIC")
>>
>>     add_executable(LIB_GLAD_EXAMPLE_CBASIC
>> ${LIB_GLAD_EXAMPLE_CBASIC_SRC})
>>     set(CMAKE_C_COMPILER ${LIB_GLAD_EXAMPLE_CBASIC_COMPILER})
>>
>>     cmake_print_variables(LIB_GLAD_INC_PATH)
>>     target_include_directories(LIB_GLAD_EXAMPLE_CBASIC PRIVATE
>> ${LIB_GLAD_INC_PATH})
>>     target_link_directories(LIB_GLAD_EXAMPLE_CBASIC PRIVATE
>> ${LIB_GLAD_LIB_PATH})
>>     target_link_libraries(LIB_GLAD_EXAMPLE_CBASIC PRIVATE
>> ${LIB_GLAD_STATIC_LIBS})
>>
>>     set(LIB_GLAD_EXAMPLE_CBASIC_C_FLAGS_DEBUG
>> ${LIB_GLAD_EXAMPLE_CBASIC_C_FLAGS_DEBUG})
>>     set(LIB_GLAD_EXAMPLE_CBASIC_C_FALGS_RELEASE
>> ${LIB_GLAD_EXAMPLE_CBASIC_C_FLAGS_RELEASE})
>>
>>     cmake_print_variables(LIB_GLAD_EXAMPLE_CBASIC_INSTALL_PATH)
>>     set_target_properties(LIB_GLAD_EXAMPLE_CBASIC PROPERTIES
>> OUTPUT_NAME_RELEASE ${LIB_GLAD_EXAMPLE_CBASIC_OUTPUT_NAME_RELEASE})
>>     set_target_properties(LIB_GLAD_EXAMPLE_CBASIC PROPERTIES
>> OUTPUT_NAME_DEBUG ${LIB_GLAD_EXAMPLE_CBASIC_OUTPUT_NAME_DEBUG})
>>     add_dependencies(LIB_GLAD_EXAMPLE_CBASIC
>> ${LIB_GLAD_EXAMPLE_CBASIC_DEPS})
>>     install(
>>         TARGETS LIB_GLAD_EXAMPLE_CBASIC
>>         RUNTIME DESTINATION ${LIB_GLAD_EXAMPLE_CBASIC_INSTALL_PATH}
>>     )
>> ENDIF()
>>
>>
>> ---------------------------------------------------------------------------------------------------------------------------------------------
>>
>>
>>
>> Now my problem is that the variable CMAKE_BUILD_TYPE automaticaly is set
>> to debug but i'm using cmake 3.14 with the line:
>>
>> # avoid having empty buildtype
>> IF(NOT DEFINED CMAKE_BUILD_TYPE)
>>     set(CMAKE_BUILD_TYPE Release CACHE STRING "The build type of the
>> project. (default:Release)")
>> ENDIF()
>>
>> and the build_tool directory from the ExternalProject_Add is never
>> installed but it is tried to compile the example file. It worked before
>> i'm confused
>> that something because of the order of how things are working is making
>> me trouble.
>>
>> I hope someone can help me out here, it would be the rest work of the
>> puzzle to make things work uniquely for my libs and their examples.
>>
>> best regrads!
>>


More information about the CMake mailing list