CMake: Update add_metalib() to support exports

This allows exporting (a stub function that forwards to) a
function that returns a value - it's particularly useful in
the graphics plugins for the "get_pipe_type_foo()" functions.

This also frees up CMake from needing to use any of the source
files in the metalibs/*/ directories.
This commit is contained in:
Sam Edwards 2018-11-08 17:42:32 -07:00
parent d43767c617
commit 3050203e24
9 changed files with 108 additions and 40 deletions

View File

@ -182,7 +182,9 @@ function(add_component_library target_name)
endfunction(add_component_library)
#
# Function: add_metalib(target [source1 source2] [INIT initfunc [initheader.h]]
# Function: add_metalib(target [source1 source2]
# [INCLUDE header1.h ...]
# [INIT initfunc [initheader.h] [EXPORT type name expr]]
# [COMPONENTS component1 ...])
#
# This is add_library, but for metalibs.
@ -191,28 +193,72 @@ endfunction(add_component_library)
# autogenerated by this function) that calls the underlying component libs'
# init functions.
#
# The EXPORT keyword exports the expression `expr`, which yields a value of
# type `type`, as the undecorated (extern "C") symbol `name`
#
# The INCLUDE keyword allows the init file to pull in additional headers, which
# may be useful for EXPORT.
#
function(add_metalib target_name)
set(components_keyword OFF)
set(init_keyword 0)
set(init_func)
set(init_header "${target_name}.h")
set(export_keyword 0)
set(export_declarations)
set(export_definitions)
set(component_init_headers)
set(components)
set(sources)
foreach(arg ${ARGN})
if(arg STREQUAL "COMPONENTS")
set(components_keyword ON)
set(include_keyword OFF)
set(init_keyword 0)
set(export_keyword 0)
elseif(arg STREQUAL "INCLUDE")
set(include_keyword ON)
set(components_keyword OFF)
set(init_keyword 0)
set(export_keyword 0)
elseif(arg STREQUAL "INIT")
set(init_keyword 2)
set(components_keyword OFF)
set(include_keyword OFF)
set(export_keyword 0)
elseif(arg STREQUAL "EXPORT")
if(NOT init_func)
message(FATAL_ERROR "EXPORT cannot be used before INIT")
endif()
set(export_keyword 3)
set(components_keyword OFF)
set(include_keyword OFF)
set(init_keyword 0)
elseif(components_keyword)
list(APPEND components "${arg}")
elseif(include_keyword)
set(component_init_headers
"${component_init_headers}#include \"${arg}\"\n")
elseif(init_keyword EQUAL 2)
set(init_func "${arg}")
set(init_keyword 1)
elseif(init_keyword EQUAL 1)
set(init_header "${arg}")
set(init_keyword 0)
elseif(export_keyword EQUAL 3)
set(_export_type "${arg}")
set(export_keyword 2)
elseif(export_keyword EQUAL 2)
set(_export_name "${arg}")
set(export_keyword 1)
elseif(export_keyword EQUAL 1)
set(export_declarations
"${export_declarations}\nextern \"C\" IMPORT_CLASS ${_export_type} ${_export_name}();")
set(export_definitions
"${export_definitions}\nextern \"C\" EXPORT_CLASS ${_export_type} ${_export_name}() { return ${arg}; }")
unset(_export_type)
unset(_export_name)
set(export_keyword 0)
else()
list(APPEND sources "${arg}")
endif()
@ -226,7 +272,6 @@ function(add_metalib target_name)
set(includes)
set(libs)
set(component_init_funcs "")
set(component_init_headers "")
foreach(component ${components})
if(NOT TARGET "${component}")
message(FATAL_ERROR

View File

@ -6,3 +6,4 @@ EXPORT_CLASS void
@init_func@() {
@component_init_funcs@
}
@export_definitions@

View File

@ -4,5 +4,6 @@
#include "dtoolbase.h"
IMPORT_CLASS void @init_func@();
@export_declarations@
#endif

View File

@ -2,8 +2,10 @@ if(NOT HAVE_DX9)
return()
endif()
add_metalib(pandadx9 ${MODULE_TYPE} pandadx9.cxx
add_metalib(pandadx9 ${MODULE_TYPE}
INCLUDE wdxGraphicsPipe9.h
INIT init_libpandadx9 pandadx9.h
EXPORT int get_pipe_type_pandadx9 "wdxGraphicsPipe9::get_class_type().get_index()"
COMPONENTS p3dxgsg9 p3windisplay)
set_target_properties(pandadx9 PROPERTIES DEFINE_SYMBOL BUILDING_PANDADX)
install(TARGETS pandadx9 DESTINATION ${MODULE_DESTINATION})

View File

@ -1,32 +1,37 @@
if(HAVE_GL)
# Check that we actually have a display subsystem.
if(NOT HAVE_WGL AND NOT HAVE_COCOA AND NOT HAVE_CARBON AND NOT HAVE_GLX)
message("") # Add extra line before error
message(SEND_ERROR
"When compiling with OpenGL (HAVE_GL), at least one of:
HAVE_WGL, HAVE_COCOA, HAVE_CARBON, or HAVE_GLX must be defined.")
endif()
set(PANDAGL_LINK_TARGETS p3glgsg p3glstuff)
if(HAVE_GLX)
list(APPEND PANDAGL_LINK_TARGETS p3glxdisplay p3x11display)
endif()
if(HAVE_WGL)
list(APPEND PANDAGL_LINK_TARGETS p3wgldisplay p3windisplay)
endif()
if(HAVE_COCOA)
list(APPEND PANDAGL_LINK_TARGETS p3cocoadisplay)
endif()
if(HAVE_CARBON)
list(APPEND PANDAGL_LINK_TARGETS p3osxdisplay)
endif()
add_metalib(pandagl ${MODULE_TYPE} pandagl.cxx COMPONENTS ${PANDAGL_LINK_TARGETS})
set_target_properties(pandagl PROPERTIES DEFINE_SYMBOL BUILDING_PANDAGL)
install(TARGETS pandagl DESTINATION ${MODULE_DESTINATION})
if(NOT HAVE_GL)
return()
endif()
set(PANDAGL_LINK_TARGETS p3glgsg p3glstuff)
if(HAVE_GLX)
list(APPEND PANDAGL_LINK_TARGETS p3glxdisplay p3x11display)
set(PANDAGL_PIPE_TYPE "glxGraphicsPipe")
elseif(HAVE_WGL)
list(APPEND PANDAGL_LINK_TARGETS p3wgldisplay p3windisplay)
set(PANDAGL_PIPE_TYPE "wglGraphicsPipe")
elseif(HAVE_COCOA)
list(APPEND PANDAGL_LINK_TARGETS p3cocoadisplay)
set(PANDAGL_PIPE_TYPE "CocoaGraphicsPipe")
set(PANDAGL_PIPE_INCLUDE "cocoaGraphicsPipe.h")
elseif(HAVE_CARBON)
list(APPEND PANDAGL_LINK_TARGETS p3osxdisplay)
set(PANDAGL_PIPE_TYPE "osxGraphicsPipe")
else()
message("") # Add extra line before error
message(SEND_ERROR
"When compiling with OpenGL (HAVE_GL), at least one of:
HAVE_WGL, HAVE_COCOA, HAVE_CARBON, or HAVE_GLX must be defined.")
endif()
if(NOT PANDAGL_PIPE_INCLUDE)
set(PANDAGL_PIPE_INCLUDE "${PANDAGL_PIPE_TYPE}.h")
endif()
add_metalib(pandagl ${MODULE_TYPE}
INCLUDE "${PANDAGL_PIPE_INCLUDE}"
INIT init_libpandagl pandagl.h
EXPORT int get_pipe_type_pandagl "${PANDAGL_PIPE_TYPE}::get_class_type().get_index()"
COMPONENTS ${PANDAGL_LINK_TARGETS})
install(TARGETS pandagl DESTINATION ${MODULE_DESTINATION})

View File

@ -2,8 +2,18 @@ if(NOT HAVE_GLES1 OR NOT HAVE_EGL)
return()
endif()
add_metalib(pandagles ${MODULE_TYPE} pandagles.cxx
if(ANDROID)
set(GLES1_PIPE_TYPE "AndroidGraphicsPipe")
set(GLES1_PIPE_INCLUDE "androidGraphicsPipe.h")
else()
set(GLES1_PIPE_TYPE "eglGraphicsPipe")
set(GLES1_PIPE_INCLUDE "eglGraphicsPipe.h")
endif()
add_metalib(pandagles ${MODULE_TYPE}
INCLUDE "${GLES1_PIPE_INCLUDE}"
INIT init_libpandagles pandagles.h
EXPORT int get_pipe_type_pandagles "${GLES1_PIPE_TYPE}::get_class_type().get_index()"
COMPONENTS p3egldisplay_gles1 p3glesgsg)
set_target_properties(pandagles PROPERTIES DEFINE_SYMBOL BUILDING_PANDAGLES)
install(TARGETS pandagles DESTINATION ${MODULE_DESTINATION})

View File

@ -2,8 +2,10 @@ if(NOT HAVE_GLES2 OR NOT HAVE_EGL)
return()
endif()
add_metalib(pandagles2 ${MODULE_TYPE} pandagles2.cxx
add_metalib(pandagles2 ${MODULE_TYPE}
INCLUDE eglGraphicsPipe.h
INIT init_libpandagles2 pandagles2.h
EXPORT int get_pipe_type_pandagles2 "eglGraphicsPipe::get_class_type().get_index()"
COMPONENTS p3egldisplay_gles2 p3gles2gsg)
set_target_properties(pandagles2 PROPERTIES DEFINE_SYMBOL BUILDING_PANDAGLES2)
install(TARGETS pandagles2 DESTINATION ${MODULE_DESTINATION})

View File

@ -29,6 +29,7 @@ composite_sources(p3egldisplay P3EGLDISPLAY_SOURCES)
# We actually build this twice! Once for GLES1, once for GLES2.
if(HAVE_GLES1)
add_component_library(p3egldisplay_gles1 SYMBOL BUILDING_PANDAGLES
INIT init_libegldisplay config_egldisplay.h
${P3EGLDISPLAY_HEADERS} ${P3EGLDISPLAY_SOURCES})
target_compile_definitions(p3egldisplay_gles1 PUBLIC OPENGLES_1)
target_link_libraries(p3egldisplay_gles1 p3glesgsg p3x11display
@ -41,6 +42,7 @@ endif()
if(HAVE_GLES2)
add_component_library(p3egldisplay_gles2 SYMBOL BUILDING_PANDAGLES2
INIT init_libegldisplay config_egldisplay.h
${P3EGLDISPLAY_HEADERS} ${P3EGLDISPLAY_SOURCES})
target_compile_definitions(p3egldisplay_gles2 PUBLIC OPENGLES_2)
target_link_libraries(p3egldisplay_gles2 p3gles2gsg p3x11display

View File

@ -34,7 +34,7 @@ set(P3GLSTUFF_SOURCES
)
composite_sources(p3glstuff P3GLSTUFF_SOURCES)
add_component_library(p3glstuff ${P3GLSTUFF_HEADERS} ${P3GLSTUFF_SOURCES})
add_component_library(p3glstuff NOINIT ${P3GLSTUFF_HEADERS} ${P3GLSTUFF_SOURCES})
target_link_libraries(p3glstuff panda)
if(NOT BUILD_METALIBS)