Warning, /education/kstars/cmake/modules/UnityBuild.cmake is written in an unsupported language. File is not indexed.
0001 # SPDX-FileCopyrightText: 2009-2012 Christoph Heindl 0002 # SPDX-FileCopyrightText: 2015 Csaba Kertész <csaba.kertesz@gmail.com> 0003 # 0004 # SPDX-License-Identifier: BSD-3-Clause 0005 0006 MACRO (COMMIT_UNITY_FILE UNITY_FILE FILE_CONTENT) 0007 SET(DIRTY FALSE) 0008 # Check if the build file exists 0009 SET(OLD_FILE_CONTENT "") 0010 IF (NOT EXISTS ${${UNITY_FILE}} AND NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/${${UNITY_FILE}}) 0011 SET(DIRTY TRUE) 0012 ELSE () 0013 # Check the file content 0014 FILE(STRINGS ${${UNITY_FILE}} OLD_FILE_CONTENT) 0015 STRING(REPLACE ";" "" OLD_FILE_CONTENT "${OLD_FILE_CONTENT}") 0016 STRING(REPLACE "\n" "" NEW_CONTENT "${${FILE_CONTENT}}") 0017 STRING(COMPARE EQUAL "${OLD_FILE_CONTENT}" "${NEW_CONTENT}" EQUAL_CHECK) 0018 IF (NOT EQUAL_CHECK EQUAL 1) 0019 SET(DIRTY TRUE) 0020 ENDIF () 0021 ENDIF () 0022 IF (DIRTY MATCHES TRUE) 0023 MESSAGE(STATUS "Write Unity Build file: " ${${UNITY_FILE}}) 0024 FILE(WRITE ${${UNITY_FILE}} "${${FILE_CONTENT}}") 0025 ENDIF () 0026 # Create a dummy copy of the unity file to trigger CMake reconfigure if it is deleted. 0027 SET(UNITY_FILE_PATH "") 0028 SET(UNITY_FILE_NAME "") 0029 GET_FILENAME_COMPONENT(UNITY_FILE_PATH ${${UNITY_FILE}} PATH) 0030 GET_FILENAME_COMPONENT(UNITY_FILE_NAME ${${UNITY_FILE}} NAME) 0031 CONFIGURE_FILE(${${UNITY_FILE}} ${UNITY_FILE_PATH}/CMakeFiles/${UNITY_FILE_NAME}.dummy) 0032 ENDMACRO () 0033 0034 MACRO (ENABLE_UNITY_BUILD TARGET_NAME SOURCE_VARIABLE_NAME UNIT_SIZE EXTENSION) 0035 # Limit is zero based conversion of unit_size 0036 MATH(EXPR LIMIT ${UNIT_SIZE}-1) 0037 SET(FILES ${SOURCE_VARIABLE_NAME}) 0038 # Effectivly ignore the source files from the build, but keep track them for changes. 0039 SET_SOURCE_FILES_PROPERTIES(${${FILES}} PROPERTIES HEADER_FILE_ONLY true) 0040 # Counts the number of source files up to the threshold 0041 SET(COUNTER ${LIMIT}) 0042 # Have one or more unity build files 0043 SET(FILE_NUMBER 0) 0044 SET(BUILD_FILE "") 0045 SET(BUILD_FILE_CONTENT "") 0046 SET(UNITY_BUILD_FILES "") 0047 SET(_DEPS "") 0048 0049 FOREACH (SOURCE_FILE ${${FILES}}) 0050 IF (COUNTER EQUAL LIMIT) 0051 SET(_DEPS "") 0052 # Write the actual Unity Build file 0053 IF (NOT ${BUILD_FILE} STREQUAL "" AND NOT ${BUILD_FILE_CONTENT} STREQUAL "") 0054 COMMIT_UNITY_FILE(BUILD_FILE BUILD_FILE_CONTENT) 0055 ENDIF () 0056 SET(UNITY_BUILD_FILES ${UNITY_BUILD_FILES} ${BUILD_FILE}) 0057 # Set the variables for the current Unity Build file 0058 SET(BUILD_FILE ${CMAKE_CURRENT_BINARY_DIR}/unitybuild_${FILE_NUMBER}_${TARGET_NAME}.${EXTENSION}) 0059 SET(BUILD_FILE_CONTENT "// Unity Build file generated by CMake\n") 0060 MATH(EXPR FILE_NUMBER ${FILE_NUMBER}+1) 0061 SET(COUNTER 0) 0062 ENDIF () 0063 # Add source path to the file name if it is not there yet. 0064 SET(FINAL_SOURCE_FILE "") 0065 SET(SOURCE_PATH "") 0066 GET_FILENAME_COMPONENT(SOURCE_PATH ${SOURCE_FILE} PATH) 0067 IF (SOURCE_PATH STREQUAL "" OR NOT EXISTS ${SOURCE_FILE}) 0068 SET(FINAL_SOURCE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE_FILE}) 0069 ELSE () 0070 SET(FINAL_SOURCE_FILE ${SOURCE_FILE}) 0071 ENDIF () 0072 # Treat only the existing files or moc_*.cpp files 0073 STRING(FIND ${SOURCE_FILE} "moc_" MOC_POS) 0074 IF (EXISTS ${FINAL_SOURCE_FILE} OR MOC_POS GREATER -1) 0075 # Add md5 hash of the source file (except moc files) to the build file content 0076 IF (MOC_POS LESS 0) 0077 SET(MD5_HASH "") 0078 FILE(MD5 ${FINAL_SOURCE_FILE} MD5_HASH) 0079 SET(BUILD_FILE_CONTENT "${BUILD_FILE_CONTENT}// md5: ${MD5_HASH}\n") 0080 ENDIF () 0081 # Add the source file to the build file content 0082 IF (MOC_POS GREATER -1) 0083 SET(BUILD_FILE_CONTENT "${BUILD_FILE_CONTENT}#include <${SOURCE_FILE}>\n") 0084 ELSE () 0085 SET(BUILD_FILE_CONTENT "${BUILD_FILE_CONTENT}#include <${FINAL_SOURCE_FILE}>\n") 0086 ENDIF () 0087 # Add the source dependencies to the Unity Build file 0088 GET_SOURCE_FILE_PROPERTY(_FILE_DEPS ${SOURCE_FILE} OBJECT_DEPENDS) 0089 0090 IF (_FILE_DEPS) 0091 SET(_DEPS ${_DEPS} ${_FILE_DEPS}) 0092 SET_SOURCE_FILES_PROPERTIES(${BUILD_FILE} PROPERTIES OBJECT_DEPENDS "${_DEPS}") 0093 ENDIF() 0094 # Keep counting up to the threshold. Increment counter. 0095 MATH(EXPR COUNTER ${COUNTER}+1) 0096 ENDIF () 0097 ENDFOREACH () 0098 # Write out the last Unity Build file 0099 IF (NOT ${BUILD_FILE} STREQUAL "" AND NOT ${BUILD_FILE_CONTENT} STREQUAL "") 0100 COMMIT_UNITY_FILE(BUILD_FILE BUILD_FILE_CONTENT) 0101 ENDIF () 0102 SET(UNITY_BUILD_FILES ${UNITY_BUILD_FILES} ${BUILD_FILE}) 0103 SET(${SOURCE_VARIABLE_NAME} ${${SOURCE_VARIABLE_NAME}} ${UNITY_BUILD_FILES}) 0104 ENDMACRO () 0105 0106 MACRO (UNITY_GENERATE_MOC TARGET_NAME SOURCES HEADERS) 0107 SET(NEW_SOURCES "") 0108 FOREACH (HEADER_FILE ${${HEADERS}}) 0109 IF (NOT EXISTS ${HEADER_FILE}) 0110 MESSAGE(FATAL_ERROR "Header file does not exist (mocing): ${HEADER_FILE}") 0111 ENDIF () 0112 FILE(READ ${HEADER_FILE} FILE_CONTENT) 0113 STRING(FIND "${FILE_CONTENT}" "Q_OBJECT" QOBJECT_POS) 0114 STRING(FIND "${FILE_CONTENT}" "Q_SLOTS" QSLOTS_POS) 0115 STRING(FIND "${FILE_CONTENT}" "Q_SIGNALS" QSIGNALS_POS) 0116 STRING(FIND "${FILE_CONTENT}" "QObject" OBJECT_POS) 0117 STRING(FIND "${FILE_CONTENT}" "slots" SLOTS_POS) 0118 STRING(FIND "${FILE_CONTENT}" "signals" SIGNALS_POS) 0119 IF (QOBJECT_POS GREATER 0 OR OBJECT_POS GREATER 0 OR QSLOTS_POS GREATER 0 OR Q_SIGNALS GREATER 0 OR 0120 SLOTS_POS GREATER 0 OR SIGNALS GREATER 0) 0121 # Generate the moc filename 0122 GET_FILENAME_COMPONENT(HEADER_BASENAME ${HEADER_FILE} NAME_WE) 0123 SET(MOC_FILENAME "moc_${HEADER_BASENAME}.cpp") 0124 SET(NEW_SOURCES ${NEW_SOURCES} ; "${CMAKE_CURRENT_BINARY_DIR}/${MOC_FILENAME}") 0125 ADD_CUSTOM_COMMAND(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${MOC_FILENAME}" 0126 DEPENDS ${HEADER_FILE} 0127 COMMAND ${QT_MOC_EXECUTABLE} ${HEADER_FILE} -o "${CMAKE_CURRENT_BINARY_DIR}/${MOC_FILENAME}") 0128 ENDIF () 0129 ENDFOREACH () 0130 IF (NEW_SOURCES) 0131 SET_SOURCE_FILES_PROPERTIES(${NEW_SOURCES} PROPERTIES GENERATED TRUE) 0132 SET(${SOURCES} ${${SOURCES}} ; ${NEW_SOURCES}) 0133 ENDIF () 0134 ENDMACRO ()