xo-cmake: setup to make share target available via cmake install

This commit is contained in:
Roland Conybeare 2026-02-27 19:38:53 +11:00
commit 831fc10c18
56 changed files with 146 additions and 0 deletions

View file

@ -7,4 +7,5 @@ find_dependency(indentlog)
find_dependency(reflect)
find_dependency(callback)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -5,4 +5,5 @@ include(CMakeFindDependencyMacro)
find_dependency(xo_arena)
find_dependency(xo_facet)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -3,4 +3,5 @@
include(CMakeFindDependencyMacro)
#find_dependency(randomgen)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -10,4 +10,5 @@ find_dependency(xo_reflectutil)
find_dependency(indentlog)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -3,4 +3,5 @@
include(CMakeFindDependencyMacro)
find_dependency(refcnt)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -1227,6 +1227,17 @@ macro(xo_export_cmake_config projectname projectversion projecttargets)
PERMISSIONS OWNER_READ GROUP_READ WORLD_READ
DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/cmake/${projectname}
)
# generate Share file that recreates share_${projectname} in consuming projects
file(WRITE "${PROJECT_BINARY_DIR}/${projectname}Share.cmake"
"if(NOT TARGET share_${projectname})\n"
" add_custom_target(share_${projectname})\n"
" set_property(TARGET share_${projectname} PROPERTY path\n"
" \"\${CMAKE_CURRENT_LIST_DIR}/../../../share/${projectname}\")\n"
"endif()\n")
install(
FILES "${PROJECT_BINARY_DIR}/${projectname}Share.cmake"
PERMISSIONS OWNER_READ GROUP_READ WORLD_READ
DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/cmake/${projectname})
endmacro()
# ----------------------------------------------------------------

View file

@ -0,0 +1,81 @@
cmake-facet-export
==================
:date: 2026-02
Background
----------
``xo_add_genfacetimpl()`` in ``xo_cxx.cmake`` uses ``genfacet`` to regenerate facet
implementation boilerplate from ``.json5`` IDL files. When ``FACET_PKG`` is specified
(e.g. ``FACET_PKG xo_gc``), the macro resolves the IDL directory via a cmake custom target::
get_target_property(_facet_dir share_${GF_FACET_PKG} path)
``share_${PROJECT_NAME}`` is a custom target created by ``xo_cxx_toplevel_options2()`` for
every xo satellite, with its ``path`` property set to ``${PROJECT_SOURCE_DIR}`` (the package
source root). Subdirectory ``idl/`` within that root holds the facet IDL files.
Problem
-------
Custom cmake targets are not exportable through the standard ``install(TARGETS ... EXPORT ...)``
mechanism. As a result, ``share_xo_gc`` and similar targets do not exist when a satellite is
consumed as an installed dependency (e.g. in a standalone nix build or any build that uses
``find_package(xo_gc)`` rather than building xo-gc in the same cmake invocation).
This caused ``nix-build -A xo.object2`` to fail at cmake configure time with::
CMake Error: get_target_property() called with non-existent target "share_xo_gc".
xo-gc was unaffected because it uses only ``xo_add_genfacet()`` (which does not reference
``share_*`` targets), while xo-object2 uses ``xo_add_genfacetimpl()`` with ``FACET_PKG``.
Immediate fix (2026-02)
-----------------------
A guard was added to ``xo_add_genfacetimpl()`` to skip target creation gracefully when the
``share_*`` target is absent, since all callers annotate these as
``# note: manual target; generated code committed to git``::
if(NOT TARGET share_${GF_FACET_PKG})
message(STATUS "xo_add_genfacetimpl: share_${GF_FACET_PKG} not available; skipping")
return()
endif()
This unblocked the nix build while leaving a forward path to full support.
Long-term design
----------------
To make ``xo_add_genfacetimpl()`` fully functional in standalone builds:
1. **Export ``share_`` targets universally**``xo_export_cmake_config()`` generates and
installs a ``${PROJECT_NAME}Share.cmake`` file for every satellite. This file recreates
``share_${PROJECT_NAME}`` pointing to the installed data root::
if(NOT TARGET share_xo_gc)
add_custom_target(share_xo_gc)
set_property(TARGET share_xo_gc PROPERTY path
"${CMAKE_CURRENT_LIST_DIR}/../../../share/xo_gc")
endif()
Doing this universally (not only for facet-providers) keeps ``*Config.cmake.in`` templates
consistent and provides future-proofing for other attributes that may be added to
``share_`` targets.
2. **Include the Share file** — every ``cmake/${pkg}Config.cmake.in`` adds::
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
3. **Install IDL files** — packages whose IDL is consumed by ``xo_add_genfacetimpl()``
install their ``idl/`` tree::
install(DIRECTORY idl/
DESTINATION share/${PROJECT_NAME}/idl
FILES_MATCHING PATTERN "*.json5")
This maps to the same relative path that ``genfacet`` would find under the source root.
The skip-if-absent guard is retained as graceful degradation for older installed packages
that predate this change.

View file

@ -3,4 +3,5 @@
include(CMakeFindDependencyMacro)
find_dependency(refcnt)
include("${CMAKE_CURRENT_LIST_DIR}/xo_distributionTargets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -4,4 +4,5 @@ include(CMakeFindDependencyMacro)
find_dependency(reflect)
find_dependency(xo_flatstring)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -15,4 +15,5 @@ find_dependency(cmake)
find_dependency(indentlog)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -5,4 +5,5 @@ include(CMakeFindDependencyMacro)
find_dependency(xo_arena)
find_dependency(xo_reflectutil)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -14,4 +14,5 @@ include(CMakeFindDependencyMacro)
#find_dependency(callback)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -7,4 +7,5 @@ find_dependency(subsys)
find_dependency(indentlog)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -1,4 +1,5 @@
@PACKAGE_INIT@
include("${CMAKE_CURRENT_LIST_DIR}/indentlogTargets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -4,4 +4,5 @@ include(CMakeFindDependencyMacro)
find_dependency(xo_alloc)
#find_dependency(xo_flatstring)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -10,4 +10,5 @@ find_dependency(xo_expression2)
find_dependency(xo_gc)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -3,4 +3,5 @@
include(CMakeFindDependencyMacro)
find_dependency(xo_expression)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -14,4 +14,5 @@ find_dependency(Eigen3)
#find_dependency(callback)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -8,4 +8,5 @@ find_dependency(callback)
#find_dependency(xo_alloc)
#find_dependency(xo_flatstring)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -7,4 +7,5 @@ find_dependency(xo_printable2)
find_dependency(subsys)
find_dependency(indentlog)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -4,4 +4,5 @@ include(CMakeFindDependencyMacro)
find_dependency(randomgen)
find_dependency(xo_allocutil)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -4,4 +4,5 @@ include(CMakeFindDependencyMacro)
find_dependency(indentlog)
find_dependency(xo_facet)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -4,4 +4,5 @@ include(CMakeFindDependencyMacro)
find_dependency(reflect)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -11,4 +11,5 @@ find_dependency(xo_gc)
find_dependency(subsys)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -10,4 +10,5 @@ find_dependency(reactor)
find_dependency(printjson)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -1,4 +1,5 @@
@PACKAGE_INIT@
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -4,4 +4,5 @@ include(CMakeFindDependencyMacro)
find_dependency(xo_expression)
find_dependency(xo_pyreflect)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -4,4 +4,5 @@ include(CMakeFindDependencyMacro)
find_dependency(xo_jit)
find_dependency(xo_pyexpression)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -1,4 +1,5 @@
@PACKAGE_INIT@
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -1,4 +1,5 @@
@PACKAGE_INIT@
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -1,4 +1,5 @@
@PACKAGE_INIT@
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -1,4 +1,5 @@
@PACKAGE_INIT@
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -1,4 +1,5 @@
@PACKAGE_INIT@
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -1,4 +1,5 @@
@PACKAGE_INIT@
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -1,4 +1,5 @@
@PACKAGE_INIT@
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -8,4 +8,5 @@ find_dependency(refcnt)
find_dependency(indentlog)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -1,4 +1,5 @@
@PACKAGE_INIT@
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -1,4 +1,5 @@
@PACKAGE_INIT@
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -3,4 +3,5 @@
include(CMakeFindDependencyMacro)
find_dependency(xo_pyutil)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -1,4 +1,5 @@
@PACKAGE_INIT@
include("${CMAKE_CURRENT_LIST_DIR}/randomgenTargets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -14,4 +14,5 @@ find_dependency(xo_flatstring)
#find_dependency(callback)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -13,4 +13,5 @@ find_dependency(printjson)
find_dependency(callback)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -5,4 +5,5 @@ find_dependency(xo_expression)
find_dependency(xo_tokenizer)
#find_dependency(subsys)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -13,4 +13,5 @@ find_dependency(xo_expression2)
find_dependency(subsys)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -4,4 +4,5 @@ include(CMakeFindDependencyMacro)
find_dependency(xo_reflectutil)
find_dependency(indentlog)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -5,4 +5,5 @@ find_dependency(refcnt)
find_dependency(indentlog)
find_dependency(subsys)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -9,4 +9,5 @@ include(CMakeFindDependencyMacro)
#find_dependency(xo_flatstring)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -10,4 +10,5 @@ find_dependency(reactor)
#find_dependency(callback)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -1,4 +1,5 @@
@PACKAGE_INIT@
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -1,4 +1,5 @@
@PACKAGE_INIT@
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -5,4 +5,5 @@ include(CMakeFindDependencyMacro)
find_dependency(xo_alloc)
#find_dependency(xo_flatstring)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -5,4 +5,5 @@ include(CMakeFindDependencyMacro)
find_dependency(indentlog)
#find_dependency(subsys)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -10,4 +10,5 @@ find_dependency(xo_arena)
find_dependency(indentlog)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -9,4 +9,5 @@ find_dependency(indentlog)
#find_dependency(callback)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -11,4 +11,5 @@ find_dependency(webutil)
find_dependency(Libwebsockets)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")

View file

@ -3,4 +3,5 @@
include(CMakeFindDependencyMacro)
find_dependency(callback)
include("${CMAKE_CURRENT_LIST_DIR}/webutilTargets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Share.cmake")
check_required_components("@PROJECT_NAME@")