[build] generate .xcconfig files with configure_file

We previously used incremental `file(WRITE ...)` commands that gradually recreated the file on every CMake invocation. This sometimes lead to Xcode parsing a partially written file, which in turn breaks building dependend targets. Instead, we're now using a templated configuration file, which ensure that the file is created in one go and hopefully reduces the race condition between CMake and Xcode's automatic project updating.
This commit is contained in:
Konstantin Käfer
2017-03-28 20:57:22 +02:00
parent c86b492bf7
commit a9896fa01b
7 changed files with 25 additions and 22 deletions

View File

@@ -110,3 +110,9 @@ endif()
if(COMMAND mbgl_platform_node)
include(cmake/node.cmake)
endif()
if(CMAKE_GENERATOR STREQUAL "Xcode")
write_xcconfig_target_properties(
mbgl-core
)
endif()

View File

@@ -29,4 +29,3 @@ target_add_mason_package(mbgl-core PRIVATE wagyu)
mbgl_platform_core()
create_source_groups(mbgl-core)
target_append_xcconfig(mbgl-core)

View File

@@ -17,4 +17,3 @@ target_include_directories(mbgl-loop-darwin
)
create_source_groups(mbgl-loop-darwin)
target_append_xcconfig(mbgl-loop-darwin)

View File

@@ -15,4 +15,3 @@ target_include_directories(mbgl-loop-uv
)
create_source_groups(mbgl-loop-uv)
target_append_xcconfig(mbgl-loop-uv)

View File

@@ -85,27 +85,28 @@ macro(set_xcode_property TARGET XCODE_PROPERTY XCODE_VALUE)
set_property(TARGET ${TARGET} PROPERTY XCODE_ATTRIBUTE_${XCODE_PROPERTY} ${XCODE_VALUE})
endmacro (set_xcode_property)
function(_write_xcconfig_var target var)
function(_get_xcconfig_property target var)
get_property(result TARGET ${target} PROPERTY INTERFACE_${var} SET)
if (result)
get_property(result TARGET ${target} PROPERTY INTERFACE_${var})
string(REPLACE ";" "\" \"" result "${result}")
string(REPLACE "-" "_" target "${target}")
file(APPEND "${CMAKE_BINARY_DIR}/config.xcconfig" "${target}_${var} = \"${result}\"\n")
set(${target}_${var} "${result}" PARENT_SCOPE)
endif()
endfunction()
function(target_append_xcconfig target)
file(APPEND "${CMAKE_BINARY_DIR}/config.xcconfig" "\n// ${target}\n")
_write_xcconfig_var(${target} INCLUDE_DIRECTORIES)
_write_xcconfig_var(${target} COMPILE_DEFINITIONS)
_write_xcconfig_var(${target} COMPILE_OPTIONS)
_write_xcconfig_var(${target} LINK_LIBRARIES)
function(write_xcconfig_target_properties)
foreach(target ${ARGN})
_get_xcconfig_property(${target} INCLUDE_DIRECTORIES)
_get_xcconfig_property(${target} LINK_LIBRARIES)
endforeach()
configure_file(
"${CMAKE_SOURCE_DIR}/scripts/config.xcconfig.in"
"${CMAKE_BINARY_DIR}/config.xcconfig"
@ONLY
)
endfunction()
# Start a new file when we're running CMake
file(WRITE "${CMAKE_BINARY_DIR}/config.xcconfig" "// Do not edit -- generated by CMake\n")
# CMake 3.1 does not have this yet.
set(CMAKE_CXX14_STANDARD_COMPILE_OPTION "-std=c++14")
set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION "-std=gnu++14")

View File

@@ -1725,10 +1725,7 @@
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
FRAMEWORK_VERSION = A;
HEADER_SEARCH_PATHS = (
"$(mbgl_core_INCLUDE_DIRECTORIES)",
"$(mbgl_loop_INCLUDE_DIRECTORIES)",
);
HEADER_SEARCH_PATHS = "$(mbgl_core_INCLUDE_DIRECTORIES)";
INFOPLIST_FILE = "$(SRCROOT)/sdk/Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
@@ -1762,10 +1759,7 @@
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
FRAMEWORK_VERSION = A;
HEADER_SEARCH_PATHS = (
"$(mbgl_core_INCLUDE_DIRECTORIES)",
"$(mbgl_loop_INCLUDE_DIRECTORIES)",
);
HEADER_SEARCH_PATHS = "$(mbgl_core_INCLUDE_DIRECTORIES)";
INFOPLIST_FILE = "$(SRCROOT)/sdk/Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";

View File

@@ -0,0 +1,5 @@
// Do not edit -- generated by CMake
// mbgl-core
mbgl_core_INCLUDE_DIRECTORIES = "@mbgl_core_INCLUDE_DIRECTORIES@"
mbgl_core_LINK_LIBRARIES = "@mbgl_core_LINK_LIBRARIES@"