Skip to content

Commit 944ea28

Browse files
committed
add relocatable export logic and package scripts, now I need to move include into common prefix & get rid of ABS build interface trash from install interface which are populated to the package
1 parent 3ee3404 commit 944ea28

File tree

3 files changed

+115
-51
lines changed

3 files changed

+115
-51
lines changed

CMakeLists.txt

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,14 @@ set(NBL_BUILD_ANDROID OFF)
2525
include(ExternalProject)
2626
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/toolchains/android/build.cmake)
2727

28-
project(Nabla LANGUAGES CXX C)
28+
include(GNUInstallDirs)
29+
include(CMakePackageConfigHelpers)
30+
31+
project(Nabla
32+
VERSION 0.7.2.0
33+
HOMEPAGE_URL "https://www.devsh.eu/nabla"
34+
LANGUAGES CXX C
35+
)
2936
enable_language(C CXX ASM ASM_NASM)
3037

3138
if(MSVC)
@@ -286,4 +293,35 @@ option(NBL_CPACK_INCLUDE_EXAMPLES "CPack with examples and media" ON)
286293
include(cpack/package)
287294
include(build/info)
288295
export(TARGETS ${_NBL_3RDPARTY_TARGETS_} Nabla NAMESPACE Nabla:: APPEND FILE ${NBL_ROOT_PATH_BINARY}/NablaExport.cmake)
296+
297+
install(TARGETS Nabla
298+
EXPORT NablaExportTargets
299+
ARCHIVE DESTINATION ${_NBL_CPACK_PACKAGE_RELATIVE_ENTRY_}/lib
300+
LIBRARY DESTINATION ${_NBL_CPACK_PACKAGE_RELATIVE_ENTRY_}/lib
301+
RUNTIME DESTINATION ${_NBL_CPACK_PACKAGE_RELATIVE_ENTRY_}/runtime/nbl
302+
)
303+
304+
write_basic_package_version_file(
305+
"${CMAKE_CURRENT_BINARY_DIR}/NablaConfigVersion.cmake"
306+
VERSION ${PROJECT_VERSION}
307+
COMPATIBILITY SameMajorVersion
308+
)
309+
310+
configure_package_config_file(
311+
"${CMAKE_CURRENT_LIST_DIR}/cmake/NablaConfig.cmake.in"
312+
"${CMAKE_CURRENT_BINARY_DIR}/NablaConfig.cmake"
313+
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Nabla
314+
)
315+
316+
install(EXPORT NablaExportTargets
317+
NAMESPACE Nabla::
318+
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Nabla
319+
)
320+
321+
install(FILES
322+
"${CMAKE_CURRENT_BINARY_DIR}/NablaConfig.cmake"
323+
"${CMAKE_CURRENT_BINARY_DIR}/NablaConfigVersion.cmake"
324+
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Nabla
325+
)
326+
289327
NBL_ADJUST_FOLDERS(nabla)

cmake/NablaConfig.cmake.in

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
@PACKAGE_INIT@
2+
include("${CMAKE_CURRENT_LIST_DIR}/NablaExportTargets.cmake")
3+
check_required_components(Nabla)

src/nbl/CMakeLists.txt

Lines changed: 73 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -308,14 +308,26 @@ if(MSVC)
308308
list(APPEND NABLA_SRCS_COMMON "${PROJECT_SOURCE_DIR}/tools/debug/VisualStudio/DynamicArrayVisualizer.natvis")
309309
endif()
310310

311-
set(COMMON_INCLUDE_DIRS
311+
get_target_property(JPEG_STATIC_BINARY_DIR jpeg-static BINARY_DIR)
312+
get_target_property(PNG_STATIC_BINARY_DIR png_static BINARY_DIR)
313+
314+
set(PUBLIC_INCLUDE_DIRS
315+
${NBL_ROOT_PATH}/include
316+
${CMAKE_CURRENT_BINARY_DIR}/include
317+
${THIRD_PARTY_SOURCE_DIR}
312318
${THIRD_PARTY_SOURCE_DIR}/imath/src
313319
${THIRD_PARTY_SOURCE_DIR}/gtl/include
314320
${THIRD_PARTY_SOURCE_DIR}/glm
315-
${THIRD_PARTY_SOURCE_DIR}/renderdoc # for renderdoc api header
316-
${CMAKE_BINARY_DIR}/3rdparty/zlib #for dynamically generated zconf.h
317-
$<TARGET_PROPERTY:png_static,BINARY_DIR> #for dynamically generated pnglibconf.h
318-
$<TARGET_PROPERTY:jpeg-static,BINARY_DIR> #for dynamically generated jconfig.h
321+
${THIRD_PARTY_SOURCE_DIR}/renderdoc # for renderdoc api header
322+
${CMAKE_BINARY_DIR}/3rdparty/zlib # for dynamically generated zconf.h
323+
${JPEG_STATIC_BINARY_DIR} # for dynamically generated pnglibconf.h
324+
${PNG_STATIC_BINARY_DIR} # for dynamically generated jconfig.h
325+
326+
# -> TODO:
327+
"$<$<CONFIG:DEBUG>:${NABLA_CONF_DIR_DEBUG}>"
328+
"$<$<CONFIG:RELEASE>:${NABLA_CONF_DIR_RELEASE}>"
329+
"$<$<CONFIG:RELWITHDEBINFO>:${NABLA_CONF_DIR_RELWITHDEBINFO}>"
330+
# <-
319331
)
320332

321333
# just gather all the header files and later put them into project so it's easy to search for things using IDE
@@ -333,6 +345,9 @@ set(NBL_LIBRARY_CREATION_SOURCES
333345
$<TARGET_OBJECTS:spirv_cross>
334346
)
335347

348+
set(CMAKE_INCLUDE_CURRENT_DIR OFF)
349+
set(CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE OFF)
350+
336351
if(NBL_STATIC_BUILD)
337352
add_library(Nabla STATIC
338353
${NBL_LIBRARY_CREATION_SOURCES}
@@ -386,9 +401,7 @@ if (ANDROID)
386401
android
387402
log
388403
)
389-
target_include_directories(Nabla PUBLIC
390-
${ANDROID_NDK_ROOT_PATH}/sources/android/native_app_glue
391-
)
404+
list(APPEND PUBLIC_INCLUDE_DIRS ${ANDROID_NDK_ROOT_PATH}/sources/android/native_app_glue)
392405
endif()
393406

394407
set(NBL_ASSEMBLY_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/devshgraphicsprogramming.nabla")
@@ -402,14 +415,16 @@ endif()
402415

403416
## Set up 3rdparty deps
404417
# Parallel Hashmap
405-
target_include_directories(Nabla PUBLIC ${THIRD_PARTY_SOURCE_DIR}/parallel-hashmap/parallel_hashmap)
418+
list(APPEND PUBLIC_INCLUDE_DIRS ${THIRD_PARTY_SOURCE_DIR}/parallel-hashmap/parallel_hashmap)
406419
# TCPP
407-
target_include_directories(Nabla PUBLIC ${THIRD_PARTY_SOURCE_DIR}/tcpp)
420+
list(APPEND PUBLIC_INCLUDE_DIRS ${THIRD_PARTY_SOURCE_DIR}/tcpp)
408421
# oneDPL for clang C++17 parallelism
409422
if(_NBL_BUILD_DPL_)
410423
add_dependencies(Nabla oneDPL)
411-
target_include_directories(Nabla PUBLIC ${ONETBB_INSTALL_DIR}/include)
412-
target_include_directories(Nabla PUBLIC ${ONEDPL_INSTALL_DIR}/include)
424+
list(APPEND PUBLIC_INCLUDE_DIRS
425+
${ONETBB_INSTALL_DIR}/include
426+
${ONEDPL_INSTALL_DIR}/include
427+
)
413428
target_link_libraries(Nabla INTERFACE tbb tbbmalloc tbbmalloc_proxy)
414429
endif()
415430

@@ -422,7 +437,7 @@ endif()
422437
add_dependencies(Nabla bz2_static)
423438

424439
# boost
425-
target_include_directories(Nabla PUBLIC "${BOOST_PREPROCESSOR_INCLUDE}")
440+
list(APPEND PUBLIC_INCLUDE_DIRS ${BOOST_PREPROCESSOR_INCLUDE})
426441

427442
if (UNIX)
428443
target_link_libraries(Nabla INTERFACE
@@ -451,11 +466,12 @@ else()
451466
$<$<CONFIG:RelWithDebInfo>:${ZLIB_LIBRARY_RELWITHDEBINFO}>
452467
)
453468
endif()
454-
target_include_directories(Nabla PUBLIC $<TARGET_PROPERTY:zlibstatic,BINARY_DIR>/copy_source)
469+
470+
list(APPEND PUBLIC_INCLUDE_DIRS $<TARGET_PROPERTY:zlibstatic,BINARY_DIR>/copy_source)
455471

456472
# blake3
457473
add_dependencies(Nabla blake3)
458-
target_include_directories(Nabla PUBLIC $<TARGET_PROPERTY:blake3,INCLUDE_DIRECTORIES>)
474+
list(APPEND PUBLIC_INCLUDE_DIRS $<TARGET_PROPERTY:blake3,INCLUDE_DIRECTORIES>)
459475
if(NBL_STATIC_BUILD)
460476
target_link_libraries(Nabla INTERFACE blake3)
461477
else()
@@ -469,7 +485,8 @@ if(NBL_STATIC_BUILD)
469485
else()
470486
target_link_libraries(Nabla PRIVATE shaderc)
471487
endif()
472-
target_include_directories(Nabla PUBLIC ${THIRD_PARTY_SOURCE_DIR}/shaderc/libshaderc/include)
488+
list(APPEND PUBLIC_INCLUDE_DIRS ${THIRD_PARTY_SOURCE_DIR}/shaderc/libshaderc/include)
489+
473490
# spirv tools
474491
add_dependencies(Nabla SPIRV)
475492
add_dependencies(Nabla SPIRV-Tools)
@@ -492,7 +509,7 @@ if(NBL_STATIC_BUILD)
492509
else()
493510
target_link_libraries(Nabla PRIVATE nlohmann_json::nlohmann_json)
494511
endif()
495-
target_include_directories(Nabla PUBLIC ${THIRD_PARTY_SOURCE_DIR}/nlohmann_json/include)
512+
list(APPEND PUBLIC_INCLUDE_DIRS ${THIRD_PARTY_SOURCE_DIR}/nlohmann_json/include)
496513

497514

498515
# simdjson
@@ -502,7 +519,7 @@ if(NBL_STATIC_BUILD)
502519
else()
503520
target_link_libraries(Nabla PRIVATE simdjson)
504521
endif()
505-
target_include_directories(Nabla PUBLIC ${THIRD_PARTY_SOURCE_DIR}/simdjson)
522+
list(APPEND PUBLIC_INCLUDE_DIRS ${THIRD_PARTY_SOURCE_DIR}/simdjson)
506523

507524
# libjpeg
508525
add_dependencies(Nabla jpeg-static)
@@ -511,15 +528,18 @@ if(NBL_STATIC_BUILD)
511528
else()
512529
target_link_libraries(Nabla PRIVATE jpeg-static)
513530
endif()
514-
target_include_directories(Nabla PUBLIC ${THIRD_PARTY_SOURCE_DIR}/libjpeg-turbo)
531+
list(APPEND PUBLIC_INCLUDE_DIRS ${THIRD_PARTY_SOURCE_DIR}/libjpeg-turbo)
532+
515533
# libpng
516534
add_dependencies(Nabla png_static)
517535
if(NBL_STATIC_BUILD)
518536
target_link_libraries(Nabla INTERFACE png_static)
519537
else()
520538
target_link_libraries(Nabla PRIVATE png_static)
521539
endif()
522-
target_include_directories(Nabla PUBLIC ${THIRD_PARTY_SOURCE_DIR}/libpng)
540+
list(APPEND PUBLIC_INCLUDE_DIRS ${THIRD_PARTY_SOURCE_DIR}/libpng)
541+
542+
523543
# OpenEXR
524544
if (_NBL_COMPILE_WITH_OPEN_EXR_)
525545
add_dependencies(Nabla OpenEXR)
@@ -528,10 +548,8 @@ if (_NBL_COMPILE_WITH_OPEN_EXR_)
528548
else()
529549
target_link_libraries(Nabla PRIVATE OpenEXR)
530550
endif()
531-
532-
target_include_directories(
533-
Nabla PUBLIC $<TARGET_PROPERTY:OpenEXR,INCLUDE_DIRECTORIES>
534-
)
551+
552+
list(APPEND PUBLIC_INCLUDE_DIRS $<TARGET_PROPERTY:OpenEXR,INCLUDE_DIRECTORIES>)
535553
endif()
536554

537555
add_dependencies(Nabla OpenEXRCore OpenEXRUtil)
@@ -547,9 +565,9 @@ else()
547565
)
548566
endif()
549567

550-
target_include_directories(
551-
Nabla PUBLIC $<TARGET_PROPERTY:OpenEXRCore,INCLUDE_DIRECTORIES> # for OpenEXR's core headers
552-
Nabla PUBLIC $<TARGET_PROPERTY:OpenEXRUtil,INCLUDE_DIRECTORIES> # for OpenEXR's util headers
568+
list(APPEND PUBLIC_INCLUDE_DIRS
569+
$<TARGET_PROPERTY:OpenEXRCore,INCLUDE_DIRECTORIES>
570+
$<TARGET_PROPERTY:OpenEXRUtil,INCLUDE_DIRECTORIES>
553571
)
554572

555573
# GLI
@@ -560,14 +578,15 @@ if(_NBL_COMPILE_WITH_GLI_)
560578
else()
561579
target_link_libraries(Nabla PRIVATE gli)
562580
endif()
563-
target_include_directories(Nabla PUBLIC ${THIRD_PARTY_SOURCE_DIR}/gli)
581+
list(APPEND PUBLIC_INCLUDE_DIRS ${THIRD_PARTY_SOURCE_DIR}/gli)
564582
endif()
565583

566584
# DXC (TODO: nah, lets remove/disable it)
567585
if(_NBL_ENABLE_DXC_COMPILE_TESTS_)
568586
add_dependencies(Nabla HLSL_NABLA_COMPILE_TEST)
569587
endif()
570588

589+
# TODO: remove and replace with target in tree
571590
add_custom_target(dxcompiler
572591
COMMAND "${CMAKE_COMMAND}" --build "${DXC_BUILD_DIR}" --target dxcompiler --config $<IF:$<CONFIG:Debug>,Debug,Release> -j${_NBL_JOBS_AMOUNT_}
573592
BYPRODUCTS "${DXC_LIB}" "${DXC_DLL}"
@@ -586,38 +605,36 @@ endif()
586605

587606
# Linux Display Systems
588607
if (UNIX AND NOT ANDROID AND NOT APPLE)
589-
target_include_directories(Nabla PUBLIC
608+
list(APPEND PUBLIC_INCLUDE_DIRS
590609
${X11_INCLUDE_DIR}
591-
X11_Xrandr_INCLUDE_PATH
610+
${X11_Xrandr_INCLUDE_PATH}
592611
${X11_xf86vmode_INCLUDE_PATH}
593612
)
594613
endif()
595614

596615
# Vulkan
597-
target_include_directories(Nabla PUBLIC "${THIRD_PARTY_SOURCE_DIR}/Vulkan-Headers/include")
598-
target_include_directories(Nabla PUBLIC "${THIRD_PARTY_SOURCE_DIR}/volk")
616+
list(APPEND PUBLIC_INCLUDE_DIRS
617+
${THIRD_PARTY_SOURCE_DIR}/Vulkan-Headers/include
618+
${THIRD_PARTY_SOURCE_DIR}/volk
619+
)
599620
target_link_libraries(Nabla PRIVATE volk)
600621
if(WIN32)
601622
target_compile_definitions(Nabla PUBLIC VK_USE_PLATFORM_WIN32_KHR) # volk is part of public interface headers in Nabla
602623
endif()
603624
# CUDA
604625
if (NBL_COMPILE_WITH_CUDA)
605-
target_include_directories(Nabla PUBLIC ${CUDAToolkit_INCLUDE_DIRS})
626+
list(APPEND PUBLIC_INCLUDE_DIRS "${CUDAToolkit_INCLUDE_DIRS}")
606627
endif()
607628

608-
# Include dirs for self
609-
target_include_directories(Nabla PUBLIC
610-
"${CMAKE_CURRENT_BINARY_DIR}/include"
611-
"${NBL_ROOT_PATH}/include"
612-
${COMMON_INCLUDE_DIRS}
613-
"${THIRD_PARTY_SOURCE_DIR}"
614-
#those also goes as PUBLIC because of examples
615-
"$<$<CONFIG:DEBUG>:${NABLA_CONF_DIR_DEBUG}>"
616-
"$<$<CONFIG:RELEASE>:${NABLA_CONF_DIR_RELEASE}>"
617-
"$<$<CONFIG:RELWITHDEBINFO>:${NABLA_CONF_DIR_RELWITHDEBINFO}>"
629+
list(APPEND PUBLIC_INCLUDE_DIRS
630+
# this should be PRIVATE, but things from /src (or /source) are sometimes included in things in /include and so examples have to put source dirs into theirs Include Path
631+
# -> TODO
632+
${NBL_ROOT_PATH}/src
633+
${NBL_ROOT_PATH}/source/Nabla
634+
${NBL_ROOT_PATH}/src/3rdparty
635+
# <-
618636
)
619637

620-
target_include_directories(Nabla PUBLIC ${NBL_ROOT_PATH}/src ${NBL_ROOT_PATH}/source/Nabla ${NBL_ROOT_PATH}/src/3rdparty) # this should be PRIVATE, but things from /src (or /source) are sometimes included in things in /include and so examples have to put source dirs into theirs Include Path
621638
target_include_directories(Nabla PRIVATE ${CMAKE_BINARY_DIR}/include)
622639

623640
target_compile_definitions(Nabla
@@ -627,15 +644,16 @@ target_compile_definitions(Nabla
627644

628645
# Boost
629646
add_dependencies(Nabla boost_wave)
630-
target_include_directories(Nabla PUBLIC $<TARGET_PROPERTY:boost_wave,INCLUDE_DIRECTORIES>)
647+
list(APPEND PUBLIC_INCLUDE_DIRS $<TARGET_PROPERTY:boost_wave,INCLUDE_DIRECTORIES>)
648+
631649
if(NBL_STATIC_BUILD)
632650
target_link_libraries(Nabla INTERFACE boost_wave)
633651
else()
634652
target_link_libraries(Nabla PRIVATE boost_wave)
635653
endif()
636654

637655
add_dependencies(Nabla DeviceHeaders)
638-
target_include_directories(Nabla PUBLIC "${NBL_DEVICE_GEN_INCLUDE_DIR}")
656+
list(APPEND PUBLIC_INCLUDE_DIRS ${NBL_DEVICE_GEN_INCLUDE_DIR})
639657

640658
if(NBL_EMBED_BUILTIN_RESOURCES)
641659
add_subdirectory(builtin EXCLUDE_FROM_ALL)
@@ -644,7 +662,7 @@ if(NBL_EMBED_BUILTIN_RESOURCES)
644662
foreach(NBL_TARGET IN LISTS NBL_TARGETS)
645663
get_target_property(_INTERNAL_BR_OUTPUT_INCLUDE_SEARCH_DIRECTORY_ ${NBL_TARGET} BUILTIN_RESOURCES_INCLUDE_SEARCH_DIRECTORY)
646664
target_include_directories(${NBL_TARGET} PUBLIC "$<TARGET_PROPERTY:Nabla,INCLUDE_DIRECTORIES>")
647-
target_include_directories(Nabla PUBLIC "${_INTERNAL_BR_OUTPUT_INCLUDE_SEARCH_DIRECTORY_}")
665+
target_include_directories(Nabla PRIVATE "${_INTERNAL_BR_OUTPUT_INCLUDE_SEARCH_DIRECTORY_}")
648666
endforeach()
649667

650668
add_dependencies(Nabla ${NBL_TARGETS})
@@ -685,7 +703,7 @@ target_compile_definitions(Nabla
685703
)
686704

687705
set(DEFINE_H "${CMAKE_CURRENT_BINARY_DIR}/include/$<CONFIG>/define.h")
688-
target_include_directories(Nabla BEFORE PUBLIC "$<PATH:GET_PARENT_PATH,${DEFINE_H}>")
706+
list(APPEND PUBLIC_INCLUDE_DIRS "$<PATH:GET_PARENT_PATH,${DEFINE_H}>")
689707

690708
# get consumer definitions
691709
get_directory_property(DEFS COMPILE_DEFINITIONS)
@@ -705,7 +723,8 @@ file(GENERATE OUTPUT ${DEFINE_H}
705723
nbl_install_file("${DEFINE_H}")
706724

707725
# git version tracking
708-
target_link_libraries(Nabla PUBLIC gtml)
726+
# TODO: private
727+
target_link_libraries(Nabla PUBLIC $<BUILD_INTERFACE:gtml>)
709728

710729
# NGFX
711730
if(TARGET ngfx)
@@ -754,7 +773,11 @@ endif()
754773
set_target_properties(Nabla PROPERTIES DEBUG_POSTFIX _debug)
755774
set_target_properties(Nabla PROPERTIES RELWITHDEBINFO_POSTFIX _relwithdebinfo)
756775

757-
nbl_install_lib_spec(Nabla "nbl")
776+
# target_include_directories for Nabla with PUBLIC *must not* be called after following
777+
target_include_directories(Nabla PUBLIC
778+
"$<BUILD_INTERFACE:${PUBLIC_INCLUDE_DIRS}>"
779+
"$<INSTALL_INTERFACE:include>"
780+
)
758781

759782
if(NBL_STATIC_BUILD)
760783
# install dependencies, they are required only for static Nabla builds

0 commit comments

Comments
 (0)