Fix occasional build errors on travis/appveyor

There were again occasional build errors due to a race condition which
causes the amalagamation to start two times a the same moment and thus
one overwrites the other.

This should fix it.

Additionally the amalgamation sources are only
needed if amalgamation is enabled. Thus open62541 target now only
depends on the amalgamated header
This commit is contained in:
Stefan Profanter 2017-08-07 14:24:52 +02:00
parent 812bab56a3
commit acb35c337f
2 changed files with 56 additions and 24 deletions

View File

@ -296,6 +296,7 @@ set(lib_sources ${PROJECT_SOURCE_DIR}/src/ua_types.c
${PROJECT_SOURCE_DIR}/src/ua_types_encoding_binary.c
${PROJECT_BINARY_DIR}/src_generated/ua_types_generated.c
${PROJECT_BINARY_DIR}/src_generated/ua_transport_generated.c
${PROJECT_BINARY_DIR}/src_generated/ua_statuscode_descriptions.c
${PROJECT_SOURCE_DIR}/src/ua_util.c
${PROJECT_SOURCE_DIR}/src/ua_connection.c
${PROJECT_SOURCE_DIR}/src/ua_securechannel.c
@ -388,6 +389,12 @@ add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src_generated/ua_types_generated
${PROJECT_SOURCE_DIR}/tools/schema/datatypes_minimal.txt
${CMAKE_CURRENT_SOURCE_DIR}/tools/schema/Opc.Ua.Types.bsd
${CMAKE_CURRENT_SOURCE_DIR}/tools/schema/NodeIds.csv)
# we need a custom target to avoid that the generator is called concurrently and thus overwriting files while the other thread is compiling
add_custom_target(open62541-generator-types DEPENDS
${PROJECT_BINARY_DIR}/src_generated/ua_types_generated.c
${PROJECT_BINARY_DIR}/src_generated/ua_types_generated.h
${PROJECT_BINARY_DIR}/src_generated/ua_types_generated_handling.h
${PROJECT_BINARY_DIR}/src_generated/ua_types_generated_encoding_binary.h)
# transport data types
add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src_generated/ua_transport_generated.c
@ -403,6 +410,12 @@ add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src_generated/ua_transport_gener
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tools/generate_datatypes.py
${PROJECT_SOURCE_DIR}/tools/schema/datatypes_transport.txt
${CMAKE_CURRENT_SOURCE_DIR}/tools/schema/Custom.Opc.Ua.Transport.bsd)
# we need a custom target to avoid that the generator is called concurrently and thus overwriting files while the other thread is compiling
add_custom_target(open62541-generator-transport DEPENDS
${PROJECT_BINARY_DIR}/src_generated/ua_transport_generated.c
${PROJECT_BINARY_DIR}/src_generated/ua_transport_generated.h
${PROJECT_BINARY_DIR}/src_generated/ua_transport_generated_handling.h
${PROJECT_BINARY_DIR}/src_generated/ua_transport_generated_encoding_binary.h)
# statuscode explanation
add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src_generated/ua_statuscode_descriptions.c
@ -411,24 +424,9 @@ add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src_generated/ua_statuscode_desc
${PROJECT_SOURCE_DIR}/tools/schema/Opc.Ua.StatusCodes.csv ${PROJECT_BINARY_DIR}/src_generated/ua_statuscode_descriptions
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tools/generate_statuscode_descriptions.py
${CMAKE_CURRENT_SOURCE_DIR}/tools/schema/Opc.Ua.StatusCodes.csv)
list(APPEND lib_sources ${PROJECT_BINARY_DIR}/src_generated/ua_statuscode_descriptions.c)
# generated namespace 0
add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src_generated/ua_namespaceinit_generated.c
${PROJECT_BINARY_DIR}/src_generated/ua_namespaceinit_generated.h
PRE_BUILD
COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/generate_open62541CCode.py
-i ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/NodeID_AssumeExternal.txt
-s description -b ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/NodeID_Blacklist.txt
${PROJECT_SOURCE_DIR}/tools/schema/namespace0/${GENERATE_NAMESPACE0_FILE}
${PROJECT_BINARY_DIR}/src_generated/ua_namespaceinit_generated
DEPENDS ${PROJECT_SOURCE_DIR}/tools/schema/namespace0/${GENERATE_NAMESPACE0_FILE}
${PROJECT_SOURCE_DIR}/tools/pyUANamespace/generate_open62541CCode.py
${PROJECT_SOURCE_DIR}/tools/pyUANamespace/open62541_MacroHelper.py
${PROJECT_SOURCE_DIR}/tools/pyUANamespace/ua_builtin_types.py
${PROJECT_SOURCE_DIR}/tools/pyUANamespace/ua_constants.py
${PROJECT_SOURCE_DIR}/tools/pyUANamespace/ua_namespace.py
${PROJECT_SOURCE_DIR}/tools/pyUANamespace/ua_node_types.py)
# we need a custom target to avoid that the generator is called concurrently and thus overwriting files while the other thread is compiling
add_custom_target(open62541-generator-statuscode DEPENDS
${PROJECT_BINARY_DIR}/src_generated/ua_statuscode_descriptions.c)
# single-file release
add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/open62541.h
@ -445,8 +443,32 @@ add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/open62541.c
${internal_headers} ${lib_sources} ${default_plugin_sources}
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tools/amalgamate.py ${internal_headers} ${lib_sources})
ADD_CUSTOM_TARGET(open62541_amalgamation DEPENDS ${PROJECT_BINARY_DIR}/open62541.h
${PROJECT_BINARY_DIR}/open62541.c)
add_custom_target(open62541_amalgamation_source DEPENDS ${PROJECT_BINARY_DIR}/open62541.c)
add_custom_target(open62541_amalgamation_header DEPENDS ${PROJECT_BINARY_DIR}/open62541.h)
add_dependencies(open62541_amalgamation_source open62541-generator-types open62541-generator-transport open62541-generator-statuscode)
add_dependencies(open62541_amalgamation_header open62541-generator-types)
# generated namespace 0
add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src_generated/ua_namespaceinit_generated.c
${PROJECT_BINARY_DIR}/src_generated/ua_namespaceinit_generated.h
PRE_BUILD
COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/generate_open62541CCode.py
-i ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/NodeID_AssumeExternal.txt
-s description -b ${PROJECT_SOURCE_DIR}/tools/pyUANamespace/NodeID_Blacklist.txt
${PROJECT_SOURCE_DIR}/tools/schema/namespace0/${GENERATE_NAMESPACE0_FILE}
${PROJECT_BINARY_DIR}/src_generated/ua_namespaceinit_generated
DEPENDS ${PROJECT_SOURCE_DIR}/tools/schema/namespace0/${GENERATE_NAMESPACE0_FILE}
${PROJECT_SOURCE_DIR}/tools/pyUANamespace/generate_open62541CCode.py
${PROJECT_SOURCE_DIR}/tools/pyUANamespace/open62541_MacroHelper.py
${PROJECT_SOURCE_DIR}/tools/pyUANamespace/ua_builtin_types.py
${PROJECT_SOURCE_DIR}/tools/pyUANamespace/ua_constants.py
${PROJECT_SOURCE_DIR}/tools/pyUANamespace/ua_namespace.py
${PROJECT_SOURCE_DIR}/tools/pyUANamespace/ua_node_types.py)
# we need a custom target to avoid that the generator is called concurrently and thus overwriting files while the other thread is compiling
add_custom_target(open62541-generator-namespace DEPENDS
${PROJECT_BINARY_DIR}/src_generated/ua_namespaceinit_generated.c
${PROJECT_BINARY_DIR}/src_generated/ua_namespaceinit_generated.h)
#####################
# Build the Library #
@ -460,9 +482,10 @@ if(UA_ENABLE_AMALGAMATION)
add_library(open62541-object OBJECT ${PROJECT_BINARY_DIR}/open62541.c ${PROJECT_BINARY_DIR}/open62541.h)
target_include_directories(open62541-object PRIVATE ${PROJECT_BINARY_DIR})
# make sure the open62541_amalgamation target builds before so that amalgamation is finished and it is not executed again for open62541-object
# make sure the open62541_amalgamation target builds before so that amalgamation is finished and it is not executed again for open62541-object
# and thus may overwrite the amalgamation result during multiprocessor compilation
add_dependencies(open62541-object open62541_amalgamation)
# the header is already a dependency of open62541 target itself
add_dependencies(open62541-object open62541_amalgamation_source)
add_library(open62541 $<TARGET_OBJECTS:open62541-object>)
@ -472,9 +495,11 @@ if(UA_ENABLE_AMALGAMATION)
else()
add_definitions(-DUA_NO_AMALGAMATION)
add_library(open62541-object OBJECT ${lib_sources} ${internal_headers} ${exported_headers})
add_dependencies(open62541-object open62541-generator-types open62541-generator-transport open62541-generator-statuscode)
target_include_directories(open62541-object PRIVATE ${PROJECT_SOURCE_DIR}/src)
add_library(open62541-plugins OBJECT ${default_plugin_sources} ${exported_headers})
add_dependencies(open62541-plugins open62541-generator-types)
target_include_directories(open62541-plugins PRIVATE ${PROJECT_SOURCE_DIR}/plugins)
target_include_directories(open62541-plugins PRIVATE ${PROJECT_BINARY_DIR}/src_generated)
target_compile_definitions(open62541-plugins PRIVATE -DUA_DYNAMIC_LINKING_EXPORT)
@ -487,6 +512,13 @@ else()
endif()
endif()
if(UA_ENABLE_GENERATE_NAMESPACE0)
add_dependencies(open62541_amalgamation_source open62541-generator-namespace)
if(NOT UA_ENABLE_AMALGAMATION)
add_dependencies(open62541-object open62541-generator-namespace)
endif()
endif()
# Export Symbols
target_compile_definitions(open62541-object PRIVATE -DUA_DYNAMIC_LINKING_EXPORT)
target_compile_definitions(open62541 PRIVATE -DUA_DYNAMIC_LINKING_EXPORT)
@ -499,7 +531,7 @@ endif()
target_link_libraries(open62541 ${open62541_LIBRARIES})
# Always generate the amalgamated header
add_dependencies(open62541 open62541_amalgamation)
add_dependencies(open62541 open62541_amalgamation_header)
# Generate properly versioned shared library links on Linux
SET_TARGET_PROPERTIES(open62541 PROPERTIES SOVERSION 0 VERSION "${OPEN62541_VER_MAJOR}.${OPEN62541_VER_MINOR}.${OPEN62541_VER_PATCH}")

View File

@ -12,7 +12,7 @@ macro(add_example EXAMPLE_NAME EXAMPLE_SOURCE)
add_executable(${EXAMPLE_NAME} ${STATIC_OBJECTS} ${EXAMPLE_SOURCE} ${ARGN})
target_link_libraries(${EXAMPLE_NAME} open62541 ${open62541_LIBRARIES})
assign_source_group(${EXAMPLE_SOURCE})
add_dependencies(${EXAMPLE_NAME} open62541_amalgamation)
add_dependencies(${EXAMPLE_NAME} open62541_amalgamation_header open62541_amalgamation_source)
set_target_properties(${EXAMPLE_NAME} PROPERTIES FOLDER "open62541/examples")
if(UA_COMPILE_AS_CXX)
set_source_files_properties(${EXAMPLE_SOURCE} PROPERTIES LANGUAGE CXX)