[CMake] A bit harder question:
Steven Truppe
workbench at gmx.at
Thu Jun 6 10:54:05 EDT 2019
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()
>
>
>
>
>
> ########################################
> ## FIRST FILE I INCLUDE with inclde() ##
> ########################################
>
> 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
> 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.
>
> ---------------------------------------------------------------------------------------------------------------------------------------------
>
>
>
> 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()
>
> ###########################
> ## second file i include ##
> ###########################
> 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