mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 02:42:49 -04:00
cmake: Reorganize macros, and cleanup related files (add docs, etc)
This commit is contained in:
parent
3fa270b302
commit
c579f87007
@ -3,18 +3,25 @@
|
|||||||
cmake_minimum_required(VERSION 2.8.4)
|
cmake_minimum_required(VERSION 2.8.4)
|
||||||
project(Panda3D)
|
project(Panda3D)
|
||||||
|
|
||||||
# Set Panda's CMake module path
|
# Add generic modules to cmake module path,
|
||||||
|
# and add Panda3D specific modules to cmake module path
|
||||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules/")
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules/")
|
||||||
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/macros/")
|
||||||
|
|
||||||
# This is where dtool_config.h gets generated.
|
# Include global modules
|
||||||
|
include(AutoInclude) # Implements automatic include_directories finding
|
||||||
|
include(AddBisonTarget) # Defines add_bison_target function
|
||||||
|
include(CompositeSources) # Defines composite_sources function
|
||||||
|
include(ConfigPackage) # Defines config_package function
|
||||||
|
include(Interrogate) # Defines target_interrogate AND add_python_module
|
||||||
|
|
||||||
|
# Add the include path for source and header files generated by CMake
|
||||||
include_directories("${CMAKE_BINARY_DIR}")
|
include_directories("${CMAKE_BINARY_DIR}")
|
||||||
|
|
||||||
# Configure Panda3D
|
# Configure Panda3D
|
||||||
include(dtool/PandaMacros.cmake)
|
|
||||||
include(dtool/PandaVersion.cmake)
|
include(dtool/PandaVersion.cmake)
|
||||||
include(dtool/Packages.cmake)
|
include(dtool/Package.cmake)
|
||||||
include(dtool/Config.cmake)
|
include(dtool/Config.cmake)
|
||||||
include(dtool/Interrogate.cmake)
|
|
||||||
|
|
||||||
# Determine which trees to build.
|
# Determine which trees to build.
|
||||||
option(BUILD_DTOOL "Build the dtool source tree." ON)
|
option(BUILD_DTOOL "Build the dtool source tree." ON)
|
||||||
|
73
cmake/macros/AddBisonTarget.cmake
Normal file
73
cmake/macros/AddBisonTarget.cmake
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
# Filename: AddBisonTarget.cmake
|
||||||
|
# Description: This file defines the function add_bison_target which instructs
|
||||||
|
# cmake to use bison on an input .yxx file. If bison is not available on
|
||||||
|
# the system, add_bison_target tries to use .prebuilt .cxx files instead.
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# add_bison_target(output_cxx input_yxx [DEFINES output_h] [PREFIX prefix])
|
||||||
|
#
|
||||||
|
|
||||||
|
# Define add_bison_target()
|
||||||
|
function(add_bison_target output_cxx input_yxx)
|
||||||
|
set(arguments "")
|
||||||
|
set(outputs "${output_cxx}")
|
||||||
|
set(keyword "")
|
||||||
|
|
||||||
|
# Parse the extra arguments to the function.
|
||||||
|
foreach(arg ${ARGN})
|
||||||
|
if(arg STREQUAL "DEFINES")
|
||||||
|
set(keyword "DEFINES")
|
||||||
|
elseif(arg STREQUAL "PREFIX")
|
||||||
|
set(keyword "PREFIX")
|
||||||
|
|
||||||
|
elseif(keyword STREQUAL "PREFIX")
|
||||||
|
set(arguments ${arguments} -p "${arg}")
|
||||||
|
elseif(keyword STREQUAL "DEFINES")
|
||||||
|
set(arguments ${arguments} --defines="${arg}")
|
||||||
|
list(APPEND outputs "${arg}")
|
||||||
|
|
||||||
|
else()
|
||||||
|
message(SEND_ERROR "Unexpected argument ${arg} to add_bison_target")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
if(keyword STREQUAL arg AND NOT keyword STREQUAL "")
|
||||||
|
message(SEND_ERROR "Expected argument after ${keyword}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(HAVE_BISON)
|
||||||
|
get_source_file_property(input_yxx "${input_yxx}" LOCATION)
|
||||||
|
|
||||||
|
# If we have bison, we can of course just run it.
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${outputs}
|
||||||
|
COMMAND ${BISON_EXECUTABLE}
|
||||||
|
-o "${output_cxx}" ${arguments}
|
||||||
|
"${input_yxx}"
|
||||||
|
MAIN_DEPENDENCY "${input_yxx}"
|
||||||
|
)
|
||||||
|
|
||||||
|
else()
|
||||||
|
# Look for prebuilt versions of the outputs.
|
||||||
|
set(commands "")
|
||||||
|
set(depends "")
|
||||||
|
|
||||||
|
foreach(output ${outputs})
|
||||||
|
set(prebuilt_file "${output}.prebuilt")
|
||||||
|
get_filename_component(prebuilt_file "${prebuilt_file}" ABSOLUTE)
|
||||||
|
|
||||||
|
if(NOT EXISTS "${prebuilt_file}")
|
||||||
|
message(SEND_ERROR "Bison was not found and ${prebuilt_file} does not exist!")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
list(APPEND depends "${prebuilt_file}")
|
||||||
|
set(commands ${commands} COMMAND ${CMAKE_COMMAND} -E copy ${prebuilt_file} ${output})
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${outputs}
|
||||||
|
${commands}
|
||||||
|
DEPENDS ${depends}
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
endfunction(add_bison_target)
|
101
cmake/macros/CompositeSources.cmake
Normal file
101
cmake/macros/CompositeSources.cmake
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
# Filename: CompositeSources.cmake
|
||||||
|
# Description: This file defines the function composite_sources which looks at
|
||||||
|
# a provided list of sources, generates _compositeN.cxx, and appends the
|
||||||
|
# composites to the list. The original files in the list are marked as headers
|
||||||
|
# so that they will be available in an IDE, but not compiled at build time.
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# composite_sources(target source_var)
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
# set(MY_SOURCES a.cxx b.cxx c.cxx)
|
||||||
|
# composite_sources(my_lib MY_SOURCES)
|
||||||
|
# add_library(my_lib ${MY_SOURCES})
|
||||||
|
#
|
||||||
|
# TODO: Only supports .cxx files so far, not yet .mm files
|
||||||
|
# It should probably sort the files by extension (.c, .cxx, .mm) first.
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
# Settings for composite builds. Should be moved to Config.cmake?
|
||||||
|
set(COMPOSITE_SOURCE_LIMIT "30" CACHE STRING
|
||||||
|
"Setting this to a value higher than 1 will enable unity builds, also
|
||||||
|
known as SCU (single compilation unit). A high value will speed up the
|
||||||
|
build dramatically but will be more memory intensive than a low value.")
|
||||||
|
|
||||||
|
set(COMPOSITE_SOURCE_EXTENSIONS "cxx;c;mm" CACHE STRING
|
||||||
|
"Only files of these extensions will be added to composite files.")
|
||||||
|
|
||||||
|
set(COMPOSITE_GENERATOR "${CMAKE_SOURCE_DIR}/cmake/scripts/MakeComposite.cmake")
|
||||||
|
|
||||||
|
|
||||||
|
# Define composite_sources()
|
||||||
|
function(composite_sources target sources_var)
|
||||||
|
# How many sources were specified?
|
||||||
|
set(orig_sources ${${sources_var}})
|
||||||
|
set(sources ${orig_sources})
|
||||||
|
list(LENGTH sources num_sources)
|
||||||
|
|
||||||
|
if(num_sources LESS 2 OR ${COMPOSITE_SOURCE_LIMIT} LESS 2)
|
||||||
|
# It's silly to do this for a single source.
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(composite_files "")
|
||||||
|
set(composite_sources "")
|
||||||
|
|
||||||
|
while(num_sources GREATER 0)
|
||||||
|
# Pop the first element
|
||||||
|
list(GET sources 0 source)
|
||||||
|
list(REMOVE_AT sources 0)
|
||||||
|
list(LENGTH sources num_sources)
|
||||||
|
|
||||||
|
# Check if we can safely add this to a composite file.
|
||||||
|
get_source_file_property(generated "${source}" GENERATED)
|
||||||
|
get_source_file_property(is_header "${source}" HEADER_FILE_ONLY)
|
||||||
|
|
||||||
|
if(NOT generated AND NOT is_header)
|
||||||
|
# Add it to composite_sources.
|
||||||
|
list(APPEND composite_sources ${source})
|
||||||
|
list(LENGTH composite_sources num_composite_sources)
|
||||||
|
|
||||||
|
if(num_sources EQUAL 0 OR NOT num_composite_sources LESS ${COMPOSITE_SOURCE_LIMIT})
|
||||||
|
|
||||||
|
# It's pointless to make a composite source from just one file.
|
||||||
|
if(num_composite_sources GREATER 1)
|
||||||
|
|
||||||
|
# Figure out the name of our composite file.
|
||||||
|
list(LENGTH composite_files index)
|
||||||
|
math(EXPR index "1+${index}")
|
||||||
|
set(composite_file "${CMAKE_CURRENT_BINARY_DIR}/${target}_composite${index}.cxx")
|
||||||
|
list(APPEND composite_files "${composite_file}")
|
||||||
|
|
||||||
|
# Set HEADER_FILE_ONLY to prevent it from showing up in the
|
||||||
|
# compiler command, but still show up in the IDE environment.
|
||||||
|
set_source_files_properties(${composite_sources} PROPERTIES HEADER_FILE_ONLY ON)
|
||||||
|
|
||||||
|
# We'll interrogate the composite files, so exclude the original sources.
|
||||||
|
set_source_files_properties(${composite_sources} PROPERTIES WRAP_EXCLUDE YES)
|
||||||
|
|
||||||
|
# Finally, add the target that generates the composite file.
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT "${composite_file}"
|
||||||
|
COMMAND ${CMAKE_COMMAND}
|
||||||
|
-DCOMPOSITE_FILE="${composite_file}"
|
||||||
|
-DCOMPOSITE_SOURCES="${composite_sources}"
|
||||||
|
-P "${COMPOSITE_GENERATOR}"
|
||||||
|
DEPENDS ${composite_sources})
|
||||||
|
|
||||||
|
# Reset for the next composite file.
|
||||||
|
set(composite_sources "")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endwhile()
|
||||||
|
|
||||||
|
#set_source_files_properties(${composite_files} PROPERTIES GENERATED YES)
|
||||||
|
|
||||||
|
# The new files are added to the existing files, which means the old files
|
||||||
|
# are still there, but they won't be compiled due to the HEADER_FILE_ONLY setting.
|
||||||
|
set(${sources_var} ${orig_sources} ${composite_files} PARENT_SCOPE)
|
||||||
|
endfunction(composite_sources)
|
@ -1,4 +1,4 @@
|
|||||||
# Filename: ConfigurePackage.cmake
|
# Filename: ConfigPackage.cmake
|
||||||
# Author: kestred (30 Nov, 2013)
|
# Author: kestred (30 Nov, 2013)
|
||||||
#
|
#
|
||||||
# This modules defines a function which finds and configures libraries
|
# This modules defines a function which finds and configures libraries
|
||||||
@ -6,6 +6,9 @@
|
|||||||
#
|
#
|
||||||
# Assumes the file has already been found with find_package().
|
# Assumes the file has already been found with find_package().
|
||||||
#
|
#
|
||||||
|
# Usage:
|
||||||
|
# config_package(package_name)
|
||||||
|
#
|
||||||
# The following variables can be set to override the cached values of USE_XYZZY
|
# The following variables can be set to override the cached values of USE_XYZZY
|
||||||
# CONFIG_DISABLE_EVERYTHING - always set USE_XYZZY to false
|
# CONFIG_DISABLE_EVERYTHING - always set USE_XYZZY to false
|
||||||
# CONFIG_DISABLE_MISSING - set USE_XYZZY to false if it was not found
|
# CONFIG_DISABLE_MISSING - set USE_XYZZY to false if it was not found
|
@ -1,9 +1,11 @@
|
|||||||
|
# Filename: Interrogate.cmake
|
||||||
#
|
#
|
||||||
# dtool/Interrogate.cmake
|
# Description: This file contains macros and functions that are used to invoke
|
||||||
|
# interrogate, to generate wrappers for Python and/or other languages.
|
||||||
#
|
#
|
||||||
# This file contains macros and functions that are used to invoke
|
# Functions:
|
||||||
# interrogate, in order to generate wrappers for Python and/or other
|
# target_interrogate(target [ALL] [source1 [source2 ...]])
|
||||||
# languages.
|
# add_python_module(module [lib1 [lib2 ...]])
|
||||||
#
|
#
|
||||||
|
|
||||||
set(IGATE_FLAGS ${INTERROGATE_OPTIONS} -DCPPPARSER -D__cplusplus -Dvolatile -Dmutable)
|
set(IGATE_FLAGS ${INTERROGATE_OPTIONS} -DCPPPARSER -D__cplusplus -Dvolatile -Dmutable)
|
9
cmake/macros/README.md
Normal file
9
cmake/macros/README.md
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
Directory Info
|
||||||
|
--------------
|
||||||
|
**Directory:** /cmake/macros
|
||||||
|
**License:** Unlicense
|
||||||
|
**Description:** This directory is used for CMake modules which may be _unsafe_
|
||||||
|
to use outside of a Panda3D project. These modules may rely on Panda3D specific
|
||||||
|
cmake variables, Panda3D's directory structure, or some other dependency.
|
||||||
|
They are not intended to be included in other projects directly, though you
|
||||||
|
are free to copy and adapt them to your own needs.
|
50
cmake/modules/AutoInclude.cmake
Normal file
50
cmake/modules/AutoInclude.cmake
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
# Filename: AutoInclude.cmake
|
||||||
|
# Description: This file backports the CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE
|
||||||
|
# introduced in CMake 2.8.11 to previous versions of cmake, and enables the
|
||||||
|
# behavior by default.
|
||||||
|
#
|
||||||
|
|
||||||
|
# Emulate CMake 2.8.11's CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE behavior.
|
||||||
|
if(CMAKE_VERSION VERSION_LESS 2.8.11)
|
||||||
|
# Replace some built-in functions in order to extend their functionality.
|
||||||
|
function(add_library target)
|
||||||
|
_add_library(${target} ${ARGN})
|
||||||
|
set_target_properties("${target}" PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR};${CMAKE_CURRENT_BINARY_DIR}")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(add_executable target)
|
||||||
|
_add_executable(${target} ${ARGN})
|
||||||
|
set_target_properties("${target}" PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR};${CMAKE_CURRENT_BINARY_DIR}")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(target_link_libraries target)
|
||||||
|
set(interface_dirs)
|
||||||
|
get_target_property(target_interface_dirs "${target}" INTERFACE_INCLUDE_DIRECTORIES)
|
||||||
|
|
||||||
|
foreach(lib ${ARGN})
|
||||||
|
get_target_property(lib_interface_dirs "${lib}" INTERFACE_INCLUDE_DIRECTORIES)
|
||||||
|
|
||||||
|
if(lib_interface_dirs)
|
||||||
|
list(APPEND interface_dirs ${lib_interface_dirs})
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
list(REMOVE_DUPLICATES interface_dirs)
|
||||||
|
|
||||||
|
#NB. target_include_directories is new in 2.8.8.
|
||||||
|
#target_include_directories("${target}" ${interface_dirs})
|
||||||
|
include_directories(${interface_dirs})
|
||||||
|
|
||||||
|
# Update this target's interface inc dirs.
|
||||||
|
set_target_properties("${target}" PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${target_interface_dirs};${interface_dirs}")
|
||||||
|
|
||||||
|
# Call to the built-in function we are overriding.
|
||||||
|
_target_link_libraries(${target} ${ARGN})
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
else()
|
||||||
|
# 2.8.11 supports this natively.
|
||||||
|
set(CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
7
cmake/modules/README.md
Normal file
7
cmake/modules/README.md
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
Directory Info
|
||||||
|
--------------
|
||||||
|
**Directory:** /cmake/modules
|
||||||
|
**License:** Unlicense
|
||||||
|
**Description:** This directory is used for standard CMake modules which are safe
|
||||||
|
to use outside of a Panda3D project. This should be the normal location for
|
||||||
|
most FindXYZZY packages that are written for Panda3D.
|
@ -1,5 +1,13 @@
|
|||||||
# This script is invoked via add_custom_target, like this:
|
# Filename: MakeComposite.cmake
|
||||||
# cmake -P MakeComposite.cmake -D COMPOSITE_FILE="x_composite1.cxx" -D COMPOSITE_SOURCES="a.cxx b.cxx"
|
#
|
||||||
|
# Description: When run, creates a single C++ file which includes multiple
|
||||||
|
# other C++ files, to help facilitate unity builds.
|
||||||
|
# Unity builds provide significantly increased compile speed.
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# This script is invoked via add_custom_target, like this:
|
||||||
|
# cmake -P MakeComposite.cmake -D COMPOSITE_FILE="x_composite1.cxx" -D COMPOSITE_SOURCES="a.cxx b.cxx"
|
||||||
|
#
|
||||||
|
|
||||||
if(CMAKE_SCRIPT_MODE_FILE)
|
if(CMAKE_SCRIPT_MODE_FILE)
|
||||||
#cmake_minimum_required(VERSION 2.8.4)
|
#cmake_minimum_required(VERSION 2.8.4)
|
10
cmake/scripts/README.md
Normal file
10
cmake/scripts/README.md
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
Directory Info
|
||||||
|
--------------
|
||||||
|
**Directory:** /cmake/scripts
|
||||||
|
**License:** Unlicense
|
||||||
|
**Description:** This directory is used for cmake files which are not meant to
|
||||||
|
be included using CMake's normal include() directive. Typically, files in this
|
||||||
|
directory will be invoked as a custom command/target in the form of:
|
||||||
|
```
|
||||||
|
cmake -P <CustomScriptName.cmake> [... other options ...]
|
||||||
|
```
|
@ -1,205 +0,0 @@
|
|||||||
# Settings for composite builds. Should be moved to Config.cmake?
|
|
||||||
set(COMPOSITE_SOURCE_LIMIT "30" CACHE STRING
|
|
||||||
"Setting this to a value higher than 1 will enable unity builds, also
|
|
||||||
known as SCU (single compilation unit). A high value will speed up the
|
|
||||||
build dramatically but will be more memory intensive than a low value.")
|
|
||||||
|
|
||||||
set(COMPOSITE_SOURCE_EXTENSIONS "cxx;c;mm" CACHE STRING
|
|
||||||
"Only files of these extensions will be added to composite files.")
|
|
||||||
|
|
||||||
set(COMPOSITE_GENERATOR "${CMAKE_CURRENT_LIST_DIR}/MakeComposite.cmake")
|
|
||||||
|
|
||||||
#
|
|
||||||
# Macro: composite_sources(target sources_var)
|
|
||||||
# Looks at all the sources, generates _composite#.cxx and modifies the list.
|
|
||||||
# Usage:
|
|
||||||
# set(MY_SOURCES a.cxx b.cxx c.cxx)
|
|
||||||
# composite_sources(MY_SOURCES)
|
|
||||||
# add_library(my ${MY_SOURCES})
|
|
||||||
#
|
|
||||||
#TODO: only supports .cxx files so far, not yet .mm files
|
|
||||||
# it should probably sort the files by extension (.c, .cxx, .mm) first.
|
|
||||||
#
|
|
||||||
function(composite_sources target sources_var)
|
|
||||||
# How many sources were specified?
|
|
||||||
set(orig_sources ${${sources_var}})
|
|
||||||
set(sources ${orig_sources})
|
|
||||||
list(LENGTH sources num_sources)
|
|
||||||
|
|
||||||
if(num_sources LESS 2 OR ${COMPOSITE_SOURCE_LIMIT} LESS 2)
|
|
||||||
# It's silly to do this for a single source.
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(composite_files "")
|
|
||||||
set(composite_sources "")
|
|
||||||
|
|
||||||
while(num_sources GREATER 0)
|
|
||||||
# Pop the first element
|
|
||||||
list(GET sources 0 source)
|
|
||||||
list(REMOVE_AT sources 0)
|
|
||||||
list(LENGTH sources num_sources)
|
|
||||||
|
|
||||||
# Check if we can safely add this to a composite file.
|
|
||||||
get_source_file_property(generated "${source}" GENERATED)
|
|
||||||
get_source_file_property(is_header "${source}" HEADER_FILE_ONLY)
|
|
||||||
|
|
||||||
if(NOT generated AND NOT is_header)
|
|
||||||
# Add it to composite_sources.
|
|
||||||
list(APPEND composite_sources ${source})
|
|
||||||
list(LENGTH composite_sources num_composite_sources)
|
|
||||||
|
|
||||||
if(num_sources EQUAL 0 OR NOT num_composite_sources LESS ${COMPOSITE_SOURCE_LIMIT})
|
|
||||||
|
|
||||||
# It's pointless to make a composite source from just one file.
|
|
||||||
if(num_composite_sources GREATER 1)
|
|
||||||
|
|
||||||
# Figure out the name of our composite file.
|
|
||||||
list(LENGTH composite_files index)
|
|
||||||
math(EXPR index "1+${index}")
|
|
||||||
set(composite_file "${CMAKE_CURRENT_BINARY_DIR}/${target}_composite${index}.cxx")
|
|
||||||
list(APPEND composite_files "${composite_file}")
|
|
||||||
|
|
||||||
# Set HEADER_FILE_ONLY to prevent it from showing up in the
|
|
||||||
# compiler command, but still show up in the IDE environment.
|
|
||||||
set_source_files_properties(${composite_sources} PROPERTIES HEADER_FILE_ONLY ON)
|
|
||||||
|
|
||||||
# We'll interrogate the composite files, so exclude the original sources.
|
|
||||||
set_source_files_properties(${composite_sources} PROPERTIES WRAP_EXCLUDE YES)
|
|
||||||
|
|
||||||
# Finally, add the target that generates the composite file.
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT "${composite_file}"
|
|
||||||
COMMAND ${CMAKE_COMMAND}
|
|
||||||
-DCOMPOSITE_FILE="${composite_file}"
|
|
||||||
-DCOMPOSITE_SOURCES="${composite_sources}"
|
|
||||||
-P "${COMPOSITE_GENERATOR}"
|
|
||||||
DEPENDS ${composite_sources})
|
|
||||||
|
|
||||||
# Reset for the next composite file.
|
|
||||||
set(composite_sources "")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endwhile()
|
|
||||||
|
|
||||||
#set_source_files_properties(${composite_files} PROPERTIES GENERATED YES)
|
|
||||||
|
|
||||||
# The new files are added to the existing files, which means the old files
|
|
||||||
# are still there, but they won't be compiled due to the HEADER_FILE_ONLY setting.
|
|
||||||
set(${sources_var} ${orig_sources} ${composite_files} PARENT_SCOPE)
|
|
||||||
endfunction(composite_sources)
|
|
||||||
|
|
||||||
#
|
|
||||||
# Function: add_bison_target(output_cxx input_yxx [DEFINES output_h] [PREFIX prefix])
|
|
||||||
# Takes .prebuilt files into account if BISON_FOUND is not true.
|
|
||||||
#
|
|
||||||
function(add_bison_target output_cxx input_yxx)
|
|
||||||
set(arguments "")
|
|
||||||
set(outputs "${output_cxx}")
|
|
||||||
set(keyword "")
|
|
||||||
|
|
||||||
# Parse the extra arguments to the function.
|
|
||||||
foreach(arg ${ARGN})
|
|
||||||
if(arg STREQUAL "DEFINES")
|
|
||||||
set(keyword "DEFINES")
|
|
||||||
elseif(arg STREQUAL "PREFIX")
|
|
||||||
set(keyword "PREFIX")
|
|
||||||
|
|
||||||
elseif(keyword STREQUAL "PREFIX")
|
|
||||||
set(arguments ${arguments} -p "${arg}")
|
|
||||||
elseif(keyword STREQUAL "DEFINES")
|
|
||||||
set(arguments ${arguments} --defines="${arg}")
|
|
||||||
list(APPEND outputs "${arg}")
|
|
||||||
|
|
||||||
else()
|
|
||||||
message(SEND_ERROR "Unexpected argument ${arg} to add_bison_target")
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
if(keyword STREQUAL arg AND NOT keyword STREQUAL "")
|
|
||||||
message(SEND_ERROR "Expected argument after ${keyword}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(HAVE_BISON)
|
|
||||||
get_source_file_property(input_yxx "${input_yxx}" LOCATION)
|
|
||||||
|
|
||||||
# If we have bison, we can of course just run it.
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT ${outputs}
|
|
||||||
COMMAND ${BISON_EXECUTABLE}
|
|
||||||
-o "${output_cxx}" ${arguments}
|
|
||||||
"${input_yxx}"
|
|
||||||
MAIN_DEPENDENCY "${input_yxx}"
|
|
||||||
)
|
|
||||||
|
|
||||||
else()
|
|
||||||
# Look for prebuilt versions of the outputs.
|
|
||||||
set(commands "")
|
|
||||||
set(depends "")
|
|
||||||
|
|
||||||
foreach(output ${outputs})
|
|
||||||
set(prebuilt_file "${output}.prebuilt")
|
|
||||||
get_filename_component(prebuilt_file "${prebuilt_file}" ABSOLUTE)
|
|
||||||
|
|
||||||
if(NOT EXISTS "${prebuilt_file}")
|
|
||||||
message(SEND_ERROR "Bison was not found and ${prebuilt_file} does not exist!")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
list(APPEND depends "${prebuilt_file}")
|
|
||||||
set(commands ${commands} COMMAND ${CMAKE_COMMAND} -E copy ${prebuilt_file} ${output})
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT ${outputs}
|
|
||||||
${commands}
|
|
||||||
DEPENDS ${depends}
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
endfunction(add_bison_target)
|
|
||||||
|
|
||||||
|
|
||||||
# Emulate CMake 2.8.11's CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE behavior.
|
|
||||||
if(CMAKE_VERSION VERSION_LESS 2.8.11)
|
|
||||||
# Replace some built-in functions in order to extend their functionality.
|
|
||||||
function(add_library target)
|
|
||||||
_add_library(${target} ${ARGN})
|
|
||||||
set_target_properties("${target}" PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR};${CMAKE_CURRENT_BINARY_DIR}")
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
function(add_executable target)
|
|
||||||
_add_executable(${target} ${ARGN})
|
|
||||||
set_target_properties("${target}" PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR};${CMAKE_CURRENT_BINARY_DIR}")
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
function(target_link_libraries target)
|
|
||||||
set(interface_dirs)
|
|
||||||
get_target_property(target_interface_dirs "${target}" INTERFACE_INCLUDE_DIRECTORIES)
|
|
||||||
|
|
||||||
foreach(lib ${ARGN})
|
|
||||||
get_target_property(lib_interface_dirs "${lib}" INTERFACE_INCLUDE_DIRECTORIES)
|
|
||||||
|
|
||||||
if(lib_interface_dirs)
|
|
||||||
list(APPEND interface_dirs ${lib_interface_dirs})
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
list(REMOVE_DUPLICATES interface_dirs)
|
|
||||||
|
|
||||||
#NB. target_include_directories is new in 2.8.8.
|
|
||||||
#target_include_directories("${target}" ${interface_dirs})
|
|
||||||
include_directories(${interface_dirs})
|
|
||||||
|
|
||||||
# Update this target's interface inc dirs.
|
|
||||||
set_target_properties("${target}" PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${target_interface_dirs};${interface_dirs}")
|
|
||||||
|
|
||||||
# Call to the built-in function we are overriding.
|
|
||||||
_target_link_libraries(${target} ${ARGN})
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
else()
|
|
||||||
# 2.8.11 supports this natively.
|
|
||||||
set(CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
|
Loading…
x
Reference in New Issue
Block a user