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 ()