मैं एक पुस्तकालय गैर स्रोत फ़ाइलों की सामग्री (इस मामले, ओपन शेडर कोड में) से इंजेक्शन कुछ निरंतर डेटा ले जाने की जरूरत है के साथ पुस्तकालय। इस लक्ष्य को हासिल करने के लिए, मैं add_custom_command()
उपयोग कर रहा हूँ उत्पन्न करने के लिए फ़ाइलों है कि मैं तो #include
मेरी कोड में स्थिरांक स्थैतिक चर प्रारंभ करने में कर सकते हैं शामिल हैं।CMake: हेडर-केवल उत्पन्न फ़ाइलों
यह नियमित पुस्तकालयों (स्थिर या साझा) के साथ पूरी तरह से काम करता है, लेकिन अब मैं अपने पुस्तकालय हेडर केवल करना चाहते हैं। सी की क्षमता ++ स्थिर तरीकों जाने के लिए कि डेटा प्रत्येक अनुवाद इकाई ("जादू स्टैटिक्स") में दोहराया होने का खतरा चलने के बिना स्थिर डेटा लौट यह संभव है।
समस्या यह है कि सीएमके को लगता है कि एक इंटरफेस लाइब्रेरी (जो कि सीएमके फीचर है जिसे मैं हेडर-केवल पुस्तकालय बनाने के लिए उपयोग कर रहा हूं) को भवन की आवश्यकता नहीं है - जो इस मामले में गलत है।
(मुझे एहसास है कि मेरी लाइब्रेरी के लिए केवल वास्तविकता होने के लिए कोई वास्तविक दायित्व नहीं है। इस विशेष मामले में, मुझे यह कारण यह है कि मैं पुस्तकालय चाहता हूं, जो ओपनजीएल कर रहा है, किसी भी से स्वतंत्र रहने के लिए विशिष्ट बाइंडिंग लाइब्रेरी [जैसे कि GLEW
या GLee
या नवागंतुक glbinding
]। मेरी लाइब्रेरी हेडर को केवल रखकर, मैं उस विकल्प को उपयोगकर्ता को छोड़ सकता हूं - उसे केवल #include
मेरे पहले बाइंडिंग लाइब्रेरी का शीर्षलेख है।)
किसी CMake हेडर पैदा कस्टम आदेशों को गति प्रदान, नवीनतम पर जब उपभोक्ता प्रोजेक्ट बनाया जा रहा है के लिए एक तरह से देख रहा है?
संपादित करें: मैं बस महसूस किया कि मैं "दोनों दुनिया का सबसे अच्छा" हो सकता है के रूप में यह मेरी लाइब्रेरी स्थिर मेरे सारे कोड हेडर फाइल में लगातार डेटा के लिए छोड़कर रखने, लेकिन अभी भी जारी रखते हुए थे। इस तरह, एक विशिष्ट ओपनजीएल बाइंडिंग लाइब्रेरी चुनने की अभी भी आवश्यकता नहीं होगी। एक के लिए उपयोग की सादगी - - इसलिए मैं अपने सवाल खुला जा रहा हूँ हालांकि, अभी भी हो रही एक पुस्तकालय हेडर केवल होने का लाभ हैं।
संपादित करें # 2: यहाँ मेरी CMakeLists.txt
फ़ाइल के प्रासंगिक हिस्सा है (मैं केवल पुस्तकालय निर्भरता छीन - सभी शीर्ष लेख-केवल - अंत से):
set(SHADER_FILES "src/vertex.glsl" "src/fragment.glsl")
add_library(libGPCGUIGLRenderer INTERFACE)
target_sources(libGPCGUIGLRenderer INTERFACE ${SHADER_FILES})
target_include_directories(libGPCGUIGLRenderer BEFORE
INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
# Embed shader files
source_group("Shader files" FILES ${SHADER_FILES})
set(GENERATED "${CMAKE_CURRENT_BINARY_DIR}/generated")
target_include_directories(libGPCGUIGLRenderer INTERFACE ${GENERATED})
# Find the GPC Bin2C utility
find_package(GPCBin2C REQUIRED)
# Add a custom target and a dependency for each shader file
foreach(shader ${SHADER_FILES})
get_filename_component(name "${shader}" NAME)
set(shader_header "${GENERATED}/${name}.h")
add_custom_command(
OUTPUT ${shader_header}
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${shader}
COMMAND GPCBin2C --input=${CMAKE_CURRENT_SOURCE_DIR}/${shader} --output=${shader_header}
)
target_sources(libGPCGUIGLRenderer INTERFACE ${shader_header})
endforeach()
मैं पहले से ही मेरे इंटरफेस लाइब्रेरी में जेनरेट की गई हेडर फ़ाइलों को जोड़ने के लिए 'target_sources()' का उपयोग कर रहा हूं। लेकिन सीएमके उन्हें उत्पन्न नहीं करता है - स्पष्ट रूप से निर्भरता (और इसे हल करने के लिए कस्टम कमांड) उपभोक्ता को पास नहीं किया जा रहा है। – JPNotADragon